找回密码
 注册
查看: 996|回复: 27
打印 上一主题 下一主题

Form怎么写?

[复制链接]
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2022-2-20 18:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    如题,看了一下参考文件,不太懂,就知道Form可以单独写成一个form文件在程序中调用,也可以嵌入程序。现在我的需求是要一个对话框设置a、b、c三个参数供程序使用,倾向于嵌入程序,大神动动手指头指导一下吧
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    推荐
    发表于 2022-2-21 18:45 | 只看该作者
    最简单的就是
    先不看手册。
    第一步,看看别人写的源码。抄过来改改。(越简单的越好)
    第二步,看看cadence自带的form.il,边运行边研究。
    第三步,看help文档,熟悉每一个还不了解的字段代表的含义。

    增加form需要三部分。
    第一,form文件,可以单独一个文件,也可以程序里新建一个文件,然后删掉。
    第二,form的响应函数,也就是说点击form里面的按钮,下拉框,之类的怎么处理。
    第三,主程序里的使用。也分几步,先create form,再display form,最后设置值set form field,以及获取值get form field

    点评

    谢谢这位兄弟~按照这个思路,从简单的入手,单独写了一个非常单一的form,功能只有一个,输入一个参数到主程序中。现在功能是实现了,但是应该还是有比较大的问题的。 1. 在窗体修改了默认值以后,点OK后println(p)  详情 回复 发表于 2022-2-24 16:58
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    推荐
     楼主| 发表于 2022-3-16 22:21 | 只看该作者
    db-_- 发表于 2022-3-16 19:22
    1 如果是选择上面的网络,下面显示数量, 那么axlFormListGetSelCount这部分代码应该放在"nets_selected"下 ...

    应该是我表述不清。Form可能调整,所以单独写的:net_selector.form………………


    FILE_TYPE=FORM_DEFN VERSION=2
    FORM
    FIXED
    PORT 49 50

    HEADER "Nets Selector"
    TILE

    TEXT "Select the nets"
    TLOC 5 1
    ENDTEXT

    FIELD nets_list
    FLOC 5 3
    LIST "" 40 5
    OPTIONS multiselect
    ENDFIELD

    TEXT "Nets selected"
    TLOC 5 13
    ENDTEXT

    FIELD nets_selected
    FLOC 5 15
    LIST "" 40 5
    ENDFIELD

    TEXT Selected:
    TLOC 5 25
    ENDTEXT

    TEXT
    FLOC 23 25
    INFO Cnt 10
    ENDTEXT

    FIELD done
    FLOC 10 28
    MENUBUTTON "Next" 9 3
    ENDFIELD

    FIELD cancel
    FLOC 30 28
    MENUBUTTON "Cancel" 8 3
    ENDFIELD

    ENDTILE
    ENDFORM


    ………………

    FIELD nets_list用于列出所有net供选择,选中的网络出现在FIELD nets_selected中,然后TEXT Selected:后面的空格显示选中的net数量。

    现在我的skill完成了列出net,但是选中net并不会出现在FIELD nets_selected中,更没有显示net数量。另外对应的case里面增加函数,这个不明白
    下面是skill代码:
    ………………

    axlCmdRegister("seglength_check" 'seglength_check)

    defun( seglength_check ()

      net_form=axlFormCreate((gensym) "net_selector.form" '(n inner) 'net_selector_callback t)
      nets=axlDBGetDesign()->nets
      nets_name=list()
      i=0
      while( (i<=length(nets)-1)
      nets_name=cons(nth(i nets)->name nets_name)
      i=i+1
      )

    axlFormSetField(net_form "nets_list" nets_name)     
    axlFormDisplay(net_form)
    )

    defun( net_selector_callback (net_form)
          case(net_form->curField
              ("nets_list"
              net_s=net_form->curField            
              )
              ("nets_selected"
              axlFormSetField(net_form "nets_selected" net_s)

              )
              ("Cnt"
              Num=axlFormListGetSelCount(net_form "nets_selected")
                    sprintf(item "Num = %L" Num)
                    axlFormSetField(net_form "listnet" item)         
              )
              ("done"
               Nets=axlFormGetField(net_form "nets_selected")
               axlFormClose(net_form)           
              )
              ("cancel"
               axlFormClose(net_form)           
              )

          )   
    )

    defun( main ()

        println(Nets)   

    )


    ………………

    我希望点击Next(done)的时候继续运行下面的main函数,输出选中的net名称。
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    推荐
    发表于 2022-3-17 18:19 | 只看该作者
    mycoal 发表于 2022-3-16 22:21
    应该是我表述不清。Form可能调整,所以单独写的:net_selector.form………………
    1. axlCmdRegister("seglength_check" 'seglength_check)

    2. defun( seglength_check ()

    3.   net_form=axlFormCreate((gensym) "net_selector.form" '(n inner) 'net_selector_callback t)
    4.   nets=axlDBGetDesign()->nets
    5.   nets_name=list()
    6.   i=0
    7.   while( (i<=length(nets)-1)
    8.           nets_name=cons(nth(i nets)->name nets_name)
    9.           i=i+1
    10.   )

    11. axlFormSetField(net_form "nets_list" nets_name)     
    12. axlFormDisplay(net_form)
    13. )

    14. defun( net_selector_callback (net_form)
    15.       case(net_form->curField
    16.           ("nets_list"
    17.                         ;net_s=net_form->curField   
    18.                                 axlFormListDeleteAll(net_form "nets_selected")
    19.                                 axlFormSetField(net_form "nets_selected"  axlFormListGetSelItems(net_form "nets_list"))
    20.                                  
    21.                                  Num = axlFormListGetSelCount(net_form "nets_list")
    22.                 sprintf(item "Num = %L" Num)
    23.                 axlFormSetField(net_form "Cnt" item)   
    24.           )
    25.           ("nets_selected"
    26.                        
    27.                  

    28.           )
    29.           ("Cnt"
    30.               
    31.           )
    32.           ("done"
    33.            Nets = axlFormGetField(net_form "nets_selected")
    34.                    main()
    35.            axlFormClose(net_form)           
    36.           )
    37.           ("cancel"
    38.            axlFormClose(net_form)           
    39.           )

    40.       )   
    41. )

    42. defun( main ()

    43.     println(Nets)   

    44. )
    复制代码


    点评

    直接用axlFormGetField获取"nets_selected"好像不行,下面这样就可以 ("done" axlFormListSelAll(net_form "nets_selected" t) Nets=axlFormListGetSelItems(net_form "nets_s  详情 回复 发表于 2022-3-18 09:35
    发现还有个问题,选中了网络,nets_selected里也显示了,点Next以后输出的Nets是空的,也就是并没有获取到nets_selected的东西,按理说我这里的Nets是全局变量,应该有内容才对的。  详情 回复 发表于 2022-3-17 21:21
    可以了,是我自己的form路径没设置对才出现那个问题。多谢多谢  详情 回复 发表于 2022-3-17 20:50
    运行报E- *Error* axlFormSetField: argument #1 should be any user-defined (other) type (type template = "otg") - nil 三个axlFormSetField函数没看出来参数有什么不对……  详情 回复 发表于 2022-3-17 20:39

    该用户从未签到

    2#
    发表于 2022-2-21 11:25 | 只看该作者
    创建一个窗体Form1.cs 后,在他的下一级,有两个子文件: Form1.Designer.cs 和Form1.resx 这两个子文件


    Form1.Designer.cs是VS自动生成用作UI的绘制以及事件绑定的代码;
    Form1.resx可以用来存储资源,比如窗体上的字符串、图片等。

    Form1.designer.cs 是对应Form1.cs的,他实际上是Form1那个Form1类的一部分,里面主要的方法 private void InitializeComponent()内部是把你 通过设计器 拖拽过去的 控件在这里实现,也就是说实际上你拖一个控件,这边对应生成代码,然后 在Form1 的 构造器里调用他,所以你接着就可以在 form1.cs 内部 访问到这些 控件了;

    Form1.resx 是资源导入用的 比如一些图片和 音乐之类的 你可以通过它导入到项目中 这样 生成的时候 就 不需要引用外部的文件了

    点评

    谢谢~不过好像超出了我能理解的范畴 我现在的水平:按部就班写了两三个简单功能的skill,通篇一个defun搞定,交互界面零基础。 现在的需求:最简单的交互,程序中的某个参数,需要人工设置数值,那么我  详情 回复 发表于 2022-2-21 17:03
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2022-2-21 17:02 | 只看该作者
        谢谢~不过好像超出了我能理解的范畴
        我现在的水平:按部就班写了两三个简单功能的skill,通篇一个defun搞定,交互界面零基础。
        现在的需求:最简单的交互,程序中的某个参数,需要人工设置数值,那么我需要一个对话框,能输入数值,这个数值能传递到程序里就可以了。这应该在程序里直接嵌入比较方便是吗?    也是想通过这么一个简单的对话框,来理解一下form,参考文件看起来好吃力。
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
     楼主| 发表于 2022-2-21 17:03 | 只看该作者
    ESCAPE 发表于 2022-2-21 11:25
    创建一个窗体Form1.cs 后,在他的下一级,有两个子文件: Form1.Designer.cs 和Form1.resx 这两个子文件

    ...

    谢谢~不过好像超出了我能理解的范畴
        我现在的水平:按部就班写了两三个简单功能的skill,通篇一个defun搞定,交互界面零基础。
        现在的需求:最简单的交互,程序中的某个参数,需要人工设置数值,那么我需要一个对话框,能输入数值,这个数值能传递到程序里就可以了。这应该在程序里直接嵌入比较方便是吗?    也是想通过这么一个简单的对话框,来理解一下form,参考文件看起来好吃力。
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2022-2-24 16:58 | 只看该作者
    db-_- 发表于 2022-2-21 18:45
    最简单的就是
    先不看手册。
    第一步,看看别人写的源码。抄过来改改。(越简单的越好)

    谢谢这位兄弟~按照这个思路,从简单的入手,单独写了一个非常单一的form,功能只有一个,输入一个参数到主程序中。现在功能是实现了,但是应该还是有比较大的问题的。
    1. 在窗体修改了默认值以后,点OK后println(p)会输出两次,不在预期内;
    2. 重新运行一次,如果不修改默认值,println(p)输出的并不是默认值,而是上次修改的值,这是有问题的。
    能帮我看下是怎么回事吗?下面是form文件和il文件。

    ##set_parameter.form:

    FILE_TYPE=FORM_DEFN VERSION=2
    FORM
    FIXED
    PORT 35 13
    HEADER "Setting parameters"
    TILE
    TEXT "Enter the parameter!"
    TLOC 3 1
    ENDTEXT
    TEXT "Value of parameter:"
    TLOC 3 3
    ENDTEXT
    FIELD parameter
    FLOC 20 3
    STRFILLIN 10 10
    ENDFIELD
    FIELD done
    FLOC 7 6
    MENUBUTTON "Done" 8 3
    ENDFIELD
    FIELD cancel
    FLOC 22 6
    MENUBUTTON "Cancel" 8 3
    ENDFIELD
    ENDTILE
    ENDFORM



    ##set_parameter.il:

    axlCmdRegister("set_parameter"  'set_parameter)
    defun( set_parameter ()
    user_form=axlFormCreate((gensym) "set_parameter.form" '(n inner) 'user_callback t);调用写好的set_parameter.form
    axlFormSetField(user_form "parameter" 100);设置默认值
    axlFormDisplay(user_form);显示窗体
    )

    defun( user_callback (user_form)
    case(user_form->curField
    ("parameter" p=user_form->curValue
    )
    ("done" axlFormClose(user_form)
    )
    ("cancel" axlFormClose(user_form)
    nil)
    )
    println(p)
    )


    无标题.gif (19.41 KB, 下载次数: 3)

    无标题.gif
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    7#
    发表于 2022-2-24 17:42 | 只看该作者
    defun( user_callback (user_form)
            case(user_form->curField
                    ("parameter"
                            p=user_form->curValue
                    )
                    ("done"
                            p = axlFormGetField(user_form "parameter")
                            println(p)
                            axlFormClose(user_form)
                    )
                    ("cancel"
                            axlFormClose(user_form)
                    )
            )
           
    )
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    8#
    发表于 2022-2-24 18:20 | 只看该作者
    之所以打印两次,是因为你点编辑框会进去一次,再点ok,又进了一次。当切换到pcb界面时一块打印出来了。自己加个user_form->curField的打印就能看出来。

    你的p是全部变量,所以如果不手动读取,就会保持上一次的值。如果改为局部变量,就会是默认值nil。不管哪种都需要加个get field,才是你想要的值。

    点评

    老哥,又来求教了两个跟Form有关的问题: 1. 如图,想做一个网络等长match group的工具,列举所有网络已经可以了,但选取目标网络到下面的框里没成功,麻烦帮看下的问题: defun( net_selector_callback  详情 回复 发表于 2022-3-16 16:35
    多谢热心解惑!非常感激  详情 回复 发表于 2022-2-25 13:36
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    9#
     楼主| 发表于 2022-2-25 13:36 | 只看该作者
    db-_- 发表于 2022-2-24 18:20
    之所以打印两次,是因为你点编辑框会进去一次,再点ok,又进了一次。当切换到pcb界面时一块打印出来了。自 ...

    多谢热心解惑!非常感激
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2022-3-16 16:35 | 只看该作者
    本帖最后由 mycoal 于 2022-3-16 16:41 编辑
    db-_- 发表于 2022-2-24 18:20
    之所以打印两次,是因为你点编辑框会进去一次,再点ok,又进了一次。当切换到pcb界面时一块打印出来了。自 ...

    老哥,又来求教了两个跟Form有关的问题:
    1. 如图,想做一个网络等长match group的工具,列举所有网络已经可以了,但选取目标网络到下面的框里没成功,麻烦帮看下的问题:
    defun( net_selector_callback (net_form)
          case(net_form->curField
              ("nets_list"
              net_s=net_form->curField
                event=0
              )
              ("nets_selected"
              axlFormSetField(net_form "nets_selected" net_s)
                event=0
              )
              ("listnet";这里是想在Next按钮上方Selected:后面动态显示选取的网络数量
              Num=axlFormListGetSelCount(net_form "nets_selected")
                    sprintf(item "Num = %L" Num)
                    axlFormSetField(net_form "listnet" item)
              event=0
              )
              ("done"
               Nets=axlFormGetField(net_form "nets_selected")
               axlFormClose(net_form)
               event=1
              )
              ("cancel"
               axlFormClose(net_form)
               event=0
              )

          )


          if( event==1
          then println(Nets)
          else)
    )

    2. 函数调用和程序流向问题:如上方代码,form的每个case加了一个event,根据不同的赋值,再用了一个if来确定后面主程序是否执行。虽然也可以,但是感觉很low;如果直接后面接着后续的主程序,不论form什么操作都会继续执行,但是另外创建函数,跟前面没关系好像不会执行。那么常规是怎么做的呢?指点一下,或者给个简单例子学习下,谢谢~

    无标题.png (18.95 KB, 下载次数: 1)

    无标题.png

    点评

    1 如果是选择上面的网络,下面显示数量, 那么axlFormListGetSelCount这部分代码应该放在"nets_selected"下面吧. 代码不完整, 描述也没太听明白. 2 一般主程序和form不会同时运行的. 主程序一般退出,或者等待done/can  详情 回复 发表于 2022-3-16 19:22
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    11#
    发表于 2022-3-16 19:22 | 只看该作者
    mycoal 发表于 2022-3-16 16:35
    老哥,又来求教了两个跟Form有关的问题:
    1. 如图,想做一个网络等长match group的工具,列举 ...

    1 如果是选择上面的网络,下面显示数量, 那么axlFormListGetSelCount这部分代码应该放在"nets_selected"下面吧. 代码不完整, 描述也没太听明白.
    2 一般主程序和form不会同时运行的. 主程序一般退出,或者等待done/cancel命令. form自己跑自己的就行. 另设置一个函数, 放在case对应的filed里面就可以.

    点评

    第二个问题搞懂了。  详情 回复 发表于 2022-3-17 15:18
    应该是我表述不清。Form可能调整,所以单独写的:net_selector.form……………… FILE_TYPE=FORM_DEFN VERSION=2 FORM FIXED PORT 49 50 HEADER "Nets Selector" TILE TEXT "Select the nets" TLOC  详情 回复 发表于 2022-3-16 22:21
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    13#
     楼主| 发表于 2022-3-17 15:18 | 只看该作者
    本帖最后由 mycoal 于 2022-3-17 15:19 编辑
    db-_- 发表于 2022-3-16 19:22
    1 如果是选择上面的网络,下面显示数量, 那么axlFormListGetSelCount这部分代码应该放在"nets_selected"下 ...

    第二个问题搞懂了,只需要在case “done”下面增加main ()就可以了,试了下是可以的。
  • TA的每日心情
    开心
    2021-9-16 15:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    15#
     楼主| 发表于 2022-3-17 20:39 | 只看该作者

    运行报E- *Error* axlFormSetField: argument #1 should be any user-defined (other) type (type template = "otg") - nil
    三个axlFormSetField函数没看出来参数有什么不对……
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-5-24 22:00 , Processed in 0.093750 second(s), 30 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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