一个简单的例子详解FORM的操作
上图中为一个FORM的例子,该FORM包含了些简单的控件,包括文本框(STRFILLIN),文本(TEXT),按钮(MENUBUTTON),框架(GROUP)。
该FORM代码如下:FILE_TYPE=FORM_DEFN VERSION=2 FORM文件头,FORM文件里面第一句必须为这个
FORM FORM开始,在FORM结束时必须有ENDFORM与之对应
FIXED 这个不用管,必须这样写
PORT 35 20 这个定义FORM的大小
HEADER "Gerber Setup V1.0" 这个定义标题栏上显示的文字
TILE遇到这句,说明开始定义FORM中的内容了,与FORM关键字一样,必须在定义结束时加上ENDTILE
FIELD G274D 定义一个FIELD,名字为G274D,之后在skill程序中使用这个字符串来与这个FIELD对应
FLOC 5 4 定义坐标位置 x y
FGROUP "Gerber Setup" 定义属于哪个GROUP
MENUBUTTON "Gerber 274D" 4 4 这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
ENDFIELD 结束FIELD
FIELD G274X 这里定义另外一个FIELD
FLOC 20 4 定义坐标位置 x y
FGROUP "Gerber Setup"定义属于哪个GROUP
MENUBUTTON "Gerber 274X" 4 4这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
ENDFIELD 结束FIELD
TEXT "Board Name:" 这里定义一串文本,文本为 “Board Name:”
TLOC 5 12 这里定义文本的位置,注意与FIELD定义位置的区别,文本为TEXT LOCATION,缩写为TLOC,FIELD LOCATION缩写为TLOC
TGROUP "Add Gerber Text" 定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
ENDTEXT 结束文本定义
FIELD BoardName 这里定义一个FIELD ,名字为 “BoardName”
FLOC 5 14 定义坐标位置 x y
FGROUP "Add Gerber Text" 定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
STRFILLIN 18 40 这里定义该FIELD为一个文本框,后面连个数字分别代表文本框的长度,和文本框可输入的字符数。
ENDFIELD 结束FIELD
FIELD AddText 这里定义 一个FIELD ,名字为 AddText
FLOC 26 14 定义坐标位置 x y
FGROUP "Add Gerber Text"定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
MENUBUTTON "ADD" 4 3 这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
ENDFIELD结束FIELD
GROUP "Gerber Setup"这里定义 一个GROUP
GLOC 3 1 定义GROUP的坐标位置,注意所有坐标位置都为左上角的坐标。
GSIZE 30 8 定义GROUP的大小
ENDGROUP 结束GROUP
GROUP "Add Gerber Text"这个与上面类似,就不注释了
GLOC 3 10
GSIZE 30 8
ENDGROUP
ENDTILE 结束定义FORM中的内容,与前面的TILE对应
ENDFORM 结束FORM,与前面的的FORM对应
==================================================================
上面定义了图片中FORM的完整代码,那么如何在SKILL中调用FORM呢?请继续往看下面。
在一个包含FORM的SKILL中,FORM的创建可以单独创建一个后缀名为.form的文件,然后输入FORM的完整代码。也可以通过在il文件中,使用函数创建一个FORM文件,并将代码输出到一个文件中,这就看个人喜好了。
现在我们使用上面那个FORM文件来执行相应的操作,比如我点击每个按钮,都弹出不同的提示框,输如文本框的内容,通过点击add按钮显示出来。
现在我们来编写skill:
首先我们注册一个命令,用来执行该操作。axlCmdRegister("ft" 'gerberFormTest)上面命令注册函数指定了执行ft命令就调用gerberFormTest函数,因此,这儿我们要创建一个gerberFormTest函数procedure(gerberFormTest()
);end procedure创建好函数后,我们需要向函数中添加相应的命令。当执行ft命令后,首先加载form,然后显示form,那么我们在gerberFormTest函数中加入下面代码:testForm = axlFormCreate((gensym) "e:/GerberFormFile.form" nil 'gerberFormAction t nil )
axlFormDisplay(testForm)上面代码中,指定了对窗口回调函数为gerberFormAction,那么我就再创建一个gerberFormAction函数,用来对FORM的一系列操作做出相应的回应。procedure(gerberFormAction(testForm)
)注:FORM会将其DBID传递个gerberFormAction函数,因此我们要给函数指定一个入口参数。
当FORM传递到gerberFormAction函数后,我们要知道到底是FORM上什么被触发了。我们可以通过testForm->curField来获取当前FORM被触发的FIELD。当获取到FIELD后,需要对不同的FIELD做出不同的操作。这儿,我们可以使用case函数来操作:case(testForm->curField ;获取FORM当前FIELD
("G274D" ;对G274D执行的操作
axlUIConfirm("You have pressed Gerber 274D Button") ;弹出一个对话框
)
("G274X";对G274X执行的操作
axlUIConfirm("You have pressed Gerber 274X Button") ;弹出一个对话框注:这儿使用的FIELD名字为FORM中定义的FIELD名称,要一一对应。
下面是完整的SKILL代码:axlCmdRegister("ft" 'gerberFormTest)
procedure(gerberFormTest()
testForm = axlFormCreate((gensym) "e:/GerberFormFile.form" nil 'gerberFormAction t nil )
axlFormDisplay(testForm)
);end procedure
procedure(gerberFormAction(testForm)
case(testForm->curField
("G274D"
axlUIConfirm("You have pressed Gerber 274D Button")
)
("G274X"
axlUIConfirm("You have pressed Gerber 274X Button")
)
("AddText"
sprintf(boardname "Board Name is : %s",axlFormGetField(testForm "BoardName"))
axlUIConfirm(boardname)
)
);end case
)
如有什么问题,期待你的积极讨论。。。
按照楼主的教程自己也修改了哈,教程太棒了,在来顶帖!
顶起来,膜拜师傅啊!!今天上学会了怎么编辑group啊!!{:soso_e128:} shape 发表于 2013-5-17 22:59 static/image/common/back.gif
按照楼主的教程自己也修改了哈,教程太棒了,在来顶帖!
多谢多谢。看来你进步不少哈。。。 好贴啊,以后用skill写程序就可以方便的和用户互动了。
另外问个题外的问题,如何用skill设置光绘的274X格式和输出精度及生成光绘呢? 好东西啊受教了 正在学习中…… 受益了,全力顶起。 超強的帖很好的學習範例謝謝分享喔 学习了。谢谢分享