当前位置: 首页 > 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.dtcms.com/a/327125.html

相关文章:

  • NetworkManager配置热点
  • Springboot注册过滤器的三种方式(Order 排序)
  • 如何用codeBuddy20分钟处理一单数据分析
  • 10. React组件间的通信
  • MySQL——MySQL引擎层BufferPool工作过程原理
  • K8s 1.32.6版本部署文档
  • Ansible 基础到实操笔记
  • 【Redis在数据治理与数据隐私保护策略中的优化】
  • 新手向:Python编写简易翻译工具
  • 移动端调用大模型详解
  • 【运维进阶】Ansible 自动化
  • 西门子 S7-200 与 S7-1200 借 PPI 以太网模块通讯,赋能食品行业进步
  • 【pxe】通过pxe批量安装centos系统(传统Legacy启动+uefi启动)
  • Neo4j Cypher语句
  • 淘宝API列表:高效获取商品详情图主图商品视频参数item_get
  • 微前端 + Docker + Kubernetes 运作机制
  • 【51单片机定时器流水灯】2022-10-28
  • Docker使用----(安装_Windows版)
  • Go语言实战案例:使用Gin框架构建Hello API
  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 快速了解自然语言处理
  • 《Redis慢查询日志操作:SLOWLOG GET/CONFIG等命令的分析方法》
  • 计算机视觉(4)-相机基础知识恶补
  • 前端css学习笔记3:伪类选择器与伪元素选择器
  • 【shell脚本编程】-4 shell脚本编写冒泡排序
  • Redis命令大全
  • 新型Windows RPC攻击可劫持服务并完全攻陷Active Directory,PoC已公开
  • C++——模板初阶
  • 企业培训笔记:宠物信息管理--实现宠物信息的添加
  • 计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】