当前位置: 首页 > news >正文

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

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(donewhen( allsel != nil foreach( p allselwhen( p -> number == ""axlDBCreateText( "?"                    p -> xymake_axlTextOrientation(?textBlock "1" ,?rotation  0 ,?mirrored  nil ,?justify  "CENTER" ) "PACKAGE GEOMETRY/PIN_NUMBER"p)))))(cancelaxlUIWPrint(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 ();函数逻辑代码(cancelaxlUIWPrint(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 alistprintln( 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 allselwhen( p -> number == ""axlDBCreateText( "?"                    p -> xymake_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”,不做任何绘制。

(cancelaxlUIWPrint(nil "cancel")
)
http://www.lryc.cn/news/619173.html

相关文章:

  • Web 安全之互联网暴露面管理
  • 零售业CRM实战:如何打通线上线下客户数据?
  • word——照片自适应框大小【主要针对需要插入证件照时使用】
  • 亚马逊优惠券视觉体系重构:颜色标签驱动的消费决策效率革命
  • DAY38打卡
  • CTO 如何从“干活的人”转变成“带方向的人”?
  • Spring Boot项目通过RestTemplate调用三方接口详细教程
  • 带宽受限信道下的数据传输速率计算:有噪声与无噪声场景
  • mysql锁+索引
  • 自然语言处理关键库解析和使用方法- FuzzyWuzzy
  • 【3】Transformers快速入门:大语言模型LLM是啥?
  • 【4】Transformers快速入门:自然语言模型 vs 统计语言模型
  • GaussDB 数据库架构师修炼(十三)安全管理(2)-数据库权限管理
  • 如何构建PHP表单页面及验证相关原理(PHP基础)
  • 前后端分离项目中Spring MVC的请求执行流程
  • Kubernetes 资源管理全解析:从基础到企业级实践
  • TDengine 可观测性最佳实践
  • VBS 时间函数
  • 移动端网页调试实战,键盘弹出与视口错位问题的定位与优化
  • 需求跟踪矩阵是什么
  • mysql参数调优之 sync_binlog (二)
  • python技巧:控制转台的2个坑。
  • [激光原理与应用-253]:理论 - 几何光学 - 变焦镜头的组成原理及图示解析
  • 分布式事务Seata使用不当引发的全局锁问题
  • hashmap如何解决碰撞
  • JavaWeb从入门到精通!第二天!(Servlet)
  • 揭开Spectre漏洞的神秘面纱
  • 【后端】Spring @Resource和@Autowired的用法和区别
  • 告别数据孤岛!React 路由 3 种传参方法全解析
  • [Robotics_py] 定位滤波器 | 预测与更新 | 扩展卡尔曼滤波器(`EKF`)