Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 83|回复: 7

quick_danglings.il代码解析form部分

[复制链接]
发表于 2025-2-17 14:28:49 | 显示全部楼层 |阅读模式
axlCmdRegister( "quick_danglings" 'quick_danglings ?cmdType "general" )

defvar( psmddo_HELPPAGE "http://www.eda365.com/") ;defvar( s_varName [ g_value ] )定义全局变量,并赋予值or 空


; load("quick_danglings.il")

procedure( quick_danglings(  )
  let(
    ( lDanglingLine
      lDanglingVia
      lIslandShape
      ps_DanglingForm
      ps_DanglingForm_file
      ps_DanglingForm_Port
      lDanglingObject
    );let函数定义局部变量

    when( axlOKToProceed() ;如果Allegro返回t,PCB编辑器已准备好正确执行SKILL命令,否则返回nil。
        axlMsgPut("quick_danglings from www.eda365.com" );axlMsgPut( g_message_format [g_arg1 ...] )将消息放入日志文件中

        lDanglingObject = ps_ddoCheck()
        lDanglingLine = car(lDanglingObject)
        ;car(l_list):car( '(a b c) ) => a;car( '((a b c)) => (a b c);car(nil) => nil;
        ;返回列表lDanglingObject的第一个元素,不会改变列表lDanglingObject的内容。
        lDanglingVia = cadr(lDanglingObject)
        ;SKILL使用a和d的任意组合实现所有c…r函数,最多四个字符.cadr is equivalent to car( cdr( l_list))).
        ;举例cdr( '((a b c)) => nil;cdr( '(a b c) ) => (b c);
        lIslandShape = caddr(lDanglingObject)
        ;caddr is equivalent to car( cdr( cdr( l_list))).
        ;举例caddr('(((1 2 3)(4 5 6))(7 8 9))) => nil;cadr('(((1 2 3)(4 5 6))(7 8 9)))=> (7 8 9);
        
        if( lDanglingVia || lDanglingLine || lIslandShape then     
                ;if(g_condition  g_thenExpression  [ g_elseExpression ])   
                ;if(g_condition  then g_thenExpr1 ...  [ else g_elseExpr1 ... ])         
          ps_DanglingForm_file = strcat( axlTempDirectory() "./ps_DanglingForm.form" )
          ;strcat(S_string1 [ S_string2 ... ])接收输入字符串或符号并将其连接起来。举例strcat( "l" "ab" "ef" ) => "labef";
          ;返回当前平台的临时目录,和后面字符串合并形成的新字符串作为断头线ps_DanglingForm_file文件路径
          ps_DanglingForm_Port= outfile( ps_DanglingForm_file "w" )
          ;outfile的功能是打开一个输出端口,准备写入文件。
          ;outfile(S_fileName要打开或创建的文件的名称 [ t_mode ] [ g_openHiddenFile如果指定为非nil,则强制使用指定的Windows隐藏文件打开 ])
          ;必须指定t_mode选项(仅指定为w创建新文件写入且任何存在的文件被覆盖或a-打开现有文件增加)
          ; 创建新文件覆盖ps_DanglingForm_file文件   
          fprintf( ps_DanglingForm_Port "FILE_TYPE=FORM_DEFN VERSION=2\n" ) ; 这行内容不能修改,且必须出现在FORM文件的第一行
          fprintf( ps_DanglingForm_Port "FORM\n" )     
;FORM [form_options]表示FORM开始,FORM到ENDFORM为FORM之间的内容。
          fprintf( ps_DanglingForm_Port "FIXED\n" )    ;“formtype”有两个选择,一个为“FIXED” 另一个为 “VARIABLE”,但SKILL只支持“FIXED”类型,所以默认该部分填写“FIXED”
          fprintf( ps_DanglingForm_Port "PORT 42 42\n" )    ;“PORT w h” 用于描述FORM的高度和宽度。其中“w-width”描述的是宽度,“h-height”描述的是高度,可根据需要填写。
          fprintf( ps_DanglingForm_Port "HEADER \"Delete Dangling Design Objects\"\n" )  ; “HEADER "text"” FORM标题栏显示的字符,将"text"替换为自己需要的字符串。
          ;form_header包含以下三个选项1)[{default_button_def}]定义默认按键标签 2)[{popup_def}] 3)[{message_def}]
          fprintf( ps_DanglingForm_Port "TILE\n" )
;必须有ENDTILE结束,否则产生错误。
          ;“{tile_def}”这是FORM的主要部分,FORM上的各个控件都在该部分定义,比如标签、文本框、按键等。
          ;TILE [<tileLabel>];[TPANEL tileType];[{text_def}];[{group_def}];[{field_def}];[{button_def}];[{grid_def}];[{glex_def}]

          fprintf( ps_DanglingForm_Port "FIELD ddoRefresh\n" )            ;定义一个FIELD字段,字段名为ddoRefresh
          fprintf( ps_DanglingForm_Port "FLOC 2 39\n" )                   ;FIELD定义位置
          ;LOC是location(位置)的缩写。
          ;FLOC 是为FIELD 定义坐标的,因为FIELD第一个字母是F;TLOC 是为TEXT 定义坐标的,因为TEXT第一个字母是T
          ;比如GROUP,那么就使用GLOC定义坐标。
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Refresh\" 10 3\n" ) ;定义一个按键,按键名为“Refresh”,长宽分别为10 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

          fprintf( ps_DanglingForm_Port "FIELD ddoHelp\n" )               ;定义一个FIELD字段,字段名为ddoHelp
          fprintf( ps_DanglingForm_Port "FLOC 16 39\n" )                  ;FIELD定义位置x=16,y=39   
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Help\" 10 3\n" )    ;定义一个按键,按键名为“Help”,长宽分别为10 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

          fprintf( ps_DanglingForm_Port "FIELD ddoClose\n" )              ;定义一个FIELD字段,字段名为ddoClose
          fprintf( ps_DanglingForm_Port "FLOC 30 39\n" )                  ;FIELD定义位置x=30,y=39
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Close\" 10 3\n" )   ;定义一个按键,按键名为“Close”,长宽分别为10 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

          fprintf( ps_DanglingForm_Port "TEXT \"Tool from www.eda365.com\"\n" )   ;定义一个文本,文本内容Tool from www.eda365.com
          fprintf( ps_DanglingForm_Port "FLOC 2 1\n" )                            ;FIELD定义位置???
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                             ;文本结束

          fprintf( ps_DanglingForm_Port "TABSET tset\n     FLOC 2 3\n      FSIZE 39 35\n")   ;定义一个TAB
                  
                  
                  ;cline:
          fprintf( ps_DanglingForm_Port "TAB \"Dangling Lines\" \n")  
;定义一个TAB,名字Dangling Lines
          fprintf( ps_DanglingForm_Port "TEXT \"Dangling Line:\"\n" )       ;定义一个文本,文本内容Dangling Line:
          fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )                      ;TEXT 定义坐标的
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                       ;文本结束

          fprintf( ps_DanglingForm_Port "TEXT \n" )                         ;定义一个文本      
          fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )                     ;FIELD定义位置???
          fprintf( ps_DanglingForm_Port "INFO ddoLineInfo 10\n" )           
          ;INFO文本???
          ;ddoLineInfo断头线数量信息
          ;后面有程序axlFormSetField( ps_DanglingForm "ddoLineInfo" length(lDanglingLine) )
          ;10 应该是字体大小???
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                       ;文本结束

          fprintf( ps_DanglingForm_Port "FIELD ddoLineList\n" )             ;定义一个FIELD字段,字段名为ddoLineList
          fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )                      ;FIELD定义位置
          fprintf( ps_DanglingForm_Port "LIST \"\" 34 14\n" )               ;定义一个LIST,内容\,位置34 14  短路线的list内容
          fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )           ;OPTIONS multiselect多选下拉菜单组件,可以多选断头线的选项
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                      ;FIELD字段结束

          fprintf( ps_DanglingForm_Port "FIELD ddoLinesDel\n" )             ;定义一个FIELD字段,字段名为ddoLinesDel
          fprintf( ps_DanglingForm_Port "FLOC 13 30\n" )                    ;FIELD定义位置
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Delete\" 12 3\n" )    ;定义一个按键,按键名为“Delete”,长宽分别为12 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                      ;FIELD字段结束            

          fprintf(ps_DanglingForm_Port "ENDTAB\n")                          
