2025年7月27日日曜日

KiCadのPCB editorのpythonプラグインでfootprintに含まれるEdge.Cutsを認識する


背景

KiCadとはプリント基板を設計可能なCADプログラムです。
それで使えるプラグインを公開していたら特定の条件で基板の外形の大きさがおかしくなると報告を受けました。
調べたところ、footprintにEdge.Cuts(切断線)が含まれているとそれが自分の作ったプラグインで認識できずにおかしくなっていると分かりました。

調査しつつ試行錯誤したらfootprintのEdge.Cutsの取得方法が分かったので、備忘録を兼ねて書き方を記事に残します。

使ったもの

KiCad
8.0と9.0で動くのを確認しました。

書き方

下記の順序でfootprintのEdge.Cutsを取得できます。
  1. pcbnewをimport
  2. pcbnewのGetBoardで基板のインスタンスを取得
  3. 基板のインスタンスでGetFootprintsを呼びfootprint一覧を取得
  4. footprintでGraphicalItemsを呼び描画要素を取得
  5. 描画要素のclassが"DRAWSEGMENT"か "PCB_SHAPE"、かつLayerNameがEdge.CutsなのがfootprintのEdge.Cuts

コードを書くとこうです。
import pcbnew

board = pcbnew.GetBoard()
for fp in board.GetFootprints():
for draw in fp.GraphicalItems():
if draw.GetClass() in ['DRAWSEGMENT', 'PCB_SHAPE'] and \
     draw.GetLayerName() == 'Edge.Cuts':
            print('Edge.Cuts on footprint %s' % draw)

実行するとEdge.Cutsを持つfootprintがあれば、そのEdge.Cutsを取得できます。


上記のコードにたどり着いたきっかけは、下記のフォーラムでGraphicalItemsを使えばfootprintの描画要素が取得できると紹介されていたことでした。

Kicad Python bindings: How to access location, size etc of footprint text

基板のfootprintは、boardインスタンスの説明書を眺めてGetFootprintsで取得できそうなのを把握しました。

おわり

KiCadの基板のboard.GetDrawingsで取得可能な要素のfootprint版はboard.GetFootprints -> footprint.GraphicalItemsで取得可能と分かり、それに対してclassが"DRAWSEGMENT"か "PCB_SHAPE"かつLayerNameがEdge.Cutsか確認すれば、footprintのEdge.Cutsを取得可能と分かりました。

footprintにGetDrawingsが無かったので戸惑いましたが、GraphicalItemsがそれと同等と分かって良かったです。

参考

Kicad Python bindings: How to access location, size etc of footprint text 
GetFootprints

この記事で把握した内容で実施したプラグインのコミットです。
See line of Edge.Cuts on footprints

0 件のコメント :