axlCmdRegister( "apn" 'x_add_pin_number )
defun( x_add_pin_number ()
let((p allsel)
axlSetFindFilter( ?enabled
list("noall" "pins") ?onButtons
list("noall" "pins"))
while( axlSelect()
axlHighlightObject(axlGetSelSet())
allsel = axlGetSelSet()
)
case( axlUIGetUserData() -> doneState
(done
when( allsel != nil
foreach( p allsel
when( p -> number == ""
axlDBCreateText(
"?"
p -> xy
make_axlTextOrientation(
?textBlock "1" ,
?rotation 0 ,
?mirrored nil ,
?justify "CENTER"
)
"PACKAGE GEOMETRY/PIN_NUMBER"
p
)
)
)
)
)
(cancel
axlUIWPrint(nil "cancel")
)
)
))
知识点一:
基础知识:
axlCmdRegister
是Allegro SKILL语言中用于注册自定义命令的关键函数,其核心用法如下:
基础语法结构:
axlCmdRegister(“命令名” '回调函数 ?cmdType “类型” ?doneCmd '完成函数 ?cancelCmd '取消函数)
参数说明:
命令名:
在Allegro软件中调用的命令字符串(如"ch_via_net")
回调函数:
SKILL中定义的函数符号其余参数不介绍。
代码解析:
axlCmdRegister( “apn” 'x_add_pin_number )
apn为命令标识符,需唯一且避免与内置命令冲突
'x_add_pin_number为回调函数的符号引用(需单引号前缀),开发者需提前定义该函数逻辑。
知识点二
基础知识:
defun
是定义函数的核心关键字,用法如下:
(defun 函数名 (参数1 参数2 ...)
; 函数逻辑代码
(返回值)
)
代码解析
defun( x_add_pin_number ()
;函数逻辑代码
(cancel
axlUIWPrint(nil "cancel"))
)
知识点三
基础知识
let
定义局部变量的2个关键字let和prog。let和prog的区别在于函数的返回值,let的返回值是let()中的最后一句表达式,prog的返回值比较多样,还包括return命令的返回值。相对于let,prog还多了项功能,在prog()中多了一个循环功能,支持go命令。
代码解析
p和allsel定义的是局部变量,就是只在let区域内是生效的
let((p allsel)
allsel = axlGetSelSet()
)
知识点四
基础知识
axlSetFindFilter
主要用于设置查找过滤器(Find Filter)。通过该函数,用户可以定义在 PCB 设计中选择或查找特定对象时的过滤条件,例如只选择特定类型的元件、网络或走线等。axlSetFindFilter(?enabled ?onButtons)
?enabled:指定可被选择的元素类型(如"PINS"、“VIAS”)
?onButtons:指定默认高亮的元素类型(需为?enabled的子集)
常用对象类型:
* "symbols":元件符号
* "nets":网络
* "vias":过孔
* "clines":走线线段
* "shapes":形状(如铜皮、文本等)
* "pins":元件引脚
* "drcs":DRC 错误标记
代码解析
限定仅引脚(pins)可被选择,同时"noall"表示禁用其他所有类型
在Allegro界面中默认高亮引脚选择按钮,用户无需手动勾选
axlSetFindFilter(
?enabled list("noall" "pins")
?onButtons list("noall" "pins")
)
知识点五
基础知识
axlSelect()
会弹出一个交互式选择,让你用鼠标在 Allegro 界面里点选对象
返回用户选中的数据库对象(DBID)
如果用户没有选择任何对象,就返回 nil
如果你想一次选多个对象,要用 axlSelectMultiple()
代码解析
每次让用户点选一个对象 → 高亮它 → 存到 allsel 里(累计保存所有选过的对象)
while循环内第一句axlHighlightObject(axlGetSelSet()) 是获得选取对象并高亮
while( axlSelect()
axlHighlightObject(axlGetSelSet())
allsel = axlGetSelSet()
)
知识点六
基础知识
case
它会先计算 <判断表达式> 的结果,然后和每个 (值X …) 里的值比对,匹配到的那一组会执行对应的表达式。
axlUIGetUserData() -> doneState
如果用户完成选择,doneState 是 “done”
如果用户取消,doneState 是 “cancel”
(case <判断表达式>
(值1 表达式1 ...)
(值2 表达式2 ...)
...
)
case( axlUIGetUserData() -> doneState
(done 表达式1)
(cancel 表达式2)
)
知识点七
基础知识
when
when( condition ;当condition为真值时执行代码块expA,否则跳过
expA
)
知识点八
基础知识
foreach
通常用于操作列表,因为它会遍历列表的每一个元素。
alist = ‘(1 2 3 4 5)
foreach( item alist
println( item )
)
知识点九
基础知识
axlDBCreateText
用来在 PCB 数据库里创建文本对象的函数,常用于自动加丝印、标注坐标、标 pin 号等。
axlDBCreateText(
t_text ; string,显示的文字内容,例如 "?"、"PIN1"
l_anchorPoint ; list(x y),位置坐标,单位是 Allegro 数据库内部单位(通常是 mil,可能需要换算)
r_textOrientation ; 用 make_axlTextOrientation 创建,定义字体、高度、旋转、镜像、对齐方式等
[t_layer] ; (可选) string,文本放置的图层,例如 "PACKAGE GEOMETRY/PIN_NUMBER"、"SILKSCREEN_TOP"
[o_attach] ; (可选) DBID,如果文本属于某个对象(比如 pin),可以传这个对象 ID,这样文字会跟随该对象移动
)
知识点十
基础知识
make_axlTextOrientation
用来生成文本方向与样式结构(axlTextOrientation)的函数,这个结构通常作为 axlDBCreateText 的第三个参数,用来控制字体块、旋转、镜像、对齐方式等。
;1 号字体块、0°、不镜像、居中对齐
(make_axlTextOrientation
?textBlock "1"
?rotation 0
?mirrored nil
?justify "CENTER"
)
代码解析
如果 allsel(用户选中的对象集合)不是空
遍历 allsel 中的每一个对象 p
如果该对象的 number 属性为空字符串(说明这个 pin 没有编号)
在 p 的位置画一个 “?” 文字标注(放在 PACKAGE GEOMETRY/PIN_NUMBER 层)
也就是 自动给没编号的 Pin 加个 ? 标识。
when( allsel != nil
foreach( p allsel
when( p -> number == ""
axlDBCreateText(
"?"
p -> xy
make_axlTextOrientation(
?textBlock "1" ,
?rotation 0 ,
?mirrored nil ,
?justify "CENTER"
)
"PACKAGE GEOMETRY/PIN_NUMBER"
p
)
)
)
知识点十一
基础知识
axlUIWPrint( t_window t_message )
t_window要输出到的 UI 窗口;传 nil 时,默认输出到 Allegro 主 Command Window
t_message 要显示的文本消息
代码解析
如果 doneState 是 cancel,就调用 axlUIWPrint 在状态栏显示 “cancel”,不做任何绘制。
(cancel
axlUIWPrint(nil "cancel")
)