Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18742|回复: 16

FORM中ENUM的使用方法详解

[复制链接]
发表于 2013-6-9 21:39:59 | 显示全部楼层 |阅读模式
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时,只需要指定其宽度即可。请参考下面例子:
  1. FIELD Layer
  2. FLOC 1 1
  3. ENUMSET 11
  4. POP "Layer_Names"
  5. ENDFIELD</div>
复制代码
显示效果如下:
enum_single.png

2.多行显示。可显示POPUP中多个下拉选项。通过指定ENUMSET的长宽来设置。
  1. FIELD Layer
  2. FLOC 1 1
  3. ENUMSET 11 10
  4. POP "Layer_Names"
  5. ENDFIELD
复制代码
显示效果如下:
enum_mut.png

例如,定义一个ENUM来获取当前所有ETCH层。代码如下:
  1. axlCmdRegister("emnutest" 'emnutest ?cmdType "general")
  2. procedure(emnutest()
  3.         enumFormCreate()        
  4.         formPort = axlFormCreate((gensym) "enum.form" nil nil t nil)
  5.         axlFormDisplay(formPort)        
  6.         axlFormBuildPopup(formPort "Layer" '(("item 1""1")))
  7.         ;axlFormBuildPopup(formPort "Layer" (list (list "MyPop A" 1) (list "MyPop B" 2)) )
  8. )
  9. procedure(enumFormCreate()
  10.         enumFormPort = outfile("enum.form")
  11.         fprintf(enumFormPort "FILE_TYPE=FORM_DEFN VERSION=2\n")
  12.         fprintf(enumFormPort "FORM\n")
  13.         fprintf(enumFormPort "FIXED\n")
  14.         fprintf(enumFormPort "PORT 20 50\n")
  15.         fprintf(enumFormPort "HEADER "Enum Test"\n\n")
  16.         Desing_Layers=(axlGetParam("paramLayerGroup:ETCH")->groupmembers)
  17.    fprintf(enumFormPort "POPUP <Layer_Names>")
  18.         foreach(Item Desing_Layers
  19.     if(Item=="BOTTOM" then
  20.      (fprintf enumFormPort ""%s"" Item)
  21.      (fprintf enumFormPort ""%s".\n" Item)
  22.      else
  23.      (fprintf enumFormPort ""%s"" Item)
  24.      (fprintf enumFormPort ""%s"," Item)
  25.     )
  26.     )        
  27.         fprintf(enumFormPort "TILE\n\n")
  28.         fprintf(enumFormPort "FIELD Layer\n")
  29.         fprintf(enumFormPort "FLOC 1 1\n")
  30.         fprintf(enumFormPort "ENUMSET 11 10\n")        
  31.         fprintf(enumFormPort "OPTIONS prettyprint\n")
  32.         fprintf(enumFormPort "POP "Layer_Names"\n")        
  33.         fprintf(enumFormPort "ENDFIELD\n\n")

  34.         fprintf(enumFormPort "ENDTILE\n")
  35.         fprintf(enumFormPort "ENDFORM\n")
  36.         close(enumFormPort)
  37. )
复制代码
在使用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来改变当前活动层。
具体请参考以下代码:
  1. FILE_TYPE=FORM_DEFN VERSION=2
  2. FORM
  3. FIXED
  4. PORT 20 50
  5. HEADER "ENUM TEST"

  6. POPUP <class>"class""class"
  7. POPUP <subclass>"subclass""subclass"
  8. TILE

  9. TEXT "Active Class and Subclass:"
  10. TLOC 1 1
  11. ENDTEXT

  12. FIELD class
  13. FLOC 5 4
  14. ENUMSET 19
  15. OPTIONS prettyprint
  16. POP "class"
  17. ENDFIELD

  18. FIELD subcolor
  19. FLOC 2 7
  20. COLOR 2 1
  21. OPTIONS colorchooser
  22. ENDFIELD

  23. FIELD subclass
  24. FLOC 5 7
  25. ENUMSET 19
  26. POP "subclass"
  27. OPTIONS prettyprint ownerdrawn
  28. ENDFIELD

  29. ENDTILE
  30. ENDFORM
复制代码
当我们使用axlMiniStatusLoad加载时,显示效果如下:
enum_miniState.png

注: subcolor用来显示subclass层的颜色。
enum_test.rar (1.39 KB, 下载次数: 166)
发表于 2015-4-19 20:27:52 来自手机 | 显示全部楼层
罗老师,发现一处笔误和一处可以优化的地方。笔误:获取layername时的关键字groupmembers中的第一个m应为大写,正确应为groupMembers;定义popup时,判断是否是最后一层时用的判断条件为是否等于字符串BOTTOM,虽然大部分用户定义走线层时会用BOTTOM,但是难免会有人不这么做,这时候就会出现bug,我认为改为car(last(Design_Layers))会更准确点。

评分

参与人数 1SKILL币 +4 收起 理由
vivienluo + 4 赞一个!

查看全部评分

发表于 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吗。
 楼主| 发表于 2013-6-10 22:19:38 | 显示全部楼层
chuankay 发表于 2013-6-10 20:38
看楼主用 fprintf(enumFormPort "POPUP \"class\"\n\n") 定义一个空pop,为什么不使用skill推荐的方式呢:P ...

如果省略dispatch的话,那么display/dispatch为同一个值。。
发表于 2013-8-17 05:43:36 | 显示全部楼层
谢谢楼主!
发表于 2014-11-28 11:32:16 | 显示全部楼层
很不错,谢谢!
发表于 2015-1-28 10:36:47 | 显示全部楼层
罗老师,我用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是为啥啊
发表于 2015-8-12 14:29:28 | 显示全部楼层
罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示function emnutest redefined function enumFormCreate redefined,这是什么原因啊?没有出现窗体
 楼主| 发表于 2015-8-12 22:02:41 | 显示全部楼层
wuyuhe 发表于 2015-8-12 14:29
罗老师,我遇到的情况与PCN1216083420同学的一样,用axlMiniStatusLoad加载,窗体没有出现,调试窗口显示fu ...

1.可能因为FORM文件有误
2.可能是你的执行axlMiniStatusLoad函数后,就直接退出自定义的函数了,不是处在等待状态,你试试在form后面增加一个选择函数。这种情况比较多。这个与一般加载form不一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-26 14:11 , Processed in 0.153669 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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