Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16268|回复: 42

一个简单的例子详解FORM的操作

[复制链接]
发表于 2013-5-13 22:37:51 | 显示全部楼层 |阅读模式

allegro form

allegro form


上图中为一个FORM的例子,该FORM包含了些简单的控件,包括文本框(STRFILLIN),文本(TEXT),按钮(MENUBUTTON),框架(GROUP)。

该FORM代码如下:
  1. FILE_TYPE=FORM_DEFN VERSION=2 FORM文件头,FORM文件里面第一句必须为这个
  2. FORM    FORM开始,在FORM结束时必须有ENDFORM与之对应
  3. FIXED    这个不用管,必须这样写
  4. PORT 35 20    这个定义FORM的大小
  5. HEADER "Gerber Setup V1.0"   这个定义标题栏上显示的文字
  6. TILE  遇到这句,说明开始定义FORM中的内容了,与FORM关键字一样,必须在定义结束时加上ENDTILE

  7. FIELD G274D                        定义一个FIELD,名字为G274D,之后在skill程序中使用这个字符串来与这个FIELD对应
  8. FLOC 5 4                        定义坐标位置 x y
  9. FGROUP "Gerber Setup"        定义属于哪个GROUP
  10. MENUBUTTON "Gerber 274D" 4 4   这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
  11. ENDFIELD           结束FIELD

  12. FIELD G274X                        这里定义另外一个FIELD
  13. FLOC 20 4                        定义坐标位置 x y
  14. FGROUP "Gerber Setup"  定义属于哪个GROUP
  15. MENUBUTTON "Gerber 274X" 4 4  这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
  16. ENDFIELD            结束FIELD

  17. TEXT "Board Name:"   这里定义一串文本,文本为 “Board Name:”
  18. TLOC 5 12          这里定义文本的位置,注意与FIELD定义位置的区别,文本为TEXT LOCATION,缩写为TLOC,FIELD LOCATION缩写为TLOC
  19. TGROUP "Add Gerber Text" 定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
  20. ENDTEXT            结束文本定义

  21. FIELD BoardName    这里定义一个FIELD ,名字为 “BoardName”
  22. FLOC 5 14          定义坐标位置 x y
  23. FGROUP "Add Gerber Text" 定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
  24. STRFILLIN 18 40    这里定义该FIELD为一个文本框,后面连个数字分别代表文本框的长度,和文本框可输入的字符数。
  25. ENDFIELD           结束FIELD

  26. FIELD AddText      这里定义 一个FIELD ,名字为 AddText
  27. FLOC 26 14         定义坐标位置 x y
  28. FGROUP "Add Gerber Text"  定义属于哪个GROUP,注意,定义GROUP是不会在FORM上有任何显示的。
  29. MENUBUTTON "ADD" 4 3 这里定义该FIELD为一个按钮,双引号中为按钮上显示的文字,后面两个数字代表该按钮的大小 w h
  30. ENDFIELD  结束FIELD

  31. GROUP "Gerber Setup"  这里定义 一个GROUP
  32. GLOC 3 1           定义GROUP的坐标位置,注意所有坐标位置都为左上角的坐标。
  33. GSIZE 30 8         定义GROUP的大小
  34. ENDGROUP           结束GROUP

  35. GROUP "Add Gerber Text"  这个与上面类似,就不注释了
  36. GLOC 3 10
  37. GSIZE 30 8
  38. ENDGROUP

  39. ENDTILE            结束定义FORM中的内容,与前面的TILE对应
  40. ENDFORM            结束FORM,与前面的的FORM对应
复制代码
==================================================================
上面定义了图片中FORM的完整代码,那么如何在SKILL中调用FORM呢?请继续往看下面。
在一个包含FORM的SKILL中,FORM的创建可以单独创建一个后缀名为.form的文件,然后输入FORM的完整代码。也可以通过在il文件中,使用函数创建一个FORM文件,并将代码输出到一个文件中,这就看个人喜好了。

