共计 1632 个字符,预计需要花费 5 分钟才能阅读完成。
手动调整过孔的痛点
在 PCB 设计中,过孔对齐是个高频操作。记得我第一次用 Allegro 手动对齐 20 个过孔时:

- 需要逐个拖动并盯着坐标栏微调
- 反复按空格键旋转方向
- 完成后发现整体偏移 0.1mm 又得重来
- 复杂布局时操作耗时超过 30 分钟
为什么选择 SKILL 脚本
通过对比测试同一个 6 ×6 过孔阵列:
- 手动操作:约 15 分钟(含检查时间)
- SKILL 脚本:3 秒执行 + 2 秒验证
自动化优势体现在:
- 精度达到 0.001mm 级误差
- 支持批量处理数百个过孔
- 可保存脚本重复使用
实战脚本开发
坐标系系统基础
Allegro 使用两种坐标表示:
- 绝对坐标:以板框左下角为原点(0,0)
- 相对坐标 :基于当前axlDBGrid 设置
获取当前单位制的代码示例:
procedure(getCurrentUnits()
let((unit)
unit = axlGetVariable("design" "USERUNITS")
case(unit
(0 'micrometers)
(1 'mils)
(t 'millimeters)
)
)
)
核心四步实现法
- 数据采集 – 用axlDBGet 获取过孔集合
vias = axlSingleSelectByName("VIA")
unless(vias axlUIConfirm("未选中任何过孔!"))
- 计算基准点 – 自动识别对齐中心
; 计算平均中心点
centroid = list(0.0 0.0)
foreach(via vias
centroid = mapcar('+ centroid via->xy)
)
centroid = mapcar('/ centroid (length vias))
- 几何排布算法 – 网格 / 环形两种模式
; 网格排列示例
procedure(gridArrange(vias cols spacing)
for(i 0 (length vias)-1
x = mod(i cols) * spacing
y = floor(i / cols) * spacing
axlDBCreateVia(...)
)
)
- 批量写入 – 使用axlDBChange 提交修改
完整脚本示例
/* 过孔对齐脚本 v1.2 */
procedure(alignVias(@optional (mode 'grid) (spacing 1.0))
let((vias centroid)
; 步骤 1:获取选择集
vias = axlSingleSelectByName("VIA")
unless(vias return(axlUIConfirm("请先选中过孔!")))
; 步骤 2:计算中心(处理奇数个情况)
centroid = list(0.0 0.0)
foreach(via vias
when(via->objType == "via"
centroid = mapcar('+ centroid via->xy)
)
)
centroid = mapcar('/ centroid (length vias))
; 步骤 3:执行排列
case(mode
('grid gridArrange(vias spacing))
('ring ringArrange(vias centroid spacing))
(t axlUIConfirm("未知模式!"))
)
; 步骤 4:刷新视图
axlUIWRedraw()
t
)
)
避坑指南
单位制转换
- 脚本内部统一使用 毫米 计算
- 需处理 mils 单位板时的转换:
if(getCurrentUnits() == 'mils then
spacing *= 0.0254 ; mils 转 mm
)
选择集过滤
避免误操作焊盘:
vias = setof(x axlGetSelSet() x->objType == "via")
调试技巧
- 使用 axlMsgPut 输出中间值
- 分阶段执行脚本
- 备份.brd 文件再测试
效率实测数据
| 过孔数量 | 手动(min) | 脚本(sec) |
|---|---|---|
| 16 | 8 | 2.1 |
| 64 | 35 | 3.8 |
| 256 | 预估 120+ | 6.4 |
扩展思考
如何实现 3D 堆叠过孔对齐?建议考虑:
- 获取层叠信息axlGetLayerStack
- 计算 Z 轴坐标偏移
- 动态调整过孔起始 / 终止层
下次可以试试在脚本中加入 axlCNSCreateCrossSection 调用来可视化验证!
正文完
发表至: 未分类
近一天内