;TAB结束
                  
                  
                  
                  ;via

          fprintf(ps_DanglingForm_Port "TAB \"Dangling Vias\" \n")
;定义一个TAB,名字Dangling Vias
          fprintf( ps_DanglingForm_Port "TEXT \"Dangling Vias:\"\n" )
          fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

          fprintf( ps_DanglingForm_Port "TEXT \n" )
          fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )
          fprintf( ps_DanglingForm_Port "INFO ddoViaInfo 10\n" )               
          ;INFO文本
          ;ddoViaInfo悬空过孔数量信息
          ;后面有程序axlFormSetField( ps_DanglingForm "ddoViaInfo" length(lDanglingVia) )
          ;10 应该是字体大小???
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

          fprintf( ps_DanglingForm_Port "FIELD ddoViaList\n" )
          fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )
          fprintf( ps_DanglingForm_Port "LIST \"\" 34 14\n" )
          fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )              ;OPTIONS multiselect多选下拉菜单组件,可以多选悬空过孔的选项
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

          fprintf( ps_DanglingForm_Port "FIELD ddoViasDel\n" )
          fprintf( ps_DanglingForm_Port "FLOC 2 30\n" )
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Delete\" 12 3\n" )       ;定义一个按键,按键名为“Delete”,长宽分别为12 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    

          fprintf( ps_DanglingForm_Port "FIELD ddoAssign\n" )
          fprintf( ps_DanglingForm_Port "FLOC 24 30\n" )
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Change Net\" 12 3\n" )   ;定义一个按键,按键名为“Change Net”,长宽分别为12 3
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

          fprintf(ps_DanglingForm_Port "ENDTAB\n")
;TAB结束
                  
                  ;shape

          fprintf(ps_DanglingForm_Port "TAB \"Island Shapes\" \n")
          fprintf( ps_DanglingForm_Port "TEXT \"Island Shapes:\"\n" )
          fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

          fprintf( ps_DanglingForm_Port "TEXT \n" )
          fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )
          fprintf( ps_DanglingForm_Port "INFO ddoShapeInfo 10\n" )
          ;INFO文本???
          ;ddoShapeInfo孤岛数量信息
          ;后面有程序axlFormSetField( ps_DanglingForm "ddoShapeInfo" length(lIslandShape) )
          ;10 应该是字体大小???      
   
          fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

          fprintf( ps_DanglingForm_Port "FIELD ddoShapeList\n" )
          fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )
          fprintf( ps_DanglingForm_Port "LIST \"\" 34 14\n" )
          fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

          fprintf( ps_DanglingForm_Port "FIELD ddoShapesDel\n" )
          fprintf( ps_DanglingForm_Port "FLOC 13 30\n" )
          fprintf( ps_DanglingForm_Port "MENUBUTTON \"Delete\" 12 3\n" )
          fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    

          fprintf(ps_DanglingForm_Port "ENDTAB\n")

          fprintf(ps_DanglingForm_Port "ENDTABSET\n")

          fprintf( ps_DanglingForm_Port "ENDTILE\n" )  ;ENDTILE与前面TILE照应,表示TILE结束
          fprintf( ps_DanglingForm_Port "ENDFORM\n" )  ;ENDFORM与前面FORM照应,表示FORM结束

          close( ps_DanglingForm_Port ) ;排空、关闭和释放端口。关闭文件时,它会释放与p_port关联的file*。
          ;不要使用此函数在piport、poport、stdin、stdout和stderr上。

          ps_DanglingForm = axlFormCreate( (gensym) ps_DanglingForm_file '(e outer) 'ps_DanglingForm_action t)
          ;axlFormCreate(s_formHandle  t_formfile/(t_formName t_contents)  [lt_placement]  g_formAction  g_nonBlock  [g_stringOption])
          ;支持“fixed”类型的表单,如果t_formfile包含任何可变图块,则会失败。
          ;这个函数不显示表单。请使用axlFormDisplay显示表单。
          ;支持另一种接口,允许将表单文件的内容嵌入到skill代码。
          ;s_formHandle代表FORM的句柄,就是该FORM在那个窗口上显示,一般这个参数我们使用 (gensym)
          ;t_formfile代表FORM文件的完整路径,即form文件路径为ps_DanglingForm_file字符串内容。
          ;[lt_placement] :可选参数,这个代表FORM的显示位置。当使用nil 时,allegro会调用默认的位置显示。
;下面是位置参数(注,使用的时候选择括号中的字母即可)
;north(n) northeast(ne) east(e) southeast(se) south(s) southwest(sw) west(w) northwest(nw) center(c)
          ;[lt_placement] 选择Inner or Outer 设置FORM显示在ALLEGRO里面还是外面,默认为里面即 Inner
          ;g_formAction  对FORM所有触发事件响应的函数,比如对点击某个按钮,则会执行该函数。事件函数为ps_DanglingForm_action
          ;g_nonBlock 可设置FORM是否在non-blocking模式下运行。
          ;[g_stringOption] 可选参数,如果为t,那么form返回的所有值都为string格式。一般设置为nil

          axlFormSetField( ps_DanglingForm "ddoLineList" lDanglingLine )
          ;axlFormSetField(r_form  t_field  g_value/nil) 在开放的FORM表r_form里,将t_field设置为g_value值
          ;即ps_DanglingForm里,把"ddoLineList"列表设置为lDanglingLine 【其中 lDanglingLine = car(lDanglingObject),即lDanglingObject列表的第一个元素】   
;r_form Form dbid.开放的FORM表r_form
;t_field 字段名称。字段名是字符串或符号。
;字段名有多种,有List Field(field is named "list");Color field (field is named "color");Tab field (field is named "tab")等
;g_value 字段的期望值。可以是字符串、布尔值、整数或浮点数或列表;字段类型的函数。
          axlFormSetField( ps_DanglingForm "ddoViaList" lDanglingVia )
          axlFormSetField( ps_DanglingForm "ddoShapeList" lIslandShape )
          axlFormSetField( ps_DanglingForm "ddoLineInfo" length(lDanglingLine) )  ;断头线数量
          axlFormSetField( ps_DanglingForm "ddoViaInfo" length(lDanglingVia) )    ;悬空过孔数量
          axlFormSetField( ps_DanglingForm "ddoShapeInfo" length(lIslandShape) )  ;孤岛数量
          axlFormColorize( ps_DanglingForm "ddoLineInfo" 'text 'red )             ;断头线数量信息高亮成红色
          axlFormColorize( ps_DanglingForm "ddoViaInfo" 'text 'red )              ;悬空过孔数量信息高亮成红色
          axlFormColorize( ps_DanglingForm "ddoShapeInfo" 'text 'red )            ;孤岛数量信息高亮成红色

          axlFormDisplay( ps_DanglingForm )         ;axlFormSetField函数不显示表单,使用axlFormDisplay显示表单。
          when( lDanglingLine
            axlMsgPut(sprintf(nil "E- %d Dangling Lines, check Dangling Lines Tab" length(lDanglingLine) ))
          )  ;在allegro的状态栏里输出断头线数量
          when( lDanglingVia
            axlMsgPut(sprintf(nil "E- %d Dangling Via, check Dangling Vias Tab" length(lDanglingVia) ))
          )  ;在allegro的状态栏里输出悬空过孔数量
          when( lIslandShape
            axlMsgPut(sprintf(nil "E- %d Island Shape, check Island Shapes Tab" length(lIslandShape) ))
          )  ;在allegro的状态栏里输出孤岛数量
          axlUIWPrint( ps_DanglingForm "Select Dangling, Island Line/Via/Shape..." )
          ;axlUIWPrint(r_window/nil  t_formatString  [g_arg1 ...])
          ;UIW-User Interface window用户界面窗口
          ;r_window/nil消息显示在主窗口外,为空则在主窗口显示,此处为ps_DanglingForm,显示在主窗口外的FORM表ps_DanglingForm窗口上
          ;t_formatString 替换参数为字符串"Select Dangling, Island Line/Via/Shape...",这个是FORM表ps_DanglingForm窗口上的增加的内容,位置默认在最下脚。
          ;[g_arg1 ...]打印任意数量的替换参数t_formatString
          axlUIWDisableQuit(ps_DanglingForm);axlUIDisableQuit(o_window) 禁用系统菜单“退出”选项,因此用户无法选择它来关闭窗口。就是不能直接关掉ps_DanglingForm窗口
          deleteFile(ps_DanglingForm_file);将创建的ps_DanglingForm_file文件删除
        else
          axlMsgPut("I- No dangling, island line/via/shape problems")  ;在allegro的状态栏里输出I- No dangling, island line/via/shape problems
        ); end if lDanglingVia || lDanglingLine || lIslandShape
    ); end when
  ); end let
); end quick_danglings


