_KiCad プラグイン システム_

このドキュメントは以下の貢献者により著作権所有 © 2016 されています。あなたは、GNU General Public License ( http://www.gnu.org/licenses/gpl.html ) のバージョン 3 以降、あるいはクリエイティブ・コモンズ・ライセンス ( http://creativecommons.org/licenses/by/3.0/ ) のバージョン 3.0 以降のいずれかの条件の下で、配布または変更することができます。

このガイドの中のすべての商標は、正当な所有者に帰属します。

*貢献者*

Cirilo Bernardo

翻訳

starfort <starfort AT nifty.com>, 2017.

フィードバック

バグ報告や提案はこちらへお知らせください:

発行日とソフトウエアのバージョン

2016年1月29日 発行

1. KiCad プラグイン システム について

KiCad プラグイン システムは、共有ライブラリを用いた KiCad の機能を拡張するためのフレームワークです。プラグインを使用する主な利点の一つは、プラグイン開発中に KiCad パッケージ一式を再構築する必要がないということです。実際、プラグインは、KiCad ソース ツリーにあるヘッダのごく小さなセットを使ってビルドすることができます。開発者が直接プラグインに関するコードをコンパイルするだけで済むことが保証されると、その結果として各ビルトとテストのサイクルに必要な時間を減らすことができるので、プラグイン開発において KiCad をビルドする必要をなくすということは、生産性を大きく向上させることになります。

新しいモデル形式に対して KiCad ソースのメジャーな変更を伴うことなく、より多くの3D モデル形式をサポートする目的で、プラグインは当初、3D モデル ビューア用に開発されました。プラグイン フレームワークは、将来の開発者がプラグインの異なったクラスを作成できるよう、後に一般化されたものです。今のところ、KiCad では 3D プラグインのみ実装されていますが、将来的にはデータのインポートとエクスポートをユーザーによって実装できるようにするための PCB プラグインが開発される見通しです。

1.1. プラグインのクラス

各プラグインはそれぞれ特定領域に関する問題を処理するので、その領域毎に別々のインターフェイスが必要となります。このため、プラグインはプラグイン クラスへと分類されます。例えば、3D モデル プラグインはファイルから 3D モデル データを読み込んで、3D ビューアで表示できるようなフォーマットへとデータを変換します。PCB インポート/エクスポート プラグインは PCB のデータを受け取って別の電気的あるいは機械的なデータ フォーマットへとエクスポートしたり、外部フォーマットを KiCad PCB 形式に変換したりします。現時点では、3D プラグイン クラスのみ開発されており、本文書でも集中して取り上げていきます。

プラグイン クラスを実装するには、KiCad ソース ツリー内でプラグインの読み込み管理を行うコードを作成することが必要です。全てのプラグイン ローダーに対する基本クラスは、KiCad ソース ツリー内のファイル plugins/ldr/pluginldr.h で宣言されています。このクラスは、あらゆる KiCad プラグインで見つかるであろう(お約束のコードである)最も基本的な関数を宣言しており、プラグイン ローダーと利用可能なプラグイン間のバージョン互換について最低限のチェックを行う機能を持っています。ヘッダ plugins/ldr/3d/pluginldr3D.h には、3D プラグイン クラスのためのローダーが宣言されています。ローダーは与えられたプラグインの読み込みを担当し、プラグインが持っている関数を KiCad で利用可能にします。各プラグイン ローダーのインスタンスはプラグイン実装の実体であり、KiCad とプラグインの関数を透過的に橋渡しするよう振舞います。プラグインをサポートするために KiCad 内部で必要とされるコードはローダーだけではありません: プラグインを見つけるためのコード、プラグイン ローダー経由でプラグインの関数を呼び出すコードも必要です。3D プラグインの場合、この発見と呼び出しの関数は S3D_CACHE クラス内に全て含まれています。

新規のプラグイン クラスを開発する場合以外、プラグインの開発者はプラグイン管理に関する KiCad 内部コードの詳細を知る必要はありません; プラグインに自身が属するプラグイン クラスで宣言されている関数を定義していくだけで済みます。

ヘッダ include/plugins/kicad_plugin.h には、全ての KiCad プラグインで必要とされるジェネリック関数が宣言されています; これらの関数は、プラグイン クラスを識別し、固有のプラグイン名、プラグイン クラス API に関するバージョン情報、固有のプラグインに関するバージョン情報、プラグイン クラス API 上での最低限のバージョン互換チェック機能を提供します。以下は、これらの関数についての要約です:

1.1.1. プラグイン クラス: PLUGIN_3D

ヘッダ include/plugins/3d/3d_plugin.h には、全ての 3D プラグインで実装されなければならない関数が宣言されており、プラグインにとって必要な及びユーザーが再実装する必要がない幾つかの関数が定義されています。ユーザーが再実装する必要がない定義済み関数は以下のとおりです:

ユーザーが実装しなければならない関数は次のとおりです:

2. チュートリアル: 3D プラグイン クラス

この章では2つのとても単純な PLUGIN_3D クラス プラグインについて解説し、ユーザーがセットアップとコードのビルドを習得できるよう予行演習を行います。

2.1. 基本的な 3D プラグイン

このチュートリアルでは、"PLUGIN_3D_DEMO1" という名前の非常に基本的な 3D プラグインを開発することで予行演習を行います。このチュートリアルの目的は、KiCad ユーザーが 3D モデルをブラウズする際に使用可能なファイル名をフィルタリングする幾つかの文字列を提供するだけという、非常に基本的な 3D プラグインの作成方法をデモすることです。ここでデモしているコードは任意の 3Dプラグイン に対する最低必要条件であり、より高度なプラグインを作成するためのテンプレートとして使用することができます。

デモ プロジェクトをビルドするために必要なものは以下のとおりです:

  • CMake

  • KiCad プラグイン ヘッダ

  • KiCad Scene Graph ライブラリ kicad_3dsg

自動的に KiCad のヘッダとライブラリを検出するためには、CMake FindPackage スクリプトを使うべきでしょう; 関連するヘッダ ファイルが ${KICAD_ROOT_DIR}/kicad に、KiCad Scene Graph ライブラリが ${KICAD_ROOT_DIR}/lib にインストールされているなら、このチュートリアルで提供されているスクリプトは Linux および Windows 上で動作するはずです。

まず手始めに、プロジェクト ディレクトリと FindPackage スクリプトを作成してみましょう:

KiCad とそのプラグイン ヘッダーをインストールしておく必要があります; もし Linux でそれらがユーザー ディレクトリまたは /opt の下にインストールされているか、或いは Windows を使っているならば、KiCad の includelib ディレクトリを含むディレクトリを指すように KICAD_ROOT_DIR 環境変数をセットする必要があります。OS Xでは、ここに示された FindPackage スクリプトを多少調整する必要があるでしょう。

チュートリアルのコードを組んでビルドするため、CMake を使用して CMakeLists.txt スクリプト ファイルを作成します:

最初のデモ プロジェクトはとても基本的なものです; コンパイラのデフォルト以外は外部リンクの依存関係を持たない単一ファイルで構成されています。まずはソース ディレクトリを作成することから始めます:

ではプラグイン ソース自体を作成しましょう:

s3d_plugin_demo1.cpp

このソースファイルは 3D プラグインを実装するための最低必要条件を満足しています。このプラグインはモデルをレンダリングするためのいかなるデータも作り出しませんが、3D モデル ファイル選択ダイアログを機能強化してサポートされているモデル拡張子のリストとファイル拡張子フィルタを KiCad に提供します。KiCad 内で拡張子文字列は特定の 3D モデルを読み込むために使われるプラグインの選択で使用されます; 例えば、もしプラグインが wrl ならば、KiCad はプラグインが可視化されたデータを返すまで拡張子 wrl をサポートすると宣言された各プラグインを呼び出すでしょう。各プラグインが提供するファイル フィルタはブラウジング UI を改良すべく 3D ファイル選択ダイアログへと渡されます。

プラグインをビルドするには:

プラグインはビルドされますが、インストールはされません; プラグインを読み込みたいのであれば、KiCad のプラグイン ディレクトリにプラグイン ファイルをコピーする必要があります。

2.2. 高度な 3D プラグイン

このチュートリアルでは、"PLUGIN_3D_DEMO2" という名前の 3D プラグインを開発することで予行演習を行います。このチュートリアルの目的は、レンダリング可能な KiCad プレビューアで非常に基本的なシーン グラフの構造図をデモすることです。このプラグインは txt タイプのファイルを要求します。キャッシュ マネージャーがプラグインを呼び出すためにはファイルが存在しなければなりませんが、ファイルの中身はプラグインでは処理されません; 代わりにプラグインは単に四面体のペアを含んだシーン グラフを作るだけです。このチュートリアルは、最初のチュートリアルを完了しており CMakeLists.txt と FindKICAD.cmake スクリプト ファイルが既に作られている状況を想定して書かれています。

前のチュートリアルのソース ファイルと同じディレクトリに新しいソース ファイルを置き、このチュートリアルをビルドするため前のチュートリアルの CMakeLists.txt ファイルを拡張しましょう。このプラグインは KiCad のシーン グラフを作るので、KiCad のシーン グラフ ライブラリ kicad_3dsg へのリンクが必要となります。KiCad のシーン グラフ ライブラリはシーン グラフ オブジェクトをビルドするために使われるクラスのセットを提供します。シーン グラフ オブジェクトは 3D キャッシュ マネージャで使われる可視化フォーマットの中間データです。モデルの可視化をサポートする全てのプラグインは、このライブラリ経由でモデルデータをシーン グラフへと変換しなければなりません。

最初のステップは、このシュートリアル プロジェクトをビルドできるように CMakeLists.txt を拡張することです:

ではソース ディレクトリへと移動してソース ファイルを作成しましょう:

s3d_plugin_demo2.cpp

3. アプリケーション プログラミング インタフェース (API)

プラグインはアプリケーション プログラミング インタフェース (API) の実装により開発されます。各プラグイン クラスは固有の API を持っており、3D プラグイン チュートリアルでは 3d_plugin.h ヘッダで宣言された 3D プラグイン API の実装例を見てきました。プラグインはまた KiCad ソース ツリーで定義された別の API にも依存しています; 3D プラグインの例では、モデルの可視化をサポートする全てのプラグインは ifsg_all.h ヘッダとそれ自身が包んでいるヘッダとで宣言された Scene Graph API と密接に関わらなければなりません。

この章では利用可能なプラグイン クラス API とプラグイン クラスの実装に必要と思われる別の KiCad API の詳細について説明します。

3.1. プラグイン クラス API

今のところ、KiCad で宣言されているプラグイン クラスは次の一つだけです: 3D プラグイン クラス。全ての KiCad プラグイン クラスは kicad_plugin.h で宣言されている基本的な関数のセットを実装しなければなりません; これらの宣言はベース KiCad プラグイン クラスとして参照されます。ベース KiCad プラグイン クラスの実装は存在していません; ヘッダ ファイルはプラグイン開発者が各プラグインでこれらの定義済み関数を確実に実装するためだけに存在しています。

KiCadでは、プラグイン ローダーの各インスタンスはプラグインが公開する API を提供します。プラグイン ローダーはプラグインのサービスを提供するクラスのようなものです。これはプラグインで実装されたものと同様な関数名を含んだパブリック インターフェイスをプラグイン ローダー クラスが提供することで実現されています; 引数リストは、例えばプラグインが読み込まれていないというような予見される問題をユーザーに知らせる必要に応じて、適宜変更しても構いません。内部的には、プラグイン ローダーはユーザーに代わって各関数を呼び出すために各 API 関数へのストアド ポインタを使用します。

3.1.1. API: ベース KiCad プラグイン クラス

ベース KiCad プラグイン クラスはヘッダ ファイル kicad_plugin.h で定義されます。このヘッダは全ての異なるプラグイン クラスの宣言に含まれなければなりません; 例としてヘッダ ファイル 3d_plugin.h で宣言された 3D プラグイン クラスを見てみましょう。これらの関数のプロトタイプは Plugin Classes内で簡潔に記述されています。API は pluginldr.cpp で定義されているようにベース プラグイン ローダーによって提供されます。

ベース KiCad プラグイン ヘッダで要求される関数を理解するには、ベース プラグイン ローダー クラスで何が起こるのか調べる必要があります。プラグイン ローダー クラスは読み込まれるプラグインのフルパスを引数とする virtual 関数 Open() を宣言します。特定のプラグイン クラス ローダーでのOpen() 関数の実装では、ベース プラグイン ローダーの protected 関数 open() を呼び出します; このベース open() 関数は要求された基本的なプラグインの関数それぞれのアドレスを見つけようとします; 各関数のアドレスが取得されると、いくつかのチェックが実行されます:

  1. プラグイン GetKicadPluginClass() が呼び出されると、プラグイン ローダーが提供するプラグイン クラス文字列との比較が行われます; もしこれらの文字列が一致しなければ、開かれたプラグインはこのプラグイン ローダー インスタンス向けのものではありません。

  2. プラグイン GetClassVersion() はプラグインが実装しているプラグイン クラス API Version を取得するために呼び出されます。

  3. プラグイン ローダー virtual 関数 GetLoaderVersion() はローダーが実装しているプラグイン クラス API Version を取得するために呼び出されます。

  4. プラグインとローダーが報告するプラグイン クラス API Version は同じメジャー バージョン番号を持っている必要があります。もし違っていれば互換性はないと考えられます。これは最も基本的なバージョンのテストで、ベース プラグイン ローダーによって強制的に実行されます。

  5. プラグイン CheckClassVersion() はプラグイン ローダーのプラグイン クラス API Version information を呼び出します; もしプラグインが与えられたバージョンをサポートしていれば、成功を意味する true が返ります。成功した場合、ローダーは GetKicadPluginName()GetPluginVersion() の結果を基に PluginInfo 文字列を作成し、plugin loading procedure がプラグイン ローダーの Open() 実装部の中で続けて実行されます。

3.1.2. API: 3D プラグイン クラス

3D プラグイン クラスはヘッダ ファイル 3d_plugin.h で宣言されており、Plugin Class: PLUGIN_3D 内で記述されるような必要とされるプラグイン関数を拡張します。対応するプラグイン ローダーは pluginldr3D.cpp 内で定義され、ローダーは要求された API 関数に加えて public 関数を提供します。

要求された 3D プラグイン クラス 関数は、以下の関数を経由して公開されます:

典型的な状況では、ユーザーは以下のような使い方をするでしょう:

  1. KICAD_PLUGIN_LDR_3D のインスタンスを作成する。

  2. 特定のプラグインを読み込むために Open( "/path/to/myplugin.so" ) を呼ぶ。望み通りのプラグインが読み込まれたかどうか確かめるためには、戻り値をチェックする必要がある。

  3. KICAD_PLUGIN_LDR_3D で公開されているような、何れかの 3D プラグイン クラス コールを呼ぶ。

  4. プラグインを閉じる (リンクを外す) ために Close() を呼ぶ。

  5. KICAD_PLUGIN_LDR_3D インスタンスを破棄する。

3.2. シーングラフ クラス API

シーングラフ クラス API はヘッダ ファイル ifsg_all.h とそれに含まれるヘッダで定義されています。この API は、 ifsg_api.h で定義されている名前空間 S3D にある幾つかのヘルパー ルーチンと ifsg_*.h ヘッダ各種で定義されているラッパー クラスからなっています; ラッパーは、VRML2.0 のスタティック シーン グラフと互換があるシーン グラフ 構造体をまとめたものである、下層のシーン グラフ クラスをサポートします。ヘッダ、構造体、クラスおよびその public 関数は次の通りです:

sg_version.h
sg_types.h

sg_base.h ヘッダはシーングラフ クラスで使われる基本的なデータ型の宣言を含んでいる。

sg_base.h

IFSG_NODE クラスは全てのシーングラフ ノードの基本クラスです。全てのシーングラフ オブジェクトはこのクラスの public 関数として実装されますが、いくつかのケースでは、ある関数は特定のクラスでは意味がないかも知れません。

ifsg_node.h

IFSG_TRANSFORM は VRML2.0 Transform ノードと同等です; これは、子ノード IFSG_SHAPE と IFSG_TRANSFORM および参照ノード IFSG_SHAPE と IFSG_TRANSFORM を大量に含んでいます。有効なシーングラフは、ルートに単一の IFSG_TRANSFORM オブジェクトを持っている必要があります。

ifsg_transform.h

IFSG_SHAPE は VRML2.0 シェイプ ノードと同等です; これは、単独の子ノードあるいは参照ノード FACESET を含んでいる必要があります。また、単独の子ノードあるいは参照ノード APPEARANCE を含んでいても構いません。

ifsg_shape.h

IFSG_APPEARANCE は VRML2.0 Appearance ノードと同等です。しかしながら、今のところ Material ノードを含んだ Appearance ノードと同じ意味しか持っていません。

ifsg_appearance.h

IFSG_FACESET は IndexedFaceSet ノードを含んだ VRML2.0 Geometry ノードと同等です。これは、単独の子ノードあるいは参照ノード COORDS、単独の子ノード COORDINDEX、単独の子ノードあるいは参照ノード NORMALS を含んでいる必要があります。さらに、単独の子ノードあるいは参照ノード COLORS を含んでいても構いません。ユーザーが面に法線を配置できるように、単純化された法線を計算する関数が用意されています。VRML2.0 同等と異なっている部分は次のとおりです:

  1. 法線は常に頂点毎である。

  2. 色は常に頂点毎である。

  3. 座標値の集合は三角形の面だけを記述しなければならない。

ifsg_faceset.h
ifsg_coords.h

IFSG_COORDINDEX は三角形の面のみを記述しなければならない点を除いて VRML2.0 coordIdx[] set と同等です。これは座標値の合計数が3で割り切れることを意味しています。

ifsg_coordindex.h

IFSG_NORMALS は VRML2.0 Normals ノードと同等です。

ifsg_normals.h

IFSG_COLORS は VRML2.0 colors[] set と同等です。

ifsg_colors.h

残りの API 関数は、以下のように ifsg_api.h で定義されています:

ifsg_api.h

シーングラフ API の実際の使用例は、Advanced 3D Plugin tutorial の記述と KiCad VRML1, VRML2, X3D パーサーを参照のこと。