现在我们使用上面那个FORM文件来执行相应的操作,比如我点击每个按钮,都弹出不同的提示框,输如文本框的内容,通过点击add按钮显示出来。
现在我们来编写skill:
首先我们注册一个命令,用来执行该操作。
  1. axlCmdRegister("ft" 'gerberFormTest)
复制代码
上面命令注册函数指定了执行ft命令就调用gerberFormTest函数,因此,这儿我们要创建一个gerberFormTest函数
  1. procedure(gerberFormTest()
  2. );end procedure
复制代码
创建好函数后,我们需要向函数中添加相应的命令。当执行ft命令后,首先加载form,然后显示form,那么我们在gerberFormTest函数中加入下面代码:
  1. testForm = axlFormCreate((gensym) "e:/GerberFormFile.form" nil 'gerberFormAction t nil )
  2. axlFormDisplay(testForm)
复制代码
上面代码中,指定了对窗口回调函数为gerberFormAction,那么我就再创建一个gerberFormAction函数,用来对FORM的一系列操作做出相应的回应。
  1. procedure(gerberFormAction(testForm)
  2. )
复制代码
注:FORM会将其DBID传递个gerberFormAction函数,因此我们要给函数指定一个入口参数。

当FORM传递到gerberFormAction函数后,我们要知道到底是FORM上什么被触发了。我们可以通过testForm->curField来获取当前FORM被触发的FIELD。当获取到FIELD后,需要对不同的FIELD做出不同的操作。这儿,我们可以使用case函数来操作:
  1. case(testForm->curField ;获取FORM当前FIELD
  2. ("G274D" ;对G274D执行的操作
  3. axlUIConfirm("You have pressed Gerber 274D Button") ;弹出一个对话框
  4. )
  5. ("G274X";对G274X执行的操作
  6. axlUIConfirm("You have pressed Gerber 274X Button") ;弹出一个对话框
复制代码
注:这儿使用的FIELD名字为FORM中定义的FIELD名称,要一一对应。

下面是完整的SKILL代码:
  1. axlCmdRegister("ft" 'gerberFormTest)
  2. procedure(gerberFormTest()
  3.         testForm = axlFormCreate((gensym) "e:/GerberFormFile.form" nil 'gerberFormAction t nil )
  4.         axlFormDisplay(testForm)
  5. );end procedure

  6. procedure(gerberFormAction(testForm)
  7. case(testForm->curField
  8.         ("G274D"
  9.                 axlUIConfirm("You have pressed Gerber 274D Button")
  10.         )
  11.         ("G274X"
  12.                 axlUIConfirm("You have pressed Gerber 274X Button")
  13.         )
  14.         ("AddText"
  15.                 sprintf(boardname "Board Name is : %s",axlFormGetField(testForm "BoardName"))
  16.                 axlUIConfirm(boardname)
  17.         )
  18. );end case
  19. )
复制代码
boardname.png
如有什么问题,期待你的积极讨论。。。

GerberFormFile.rar (1 KB, 下载次数: 202, 售价: 2 SKILL币)

评分

参与人数 1威望 +2 SKILL币 +4 贡献 +2 收起 理由
shape + 2 + 4 + 2 很给力!

查看全部评分

发表于 2013-5-13 23:05:42 | 显示全部楼层
顶起来,膜拜师傅啊!!今天上学会了怎么编辑group啊!!{:soso_e128:}
发表于 2013-5-17 22:59:33 | 显示全部楼层
guanghui1.jpg 按照楼主的教程自己也修改了哈,教程太棒了,在来顶帖!
 楼主| 发表于 2013-5-17 23:07:08 | 显示全部楼层
shape 发表于 2013-5-17 22:59
按照楼主的教程自己也修改了哈,教程太棒了,在来顶帖!

多谢多谢。看来你进步不少哈。。。
发表于 2013-6-18 15:52:37 | 显示全部楼层
好贴啊,以后用skill写程序就可以方便的和用户互动了。
另外问个题外的问题,如何用skill设置光绘的274X格式和输出精度及生成光绘呢?
发表于 2013-6-21 14:21:57 | 显示全部楼层
好东西啊  受教了
发表于 2013-7-19 09:42:54 | 显示全部楼层
正在学习中……
发表于 2013-8-9 13:40:34 | 显示全部楼层
受益了,全力顶起。
发表于 2014-1-2 21:18:41 | 显示全部楼层
超強的帖  很好的學習範例  謝謝分享喔
发表于 2014-1-7 13:52:08 | 显示全部楼层
学习了。谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2020-11-26 01:29 , Processed in 0.459078 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表