井土です。

KiCad Advent Calendar 2015
 14日目の記事です。
13日目はtd2skさんのWindows で KiCad をビルドする でした。

今回はKiCadのPythonでscriptを書いてみたというお話です。私自身も今回初めていじってみた機能なので特に詳しいわけではないのですが、script機能を使うきっかけになってもらえたらと思います。


1.KiCadのPython scripting機能とは
一言で言うと

KiCadの操作をマウスでポチポチやるのではなく、
プログラムを書くことで作業を自動化できる機能


のことです。(eagleにおけるulp)

しかもそのプログラムはただのpythonなので馴染みがある人が多かったり、
いろんな便利ライブラリを活用することもできそうです。

例として、先日miettalさんが
スイッチサイエンスPCBへの発注を手助けするscript
を作られていました。
こんな感じである意味KiCadに機能を付け足すということができます。

現在はpcbnew上でしか使うことができませんが、
いつかEeschemaもサポートされるらしいです。
pcbnew上でできることなのですが、私が把握してる範囲ではこんな感じです。
  • 基板上の物(部品,テキスト,線)のプロパティを取得・変更する
  • フットプリントの作成を支援する
  • KiCadの機能を呼び出す(ガーバー出力とか)

今回は基本となりそうな
・部品にアクセスする
・部品を移動する
あたりの機能を紹介していきたいと思います。

2.とりあえず使ってみる

まず、この記事の内容をつくるにあたって参考にしたところを載せておきます。
KiCad pcbnewの日本語公式ドキュメント
python scripttingのリファレンス
hanyaさんのブログ

今回は次のような回路を対象に話をします。抵抗とLEDが12個あります。
2015-12-14-171327_514x217_scrot

まずはこのボタンを押してpythonのconsoleを起動しましょう。
console

次のように打ちこんでみてください。

ここまで打つと「u'R1'」と表示されると思います。
このようにまずはBOARDを取得して、BOARDから弄りたいものを取得していじるのが基本的な流れになります。ここではboard.FindModuleByReference("R1")として部品のオブジェクトを取得しましたが、board.GetModules()を実行するとboardの持っている部品全てが出てきます。

部品はMODULEのオブジェクトとして管理されているので、
ここではr1というオブジェクトを通してR1の位置などを変更することもできます。
続けて次のものを実行してみてください。

こんな感じでR1が回転して移動すると思います。
2015-12-14-175414_352x153_scrot

角度はMODULEのSetOrientationから指定したい角度の10倍を渡すことで指定できます。
位置移動は直接(x,y)と渡すのではなく、pcbnew.wxPointMM(x,y)という形に変換してから渡します。wxPointMMは引数をmmとして解釈しますが、wxPointMilsをつかうとinchで渡せます。

MODULEは他にも色々なattributeを持っているので、リファレンスを見ながら色々試してみてください。


3.なにかを作ってみた
部品の移動や取得に関して、便利そうな機能をいくつか関数にまとめてみました。
https://gist.github.com/idt12312/a20f17893c3a1936b036

こんなことができます。
  • まとめて部品のリファレンスのシルクのサイズと太さを変更
  • 複数の部品それぞれを回転
  • 部品を直線上に並べる
  • 部品を格子上に並べる
  • 部品を円上に並べる
  • 正規表現で部品を検索
正規表現で部品を検索する部分についてはhanyaさんのブログを参考にしています。とても便利です。

先ほどのkicad_tools.pyを*.kicad_pcbと同じディレクトリにいれて、
pcbnewのコンソールからimport kicad_pcbと打つと使えます。

サンプルコードのようなものです。

最後の円形に並べるものを実行するとこんな感じになります。
確かに円形に並んで抵抗のリファレンスも大きくなっています。
手作業でちまちまやらなくていいので便利です。
2015-12-14-194249_949x929_scrot


4.最後に
実はKiCadには部品を円形や格子状に整列する機能が標準であります。pcbnewの配列ツールというものです。しかし今基板上あるものを整列する機能ではなく、格子上や円形に部品を新たに整列して配置する機能といった感じです。基板上にあるネットリストから読み込んだ部品を並べたい時もあるだろうと思い、今回のscriptをつくりました。エラー処理などをしていないので実用できるかと言われると微妙ですが、今のKiCadにはない機能を追加したことになるのかもしれないです。

足りないと思った機能をどんどんscriptというかたちで付け足して行けるのはとても楽しいです。こんな便利な機能が合ったらなぁと思った際にはKiCadのcommitterになって機能を追加するよりも、ちょろっとscriptを書いてみるほうが簡単です。
 

以上 KiCad Advent Calendar 2015 14日目の記事でした。
明日は masahirosuzukaさんです。