| 
 | 
 
 
 楼主 |
发表于 2025-2-17 14:30:47
|
显示全部楼层
 
 
 
- 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
 
  复制代码 
 
 |   
 
 
 
 |