【Allegro SKILL代码解析】添加Pin Number

发布于:2025-08-13 ⋅ 阅读:(13) ⋅ 点赞:(0)
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")
)

网站公告

今日签到

点亮在社区的每一天
去签到