Script Example Analysis in Altium Designer
スクリプトシステムの一般的な側面や、スクリプト内でのDelphiおよびX2オブジェクトモデルの使用についてさらに理解を深めるために、ここでは機能面から2つのサンプルプロジェクト ― ボード外形線コピーツールとネットリスト生成スクリプト ― を取り上げて解説します。
Board Outline CopierおよびNetlisterスクリプトは、Altium Designerのスクリプトシステムの機能を示すためにX2オブジェクトモデルを用いて開発されています。これらはサンプルスクリプト集に含まれている既存のスクリプトです。
-
Board Outline Copierスクリプトは、PCBオブジェクトモデルを利用して、既存のPCBボード外形線をトラックやアークとして指定したレイヤーにコピーします。
詳細は をご覧ください。\Scripts\VB Scripts\CopyBoardOutlinePRJ.PRJSCR -
Netlist generatorスクリプトは、WorkSpace Managerオブジェクトモデルを利用して、従来のProtel(v1およびv2)形式のネットリストを生成します。
詳細は をご覧ください。\Scripts\Delphiscript Scripts\WSM\Protel Netlister\ScripterProtelNetlist.PRJSCR
Board Outline Copierプロジェクト
Board Outline Copierの目的は、PCBドキュメント内の既存のボード外形線を同じドキュメント内の別のレイヤーにコピーすることです。
このプロジェクトでは、スクリプトフォームを使用し、ユーザーがダイアログを通じて外形線の幅を指定し、ドロップダウンメニューからターゲットレイヤーを選択できるようになっています。PCBオブジェクトモデルおよびPCB APIのインターフェースを利用して、ボード外形線のオブジェクトを抽出し、指定したレイヤーにコピーします。
► スクリプト動作例
スクリプトの主な構成要素は以下の通りです。
-
グローバルな
(PCB_Board 型)の変数。IPCB_Board -
サブルーチン(CopyBoardOutline およびAWidth パラメータを受け取る)。ALayer -
スクリプトフォームから幅とレイヤーの値を取得し、
サブルーチンを実行するCopyBoardOutline イベントハンドラ。bOkClick -
Board Outlineスクリプトフォーム(ダイアログ)を閉じる
イベントハンドラ。bCancelClick
スクリプトの機能
このスクリプトでは、スクリプトフォームを使用し、
OKボタンのイベントハンドラは、基本的に以下のようになります。
Sub bOKClick(Sender) Dim Width Dim Layer Call StringToCoordUnit(eWidth.Text,Width,PCB_Board.DisplayUnit) Layer = String2Layer(cbLayers.Items(cbLayers.ItemIndex)) End Sub
ここでは、フォームのマウスbOKClickStringToCoordUniteWidthPCB_Board.DisplayUnitWidth
同様に、選択されたレイヤー文字列(フォームTComboBoxのcbLayersString2LayerLayercbLayers.ItemsCopyBoardOutlineForm.dfm
イベントハンドラ(bOKClickCopyBoardOutlineWidthLayerbCancelClick
IPCB_Boardインターフェース
OKボタンハンドラ(bOKClickIPCB_BoardPCBServerIPCB_ServerInterfaceGetCurrentPCBPCB_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オブジェクトの作成には、IPCB_ServerInterfacePCBObjectFactory
'新しいトラックオブジェクトの作成 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 Track.Width = AWidth
上記のコードスニペットからも分かるように、トラックのLayerおよびWidthプロパティは、ユーザーインターフェースダイアログから抽出された値(フォームのcbLayerseWidth
すべての定義が完了したら、新しいオブジェクトはPCB_Board.AddPCBObject(NewObject)NewObject
PreProcessとPostProcess
PCBオブジェクトを作成する際は、最初にIPCB_ServerInterfacePreProcessIPCB_ServerInterfacePostPocess
PreProcessPostProcessPreProcessPostProcess
PCBServer.PreProcess 'PCBオブジェクトの作成 PCBServer.PostProcess
PCBドキュメントで表示されていないレイヤーにオブジェクトを追加する場合、そのレイヤーを強制的に表示させる必要があります。これはPCB_Board.LayerIsDisplayed(ALayer) = TrueALayer
ドキュメントのリフレッシュ
最後に、新しいボード外形を持つPCBドキュメントは、PCB:ZoomAction = RedrawResetParametersAddStringParameter
Netlisterプロジェクト
このNetlisterスクリプトプロジェクトの目的は、回路図を含むAltium Designerプロジェクトに対して、標準的なProtelネットリスト(バージョン1またはバージョン2形式)を生成することです。回路図プロジェクトのフラットネットリストは、2つのセクションに分かれます:
- コンポーネントのデジグネータと各コンポーネントに関連する情報
- ネット名と各ネット名に関連する情報、およびピン接続(コンポーネントのピン)
► スクリプト動作例
APIのWorkSpace Manager Object Modelは、プロジェクトおよびその構成要素(ドキュメント、コンポーネントとそのピン、ネット)を表すインターフェースを提供します。WorkSpace Managerは、プロジェクトおよび関連ドキュメントを扱うクライアントモジュールと密接に連携したシステムサーバーです。コンパイル、マルチシート設計サポート、接続性ナビゲーションツール、マルチチャネルサポート、複数の実装ドキュメントなどを提供します。WorkSpace Managerインターフェースを取得するには、GetWorkspaceIWorkspace
Netlisterスクリプトで注目すべきインターフェースは、IWorkSpaceIProjectIDocumentIComponentINet
一部のインターフェース、特に設計オブジェクトインターフェースは、同等のSchematic Objectインターフェースに対応していることに注意してください。これは、プロジェクト内の論理ドキュメントが接続情報を持つ回路図ドキュメントであるためです。実際、Schematic ObjectモデルをWorkSpace Managerの代わりに使用することも可能ですが、WorkSpace Managerはプロジェクトのコンパイルやドキュメントの抽出、回路図オブジェクトからのデータ取得などの機能も提供します。
Netlisterスクリプトの主な構成要素は以下の通りです:
-
グローバルな
文字列変数(ネットリストのファイル名)TargetFileName -
ネットリストデータが格納されるグローバルNetlist
コレクションオブジェクトTStringList -
およびWriteComponent_Version1 手続きWriteComponent_Version2 -
およびWriteNet_Version1 手続きWriteNet_Version2 -
ピンの電気的プロパティを文字列に変換する
関数ConvertElectricToStringデータ生成やファイル名、パス、ディレクトリ管理を行う 手続きGenerateNetlist
スクリプトの機能
パラメータなしの2つの手続きGenerateProtelV1FormatNetlistGenerateProtelV2FormatNetlist01GenerateNetlist
Procedure GenerateProtelV1FormatNetlist; Var Version : Integer; Begin // Protel 1 Netlist format, pass 0 GenerateNetlist(0); End; Procedure GenerateProtelV2FormatNetlist; Var Version : Integer; Begin // Protel 2 Netlist format, pass 1 GenerateNetlist(1); End;
GenerateNetList
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;
コンポーネントおよびネット情報は、後でフォーマット済みネットリストテキストファイルを生成するために使用されるTStringListTStringList
その後、現在のプロジェクトパスとファイル名、ネットリストフォーマットバージョンを定義するパラメータを渡してGenerate
Generate
GenerateDocumentPathTargetFileNameIProject.DM_DocumentFlattened
プロジェクト内のすべての回路図ドキュメントについて、各ドキュメントのネットおよびコンポーネントをWriteNetsWriteComponentsNetlist
ネットおよびコンポーネントの書き出し
ネットリストはコンポーネントセクションとネットセクションで構成されるため、コンポーネントデータとネットデータを個別に書き出す2つの手続きが必要です。
ノード数が2つを超えるネットのみがネットリストに書き出され、それ以下のものは破棄されます。各ネットについては、ネット名はNetのDM_CalculatedNetName
以下は、バージョン1のネットリスト形式における「Components」セクションと「Nets」セクションの2つのコードスニペットです。コンポーネントおよびネットのデータは NetListTStringList
コンポーネントセクション
WriteComponentNetList.Add
If Component <> Nil Then
Begin
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(']');
End;
ネットセクション
INet.DM_PinCountNetlist
If Net.DM_PinCount >= 2 Then
Begin
NetList.Add('(');
NetList.Add(Net.DM_CalculatedNetName);
For i := 0 To Net.DM_PinCount – 1 Do
Begin
Pin := Net.DM_Pins(i);
PinDsgn := Pin.DM_PhysicalPartDesignator;
PinNo := Pin.DM_PinNumber;
NetList.Add(PinDsgn + '-' + PinNo);
End;
NetList.Add(')');
End;
より詳細なネットリスト形式であるProtel v2では、ネットピンの電気的特性(InOutPassiveHiZ
バージョン2形式(WriteNet_Version2INet.DM_ElecticalConvertElectricToStringElectricalString
ネットリストファイルの作成
最後に、NetlistGenerateNetlistTStringList.SaveToFileTargetFileNameGenerate


