在AD内部跑VBScript脚本做批量计算,循环几百个元件的时候界面直接卡死,任务管理器里AD进程CPU占满,等半天才出结果。脚本引擎和主界面是同一个线程,循环里每改一个对象的属性就触发一次重绘,改五百个元件就重绘五百次,不卡才怪。把重绘间隔从默认的50ms调到200ms,或者干脆在脚本开头把`Application.Visible`设成False,跑完再设回True,界面不刷了速度能快好几倍。
脚本跑完弹`ActiveX component can't create object`,GetObject或者CreateObject连接Altium.Application的时候失败。Altium没开或者开了多个实例的时候都会出这个问题,用`On Error Resume Next`包起来,先试GetObject连已运行的实例,失败再CreateObject新开一个,两个都失败就弹提示退出。AD23之后VBScript被标成Legacy了,新建脚本默认不让用,得去Preferences→System→Advanced Settings里把Legacy.Scripts.SupportOldLanguages打开,不打开的话脚本文件拖进AD窗口直接报错。
WScript.Shell对象的Run方法在AD脚本里能调外部程序,把跟AD的API无关的计算扔出去。举个例子,PCB铜皮的面积计算,遍历几万个多边形顶点在VBScript里跑慢得要死,用`WshShell.Run "python calc_area.py input.txt output.txt", 0, True`把坐标导出去,Python算完写回来,第二个参数0是隐藏窗口,True是等Python跑完再往下走。同一条路可以调Matlab、调Octave、调任何命令行工具,只要能把结果写回文件就行。计算逻辑跟AD无关的部分全塞到外部程序里,AD脚本只负责取数据和写数据。

调外部程序有几个坑。Run方法的第二个参数控制窗口样式,0是隐藏,1是正常显示,隐藏的话用户看不到进度,长时间计算的时候容易以为卡死了。第三个参数`bWaitOnReturn`设True的话AD会一直等到外部程序退出,设False的话AD继续往下跑不等待,多进程并行的时候用False。路径里带空格的话命令要用双引号包起来,`WshShell.Run """C:\Program Files\Python\python.exe"" script.py", 0, True`,VBScript的字符串里双引号要转义成两个双引号。
COM对象的复用问题。脚本里每次循环都`CreateObject`新建一个Altium.Application实例,几百次循环下来系统COM资源耗尽,脚本直接崩。改成在脚本开头建一次,循环里复用同一个对象,跑完再`Set obj = Nothing`释放。跟外部程序通信的时候也一样,别在循环里反复启动同一个外部程序,把批量数据写成一个文件传过去,外部程序一次跑完,比循环里调几百次快得多。
AD的脚本编辑器里按F9直接跑,或者DXP→Run Script选文件跑。调试的时候用`Debug.Print`往Output面板写日志,比MsgBox好,MsgBox每弹一次都要点确定,循环里弹几十次能把人逼疯。脚本文件存成UTF-8带BOM,中文注释不会乱码。脚本工程(.PRJSCR)跟PCB工程分开管理,一个功能一个.vbs文件,版本控制只提交源文件。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删