;FORM编程的一般步骤
;1.创建form文件
;可以自己提前将 FORM 代码写到单独的form文件,或者将代码嵌入到SKILL文件中,在SKILL执行过程中创建form文件 。
;2.使用 axlFormCreate 函数打开 FORM
;3.使用 axlFormSetField 函数初始化 FORM 中的各个字段
;4.使用 axlFormDisplay 函数显示 FORM
;5.使用 axlFormCallback 与用户交互
;6.使用 axlFormClose 关闭 FROM
 楼主| 发表于 2025-2-17 14:30:47 | 显示全部楼层
  1. axlCmdRegister( "quick_danglings" 'quick_danglings ?cmdType "general" )

  2. defvar( psmddo_HELPPAGE "http://www.eda365.com/") ;defvar( s_varName [ g_value ] )定义全局变量,并赋予值or 空


  3. ; load("quick_danglings.il")

  4. procedure( quick_danglings(  )
  5.   let(
  6.     ( lDanglingLine
  7.       lDanglingVia
  8.       lIslandShape
  9.       ps_DanglingForm
  10.       ps_DanglingForm_file
  11.       ps_DanglingForm_Port
  12.       lDanglingObject
  13.     );let函数定义局部变量

  14.     when( axlOKToProceed() ;如果Allegro返回t,PCB编辑器已准备好正确执行SKILL命令,否则返回nil。
  15.         axlMsgPut("quick_danglings from www.eda365.com" );axlMsgPut( g_message_format [g_arg1 ...] )将消息放入日志文件中

  16.         lDanglingObject = ps_ddoCheck()
  17.         lDanglingLine = car(lDanglingObject)
  18.         ;car(l_list):car( '(a b c) ) => a;car( '((a b c)) => (a b c);car(nil) => nil;
  19.         ;返回列表lDanglingObject的第一个元素,不会改变列表lDanglingObject的内容。
  20.         lDanglingVia = cadr(lDanglingObject)
  21.         ;SKILL使用a和d的任意组合实现所有c…r函数,最多四个字符.cadr is equivalent to car( cdr( l_list))).
  22.         ;举例cdr( '((a b c)) => nil;cdr( '(a b c) ) => (b c);
  23.         lIslandShape = caddr(lDanglingObject)
  24.         ;caddr is equivalent to car( cdr( cdr( l_list))).
  25.         ;举例caddr('(((1 2 3)(4 5 6))(7 8 9))) => nil;cadr('(((1 2 3)(4 5 6))(7 8 9)))=> (7 8 9);
  26.         
  27.         if( lDanglingVia || lDanglingLine || lIslandShape then     
  28.                 ;if(g_condition  g_thenExpression  [ g_elseExpression ])   
  29.                 ;if(g_condition  then g_thenExpr1 ...  [ else g_elseExpr1 ... ])         
  30.           ps_DanglingForm_file = strcat( axlTempDirectory() "./ps_DanglingForm.form" )
  31.           ;strcat(S_string1 [ S_string2 ... ])接收输入字符串或符号并将其连接起来。举例strcat( "l" "ab" "ef" ) => "labef";
  32.           ;返回当前平台的临时目录,和后面字符串合并形成的新字符串作为断头线ps_DanglingForm_file文件路径
  33.           ps_DanglingForm_Port= outfile( ps_DanglingForm_file "w" )
  34.           ;outfile的功能是打开一个输出端口,准备写入文件。
  35.           ;outfile(S_fileName要打开或创建的文件的名称 [ t_mode ] [ g_openHiddenFile如果指定为非nil,则强制使用指定的Windows隐藏文件打开 ])
  36.           ;必须指定t_mode选项(仅指定为w创建新文件写入且任何存在的文件被覆盖或a-打开现有文件增加)
  37.           ; 创建新文件覆盖ps_DanglingForm_file文件   
  38.           fprintf( ps_DanglingForm_Port "FILE_TYPE=FORM_DEFN VERSION=2\n" ) ; 这行内容不能修改,且必须出现在FORM文件的第一行
  39.           fprintf( ps_DanglingForm_Port "FORM\n" )     
  40. ;FORM [form_options]表示FORM开始,FORM到ENDFORM为FORM之间的内容。
  41.           fprintf( ps_DanglingForm_Port "FIXED\n" )    ;“formtype”有两个选择,一个为“FIXED” 另一个为 “VARIABLE”,但SKILL只支持“FIXED”类型,所以默认该部分填写“FIXED”
  42.           fprintf( ps_DanglingForm_Port "PORT 42 42\n" )    ;“PORT w h” 用于描述FORM的高度和宽度。其中“w-width”描述的是宽度,“h-height”描述的是高度,可根据需要填写。
  43.           fprintf( ps_DanglingForm_Port "HEADER "Delete Dangling Design Objects"\n" )  ; “HEADER "text"” FORM标题栏显示的字符,将"text"替换为自己需要的字符串。
  44.           ;form_header包含以下三个选项1)[{default_button_def}]定义默认按键标签 2)[{popup_def}] 3)[{message_def}]
  45.           fprintf( ps_DanglingForm_Port "TILE\n" )
  46. ;必须有ENDTILE结束,否则产生错误。
  47.           ;“{tile_def}”这是FORM的主要部分,FORM上的各个控件都在该部分定义,比如标签、文本框、按键等。
  48.           ;TILE [<tileLabel>];[TPANEL tileType];[{text_def}];[{group_def}];[{field_def}];[{button_def}];[{grid_def}];[{glex_def}]

  49.           fprintf( ps_DanglingForm_Port "FIELD ddoRefresh\n" )            ;定义一个FIELD字段,字段名为ddoRefresh
  50.           fprintf( ps_DanglingForm_Port "FLOC 2 39\n" )                   ;FIELD定义位置
  51.           ;LOC是location(位置)的缩写。
  52.           ;FLOC 是为FIELD 定义坐标的,因为FIELD第一个字母是F;TLOC 是为TEXT 定义坐标的,因为TEXT第一个字母是T
  53.           ;比如GROUP,那么就使用GLOC定义坐标。
  54.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Refresh" 10 3\n" ) ;定义一个按键,按键名为“Refresh”,长宽分别为10 3
  55.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

  56.           fprintf( ps_DanglingForm_Port "FIELD ddoHelp\n" )               ;定义一个FIELD字段,字段名为ddoHelp
  57.           fprintf( ps_DanglingForm_Port "FLOC 16 39\n" )                  ;FIELD定义位置x=16,y=39   
  58.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Help" 10 3\n" )    ;定义一个按键,按键名为“Help”,长宽分别为10 3
  59.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

  60.           fprintf( ps_DanglingForm_Port "FIELD ddoClose\n" )              ;定义一个FIELD字段,字段名为ddoClose
  61.           fprintf( ps_DanglingForm_Port "FLOC 30 39\n" )                  ;FIELD定义位置x=30,y=39
  62.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Close" 10 3\n" )   ;定义一个按键,按键名为“Close”,长宽分别为10 3
  63.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    ;结束FIELD定义

  64.           fprintf( ps_DanglingForm_Port "TEXT "Tool from www.eda365.com"\n" )   ;定义一个文本,文本内容Tool from www.eda365.com
  65.           fprintf( ps_DanglingForm_Port "FLOC 2 1\n" )                            ;FIELD定义位置???
  66.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                             ;文本结束

  67.           fprintf( ps_DanglingForm_Port "TABSET tset\n     FLOC 2 3\n      FSIZE 39 35\n")   ;定义一个TAB
  68.                   
  69.                   
  70.                   ;cline:
  71.           fprintf( ps_DanglingForm_Port "TAB "Dangling Lines" \n")  
  72. ;定义一个TAB,名字Dangling Lines
  73.           fprintf( ps_DanglingForm_Port "TEXT "Dangling Line:"\n" )       ;定义一个文本,文本内容Dangling Line:
  74.           fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )                      ;TEXT 定义坐标的
  75.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                       ;文本结束

  76.           fprintf( ps_DanglingForm_Port "TEXT \n" )                         ;定义一个文本      
  77.           fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )                     ;FIELD定义位置???
  78.           fprintf( ps_DanglingForm_Port "INFO ddoLineInfo 10\n" )           
  79.           ;INFO文本???
  80.           ;ddoLineInfo断头线数量信息
  81.           ;后面有程序axlFormSetField( ps_DanglingForm "ddoLineInfo" length(lDanglingLine) )
  82.           ;10 应该是字体大小???
  83.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )                       ;文本结束

  84.           fprintf( ps_DanglingForm_Port "FIELD ddoLineList\n" )             ;定义一个FIELD字段,字段名为ddoLineList
  85.           fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )                      ;FIELD定义位置
  86.           fprintf( ps_DanglingForm_Port "LIST "" 34 14\n" )               ;定义一个LIST,内容\,位置34 14  短路线的list内容
  87.           fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )           ;OPTIONS multiselect多选下拉菜单组件,可以多选断头线的选项
  88.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                      ;FIELD字段结束

  89.           fprintf( ps_DanglingForm_Port "FIELD ddoLinesDel\n" )             ;定义一个FIELD字段,字段名为ddoLinesDel
  90.           fprintf( ps_DanglingForm_Port "FLOC 13 30\n" )                    ;FIELD定义位置
  91.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Delete" 12 3\n" )    ;定义一个按键,按键名为“Delete”,长宽分别为12 3
  92.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                      ;FIELD字段结束            

  93.           fprintf(ps_DanglingForm_Port "ENDTAB\n")                          
  94. ;TAB结束
  95.                   
  96.                   
  97.                   
  98.                   ;via

  99.           fprintf(ps_DanglingForm_Port "TAB "Dangling Vias" \n")
  100. ;定义一个TAB,名字Dangling Vias
  101.           fprintf( ps_DanglingForm_Port "TEXT "Dangling Vias:"\n" )
  102.           fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )
  103.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

  104.           fprintf( ps_DanglingForm_Port "TEXT \n" )
  105.           fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )
  106.           fprintf( ps_DanglingForm_Port "INFO ddoViaInfo 10\n" )               
  107.           ;INFO文本
  108.           ;ddoViaInfo悬空过孔数量信息
  109.           ;后面有程序axlFormSetField( ps_DanglingForm "ddoViaInfo" length(lDanglingVia) )
  110.           ;10 应该是字体大小???
  111.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

  112.           fprintf( ps_DanglingForm_Port "FIELD ddoViaList\n" )
  113.           fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )
  114.           fprintf( ps_DanglingForm_Port "LIST "" 34 14\n" )
  115.           fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )              ;OPTIONS multiselect多选下拉菜单组件,可以多选悬空过孔的选项
  116.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

  117.           fprintf( ps_DanglingForm_Port "FIELD ddoViasDel\n" )
  118.           fprintf( ps_DanglingForm_Port "FLOC 2 30\n" )
  119.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Delete" 12 3\n" )       ;定义一个按键,按键名为“Delete”,长宽分别为12 3
  120.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    

  121.           fprintf( ps_DanglingForm_Port "FIELD ddoAssign\n" )
  122.           fprintf( ps_DanglingForm_Port "FLOC 24 30\n" )
  123.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Change Net" 12 3\n" )   ;定义一个按键,按键名为“Change Net”,长宽分别为12 3
  124.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

  125.           fprintf(ps_DanglingForm_Port "ENDTAB\n")
  126. ;TAB结束
  127.                   
  128.                   ;shape

  129.           fprintf(ps_DanglingForm_Port "TAB "Island Shapes" \n")
  130.           fprintf( ps_DanglingForm_Port "TEXT "Island Shapes:"\n" )
  131.           fprintf( ps_DanglingForm_Port "TLOC 2 1\n" )
  132.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

  133.           fprintf( ps_DanglingForm_Port "TEXT \n" )
  134.           fprintf( ps_DanglingForm_Port "FLOC 12 1\n" )
  135.           fprintf( ps_DanglingForm_Port "INFO ddoShapeInfo 10\n" )
  136.           ;INFO文本???
  137.           ;ddoShapeInfo孤岛数量信息
  138.           ;后面有程序axlFormSetField( ps_DanglingForm "ddoShapeInfo" length(lIslandShape) )
  139.           ;10 应该是字体大小???         
  140.           fprintf( ps_DanglingForm_Port "ENDTEXT\n" )

  141.           fprintf( ps_DanglingForm_Port "FIELD ddoShapeList\n" )
  142.           fprintf( ps_DanglingForm_Port "FLOC 2 3\n" )
  143.           fprintf( ps_DanglingForm_Port "LIST "" 34 14\n" )
  144.           fprintf( ps_DanglingForm_Port "OPTIONS multiselect\n" )
  145.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )

  146.           fprintf( ps_DanglingForm_Port "FIELD ddoShapesDel\n" )
  147.           fprintf( ps_DanglingForm_Port "FLOC 13 30\n" )
  148.           fprintf( ps_DanglingForm_Port "MENUBUTTON "Delete" 12 3\n" )
  149.           fprintf( ps_DanglingForm_Port "ENDFIELD\n" )                    

  150.           fprintf(ps_DanglingForm_Port "ENDTAB\n")

  151.           fprintf(ps_DanglingForm_Port "ENDTABSET\n")

  152.           fprintf( ps_DanglingForm_Port "ENDTILE\n" )  ;ENDTILE与前面TILE照应,表示TILE结束
  153.           fprintf( ps_DanglingForm_Port "ENDFORM\n" )  ;ENDFORM与前面FORM照应,表示FORM结束

  154.           close( ps_DanglingForm_Port ) ;排空、关闭和释放端口。关闭文件时,它会释放与p_port关联的file*。
  155.           ;不要使用此函数在piport、poport、stdin、stdout和stderr上。

  156.           ps_DanglingForm = axlFormCreate( (gensym) ps_DanglingForm_file '(e outer) 'ps_DanglingForm_action t)
  157.           ;axlFormCreate(s_formHandle  t_formfile/(t_formName t_contents)  [lt_placement]  g_formAction  g_nonBlock  [g_stringOption])
  158.           ;支持“fixed”类型的表单,如果t_formfile包含任何可变图块,则会失败。
  159.           ;这个函数不显示表单。请使用axlFormDisplay显示表单。
  160.           ;支持另一种接口,允许将表单文件的内容嵌入到skill代码。
  161.           ;s_formHandle代表FORM的句柄,就是该FORM在那个窗口上显示,一般这个参数我们使用 (gensym)
  162.           ;t_formfile代表FORM文件的完整路径,即form文件路径为ps_DanglingForm_file字符串内容。
  163.           ;[lt_placement] :可选参数,这个代表FORM的显示位置。当使用nil 时,allegro会调用默认的位置显示。
  164. ;下面是位置参数(注,使用的时候选择括号中的字母即可)
  165. ;north(n) northeast(ne) east(e) southeast(se) south(s) southwest(sw) west(w) northwest(nw) center(c)
  166.           ;[lt_placement] 选择Inner or Outer 设置FORM显示在ALLEGRO里面还是外面,默认为里面即 Inner
  167.           ;g_formAction  对FORM所有触发事件响应的函数,比如对点击某个按钮,则会执行该函数。事件函数为ps_DanglingForm_action
  168.           ;g_nonBlock 可设置FORM是否在non-blocking模式下运行。
  169.           ;[g_stringOption] 可选参数,如果为t,那么form返回的所有值都为string格式。一般设置为nil

  170.           axlFormSetField( ps_DanglingForm "ddoLineList" lDanglingLine )
  171.           ;axlFormSetField(r_form  t_field  g_value/nil) 在开放的FORM表r_form里,将t_field设置为g_value值
  172.           ;即ps_DanglingForm里,把"ddoLineList"列表设置为lDanglingLine 【其中 lDanglingLine = car(lDanglingObject),即lDanglingObject列表的第一个元素】   
  173. ;r_form Form dbid.开放的FORM表r_form
  174. ;t_field 字段名称。字段名是字符串或符号。
  175. ;字段名有多种,有List Field(field is named "list");Color field (field is named "color");Tab field (field is named "tab")等
  176. ;g_value 字段的期望值。可以是字符串、布尔值、整数或浮点数或列表;字段类型的函数。
  177.           axlFormSetField( ps_DanglingForm "ddoViaList" lDanglingVia )
  178.           axlFormSetField( ps_DanglingForm "ddoShapeList" lIslandShape )
  179.           axlFormSetField( ps_DanglingForm "ddoLineInfo" length(lDanglingLine) )  ;断头线数量
  180.           axlFormSetField( ps_DanglingForm "ddoViaInfo" length(lDanglingVia) )    ;悬空过孔数量
  181.           axlFormSetField( ps_DanglingForm "ddoShapeInfo" length(lIslandShape) )  ;孤岛数量
  182.           axlFormColorize( ps_DanglingForm "ddoLineInfo" 'text 'red )             ;断头线数量信息高亮成红色
  183.           axlFormColorize( ps_DanglingForm "ddoViaInfo" 'text 'red )              ;悬空过孔数量信息高亮成红色
  184.           axlFormColorize( ps_DanglingForm "ddoShapeInfo" 'text 'red )            ;孤岛数量信息高亮成红色

  185.           axlFormDisplay( ps_DanglingForm )         ;axlFormSetField函数不显示表单,使用axlFormDisplay显示表单。
  186.           when( lDanglingLine
  187.             axlMsgPut(sprintf(nil "E- %d Dangling Lines, check Dangling Lines Tab" length(lDanglingLine) ))
  188.           )  ;在allegro的状态栏里输出断头线数量
  189.           when( lDanglingVia
  190.             axlMsgPut(sprintf(nil "E- %d Dangling Via, check Dangling Vias Tab" length(lDanglingVia) ))
  191.           )  ;在allegro的状态栏里输出悬空过孔数量
  192.           when( lIslandShape
  193.             axlMsgPut(sprintf(nil "E- %d Island Shape, check Island Shapes Tab" length(lIslandShape) ))
  194.           )  ;在allegro的状态栏里输出孤岛数量
  195.           axlUIWPrint( ps_DanglingForm "Select Dangling, Island Line/Via/Shape..." )
  196.           ;axlUIWPrint(r_window/nil  t_formatString  [g_arg1 ...])
  197.           ;UIW-User Interface window用户界面窗口
  198.           ;r_window/nil消息显示在主窗口外,为空则在主窗口显示,此处为ps_DanglingForm,显示在主窗口外的FORM表ps_DanglingForm窗口上
  199.           ;t_formatString 替换参数为字符串"Select Dangling, Island Line/Via/Shape...",这个是FORM表ps_DanglingForm窗口上的增加的内容,位置默认在最下脚。
  200.           ;[g_arg1 ...]打印任意数量的替换参数t_formatString
  201.           axlUIWDisableQuit(ps_DanglingForm);axlUIDisableQuit(o_window) 禁用系统菜单“退出”选项,因此用户无法选择它来关闭窗口。就是不能直接关掉ps_DanglingForm窗口
  202.           deleteFile(ps_DanglingForm_file);将创建的ps_DanglingForm_file文件删除
  203.         else
  204.           axlMsgPut("I- No dangling, island line/via/shape problems")  ;在allegro的状态栏里输出I- No dangling, island line/via/shape problems
  205.         ); end if lDanglingVia || lDanglingLine || lIslandShape
  206.     ); end when
  207.   ); end let
  208. ); end quick_danglings


  209. ;FORM编程的一般步骤
  210. ;1.创建form文件
  211. ;可以自己提前将 FORM 代码写到单独的form文件,或者将代码嵌入到SKILL文件中,在SKILL执行过程中创建form文件 。
  212. ;2.使用 axlFormCreate 函数打开 FORM
  213. ;3.使用 axlFormSetField 函数初始化 FORM 中的各个字段
  214. ;4.使用 axlFormDisplay 函数显示 FORM
  215. ;5.使用 axlFormCallback 与用户交互
  216. ;6.使用 axlFormClose 关闭 FROM
