2021年10月17日日曜日

KiCadのpcbnewのpythonで呼べる機能はswigで管理されている


背景

KiCadのpcbnewでのGUI操作をpythonで行ってプラグインにしようとしたところ、期待するように機能を呼び出せませんでした。

KiCadの実装を辿ったところ、swigというプログラムでcとpythonの橋渡しをしており、使いたい機能がswig向けの設定ファイルに記載されていないとpythonで呼び出せないと分かりました。

呼びたい機能を呼べてない状態なのですが、KiCadの実装から欲しい機能を探してpythonで呼べるか否かを判別する流れを残しておくと後々役立ちそうなので、備忘録を兼ねて記事に残します。

使ったもの

KiCad 5.1
インターネットに繋がっているPC

使いたい機能をKiCadのソースコードから辿る

今回は「pick and placeファイル」と呼ばれることもある「フットプリントと位置の情報ファイル」 .pos ファイルを出力する機能を探してみます。
ちなみに、その機能はpcbnewのファイル -> 各種製造ファイル出力 -> フットプリントと位置情報のファイル から呼び出せます。


まず、検索キーワードを把握するため、KiCadの言語を英語に変更します。
英語を選択しても言語が変わらない場合は、KiCadを再起動してください。


英語モードで位置情報ファイル出力画面を開きます。


出力ボタンを見ると、Generate Position File と表示されています。

その文字列でソースコードに対して検索を行います。

KiCadのソースコードはgitlabで管理されています。
https://gitlab.com/kicad/code/kicad

現在のmasterは6系に向けて開発されている状況です。
今回は5.1系の機能を知りたいので。タグを5.1にして検索します。


検索バーは画面の右上にあるので、そこに先ほど調べた Genearte Position File を入力してエンターを押します。


まさにそのボタンの実装箇所が検索結果として出てきました。


gen_footprints_placefile.cppを読むと PCB_EDIT_FRAME::DoGenFootprintsPositionFile が位置情報ファイル生成関数であると分かりました。


関数の説明ページで機能を確認

KiCadで使われる機能は下記のページにまとめられています。
https://docs.kicad.org/doxygen/index.html

先ほどの手順で把握したDoGenFootprintsPositionFileを検索すると、解説が見つかります。
DoGenFootprintsPositionFile()


pythonで呼び出せるか確認

pcbnewのpythonで呼び出せる機能は下記のページにまとめられています。

pcbnew Namespace Reference

DoGenFootprintsPositionFileは検索しても出てこないので、pythonからは呼び出せないと分かります。


pythonの実装はswigディレクトリで管理されている

似たような機能でドリルファイルを出力する EXCELLON_WRITER はpcbnewで呼び出せるので、pythonに関する実装がどのように異なっているのか調べてみました。

KiCadの実装を辿ると、cとpythonの橋渡しはswigというプログラムを利用してpython向けにビルドされていると分かりました。(pcbnew.pyの冒頭に書かれていました。)


masterと5.1でディレクトリが異なっていましたが、下記の場所で関連ファイルが管理されていると分かりました。
master: pcbnew/python/swig
5.1: pcbnew/swig

ドリルファイルを生成するEXCELLON_WRITERはgendrill_Excellon_writerというファイルに記述されており、それがswig向けのpcbnew.iで取り込まれることでpcbnew.pyにEXCELLON_WRITER記述されて、pcbnewのpython利用可能になると分かりました。



一方DoGenFootprintsPositionFileはgen_footprints_placefileで定義されますが、そのファイルはswig向けの設定ファイルで取り込まれていないため、関数をpythonから呼び出せないと分かります。


まとめ

KiCadのpcbnewの使いたいcppで実装された機能を把握しても、swigで設定されていなければpcbnewのpythonコンソールから呼び出せないと分かりました。

swigに必要なファイルを記述してビルドすれば使えるようになりそうですが、まだそこまで試せていません。

0 件のコメント :