FORM中ENUM的使用方法详解
ALLEGRO FORM中ENUM也称为combo box 即组合框。在FIELD中定义关键词"ENUMSET"来使用。使用ENUM前,首先须定义POPUP。可通过以下方式定义:1.在FORM文件中直接定义一个POPUP来指定ENUM的下拉列表。比如:
POPUP <Layer_Names>"TOP""TOP","GND02""GND02","POWER03""POWER03","BOTTOM""BOTTOM".
该字段定义在TILE关键词前面。
2.当FORM文件已经加载,并显示出来。此时我们可使用AXL函数axlFormBuildPopup来定义下拉列表。
POPUP “<>”中的内容为POPUP的名称,比如上列中<Layer_Names>,我们可通过Layer_Names来调用该菜单;
POPUP中单个选项的基本格式为display/dispatch,比如上例中的"TOP""TOP",其中display为显示内容,而dispath为该选项的派遣值,即在FORM中,通过form->curValue获取到的值。当然,这两个参数可以一致。
================================分割线==============================
在FORM中,ENUM共有两种显示方式:
1.单行显示,必须通过下拉列表来显示。定义ENUMSET时,只需要指定其宽度即可。请参考下面例子:FIELD Layer
FLOC 1 1
ENUMSET 11
POP "Layer_Names"
ENDFIELD</div>显示效果如下:
2.多行显示。可显示POPUP中多个下拉选项。通过指定ENUMSET的长宽来设置。FIELD Layer
FLOC 1 1
ENUMSET 11 10
POP "Layer_Names"
ENDFIELD显示效果如下:
例如,定义一个ENUM来获取当前所有ETCH层。代码如下:axlCmdRegister("emnutest" 'emnutest ?cmdType "general")
procedure(emnutest()
enumFormCreate()
formPort = axlFormCreate((gensym) "enum.form" nil nil t nil)
axlFormDisplay(formPort)
axlFormBuildPopup(formPort "Layer" '(("item 1""1")))
;axlFormBuildPopup(formPort "Layer" (list (list "MyPop A" 1) (list "MyPop B" 2)) )
)
procedure(enumFormCreate()
enumFormPort = outfile("enum.form")
fprintf(enumFormPort "FILE_TYPE=FORM_DEFN VERSION=2\n")
fprintf(enumFormPort "FORM\n")
fprintf(enumFormPort "FIXED\n")
fprintf(enumFormPort "PORT 20 50\n")
fprintf(enumFormPort "HEADER \"Enum Test\"\n\n")
Desing_Layers=(axlGetParam("paramLayerGroup:ETCH")->groupMembers)
fprintf(enumFormPort "POPUP <Layer_Names>")
foreach(Item Desing_Layers
if(Item=="BOTTOM" then
(fprintf enumFormPort "\"%s\"" Item)
(fprintf enumFormPort "\"%s\".\n" Item)
else
(fprintf enumFormPort "\"%s\"" Item)
(fprintf enumFormPort "\"%s\"," Item)
)
)
fprintf(enumFormPort "TILE\n\n")
fprintf(enumFormPort "FIELD Layer\n")
fprintf(enumFormPort "FLOC 1 1\n")
fprintf(enumFormPort "ENUMSET 11 10\n")
fprintf(enumFormPort "OPTIONS prettyprint\n")
fprintf(enumFormPort "POP \"Layer_Names\"\n")
fprintf(enumFormPort "ENDFIELD\n\n")
fprintf(enumFormPort "ENDTILE\n")
fprintf(enumFormPort "ENDFORM\n")
close(enumFormPort)
)在使用ENUM时,可定义OPTIONS 参数:
1. prettyprint 使用该参数,ENUM中所有选项以首字母均为大写,其余部分为小写字母,比如:TOP显示为Top、GND02显示为Gnd02。
2. ownerdrawn,用于Subclass中
3. dispatchsame
ENUM可配合axlMiniStatusLoad使用,在axlMiniStatusLoad中,预留了两个字段:class和subclass。
假如我们使用axlMiniStatusLoad来加载FORM,那么我们可以定义两个ENUM,一个为class,另一给为subclass,并可通过控制class/subclass来改变当前活动层。
具体请参考以下代码:FILE_TYPE=FORM_DEFN VERSION=2
FORM
FIXED
PORT 20 50
HEADER "ENUM TEST"
POPUP <class>"class""class"
POPUP <subclass>"subclass""subclass"
TILE
TEXT "Active Class and Subclass:"
TLOC 1 1
ENDTEXT
FIELD class
FLOC 5 4
ENUMSET 19
OPTIONS prettyprint
POP "class"
ENDFIELD
FIELD subcolor
FLOC 2 7
COLOR 2 1
OPTIONS colorchooser
ENDFIELD
FIELD subclass
FLOC 5 7
ENUMSET 19
POP "subclass"
OPTIONS prettyprint ownerdrawn
ENDFIELD
ENDTILE
ENDFORM
当我们使用axlMiniStatusLoad加载时,显示效果如下:
注: subcolor用来显示subclass层的颜色。
罗老师,发现一处笔误和一处可以优化的地方。笔误:获取layername时的关键字groupmembers中的第一个m应为大写,正确应为groupMembers;定义popup时,判断是否是最后一层时用的判断条件为是否等于字符串BOTTOM,虽然大部分用户定义走线层时会用BOTTOM,但是难免会有人不这么做,这时候就会出现bug,我认为改为car(last(Design_Layers))会更准确点。 本帖最后由 chuankay 于 2013-6-10 20:51 编辑
看楼主用 fprintf(enumFormPort "POPUP <class>\"class\"\n\n") 定义一个空pop,为什么不使用skill推荐的方式呢:POPUP <class>"PLACEHOLDER""0".我想描述的是"class\"后面不用放一个dispatch吗。 chuankay 发表于 2013-6-10 20:38 static/image/common/back.gif
看楼主用 fprintf(enumFormPort "POPUP \"class\"\n\n") 定义一个空pop,为什么不使用skill推荐的方式呢:P ...
如果省略dispatch的话,那么display/dispatch为同一个值。。 谢谢楼主! 很不错,谢谢! 谢谢分享! 罗老师,我用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是为啥啊 罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是什么原因啊?没有出现窗体 wuyuhe 发表于 2015-8-12 14:29
罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示fu ...
1.可能因为FORM文件有误
2.可能是你的执行axlMiniStatusLoad函数后,就直接退出自定义的函数了,不是处在等待状态,你试试在form后面增加一个选择函数。这种情况比较多。这个与一般加载form不一样。
页:
[1]
2