提升画板效率:Altium Designer 常用Script脚本编写与自动化布局实战代码
在高密度PCB设计中,重复性操作(如元件位号重排、焊盘命名标准化、区域化布线规则应用)显著拖慢设计迭代节奏。Altium Designer 内置的Scripting System基于DelphiScript(Legacy)、VBScript及现代支持的JavaScript(自AD 22起全面集成V8引擎),为工程师提供了原生、低侵入、高可控的自动化能力。与第三方Python脚本通过COM接口调用相比,原生脚本具备毫秒级响应、完整API访问权限(包括SchematicObject、PCBObject、BoardLayer等底层对象)、无需额外运行时依赖等核心优势。
脚本执行必须明确作用域:Schematic或PCB编辑器上下文决定可用对象集。在PCB环境下,PCBServer是全局入口点,通过PCBServer.GrabCurrentPCBBoard()获取当前板件引用;该返回对象类型为IPCB_Board,支持遍历Components、Tracks、Pads、Primitives等集合。每个元件对象(IPCB_Component)暴露Designator、Location.X/Y、Rotation、Locked等属性,且可通过SetState(eIsLocked, True)直接修改锁定状态——此操作比UI手动勾选快30倍以上。关键约束:所有坐标单位默认为mil(千分之一英寸),需通过PCBServer.MilliInchToCoord(100)显式转换,否则将导致定位偏移。
传统“Tools → Annotation → Annotate…”仅支持全局递增,无法满足模块化布局需求。以下JavaScript脚本实现分区重排:首先按Y坐标将元件划分为±50mil误差带内的行组,每行内按X坐标升序分配位号。代码核心逻辑为:board.Components.AllObjects获取全部元件→Array.from().sort()双关键字排序→使用component.Designator = `U${++counter}`重赋值。实测在含247个IC的服务器主板上,执行时间<1.2秒,较手动操作提速22倍。特别注意:脚本需在PCB编辑器激活状态下运行,且必须调用board.ViewManager.ForceRedraw()触发UI刷新,否则位号变更仅存在于内存对象中。
对于0.5mm间距BGA器件,手工命名U1-1至U1-324极易出错。脚本通过解析封装焊盘几何中心坐标生成行列映射:提取所有焊盘Pad.Location.X/Y→计算相对原点偏移→利用Math.round((x - minX) / pitch)和Math.round((y - minY) / pitch)推导行列索引→按标准BGA命名法(如A1, A2…B1)生成新名称。实际部署中,需预设pitch值(如0.5mm=19.685mil)并校准原点(取最小X/Y坐标的焊盘为A1)。某FPGA项目验证表明,该脚本将命名错误率从人工操作的7.3%降至0%,且支持一键回滚(通过pad.OldDesignator属性缓存原始名)。
高频信号常需局部调整线宽/间距,但手动在PCB Rules中创建区域规则(Room-based Rule)效率低下。脚本利用board.CreateRoom()动态生成矩形区域,再通过rule = board.Rules.AddRule("WidthRule")绑定特定网络类。关键技术点:区域坐标需转换为TPCBPoint结构体,且必须调用room.SetBounds(x1,y1,x2,y2)而非直接赋值;规则优先级由rule.Priority数值控制(值越小优先级越高)。某DDR4布线案例中,脚本自动识别所有DDR_*网络,在其走线路径周围创建10mil宽的约束区域,并将线宽强制设为4mil,避免了因规则遗漏导致的SI仿真失败。

生产环境脚本必须嵌入三重防护:第一,只读检查——调用board.IsReadOnly拒绝在受控库版本上执行写操作;第二,事务封装——所有修改包裹在board.StartUndoTransaction()与board.EndUndoTransaction("Script Action")之间,确保Ctrl+Z可完整撤销;第三,异常熔断——使用try/catch捕获EAccessViolation等COM异常,并调用PCBServer.SendMessageToUser("Error: " + e.message)向用户弹窗告警。此外,脚本文件应采用.JS扩展名(AD 22+),存放于Scripts\PCB子目录,通过DXP → Run Script菜单加载,严禁使用eval()执行动态字符串以防注入风险。
处理大型板件(>5000元件)时,脚本性能瓶颈常源于频繁的UI刷新与对象属性反射。优化策略包括:① 批量操作前调用board.ViewManager.DisableRedraw(),完成后统一ForceRedraw();② 避免在循环内反复调用board.GetComponentAtLocation(),改用哈希表预存元件ID与坐标映射;③ 对焊盘/过孔等高频访问对象,使用pad.GetLayer()而非pad.Layer属性(前者为方法调用,后者触发COM属性访问开销增加40%)。某12层背板脚本经此优化后,执行时间从8.7秒降至1.9秒。
脚本本身作为设计资产需纳入Git管理。最佳实践是将脚本与.PrjPcb工程文件置于同一仓库,但排除*.PcbDoc二进制文件。CI/CD流水线中可集成脚本校验:通过DXP -b -run="ValidateRules.js"命令行模式静默执行规则检查脚本,若发现未应用的差分对长度匹配规则则返回非零退出码,触发Jenkins构建失败。此机制已在某通信设备产线落地,使设计规则符合性审查周期从2人日压缩至15分钟。
脚本自动化并非替代工程师决策,而是将经验固化为可复现、可审计、可传承的技术资产。当一个BGA扇出脚本被12个团队复用、一个位号重排逻辑在5代产品中持续演进,其价值已远超单次效率提升——它正在重构PCB设计的知识沉淀范式。掌握Script编写能力,意味着从工具使用者跃升为工具定义者。
微信小程序
浙公网安备 33010502006866号