KiCadのBOM出力プラグイン書いてみた


この記事はQiitaのKiCad Advent Calendar 2015の8日目です。

←7日目(kinichiroさん)
・8日目・9日目(starfort-jpさん)→

KiCad 4.0では、プラグインを使用してBOMを出力するようになりました。この変更によりユーザがプラグインを作成してBOMの内容を簡単に変更できるようになりました。

ネットを見回すと、BOM情報を元にDigi-KeyMOUSERなどの情報を参照してコストを計算するプラグインKiCostなどが有ります。

ここまでの高機能は必要ありませんが、部品の発注(買い物)と実装を少しだけ便利にするBOMプラグインを書いて使っています。標準のBOM出力プラグインに毛が生えた程度の簡単なものですが、自分ではとても楽をできている気がします。

ここではプラグインと言ってもただのフィルタープログラムで、「こんなだったらもっと便利なのを作れるぞ」という切っ掛けにしてもらえたらと思います。

プラグインを作成する言語

KiCadのディレクトリを見ると、CSV形式のBOMファイルを出力するためのプラグインなど何種類かのプログラムが標準で添付されています1。これらのプラグインは全てXSLTで書かれていて、私には理解不能です。

そこで基本に戻ってKiCadのドキュメントを参照すると、次のように書かれておりXMLファイルを読めればどの言語で書いても良いことがわかりました。

中間ネットリストファイルに後処理のフィルタリングをすることで、部品表 (BOM) ファイルのような他形式のファイルを生成できます。この変換はテキストからテキストへの変換なので、この後処理フィルタは、Python や XSLT など、入力として XML を扱える処理系で記述できます。

KiCadの標準的なスクリプト言語はPythonですが片言しか話せないので、今回はRubyを使用してプラグインを作成しました。

中間ネットリストファイルの構造

中間ネットリストファイルは、普通のXMLファイルです2。この大まかな構造は、次のように5つの大きなエレメントからなっています。

<?xml version="1.0" encoding="utf-8"?>
<export version="D">
  <design>
    ...
  </design>
  <components>
     <comp ref="P1">
      <value>CONN_4</value>
      <libsource lib="conn" part="CONN_4"/>
      <sheetpath names="/" tstamps="/"/>
      <tstamp>4C6E2141</tstamp>
    </comp>
    ...
  </components>
  <libparts>
    ...
  </libparts>
  <libraries>
    ...
  </libraries>
  <nets>
    ...
  </nets>
</export>

BOMファイルの出力に必要な部分は、主に<components>エレメントです。この中に部品のリファレンスや値が入っています。<libparts>エレメントには部品の説明などが入っているので、詳しい説明入りのBOMファイルを作成するなどに使えそうです。

プラグインを書いてみた

今回は単純に<components>エレメントの情報を使って部品の注文(買い物)と実装を少しだけ便利にするBOMプラグインを書いてみました。

部品の注文には、部品名と個数が必要です。そこで注文用には同じ部品を数え上げて、部品ごとの個数をBOMファイルに出力するようにしました。

注文(買い物)用のBOM。部品と必要数を表にしています。
注文(買い物)用のBOM。部品と必要数を表にしています。

部品を実装する時に多くの方は同じ部品、例えば1kの抵抗を5つとかまとめて実装しているのではないでしょうか。そこでリファレンスの番号に関係なく同じ値の部品でグループを作るようにソートしてBOMファイルに出力するようにしました。

実装用のBOM。リファレンス順でなく、同じ部品がグループを作るように並べています。
実装用のBOM。リファレンス順でなく、同じ部品がグループを作るように並べています。

実装用と注文用のBOMファイルをCSV形式で個別に書き出しても良いのですが、結局表示するときにはExcelを使用するので一つのExcelファイル内で別シートとして書き出すようにしました。Excel形式での書き出しにはaxlsxライブラリを使用しました。

こうして書き上げたプラグインはGistで公開しているbom2excel.rbを参照してください。

プラグインのインストールとBOM出力

今回書いたプラグインは外部ライブラリーを使用しているので次のコマンドで必要な外部ライブラリー(axlsx)をインストールしておきます。

sudo gem install axlsx

プラグインを使用するには、KiCadにプラグインを登録します。

  1. Eeschemaを起動してBOMアイコンをクリックする。
  2. Add Pluginボタンをクリックしてプラグインを選択する。
  3. Command line欄を次のように編集する。
/???/bom2excel.rb "%I" "%O.xlsx"

???の部分はプラグインを置いてある場所に依存して変わります。

EeschemaのBOMアイコンをクリックすると表示されるダイアログ。ここでプラグインの登録とBOMの作成を行います。
EeschemaのBOMアイコンをクリックすると表示されるダイアログ。ここでプラグインの登録とBOMの作成を行います。

これでプラグインがKiCadに登録されたので、GenerateボタンをクリックするとBOMファイルがプロジェクトディレクトリ内に作成されます。

こんな簡単なプラグインですが、このBOMリストで部品の買い物と実装がだいぶ楽になりました。ただ実装するときにも必要な部品の個数が必要なのと、買い物の時にあまり馴染みのないリファレンスのプレフィックスだと「何だったかな?」となるので名前で表示するように今後のPythonの勉強を兼ねて改良したいと考えています。

最後に

このようにKiCad 4.0では、慣れた言語で自由にBOM作成プラグインを作成できるようになりました。私の作成したプラグインは非常に簡単なものですが、今後KiCostのようにより便利なプラグインがたくさん出てくることを期待しています。

脚注と参照

  1. Linux版ではプラグインが/usr/lib/kicad/pluginsに、WindowsではC:\Program Files\KiCad\bin\pluginsに有ります。

  2. 中間ネットリストファイルの構造 – Eeschema


「KiCadのBOM出力プラグイン書いてみた」への5件のフィードバック

  1. 来年早々にRとCを大量発注しようとしているので、大変参考になります。
    スクリプトとかインタプリタにはいい思い出がないので敬遠してたのですが、記事を読ませていただいて、私もPythonを勉強しようかという気になりました。
    興味深い記事、どうもありがとうございました。

    1. ありがとうございます。私もstarfort _jpさんをはじめアドベントカレンダーの記事を毎朝楽しみ読ませてもらい、新発見の連続です。面白い企画ですね。

  2. Hello Nosuzuki,

    Thank you for your sharing!
    I want to know whether your plugin bom2excel.rb can work on Windows 7 based KiCad?
    I downloaded your bom2excel.rb but I don’t know how to install axlsx on Windows.
    If you know how to do it please teach me. Thank! ^_^

      1. Thank you Nosuzuki.
        I installed Ruby 2.2.6×64 and I ran “Start Command Prompt with Ruby”.
        Firstly I used “gem install axlsx” command to install axlsx, successed with message
        “Done installing documentation for mini_portile2, nokogiri, rubyzip, htmlentities, axlsx after 46 seconds
        5 gems installed”
        Then I tried the command “ruby bom2excel.rb” but this time it gave me this error message
        “bom2excel.rb:10:in ‘expand_path’: no implicit conversion of nil into String (TypeError)
        from box2excel.rb:10:in ” ”

        I’m a Ruby layman. How could I fix it?
        Thank you.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です