|

楼主 |
发表于 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
复制代码
|
|