vivienluo 发表于 2013-6-9 21:39:59

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层的颜色。


leench124 发表于 2015-4-19 20:27:52

罗老师,发现一处笔误和一处可以优化的地方。笔误:获取layername时的关键字groupmembers中的第一个m应为大写,正确应为groupMembers;定义popup时,判断是否是最后一层时用的判断条件为是否等于字符串BOTTOM,虽然大部分用户定义走线层时会用BOTTOM,但是难免会有人不这么做,这时候就会出现bug,我认为改为car(last(Design_Layers))会更准确点。

chuankay 发表于 2013-6-10 20:38:39

本帖最后由 chuankay 于 2013-6-10 20:51 编辑

看楼主用 fprintf(enumFormPort "POPUP <class>\"class\"\n\n") 定义一个空pop,为什么不使用skill推荐的方式呢:POPUP <class>"PLACEHOLDER""0".我想描述的是"class\"后面不用放一个dispatch吗。

vivienluo 发表于 2013-6-10 22:19:38

chuankay 发表于 2013-6-10 20:38 static/image/common/back.gif
看楼主用 fprintf(enumFormPort "POPUP \"class\"\n\n") 定义一个空pop,为什么不使用skill推荐的方式呢:P ...

如果省略dispatch的话,那么display/dispatch为同一个值。。

duan 发表于 2013-8-17 05:43:36

谢谢楼主!

chuchiwolong 发表于 2014-11-28 11:32:16

很不错,谢谢!

PKN1216083420 发表于 2015-1-20 11:31:24

谢谢分享!

PKN1216083420 发表于 2015-1-28 10:36:47

罗老师,我用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是为啥啊

wuyuhe 发表于 2015-8-12 14:29:28

罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是什么原因啊?没有出现窗体

vivienluo 发表于 2015-8-12 22:02:41

wuyuhe 发表于 2015-8-12 14:29
罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示fu ...

1.可能因为FORM文件有误
2.可能是你的执行axlMiniStatusLoad函数后,就直接退出自定义的函数了,不是处在等待状态,你试试在form后面增加一个选择函数。这种情况比较多。这个与一般加载form不一样。
页: [1] 2
查看完整版本: FORM中ENUM的使用方法详解