回路図APIの使用
親ページ: Altium Designer APIの使用
回路図エディタインターフェースの使用
回路図APIを使用すると、プログラマーは回路図ドキュメントから回路図オブジェクトとその属性を取得または変更できます。ドキュメントに表示されるオブジェクトは、対応する設計データベースに格納されています。
回路図エディタによって公開される回路図インターフェースは、開かれた回路図ドキュメントとその上のオブジェクトを指します。
インターフェースは、メモリ内のオブジェクトへのアクセス手段です。回路図サーバーにアクセスして回路図設計オブジェクトを更新するには、SchServer関数を呼び出してISch_ServerInterfaceインターフェースを取得する必要があります。これは主要なインターフェースであり、多くのインターフェースを内包しています。このインターフェースを使用すると、特定のPCBオブジェクトを反復処理することでさらに進むことができます。
IPCB_ServerInterfaceおよびISch_Documentインターフェースは、回路図または回路図ライブラリドキュメントからデータを抽出する際に取り扱う主要なインターフェースの中にあります。以下は、簡略化された回路図オブジェクトインターフェース階層です:
簡略化された回路図オブジェクトインターフェース階層
ISch_BasicContainer
ISch_GraphicalObject
ISch_Arc
ISch_EllipticalArc
ISch_Line
ISch_BusEntry
ISch_ConnectionLine
ISch_Polygon
ISch_BasicPolyline
ISch_Polyline
ISch_Bezier
ISch_Wire
主要な回路図インターフェース
-
ISCH_ServerInterfaceインターフェースは、回路図APIの主要なインターフェースです。回路図インターフェースを使用するには、SchServer関数を呼び出してISch_ServerInterfaceオブジェクトを取得する必要があります。ISch_ServerInterfaceインターフェースは、他の回路図オブジェクトを取得するためのゲートウェイです。 -
ISch_GraphicalObjectインターフェースは、すべての回路図設計オブジェクトインターフェースに使用される汎用インターフェースです。 -
ISch_Documentインターフェースは、Altium Designer内の既存の回路図ドキュメントを指します。
Altium Designerで回路図設計オブジェクトを扱う必要がある場合、出発点はSchServer関数を呼び出し、ISch_ServerInterfaceインターフェースを使用して、ISch_ServerInterfaceインターフェースから公開される他の派生回路図インターフェースを抽出することです。
SchServer関数の例
If SchServer = Nil Then Exit;
If Not Supports (SchServer.GetCurrentSchDocument, ISch_Document, CurrentSheet) Then Exit;
ParentIterator := CurrentSheet.SchIterator_Create;
If ParentIterator = Nil Then Exit;
回路図インターフェースのプロパティとメソッドへのアクセス
各回路図オブジェクトインターフェースには、メソッドとプロパティがリストされます(すべてのインターフェースにメソッドとプロパティの両方がリストされているわけではありません。一部はメソッドのみです)。
オブジェクトインターフェースのプロパティは変数のようなもので、プロパティで値を取得または設定しますが、一部のプロパティは読み取り専用プロパティであり、値を返すことはできますが設定はできません。プロパティは、そのGetおよびSetメソッドによって実装されます。たとえば、SelectionプロパティにはFunction GetState_Selection : Boolean; およびProcedure SetState_Selection(B : Boolean);
プロパティ値の例
Component.Selection := True //値を設定
ASelected := Component.Selection //値を取得
ISch_GraphicalObjectは、ISch_ArcやISch_Lineなど、すべての子孫回路図設計オブジェクトインターフェースの基本インターフェースです。したがって、基本インターフェースのすべてのメソッドとプロパティは、子孫設計オブジェクトで利用可能です。
たとえば、Selectionプロパティとそれに関連するFunction GetState_Selection : Boolean; およびProcedure SetState_Selection (B : Boolean);メソッドは、ISch_GraphicalObjectインターフェースで宣言され、ISch_ArcやISch_Lineインターフェースなどの子孫インターフェースで継承されています。
このSelectionプロパティはISch_Arcにはありませんが、ISch_Arcインターフェースが基本のISch_GraphicalObjectインターフェースから継承されており、このインターフェースにはSelectionプロパティとその関連メソッド(たとえばGetState関数とSetState手続き)があります。
期待するメソッドやプロパティがオブジェクトインターフェースにない場合、次のステップは基本のISch_GraphicalObjectインターフェースを調べることです。これを使用して、回路図のほとんどのオブジェクトにアクセスできます。
回路図インターフェースオブジェクトの型キャスト
サーバー開発では、変数とオブジェクトの型を扱う必要があります。インターフェース型は、変数と値の型キャストにおいてクラス型と同じルールに従います。たとえば、ISch_Pin(SchPin)は、SchPin変数がインターフェースを実装している場合に、クラス型式をインターフェース型にキャストできます。スクリプトでは、通常、オブジェクトを型キャストする必要はありません。
インターフェースオブジェクトとして直接実装されていないDelphiオブジェクトを直接型キャストすることはできません。これらのDelphiオブジェクトにインターフェースがない場合、このコードスニペットは例外を生成します。
この問題の解決策は、Embarcadeo Delphi™のVCLライブラリの一部であるSupportキーワードを使用することです。このSupportsキーワードは、指定されたインターフェースをサポートしているかどうかをチェックします。Delphiオブジェクトがインターフェースオブジェクトへの参照を含んでいるかどうかを確認するために、このSupports関数を呼び出すことができます。
サーバーコードでの不正な型キャスト
SchComponent := CurrentLib.CurrentSchComponent;
If SchComponent = Nil Then Exit;
PinList := GetState_AllPins(SchComponent);
For i := 0 to PinList.Count - 1 do
Begin
SchPin := ISch_Pin(PinList[i]); // 不正な型キャスト。
ShowMessage(SchPin.Designator+':'+SchPin.Name);
End;
サーバープロジェクトのコードでSupports関数を使用する
SchComponent := CurrentLib.CurrentSchComponent;
If SchComponent = Nil Then Exit;
PinList := GetState_AllPins(SchComponent);
For i := 0 to PinList.Count - 1 do
Begin
If (Supports(TObject(ISch_Pin(PinList[i]),ISch_Pin, SchPin) Then
ShowMessage(SchPin.Designator+':'+SchPin.Name);
End;
サーバープロジェクトのSupports関数の別の例
If SchServer = Nil Then Exit;
If Not Supports (SchServer.GetCurrentSchDocument, ISch_Document, CurrentSheet) Then Exit;
回路図データベースシステム
回路図エディタは32ビットのデータベースシステムを使用し、図面オブジェクトと電気オブジェクトの2種類のオブジェクトを格納します。データベースシステムには、フラットデータベースと空間データベースの2つの異なるデータ構造があります。この二次データベースシステムでは、各コンテナは同じ種類のオブジェクトを保持しており、例えばバスエントリコンテナは、座標によって整理されたバスエントリオブジェクトの線形リストで構成されています。
データベースの種類は、回路図オブジェクトにどのようにアクセスしたいかに応じて自動的に選択されます。回路図シート上の既存の回路図オブジェクトは、そのTSchObjectHandle値によって識別されます。インターフェースによってラップされた各回路図オブジェクトには、I_ObjectAddress関数があります。
回路図ドキュメント
回路図エディターには2種類のドキュメントがあります。回路図ドキュメントと回路図ライブラリドキュメントです。回路図ドキュメントの扱いは簡単で、該当する回路図ドキュメントを取得し、回路図オブジェクトを追加または削除できます。
回路図ライブラリドキュメントの扱いはもう少し複雑で、各回路図シンボル(指定子が未定義のコンポーネント)は同一の回路図ライブラリドキュメントの一部であり、回路図ライブラリファイル内にはライブラリドキュメントが存在します。したがって、ライブラリのシンボルを反復処理したり、シンボルを追加/削除する前に、回路図ライブラリコンテナが必要です。
Altium Designerでの回路図またはライブラリドキュメントの読み込み
特定のドキュメントをプログラム的に開く必要がある場合もあります。これは、Client.OpenDocumentおよびClient.ShowDocumentメソッドを使用して容易に行えます。
テキストドキュメントを開く場合は、「Text」文字列と完全なファイル名文字列を渡します。回路図および回路図ライブラリドキュメントの場合は、それぞれ「SCH」と「SCHLIB」文字列を完全なファイル名文字列と共に渡す必要があります。PCBおよびPCBライブラリドキュメントの場合は、「PCB」と「PCBLIB」文字列をそれぞれ完全なファイル名文字列と共に渡します。
一部の関数のパラメータがnull終端型であり、文字列がTDynamicString型であることが多いため、これらの文字列をPChar型として型キャストする必要があります。
以下のコードスニペットでは、FilenameパラメータがTDynamicString型であり、このパラメータはClient.OpenDocumentメソッドでPCharとして型キャストされています。
Client.OpenDocumentメソッドを使用して回路図ドキュメントを開く
Var
ReportDocument : IServerDocument;
Begin
ReportDocument := Client.OpenDocument('SCH',PChar(FileName));
If ReportDocument <> Nil Then
Client.ShowDocument(ReportDocument);
End
Altium Designerでの回路図またはライブラリドキュメントの作成
プログラム的に独立した空のドキュメントを作成する必要がある場合があります。これは、CreateNewDocumentFromDocumentKind関数を使用して容易に行えます。たとえば、テキストドキュメントを作成する場合は、「Text」文字列を渡します。
CreateNewDocumentFromDocumentKindの例
Var
Document : IServerDocument;
Kind : TDynamicString;
Begin
//利用可能なKindsはPCB, PCBLib, SCH, SchLib, TEXT,...
Kind := ‘SCH’;
Document := CreateNewDocumentFromDocumentKind(Kind);
End;
現在のプロジェクトに空の回路図を追加する例
Var
Doc : IServerDocument;
Project : IProject;
Path : TDynamicString;
Begin
If SchServer = Nil then Exit;
Project := GetWorkSpace.DM_FOcusedProject;
If Project <> Nil Then
Begin
Path := GetWorkSpace.Dm_CreateNewDocument(‘SCH’);
Project.DM_AddSourceDocument(Path);
Doc := Client.OpenDocument(Pchar(‘SCH’,PChar(Path));
Client.ShowDocument(Doc);
End;
If Not Supports (SchServer.GetCurrentSchDocument,ISchDocument,Doc) Then Exit;
End;
Scripts\DelphiScript Scripts\DXP\フォルダのスクリプト例を参照してください。
一般に、現在フォーカスされているプロジェクトにプログラム的にドキュメントを作成して配置したい場合は、Altium Designerのワークスペースマネージャーにインターフェースアクセスし、DM_FocusedProjectおよびDM_AddSourceDocument関数を呼び出す必要があります。
プロジェクトへのドキュメントの追加
Procedure Command_CreateSchObjects(View : IServerDocumentView; Parameters : PChar);
Var
Doc : IServerDocument;
Project : IProject;
Path : TDynamicString;
Begin
If SchServer = Nil Then Exit;
// 現在フォーカスされているプロジェクトに空の回路図ドキュメントを作成して追加します。
Project := GetWorkspace.DM_FocusedProject;
If Project <> Nil Then
Begin
Path := Getworkspace.DM_CreateNewDocument('SCH');
Project.DM_AddSourceDocument(Path);
Doc := Client.OpenDocument(PChar('SCH'), PChar(Path));
Client.ShowDocument(Doc);
End;
If Not Supports (SchServer.GetCurrentSchDocument, ISch_Document, SchDoc) Then Exit;
// 回路図ドキュメントで何をしたいか実行します!
End;
Altium Designerでの回路図ドキュメントのタイプの確認
GetCurrentSchematicDocument関数をSchServerオブジェクトから使用して、現在の回路図ドキュメントが回路図タイプのドキュメントであるかどうかを確認できます。
ISch_Docタイプのコードスニペット
Var
CurrentSch : ISch_Doc;
Begin
If Not Supports (SchServer.GetCurrentSchDocument, ISch_Doc,CurrentDoc)Then
Begin
ShowInfo('回路図ライブラリドキュメントではありません。');
Exit;
End;
//同様に
End;
このコードスニペットは、フォーカスされたドキュメントが回路図ライブラリタイプであるかどうかを確認します。
ISch_Libタイプのコードスニペット
Var
CurrentLib : ISch_Lib;
Begin
If Not Supports (SchServer.GetCurrentSchDocument, ISch_Lib,CurrentLib)Then
Begin
ShowInfo('回路図ライブラリドキュメントではありません。');
Exit;
End;
End;
このコードスニペットは、ドキュメントが回路図ライブラリ形式であるかどうかを確認します。
CurrentView.Kindの例
このコードスニペットは、Client.CurrentView.Kindメソッドを使用して、現在のドキュメントのタイプを調べます:
If StrPas(Client.CurrentView.Kind) <> UpperCase('SchLib') Then Exit;
ドキュメントをDirtyに設定する
プログラム的にドキュメントをDirtyに設定する必要がある場合があります。これは、Altium Designerを閉じるときにこのドキュメントを保存するように促すために、ServerDocument.Modified関数をtrueに設定することで実現されます。
ドキュメントをDirtyに設定する例
Var
AView : IServerDocumentView;
AServerDocument : IServerDocument;
Begin
// CLientのインターフェースを使用して現在のドキュメントビューを取得します。
AView := Client.GetCurrentView;
//所有ドキュメントフィールドを抽出してビューを格納するサーバードキュメントを取得します。
AServerDocument := AView.OwnerDocument;
// ドキュメントをDirtyに設定します。
AServerDocument.Modified := True;
End;
Scripts\DelphiScript Scripts\DXP\フォルダのスクリプト例を参照してください。
プログラム的にドキュメントをリフレッシュする
回路図ドキュメント上でオブジェクトを配置または変更するとき、このドキュメントをリフレッシュする必要がしばしばあります(PreProcess / PostProcessおよびSchServer.RobotManager.SendMessage()メソッドも使用する必要があります)。
-
ISch_Document.GraphicallyInvalidate; -
RunProcess(); (スクリプトコード) -
Commands.LaunchCommand(); (サーバーコード)
以下の例は、ドキュメントを更新する複数の方法を示しています。ICommandLauncher.LaunchCommandメソッドまたはIProcessLauncherのSendMessage関数を使用できます。
スクリプト内のGraphicallyInvalidateおよびRunProcessメソッド
//画面をリフレッシュするためにGraphicallyInvalidateメソッドを使用
Var
SchDoc : ISch_Document;
Begin
// 画面をリフレッシュ
SchDoc := SchServer.GetCurrentSchDocument;
If SchDoc = Nil Then Exit;
// 回路図ドキュメントを変更(新しいオブジェクト、削除されたオブジェクトなど)
// 回路図ドキュメントをリフレッシュするために呼び出し。
SchDoc.GraphicallyInvalidate;
ResetParameters;
AddStringParameter('Action', 'Document');
RunProcess('Sch:Zoom');
End;
サーバープロジェクトでのCommands.LaunchCommandの例
Procedure ZoomToDoc;
Var
Commands : ICommandLauncher;
Parameters : PChar;
SchematicServer : IServerModule;
Begin
GetMem (Parameters, 256);
Try
SetState_Parameter(Parameters, 'Action', 'Document');
If Supports(SchServer, IServerModule, SchematicServer) Then
Begin
If Supports (SchematicServer.CommandLauncher, ICommandLauncher, Commands) Then
Commands.LaunchCommand('Zoom', Parameters, 255,Client.CurrentView);
End;
Finally
FreeMem(Parameters);
End;
End;
スクリプトでのClient.SendMessage
プロセスとそのパラメータ文字列を送信するために、ClientオブジェクトのSendMessageメソッドを使用できます。
Client.SendMessage('SCH:Zoom', 'Action=Document' , 255, Client.CurrentView);
注、サーバープロジェクトでは、SendMessageメソッドはIProcessLauncherインターフェースから利用可能です。
回路図オブジェクト
回路図設計オブジェクトは、現在アクティブな回路図ドキュメントの回路図エディタのデータベース内に格納されています。基本的な回路図オブジェクトはプリミティブと呼ばれます。回路図エディタには、電気的プリミティブと非電気的プリミティブの2種類があります。各設計オブジェクトには、ポインタのような一意のオブジェクトハンドルがあります。これらのハンドルを使用して、設計オブジェクトのプロパティにアクセスして変更することができます。
回路図エディタには、次の電気的プリミティブが含まれます:バス、バスエントリ、ジャンクション、ポート、パワーポート、PCBレイアウト指示、ピン、No ERC指示、シートエントリ、シートシンボル、刺激指示、テストベクター指示、およびワイヤーオブジェクト。リストに新しいものを追加してください
非電気的プリミティブには、注釈、アーク、ベジエ、楕円、楕円アーク、グラフィカルイメージ、ライン、パイ、ポリゴン、長方形、角丸長方形、およびテキストフレームオブジェクトが含まれ、リストに新しいものを追加してください。非電気的プリミティブは、シートに参照情報を追加するため、またはグラフィカルシンボルを構築し、カスタムシートボーダー、タイトルブロックを作成するため、またはメモや指示を追加するために使用されます。
回路図エディタには、テンプレートのコンテナ、設定の好み、検索機能、フォントマネージャー、ロボットマネージャー(回路図エディタのイベントをキャプチャ)などの他のシステムオブジェクトもあります。
子オブジェクトを持つ回路図オブジェクトは、グループオブジェクトと呼ばれます。パートオブジェクトとシートシンボルオブジェクトは、グループオブジェクトの例です。パートオブジェクトにはピンの子オブジェクトがあり、シートシンボルにはシートエントリの子オブジェクトがあります。
ISch_BasicContainerインターフェースは、回路図シートおよびライブラリドキュメントを含むすべての回路図設計オブジェクトの祖先インターフェースです。このインターフェースには、一意のオブジェクトアドレスを返し、特定のオブジェクトを定義された領域内で検索するためのフィルターを設定するイテレータを設定するメソッドがあります。
ISch_GraphicalObjectインターフェースは、グラフィカル属性を持つすべての回路図設計オブジェクトのインターフェースです。
三つのインターフェース、ISch_MapDefiner、ISch_ModelDatafileLink、ISch_Implementationはすべて、PCBフットプリント、3Dモデル、信号整合性モデルなどのモデルへの回路図コンポーネントのマッピングを扱います。
回路図オブジェクトへのアクセス
イテレータは、集合オブジェクトの要素に対して、その基礎となる表現を公開することなく、順番にアクセスする方法を提供します。イテレータの使用は、API全体にミラーデータベースを作成することなく、回路図オブジェクトにコンパクトにアクセスする方法を提供します。回路図シートまたはライブラリドキュメント上のオブジェクトを取得するには、効率的なデータ取得方法であるイテレータを使用する必要があります。イテレータには、シンプルイテレータ、空間イテレータ、およびグループイテレータの3種類があります。
- オブジェクトイテレータは、グローバル検索を実施するために使用されます。
- 空間イテレータは、制限された検索を実施するために使用されます。
- グループイテレータは、特定の回路図オブジェクト内のプリミティブを検索するために使用されます。オブジェクト内にオブジェクトを持つ回路図オブジェクトは、シートシンボルやパートオブジェクトなどのグループオブジェクトとして呼ばれます。
ドキュメントの指定された領域で検索するオブジェクトを空間イテレータで指定できます。また、親オブジェクトの子オブジェクト内を検索するグローバルイテレータを設定することもできます。たとえば、シートシンボルのシートエントリや回路図コンポーネントのパラメータなどです。
回路図オブジェクトのイテレーション
Var
Pin : ISch_Pin;
PinIterator : ISch_Iterator;
PinFound : Boolean;
Begin
PinFound := False;
PinIterator := AComponent.SchIterator_Create;
PinIterator.SetState_IterationDepth(eIterateAllLevels);
PinIterator.AddFilter_ObjectSet([ePin]);
Try
Pin := PinIterator.FirstSchObject As ISch_Pin;
While Pin <> Nil Do
Begin
If Not PinFound Then
PinFound := True;
// ピンをTStringListタイプのPinsListコンテナに追加。
PinsList.Add('Pin ' + Pin.Designator +
' located at (x=' + IntToStr(Pin.Location.X) +
', y=' + IntToStr(Pin.Location.Y) + ')');
Pin := PinIterator.NextSchObject As ISch_Pin;
End;
Finally
AComponent.SchIterator_Destroy(PinIterator);
End;
If Not PinFound Then
PinsList.Add('There are no pins for this component.');
End;
このコードスニペットは、イテレータを使用して回路図シートから回路図オブジェクトを取得する方法を示しています。
Scripts\DelphiScript Scripts\Sch\フォルダ内のスクリプト例を参照してください。
新しい回路図オブジェクトの作成/削除
回路図APIを使用して作成された回路図オブジェクトは、回路図エディタのデータベースシステムが新しいオブジェクトを正常に登録するために、いくつかの簡単な手順に従う必要があります。以下の例は、プログラムによってポートオブジェクトを回路図ドキュメントに配置する方法を示しています。
スクリプトを使用してポートオブジェクトを作成して配置する手順
01 |
Procedure PlaceAPort; |
02 |
Var |
03 |
AName : TDynamicString; |
04 |
Orientation : TRotationBy90; |
05 |
AElectrical : TPinElectrical; |
06 |
SchPort : ISch_Port; |
07 |
Loc : TLocation; |
08 |
FSchDoc : ISch_Document; |
09 |
CurView : IServerDocumentView; |
10 |
Begin |
11 |
If SchServer = Nil Then Exit; |
12 |
FSchDoc := SchServer.GetCurrentSchDocument; |
13 |
If FSchDoc = Nil Then Exit; |
14 |
|
15 |
SchPort := SchServer.SchObjectFactory(ePort,eCreate_GlobalCopy); |
16 |
If SchPort = Nil Then Exit; |
17 |
SchPort.Location := Point(100,100); |
18 |
SchPort.Style := ePortRight; |
19 |
SchPort.IOType := ePortBidirectional; |
20 |
SchPort.Alignment := eHorizontalCentreAlign; |
21 |
SchPort.Width := 100; |
22 |
SchPort.AreaColor := 0; |
23 |
SchPort.TextColor := $FFFFFF; |
24 |
SchPort.Name := 'Test Port'; |
25 |
|
26 |
// Add a new port object in the existing Schematic document. |
27 |
FSchDoc.AddSchObject(SchPort); |
28 |
FSchDoc.GraphicallyInvalidate; |
29 |
|
30 |
// use of Server processes to refresh the screen. |
31 |
ResetParameters; |
32 |
AddStringParameter('Action', 'Document'); |
33 |
RunProcess('Sch:Zoom'); |
34 |
End; |
上記のコードの動作方法
新しいポートオブジェクトは、SchObjectFactoryメソッドによって作成されます。この関数は2つのパラメータ、ePort の値(TObjectID型)とTObjectCreationMode型の作成モデルパラメータを取ります。ポートの属性を適切に設定した後、このポートオブジェクトを回路図データベースに登録する必要があります。
AddSchObjectメソッドは、回路図データベースを表すSchServerオブジェクトに対して呼び出す必要があります。最後に、GraphicallyInvalidate呼び出しによって回路図ドキュメントがリフレッシュされます。
areacolorおよびtextcolorフィールドに色値を割り当てるためにコード内でRGB関数が使用されていることに注意してください。この関数はWindows API関数であり、3つの色の強度(赤、緑、青)に対して3つのパラメータを取ります。この場合、(255,255,255)は白色を表し、(0,0,0)は黒色を表します。
Scripts\DelphiScript Scripts\Sch\フォルダ内のスクリプト例を参照してください。
ライブラリドキュメント上での新しい回路図オブジェクトの作成
回路図ドキュメント上でオブジェクトを作成するのと同じ方法で、既存のライブラリドキュメント上にシンボルを作成することができます。
新しいライブラリドキュメント上での新しいライブラリコンポーネントの作成
手順 CreateALibComponent;
変数
CurrentLib : ISch_Lib;
SchComponent : ISch_Component;
R : ISch_Rectangle;
Location : TLocation;
Corner : TLocation;
開始
もし SchServer = Nil なら終了;
もし (SchServer.GetCurrentSchDocument, ISch_Lib, CurrentLib) をサポートしていないなら終了;
もし (SchServer.SchObjectFactory(eSchComponent, eCreate_Default), ISch_Component, SchComponent) をサポートしていないなら終了;
もし (SchServer.SchObjectFactory(eRectangle, eCreate_Default), ISch_Rectangle, R) をサポートしていないなら終了;
SchComponent.CurrentPartID := 1;
SchComponent.DisplayMode := 0;
SchComponent.LibReference := 'Custom';
CurrentLib.AddSchComponent(SchComponent);
CurrentLib.CurrentSchComponent := SchComponent;
R.LineWidth := eSmall;
Location.X := 10;
Location.Y := 10;
R.Location := Location;
Corner.X := 30;
Corner.Y := 20;
R.Corner := Corner;
R.Color := $FFFF; // YELLOW
R.AreaColor := 0; // BLACK
R.IsSolid := True;
R.OwnerPartId := CurrentLib.CurrentSchComponent.CurrentPartID;
R.OwnerPartDisplayMode := CurrentLib.CurrentSchComponent.DisplayMode;
CurrentLib.CurrentSchComponent.AddSchObject(R);
CurrentLib.CurrentSchComponent.Designator.Text := 'U';
CurrentLib.CurrentSchComponent.ComponentDescription := 'Custom IC';
ZoomToDoc;
終了;
Scripts\DelphiScript Scripts\Sch\フォルダ内のスクリプト例を参照してください。
回路図エディタでのオブジェクトの作成とUndo/Redoシステムのリフレッシュ
上記の例でのオブジェクトの単純な作成は、回路図エディタのUndoシステムをリフレッシュしません。これを行うには、SchServer.RobotManager.SendMessageメソッドを使用する必要があります。
その手順は以下の通りです:
- 回路図サーバーのロボットを初期化するPreProcess
- 新しいオブジェクトを追加
- 回路図サーバーのロボットをクリーンアップするPostProcess。
プロジェクト内での回路図オブジェクトの作成
この例は、オブジェクトをドキュメントに追加する際(最初はコンポーネントをドキュメントに追加し、次に配置されたコンポーネントのピンにパラメータを追加する)のさまざまなレベルでUndo/Redoを可能にする正しい方法を説明しています。
具体的には、現在のシートに構築されたコンポーネントを追加し、その後ピンにパラメータを追加します。その後、Undoを実行することができます。最初のUndoの押下でピンに追加されたパラメータが削除されます。2回目のUndoの押下でドキュメントに追加されたコンポーネントが削除されます。
Supports (SchServer.GetCurrentSchDocument, ISch_Sheet, SchDoc) がない場合は終了;
Supports (SchServer.SchObjectFactory (eSchComponent, eCreate_Default), ISch_Component, Component) がない場合は終了;
Supports (SchServer.SchObjectFactory (eRectangle, eCreate_Default), ISch_Rectangle, Rect) がない場合は終了;
Supports (SchServer.SchObjectFactory (ePin, eCreate_Default), ISch_Pin, Pin) がない場合は終了;
Supports (SchServer.SchObjectFactory (eParameter, eCreate_Default),ISch_Parameter, Param) がない場合は終了;
SchServer が IServerModule, SchematicServer をサポートしている場合
開始
試みる
// ロボットマネージャーを初期化
SchematicServer.ProcessControl.PreProcess(Client.CurrentView, '');
// 現在の回路図シートにコンポーネントを追加し、アンドゥスタックを有効にする
Rect.OwnerPartId := Component.CurrentPartID;
Rect.OwnerPartDisplayMode := Component.DisplayMode;
Location.X := 0;
Location.Y := 0;
Rect.Location := Location;
Location.X := 20;
Location.Y := 20;
Rect.Corner := Location;
Pin.OwnerPartId := Component.CurrentPartID;
Pin.OwnerPartDisplayMode := Component.DisplayMode;
Location.X := 20;
Location.Y := 10;
Pin.Location := Location;
Component.AddSchObject(Rect);
Component.AddSchObject(Pin);
SchDoc.AddSchObject(Component);
Component.MoveByXY(100, 100);
SchServer.RobotManager.SendMessage(SchDoc.I_ObjectAddress, c_BroadCast,
SCHM_PrimitiveRegistration, Component.I_ObjectAddress);
最終的に
// ロボットマネージャーをクリーンアップ
SchematicServer.ProcessControl.PostProcess(Client.CurrentView, '');
終了;
終了;
Scripts\DelphiScript Scripts\Sch\フォルダのスクリプト例を参照してください。
回路図オブジェクトの削除コード例
Iterator := CurrentSheet.SchIterator_Create;
Iterator が Nil の場合は終了;
Iterator.AddFilter_ObjectSet([ePort]);
// ロボットマネージャーを初期化
SchematicServer.ProcessControl.PreProcess(Client.CurrentView, '');
試みる
Port := Iterator.FirstSchObject As ISch_Port;
Port が Nil でない間
開始
OldPort := Port;
Port := Iterator.NextSchObject As ISch_Port;
CurrentSheet.RemoveSchObject(OldPort);
SchServer.RobotManager.SendMessage(CurrentSheet.I_ObjectAddress,
c_BroadCast,
SCHM_PrimitiveRegistration,
OldPort.I_ObjectAddress);
終了;
最終的に
CurrentSheet.SchIterator_Destroy(Iterator);
// ロボットマネージャーをクリーンアップ
SchematicServer.ProcessControl.PostProcess(Client.CurrentView, '');
終了;
Scripts\DelphiScript Scripts\Sch\フォルダのスクリプト例を参照してください。
回路図オブジェクトの変更
現在の回路図ドキュメント上の回路図オブジェクトをプログラムで変更するには、特定のメソッドを特定の順序で呼び出して、回路図オブジェクトの属性がプログラムで変更されたときにアンドゥ/リドゥシステムが最新の状態になるようにする必要があります。
その手順は以下の通りです:
-
PreProcessメソッドを呼び出して、回路図サーバーのロボットを初期化する -
SCHM_BeginModifyメッセージを送信する - 回路図オブジェクトの属性(プロパティ)を変更して修正する
-
SCHM_EndModifyメッセージを送信する -
PostProcessメソッドを呼び出して、回路図サーバーのロボットをクリーンアップする。
回路図オブジェクトの属性変更コード例
手続き FetchAndModifyObjects;
変数
AnObject : ISCh_GraphicalObject;
Iterator : ISch_Iterator;
SchematicServer : IServerModule;
Doc : ISch_Document;
開始
SchematicServer := SchServer As IServerModule;
Doc := SchServer.GetCurrentSchDocument;
Iterator := Doc.SchIterator_Create;
Iterator.AddFilter_ObjectSet([ePort,eWire]);
SchematicServer.ProcessControl.PreProcess(Client.CurrentView, '');
// ロボットマネージャーを初期化
SchServer.ProcessControl.PreProcess(Doc, '');
Iterator が Nil の場合は終了;
試みる
AnObject := Iterator.FirstSchObject As ISch_GraphicalObject;
AnObject が Nil でない間
開始
SchServer.RobotManager.SendMessage(AnObject.I_ObjectAddress,
c_BroadCast, SCHM_BeginModify, c_NoEventData);
AnObject.ObjectId の場合
eWire : AnObject.Color := $FF0000;
ePort : AnObject.AreaColor := $00FF00;
終了;
SchServer.RobotManager.SendMessage(AnObject.I_ObjectAddress,
c_BroadCast, SCHM_EndModify , c_NoEventData);
AnObject := Iterator.NextSchObject As ISch_GraphicalObject;
終了;
最終的に
Doc.SchIterator_Destroy(Iterator);
終了;
// ロボットマネージャーをクリーンアップ
SchServer.ProcessControl.PostProcess(Doc, '');
終了;
注記
回路図ドキュメント上の回路図オブジェクトのプロパティを変更する場合、SchServer.RobotManager.SendMessage 関数を使用する必要があります。これにより、アンドゥ/リドゥシステムやドキュメントを保存できるようにドキュメントをダーティに設定するなど、回路図システムのさまざまなサブシステムが更新されます。SendMessageメソッドは、このドキュメントのISch_RobotManagerにあります。
Altium Designerで現在開いている回路図ドキュメントでのみ回路図APIを使用できることを覚えておいてください。特定の回路図ドキュメントを取得する必要がある場合は、クライアントオブジェクトのOpenDocumentおよびShowDocumentメソッドを使用してドキュメントを開いて表示する必要があります。
手続き OpenAndShowASchDocument(AFileName : String);
変数
Document : IServerDocument;
開始
Client が Nil の場合は終了;
Document := Client.OpenDocument('SCH',AFileName,False);
Document が Nil でない場合
Client.ShowDocument(Document);
終了;
Scripts\DelphiScript Scripts\Sch\フォルダのスクリプト例を参照してください。
マウスを使用した回路図のインタラクティブなフィードバック
スクリプトからマウスの動きやクリックを監視するには、ISch_Documentドキュメントインターフェースおよびその派生インターフェース、ISch_LibおよびISch_Sheetインターフェースには、いくつかのインタラクティブなフィードバックメソッドがあります。たとえば、ChooseRectangleinteractivelyメソッドは、回路図ドキュメント上の矩形の境界内で検索する必要がある空間イテレータに使用できます。
-
ChooseLocationInteractivelyメソッド -
ChooseRectangleInteractivelyメソッド
ChooseRectangleInteractivelyメソッドの例
01 |
Var |
02 |
CurrentSheet : ISch_Document; |
03 |
SpatialIterator : ISch_Iterator; |
04 |
GraphicalObj : ISch_GraphicalObject; |
05 |
Rect : TCoordRect; |
06 |
Begin |
07 |
If SchServer = Nil Then Exit; |
08 |
CurrentSheet := SchServer.GetCurrentSchDocument; |
09 |
If CurrentSheet = Nil Then Exit; |
10 |
|
11 |
Rect := TCoordRect; |
12 |
If Not CurrentSheet.ChooseRectangleInteractively(Rect, |
13 |
'Please select the first corner', |
14 |
'Please select the final corner') Then Exit; |
15 |
|
16 |
SpatialIterator := CurrentSheet.SchIterator_Create; |
17 |
If SpatialIterator = Nil Then Exit; |
18 |
Try |
19 |
SpatialIterator.AddFilter_ObjectSet(MkSet(eJunction,eSchComponent)); |
20 |
SpatialIterator.AddFilter_Area(Rect.left, Rect.bottom, Rect.right, Rect.top); |
21 |
GraphicalObj := SpatialIterator.FirstSchObject; |
22 |
While GraphicalObj <> Nil Do |
23 |
Begin |
24 |
// do what you want with the design object |
25 |
GraphicalObj := SpatialIterator.NextSchObject; |
26 |
End; |
27 |
Finally |
28 |
CurrentSheet.SchIterator_Destroy(SpatialIterator); |
29 |
End; |
30 |
End; |
ISch_Documentインターフェースエントリを回路図APIリファレンスドキュメントで参照してください。
Scripts\DelphiScript Scripts\Sch\フォルダ内のスクリプト例を見てください。
回路図APIの活性化
Altium Designerが空の編集セッションにある場合、回路図ドキュメントが開かれていないと回路図APIはアクティブではありません。これらの時には、回路図APIにアクセスするためにサーバーを手動で起動する必要があります。回路図APIを活性化するために回路図サーバーを起動するには、'SCH'パラメーターを持つClient.StartServerメソッドを呼び出します。
Client.StartServer('SCH');