脚本实例分析
为了进一步了解脚本系统的总体情况,以及在脚本中使用 Delphi 和 X2 对象模型的情况,这里将从功能角度对两个示例项目--电路板大纲复制器和网表生成脚本--进行审查。
电路板大纲复制器和网表脚本是使用 X2 对象模型开发的,用于说明 Altium Designer 中脚本系统的功能。这些脚本是脚本示例集中的现有脚本,如下所示:
-
电路板轮廓复制器脚本利用 PCB 对象模型,将现有的 PCB 电路板轮廓复制到指定层上的轨道和圆弧上。
请参见 .\Scripts\VB Scripts\CopyBoardOutlinePRJ.PRJSCR -
网表生成器脚本利用工作空间管理器对象模型生成传统 Protel(v1 和 v2)格式的网表。
参见 .\Scripts\Delphiscript Scripts\WSM\Protel Netlister\ScripterProtelNetlist.PRJSCR
电路板大纲复制器项目
电路板大纲复制器的目的是将 PCB 文档中已有的电路板大纲复制到同一文档中的不同层。
该项目使用脚本窗体,因此用户可以与对话框交互,指定电路板轮廓的宽度,并从下拉菜单中选择目标层。使用 PCB API 中的 PCB 对象模型及其 PCB 接口,可以提取电路板轮廓的对象并将其复制到指定的层上。
► 脚本操作示例
脚本的主要部分包括
-
一个全局
(类型)变量。PCB_Board 类型)变量。IPCB_Board -
A
子程序接受CopyBoardOutline 和AWidth 参数的子程序。ALayer -
事件处理程序
事件处理程序从脚本表单中获取宽度和图层值,然后执行bOkClick 子程序。CopyBoardOutline -
事件处理程序
事件处理程序,用于关闭电路板大纲脚本窗体(对话框)。bCancelClick
脚本功能
脚本使用的脚本窗体需要事件处理程序来捕捉单个控件的鼠标点击,如
OK 按钮事件处理程序基本如下:
子 bOKClick(Sender) 尺寸 尺寸 调用 StringToCoordUnit(eWidth.Text,Width,PCB_Board.DisplayUnit) 层 = String2Layer(cbLayers.Items(cbLayers.ItemIndex)) 结束子操作
在这里,表单的鼠标 bOKClickStringToCoordUniteWidthPCB_Board.DisplayUnitWidth
同样,所选图层字符串(表单 TComboBox 中的 cbLayersString2LayerLayercbLayers.ItemsCopyBoardOutlineForm.dfm
事件处理程序的最后一步 (bOKClickCopyBoardOutlineWidthLayerbCancelClick
IPCB_Board 接口
在 OK 按钮处理程序(bOKClickIPCB_BoardIPCB_ServerInterfacePCBServerGetCurrentPCBPCB_Board
然后,在整个脚本中都可以从当前电路板大纲 (IPC_BoardOutlineIPCB_BoardBoardOutlinePCB_Board
在复制和创建新大纲之前,需要先初始化电路板大纲。由 IPCB_BoardOutline
PCB_Board.BoardOutline.Invalidate PCB_Board.BoardOutline.Rebuild PCB_Board.BoardOutline.Validate
勾画弧线和轨迹线段
界面 IPCB_BoardOutlineIPCB_GroupIPCB_GroupIPCB_Group
一个棋盘轮廓对象可以存储两种不同类型的线段,即 ePolySegmentLineePolySegmentArcPointCountIPCB_BoardOutlineIFor-To-Next
获得的电路板轮廓的每个线段都要用 If PCB_Board.BoardOutline.Segments(I).Kind = ePolySegmentLine ThenePolySegmentLineElse
对于找到的每个线段,根据线段类型,将使用 PCBObjectFactory
PCBObjectFactory 函数
创建新的 PCB 对象时,使用 PCBObjectFactoryIPCB_ServerInterface
创建新的轨道对象 PCBServer.PCBObjectFactory(eTrackObject, eNoDimension, eCreate_Default) 创建新的弧形对象 PCBServer.PCBObjectFactory(eArcObject, eNoDimension, eCreate_Default)
函数 PCBObjectFactory
每个轨道或圆弧对象由 PCBObjectFactory
轨迹和弧属性由各自的接口表示、 IPCB_TrackIPCB_ArcTrack.X1Track.Y1X2Y2
Track.X1 = PCB_Board.BoardOutline.Segments(I).vx Track.Y1 = PCB_Board.BoardOutline.Segments(I).vy Track.X2 = PCB_Board.BoardOutline.Segments(J).vx Track.Y2 = PCB_Board.BoardOutline.Segments(J).vy Track.Layer = ALayer 轨道宽度 = AWidth
从上面的代码片段中还可以看出,轨道层和宽度属性只是由从用户界面对话框中提取的传递值定义的,即窗体的 cbLayerseWidth
完全定义后,新对象将被添加到 PCB 文档的指定层,并使用 PCB_Board.AddPCBObject(NewObject)NewObject
预处理和后处理
创建 PCB 对象时,PCB 文件中的 PreProcessIPCB_ServerInterfacePostPocessIPCB_ServerInterface
调用 PreProcessPostProcessPreProcessPostProcess
PCBServer.PreProcess 创建 PCB 对象 PCBServer.PostProcess
当对象被添加到 PCB 文档中尚未显示的指定层时,需要强制该层可见。这由 PCB_Board.LayerIsDisplayed(ALayer) = TrueALayer
文档刷新
最后,使用 PCB:ZoomAction = RedrawAddStringParameterResetParameters
网表项目
该 Netlister 脚本项目旨在为包含原理图的 Altium Designer 项目生成标准 Protel 网表(版本 1 或版本 2 格式)。原理图项目的平面网表分为两部分:
- 元件代号和与每个元件相关的信息、
- 网络名称和与每个网络名称相关的信息,以及引脚连接(组件的引脚)。
► 脚本操作示例
API 的工作空间管理器对象模型(WorkSpace Manager Object Model)提供了表示项目及其组成元素 (文档、组件及其引脚和网)的接口。工作空间管理器是一个系统服务器,与处理项目及其相关文档的客户端模块紧密耦合。它提供编译、多工作表设计支持、连接导航工具、多通道支持、多执行文档等功能。要检索工作空间管理器界面,请调用 GetWorkspaceIWorkspace
对于 Netlister 脚本,我们感兴趣的接口有 IWorkSpaceIProjectIDocumentIComponentINet
请注意,某些接口,尤其是设计对象接口,与等效的示意图对象接口相对应。这是因为项目中的逻辑文档是带有连接信息的示意图文档。事实上,可以使用示意图对象模型来代替工作空间管理器,但后者提供了编译项目、从项目中提取文档以及从示意图对象中检索数据的功能。
Netlister 脚本的主要部分包括
-
一个全局
字符串变量,即网表的文件名。TargetFileName -
一个全局网表
集合对象,其中包含网表数据。TStringList -
在
和WriteComponent_Version1 程序。WriteComponent_Version2 -
和程序。
和程序。WriteNet_Version1 程序。WriteNet_Version2 -
A
函数将引脚的电气属性转换为字符串ConvertElectricToString -
程序
存储过程,用于管理数据生成以及文件名、路径和目录管理任务。GenerateNetlist
脚本功能
两个无参数过程 GenerateProtelV1FormatNetlistGenerateProtelV2FormatNetlistGenerateNetlist01
存储过程 GenerateProtelV1FormatNetlist; 变量 版本:整数; 开始 // Protel 1 网表格式,通过 0 GenerateNetlist(0); 结束; 过程 GenerateProtelV2FormatNetlist; 版本 版本:整数; 开始 // Protel 2 网表格式,通过 1 GenerateNetlist(1); 结束;
生成网表
程序 GenerateNetListIWorkspace.DM_FocusedProject
在提取网络之前,需要对项目进行编译,因为编译过程会建立项目的连接信息。项目界面的 DM_CompileIProject.DM_Compile
WS := GetWorkspace; If WS = Nil Then Exit; Prj := WS.DM_FocusedProject; If Prj = Nil Then Exit; // 编译项目以获取设计的连接信息。 Prj.DM_Compile;
组件和网络信息存储在 Netlist 对象的 TStringListTStringList
然后 Generate
生成
过程 GenerateDocumentPathTargetFileNameIProject.DM_DocumentFlattened
对于项目中的所有原理图文档,将使用 WriteNetsWriteComponentsNetlist
编写网和元件
网表由元件和网部分组成,因此需要两个程序分别写入元件数据和网数据。
只有节点数大于两个的网才会被写入网表,节点数小于两个的网会被丢弃。对于每个网,网名基于 Net 的 DM_CalculatedNetName
下图是第一版网表格式中元件和网部分的两个代码片段。请注意,元件和网数据存储在 NetListTStringList
组件部分
在 WriteComponentNetList.Add
如果组件 > 无 那么
开始
NetList.Add('[');
NetList.Add(Component.DM_PhysicalDesignator);
NetList.Add(Component.DM_FootPrint);
NetList.Add(Component.DM_PartType);
NetList.Add('');
NetList.Add('');
NetList.Add('');
NetList.Add(']');
结束;
网络部分
在 "网络 "过程中,如果一个网络有两个或多个引脚 (INet.DM_PinCountNetlist
如果 Net.DM_PinCount >= 2 那么
开始
NetList.Add('(');
NetList.Add(Net.DM_CalculatedNetName);
For i := 0 To Net.DM_PinCount - 1 Do
开始
Pin := Net.DM_Pins(i);
PinDsgn := Pin.DM_PhysicalPartDesignator;
PinNo := Pin.DM_PinNumber;
NetList.Add(PinDsgn + '-' + PinNo);
结束;
NetList.Add(')');
结束;
需要注意的是,Protel v2 这种更冗长的网表格式包含了网络引脚的电气属性 (InOutPassiveHiZ
第 2 版格式的网络编写程序 (WriteNet_Version2INet.DM_ElecticalConvertElectricToStringElectricalString
创建网表文件
最后 NetlistGenerateNetlistTStringList.SaveToFileTargetFileNameGenerate