复制代码


 楼主| 发表于 2025-2-17 14:31:25 | 显示全部楼层
红色部分不知道怎么解释,有高手解释一下吗
 楼主| 发表于 2025-2-17 14:38:38 | 显示全部楼层

axlUIWPrint函数界面区别

本帖最后由 xieeyawen 于 2025-2-17 14:41 编辑


axlUIWPrint函数界面区别
下载2.png
下载1.png
 楼主| 发表于 2025-2-17 14:39:40 | 显示全部楼层

axlMsgPut函数显示在allegro窗口上

本帖最后由 xieeyawen 于 2025-2-17 14:44 编辑

axlMsgPut(sprintf(nil "E- %d Dangling Lines, check Dangling Lines Tab" length(lDanglingLine) ))
下载3.png
 楼主| 发表于 2025-2-17 18:23:05 | 显示全部楼层
  1. procedure( ps_DanglingForm_action( ps_DanglingForm1 )  ;ps_DanglingForm_action函数,变量ps_DanglingForm1,此函数主要用途是判断用户在form里面的一些操作和allegro视图交互功能
  2.   let(
  3.     ( lDanglingVia
  4.       lDanglingLine
  5.       lIslandShape
  6.       lIssueCline
  7.       lTemp
  8.       sLayer
  9.       fStartX
  10.       fStartY
  11.       fEndX
  12.       fEndY
  13.       sStart
  14.       sEnd
  15.       lSeg
  16.       lStartA
  17.       lStartB
  18.       lEndA
  19.       lEndB
  20.       sStartTempA
  21.       sStartTempB
  22.       sEndTempA
  23.       sEndTempB
  24.       fCoordX
  25.       fCoordY
  26.       dVia
  27.       lVia
  28.       fFindRange
  29.       lClines
  30.       sNet
  31.       sMessage
  32.       lViaInfo
  33.       lShapeInfo
  34.       lShape
  35.       dShape
  36.       lDanglingObject
  37.       lSys
  38.       lCoord
  39.       bShape
  40.       bDRC
  41.     ) ;定义局部变量
  42.     fFindRange = axlMKSConvert(1 "MILS")
  43.     ;axlMKSConvert(1 "MILS") => 0.0254即1的单位是mil,输出单位nil即输出单位为当前设计单位(现在设计单位用的mm)值为0.0254
  44.     ;axlMKSConvert(1 "mm" "mils") => 39.37008即1的单位是mm,输出单位为指定单位mils,值为39.37008
  45.     case( ps_DanglingForm1->curField            ;curField-current Field当前Field字段,同样有curValue-当前值
  46.     ;case(g_selectionExpr  l_clause1  [ l_clause2 ... ])
  47.     ;例子nameofmonth = "February"  ;month = case( nameofmonth  ("January" 1) ("February" 2) (t 'Other))  => 2
  48.     ;此处的curField,用户在form里可以点击的有Refresh,linelist,vialist,shapelist,lineDel,viaDel,shapeDel,Help,close,Assign(change Net)
  49.       ( "ddoRefresh"
  50.         axlClearSelSet()        
  51.         lDanglingObject = ps_ddoCheck()
  52.         lDanglingLine = car(lDanglingObject)
  53.         lDanglingVia = cadr(lDanglingObject)
  54.         lIslandShape = caddr(lDanglingObject)

  55.         if( lDanglingLine || lDanglingVia || lIslandShape then
  56.           when( lDanglingLine
  57.             axlMsgPut(sprintf(nil "E- %d Dangling Lines, check Dangling Lines Tab" length(lDanglingLine) ))
  58.           )
  59.           when( lDanglingVia
  60.             axlMsgPut(sprintf(nil "E- %d Dangling Via, check Dangling Vias Tab" length(lDanglingVia) ))
  61.           )
  62.           when( lIslandShape
  63.             axlMsgPut(sprintf(nil "E- %d Island Shape, check Island Shapes Tab" length(lIslandShape) ))
  64.           )
  65.         else
  66.           axlMsgPut("I- No Dangling, Island Lines/Vias/Shapes")
  67.         )
  68.         axlFormListDeleteAll( ps_DanglingForm1 "ddoLineList" )
  69.         axlFormListDeleteAll( ps_DanglingForm1 "ddoViaList" )
  70.         axlFormListDeleteAll( ps_DanglingForm1 "ddoShapeList" )
  71.         axlFormSetField( ps_DanglingForm1 "ddoLineList" lDanglingLine )
  72.         axlFormSetField( ps_DanglingForm1 "ddoViaList" lDanglingVia )
  73.         axlFormSetField( ps_DanglingForm1 "ddoShapeList" lIslandShape )
  74.         axlFormSetField( ps_DanglingForm1 "ddoLineInfo" length(lDanglingLine) )
  75.         axlFormSetField( ps_DanglingForm1 "ddoViaInfo" length(lDanglingVia) )
  76.         axlFormSetField( ps_DanglingForm1 "ddoShapeInfo" length(lIslandShape) )
  77.         axlFormColorize(ps_DanglingForm1 "ddoLineInfo" 'text 'red)
  78.         axlFormColorize(ps_DanglingForm1 "ddoViaInfo" 'text 'red)
  79.         axlFormColorize(ps_DanglingForm1 "ddoShapeInfo" 'text 'red)
  80.       );case的第一种情况"ddoRefresh"
  81.       ( "ddoLineList"
  82.         lDanglingLine = axlFormListGetSelItems(ps_DanglingForm1 "ddoLineList")   
  83.         ;axlFormListGetSelItems(r_form  t_field)即GET获得FORM表里选择项目Select-Items的表list,即返回一个form(a list of string),值为断头线这个field里列表被多选的部分。
  84.         axlClearSelSet()        ;取消所有选择
  85.         axlSetFindFilter( ?enabled  '("noall" "clines") ?onButtons '("clines") )    ;取消选项并选择走线   
  86.         lIssueCline = nil       ;初始化lIssueCline
  87.         axlVisibleDesign(nil)   ;设计可显示
  88.         foreach( sline lDanglingLine   ;在form弹窗里被用户多选的那部分断头线列表里进行遍历
  89.           lTemp = parseString( sline "," )         
  90.           sLayer = car( lTemp )
  91.           lCoord = parseString(caddr(lTemp) " ()to")
  92.           fStartX = atof(car(lCoord))
  93.           fStartY = atof(cadr(lCoord))
  94.           fEndX = atof(caddr(lCoord))
  95.           fEndY = atof(nth(3 lCoord))
  96.           axlVisibleLayer(strcat("etch/" sLayer) t)         
  97.           axlVisibleLayer(strcat("via class/" sLayer) t)  
  98.           axlVisibleLayer(strcat("pin/" sLayer) t)      
  99.           sStart = sprintf(nil "x%0.3fy%0.3f" fStartX fStartY)
  100.           sEnd = sprintf(nil "x%0.3fy%0.3f" fEndX fEndY)
  101.           lClines = axlGetSelSet(
  102.                       axlSingleSelectBox(
  103.                         list((fStartX-fFindRange):(fStartY-fFindRange)
  104.                           (fStartX+fFindRange):(fStartY+fFindRange))      
  105.                       ))
  106.           axlClearSelSet()         
  107.           if( lClines then
  108.             foreach( cline lClines
  109.               lSeg = cline->segments
  110.               lStartA = car(car(lSeg)->startEnd)
  111.               lEndA = cadr(car(last(lSeg))->startEnd)
  112.               sStartTempA = sprintf( nil "x%0.3fy%0.3f" car(lStartA) cadr(lStartA))
  113.               sEndTempA = sprintf( nil "x%0.3fy%0.3f" car(lEndA) cadr(lEndA))

  114.               lStartB = car(car(last(lSeg))->startEnd)
  115.               lEndB = cadr(car(lSeg)->startEnd)
  116.               sStartTempB = sprintf( nil "x%0.3fy%0.3f" car(lStartB) cadr(lStartB))
  117.               sEndTempB = sprintf( nil "x%0.3fy%0.3f" car(lEndB) cadr(lEndB))

  118.               when( (sStartTempA==sStart && sEndTempA==sEnd) ||
  119.                   (sStartTempA==sEnd && sEndTempA==sStart) ||
  120.                   (sStartTempB==sStart && sEndTempB==sEnd) ||
  121.                   (sStartTempB==sEnd && sEndTempB==sStart)
  122.                 lIssueCline = cons( cline lIssueCline )
  123.               )
  124.             )           
  125.           else
  126.             axlUIWPrint( ps_DanglingForm1 "Can not find the cline, find it manually..." )
  127.           )
  128.         )
  129.         axlHighlightObject(lIssueCline)
  130.         axlZoomToDbid(lIssueCline t)   
  131.       );case的第二种情况"ddoLineList"
  132.       ( "ddoViaList"

  133.         when( lDanglingVia = axlFormListGetSelItems(ps_DanglingForm1 "ddoViaList")  

  134.           axlClearSelSet()        
  135.           axlSetFindFilter( ?enabled  '("noall" "vias") ?onButtons '("vias") )
  136.           lVia = nil
  137.           axlVisibleDesign(nil)
  138.           foreach( svia lDanglingVia
  139.             lViaInfo = parseString(svia ",")
  140.             axlVisibleLayer(strcat("via class/" car(lViaInfo)) t)
  141.             axlVisibleLayer(strcat("etch/" car(lViaInfo)) t)
  142.             axlVisibleLayer(strcat("pin/" car(lViaInfo)) t)
  143.             lCoord = parseString(caddr(lViaInfo) " ()")
  144.             fCoordX = atof(car(lCoord))
  145.             fCoordY = atof(cadr(lCoord))
  146.             dVia = car(axlGetSelSet(axlSingleSelectPoint(fCoordX:fCoordY)))
  147.             axlClearSelSet()
  148.             when( dVia
  149.               lVia = cons( dVia lVia)
  150.             )
  151.           )
  152.           axlHighlightObject(lVia)
  153.           axlZoomToDbid(lVia t)     
  154.         )
  155.       );case的第三种情况"ddoViaList"
  156.       ( "ddoShapeList"

  157.         when( lIslandShape = axlFormListGetSelItems(ps_DanglingForm1 "ddoShapeList")  

  158.           axlClearSelSet()        
  159.           axlSetFindFilter( ?enabled  '("noall" "shapes") ?onButtons '("shapes") )
  160.           lShape = nil
  161.           axlVisibleDesign(nil)
  162.           foreach( shape lIslandShape
  163.             lShapeInfo = parseString(shape ",")
  164.             axlVisibleLayer(strcat("via class/" car(lShapeInfo)) t)
  165.             axlVisibleLayer(strcat("etch/" car(lShapeInfo)) t)
  166.             axlVisibleLayer(strcat("pin/" car(lShapeInfo)) t)
  167.             lCoord = parseString(caddr(lShapeInfo) " ()")
  168.             fCoordX = atof(car(lCoord))
  169.             fCoordY = atof(cadr(lCoord))
  170.             dShape = car(axlGetSelSet(axlSingleSelectPoint(fCoordX:fCoordY)))
  171.             axlClearSelSet()
  172.             when( dShape
  173.               lShape = cons( dShape lShape )
  174.             )
  175.           )
  176.           axlHighlightObject(lShape)
  177.           axlZoomToDbid(lShape t)     
  178.         )
  179.       );case的第四种情况"ddoShapeList"
  180.       ( "ddoLinesDel"
  181.         when( lDanglingLine = axlFormListGetSelItems(ps_DanglingForm1 "ddoLineList")  
  182.           axlClearSelSet()        
  183.           axlSetFindFilter( ?enabled  '("noall" "clines") ?onButtons '("clines") )   
  184.           lIssueCline = nil
  185.           axlVisibleDesign(nil)
  186.           foreach( sline lDanglingLine
  187.             lTemp = parseString( sline "," )         
  188.             sLayer = car( lTemp )
  189.             lCoord = parseString(caddr(lTemp) " ()to")
  190.             fStartX = atof(car(lCoord))
  191.             fStartY = atof(cadr(lCoord))
  192.             fEndX = atof(caddr(lCoord))
  193.             fEndY = atof(nth(3 lCoord))
  194.             axlVisibleLayer(strcat("etch/" sLayer) t)         
  195.             axlVisibleLayer(strcat("via class/" sLayer) t)  
  196.             axlVisibleLayer(strcat("pin/" sLayer) t)      
  197.             sStart = sprintf(nil "x%0.3fy%0.3f" fStartX fStartY)
  198.             sEnd = sprintf(nil "x%0.3fy%0.3f" fEndX fEndY)
  199.             lClines = axlGetSelSet(
  200.                       axlSingleSelectBox(
  201.                         list((fStartX-fFindRange):(fStartY-fFindRange)
  202.                           (fStartX+fFindRange):(fStartY+fFindRange))      
  203.                       ))
  204.             axlClearSelSet()         
  205.             when( lClines
  206.               foreach( cline lClines
  207.                 lSeg = cline->segments
  208.                 lStartA = car(car(lSeg)->startEnd)
  209.                 lEndA = cadr(car(last(lSeg))->startEnd)
  210.                 sStartTempA = sprintf( nil "x%0.3fy%0.3f" car(lStartA) cadr(lStartA))
  211.                 sEndTempA = sprintf( nil "x%0.3fy%0.3f" car(lEndA) cadr(lEndA))
  212.                 lStartB = car(car(last(lSeg))->startEnd)
  213.                 lEndB = cadr(car(lSeg)->startEnd)
  214.                 sStartTempB = sprintf( nil "x%0.3fy%0.3f" car(lStartB) cadr(lStartB))
  215.                 sEndTempB = sprintf( nil "x%0.3fy%0.3f" car(lEndB) cadr(lEndB))
  216.                 when( (sStartTempA==sStart && sEndTempA==sEnd) ||
  217.                     (sStartTempA==sEnd && sEndTempA==sStart) ||
  218.                     (sStartTempB==sStart && sEndTempB==sEnd) ||
  219.                     (sStartTempB==sEnd && sEndTempB==sStart)
  220.                   lIssueCline = cons( cline lIssueCline )
  221.                 )
  222.               )
  223.             ); end when lClines           
  224.           ); end foreach
  225.           axlDeleteObject(lIssueCline)
  226.           axlFormListDeleteItem(ps_DanglingForm1 "ddoLineList" lDanglingLine)  
  227.           axlMsgPut("I- Dangling Line was deleted")
  228.         ); end when dline
  229.       );case的第五种情况"ddoLinesDel"
  230.       ( "ddoViasDel"
  231.         bDRC = axlDBControl('drcEnable nil)
  232.         bShape = axlDBControl( 'dynamicFillMode nil )
  233.         if( lDanglingVia = axlFormListGetSelItems(ps_DanglingForm1 "ddoViaList")  then
  234.           axlClearSelSet()        
  235.           axlSetFindFilter( ?enabled  '("noall" "vias") ?onButtons '("vias") )
  236.           lVia = nil
  237.           lSys = axlVisibleGet()
  238.           axlVisibleDesign(nil)
  239.           foreach( svia lDanglingVia
  240.             lViaInfo = parseString(svia ",")
  241.             axlVisibleLayer(strcat("via class/" car(lViaInfo)) t)
  242.             lCoord = parseString(caddr(lViaInfo) " ()")
  243.             fCoordX = atof(car(lCoord))
  244.             fCoordY = atof(cadr(lCoord))
  245.             dVia = car(axlGetSelSet(axlSingleSelectPoint(fCoordX:fCoordY)))
  246.             axlClearSelSet()
  247.             when( dVia
  248.               lVia = cons( dVia lVia)
  249.             )
  250.             axlVisibleLayer(strcat("via class/" car(lViaInfo)) nil)
  251.           )
  252.           axlDeleteObject(lVia)
  253.           axlFormListDeleteItem(ps_DanglingForm1 "ddoViaList" lDanglingVia)  
  254.           axlMsgPut("I- Dangling Via was deleted")
  255.           axlVisibleSet(lSys)
  256.         else
  257.           axlUIConfirm("E- Pick a item from the list before cilck on Delete button")
  258.         )
  259.         axlDBControl('drcEnable bDRC)        
  260.         axlDBControl( 'dynamicFillMode bShape )   
  261.       );case的第六种情况"ddoViasDel"
  262.       ( "ddoShapesDel"
  263.         axlMsgPut("R- if delete shape on this form is too slow, please use Shape->Delete Islands to delete all island shape and use this tool to double confirm")
  264.         bDRC = axlDBControl('drcEnable nil)
  265.         bShape = axlDBControl( 'dynamicFillMode nil )
  266.         if( lIslandShape = axlFormListGetSelItems(nv_DanglingForm1 "ddoShapeList")  then
  267.           axlClearSelSet()        
  268.           axlSetFindFilter( ?enabled  '("noall" "shapes") ?onButtons '("shapes") )
  269.           lShape = nil
  270.           lSys = axlVisibleGet()
  271.           axlVisibleDesign(nil)
  272.           foreach( shape lIslandShape
  273.             lShapeInfo = parseString(shape ",")
  274.             axlVisibleLayer(strcat("via class/" car(lShapeInfo)) t)
  275.             axlVisibleLayer(strcat("etch/" car(lShapeInfo)) t)
  276.             axlVisibleLayer(strcat("pin/" car(lShapeInfo)) t)
  277.             lCoord = parseString(caddr(lShapeInfo) " ()")
  278.             fCoordX = atof(car(lCoord))
  279.             fCoordY = atof(cadr(lCoord))
  280.             dShape = car(axlGetSelSet(axlSingleSelectPoint(fCoordX:fCoordY)))
  281.             axlClearSelSet()
  282.             when( dShape
  283.               if( dShape->shapeBoundary then
  284.                 ;  need to use current dynamic shape and void this island shape
  285.                 dVoidPoly=car(axlPolyFromDB(dShape))   ; to be void poly
  286.                 dDynaShapePoly=car(axlPolyFromDB(dShape->shapeBoundary))  ; dynamic shape poly
  287.                 dNewPoly  = car(axlPolyOperation(dDynaShapePoly dVoidPoly 'ANDNOT))  ; new shape poly
  288.                 sNet = dShape->net->name  
  289.                 sLayer = dShape->shapeBoundary->layer
  290.                 lDynShapeGroup = car(dShape->parentGroups)
  291.                 axlDeleteObject(dShape->shapeBoundary)  ; delete original shape
  292.                 dNewShape = car(axlDBCreateShape(dNewPoly t sLayer sNet))  ; create new shape
  293.                 dParent=car(car(dNewShape->shapeAuto)->parentGroups)
  294.                 axlShapeDynamicUpdate(dNewShape, t) ;update the shape, this is a time causing step            
  295.               else
  296.                 lShape = cons( dShape lShape )
  297.               )
  298.             )
  299.             axlVisibleLayer(strcat("etch/" car(lShapeInfo)) nil)
  300.           )
  301.           axlDeleteObject(lShape) ; delete static/whole dynamic shape
  302.           axlFormListDeleteItem(nv_DanglingForm1 "ddoShapeList" lIslandShape)  
  303.           axlMsgPut("I- Island Shape was deleted")
  304.           axlVisibleSet(lSys)
  305.           axlFlushDisplay()
  306.         else
  307.           axlUIConfirm("E- Pick a item from the list before cilck on Delete button")
  308.         )
  309.         axlDBControl('drcEnable bDRC)        
  310.         axlDBControl( 'dynamicFillMode bShape )   
  311.       );case的第七种情况"ddoShapesDel"
  312.       ( "ddoClose"
  313.         axlFormClose( ps_DanglingForm1 )
  314.         axlClearSelSet()
  315.         axlFlushDisplay()
  316.         axlEndSkillMode()
  317.         axlMsgPut("Done, Please update DRC and refresh shapes")
  318.       );case的第八种情况"ddoClose"
  319.       ( "ddoAssign"
  320.         bDRC = axlDBControl('drcEnable nil)
  321.         bShape = axlDBControl( 'dynamicFillMode nil )
  322.         if( lDanglingVia = axlFormListGetSelItems(ps_DanglingForm1 "ddoViaList")  then
  323.           axlClearSelSet()        
  324.           axlSetFindFilter( ?enabled  '("noall" "vias") ?onButtons '("vias") )
  325.           lVia = nil
  326.           lSys = axlVisibleGet()
  327.           axlVisibleDesign(nil)
  328.           foreach( svia lDanglingVia
  329.             lViaInfo = parseString(svia ",")
  330.             axlVisibleLayer(strcat("via class/" car(lViaInfo)) t)
  331.             lCoord = parseString(caddr(lViaInfo) " ()")
  332.             fCoordX = atof(car(lCoord))
  333.             fCoordY = atof(cadr(lCoord))
  334.             dVia = car(axlGetSelSet(axlSingleSelectPoint(fCoordX:fCoordY)))
  335.             axlClearSelSet()
  336.             when( dVia
  337.               lVia = cons( dVia lVia)
  338.             )
  339.             axlVisibleLayer(strcat("via class/" car(lViaInfo)) nil)
  340.           )
  341.           axlMsgPut("I- Select a net by click in the design")
  342.           axlVisibleSet(lSys)

  343.           axlSetFindFilter( ?enabled  '("noall" "nets") ?onButtons '("nets") )
  344.           if( axlSingleSelectPoint() then
  345.             sNet = car(axlGetSelSet())->name
  346.             axlClearSelSet()
  347.             foreach( item lVia
  348.               axlDBCloak( 'axlDBCreateVia( item->name item->xy sNet ) 'shape )
  349.               if( item->net->name then
  350.                   sMessage = sprintf( nil "I- Change via net from %s to %s" item->net->name sNet )
  351.               else
  352.                   sMessage = sprintf( nil "I- Change via net from nil to %s" sNet )
  353.               ); end if                       
  354.               axlMsgPut( sMessage )
  355.             )
  356.             axlDeleteObject(lVia)
  357.             axlFormListDeleteItem(ps_DanglingForm1 "ddoViaList" lDanglingVia)  
  358.             ;axlMsgPut("I- Dangling Via net was changed")
  359.           else
  360.             axlMsgPut("E- Dummy net was selected, no changes")
  361.           ); end when
  362.         else
  363.           axlUIConfirm("E- Pick a item from the list before cilck on Assign Net button")
  364.         )
  365.         axlDBControl('drcEnable bDRC)        
  366.         axlDBControl( 'dynamicFillMode bShape )
  367.       );case的第九种情况"ddoAssign"
  368.       ( "ddoHelp"
  369.         axlHttp( psmddo_HELPPAGE )
  370.       );case的第十种情况"ddoHelp"
  371.     );end case
  372.   );end let
  373. );end procedure
复制代码


 楼主| 发表于 2025-2-17 18:24:54 | 显示全部楼层
  1. procedure( ps_ddoCheck() ;check主程序
  2.   let(
  3.     ( lClines
  4.       lVias
  5.       sNet
  6.       sVia
  7.       lDanglingLine
  8.       bIgnore
  9.       lDanglingVia
  10.       lIslandShape
  11.       sShape
  12.       sLine
  13.     )
  14.     axlClearSelSet()        
  15.     axlSetFindFilter( ?enabled  '("noall" "invisible" "clines" ) ?onButtons '("clines" ) )
  16.     lClines = axlGetSelSet(axlAddSelectAll())
  17.     axlClearSelSet()
  18.     axlSetFindFilter( ?enabled  '("noall" "invisible"  "vias") ?onButtons '( "vias") )
  19.     lVias = axlGetSelSet(axlAddSelectAll())
  20.     axlClearSelSet()
  21.     foreach( cline lClines
  22.       when( length(axlDBGetConnect( cline t ))<2
  23.         unless(cline->prop->FILLET||cline->symbolEtch
  24.           if(cline->net then
  25.             sNet = cline->net->name
  26.           else
  27.             sNet = "Dummy"
  28.           )
  29.           sLine = sprintf(nil "%s, %s, %L to %L"
  30.             cadr(parseString(cline->layer "/"))
  31.             sNet
  32.             car(car(cline->segments)->startEnd)
  33.             cadr(car(last(cline->segments))->startEnd)
  34.           )
  35.           lDanglingLine = cons( sLine lDanglingLine )
  36.         )
  37.       )
  38.     )

  39.     lDanglingLine = reverse(sort(lDanglingLine nil))
  40.     foreach( via lVias
  41.       unless( via->symbolEtch ;;; ignore symbol type via
  42.         bIgnore = nil
  43.         if(via->net then
  44.           sNet = via->net->name
  45.           when( rexMatchp("^SNN_" sNet)
  46.             bIgnore = t
  47.           )
  48.         else
  49.           sNet = "Dummy"
  50.         )
  51.         sVia = sprintf( nil "%s, %s, %L"
  52.           cadr(parseString(car(via->startEnd) "/"))
  53.           sNet
  54.           via->xy
  55.         )
  56.         unless( bIgnore
  57.           when( onep(length(axlDBGetConnect( via t )))
  58.             unless( via->testPoint || rexMatchp("_VOID$" via->name )
  59.               lDanglingVia = cons( sVia lDanglingVia )
  60.             )
  61.           )
  62.           when( zerop(length(axlDBGetConnect( via t )))
  63.              lDanglingVia = cons( sVia lDanglingVia )
  64.           ); end when
  65.         ); end unless bIgnore
  66.       ); end unless
  67.     )
  68.     lDanglingVia = reverse(sort(lDanglingVia nil))
  69.     foreach( shape axlDBGetShapes("etch")
  70.       when( length(axlDBGetConnect(shape t))<2
  71.         unless( shape->symbolEtch
  72.           sNet = "Dummy"
  73.           when( shape->net && shape->net->name != ""
  74.             sNet = shape->net->name
  75.           )
  76.           sShape = sprintf(nil "%s, %s, %L"
  77.               cadr(parseString(shape->layer "/"))
  78.               sNet
  79.               car(car(shape->segments)->startEnd)
  80.             )
  81.           lIslandShape = cons( sShape lIslandShape )
  82.         ); end unless
  83.       ); end when
  84.     )
  85.     foreach(net axlDBGetDesign()->nets
  86.       when( net->nBranches > 1
  87.         foreach( branch cdr(net->branches)
  88.           foreach( obj branch->children
  89.             when( obj->objType == "shape"
  90.               sShape = sprintf(nil "%s, %s, %L"
  91.                   cadr(parseString(obj->layer "/"))
  92.                   net->name
  93.                   car(car(obj->segments)->startEnd)
  94.                 )
  95.               unless( member( sShape lIslandShape )
  96.                 lIslandShape = cons( sShape lIslandShape )
  97.               )
  98.             )
  99.           ); end obj
  100.         ); end branch
  101.       ); end when
  102.     ); end foreach

  103.     lIslandShape = reverse(sort(lIslandShape nil))
  104.     list(lDanglingLine lDanglingVia lIslandShape)
  105.   ); end let
  106. ); end ps_ddoCheck
复制代码


发表于 6 天前 | 显示全部楼层
很详细,期待还有更多的代码分析,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-28 06:54 , Processed in 0.157100 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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