⌨️

【Kicad7系に対応するための補足メモ】 Adobe Illustratorで描いた基板部品の座標を簡単にKiCADへ移入する手順

に公開

背景と目的

Adobe Illustratorで描いた基板部品の座標を、サクッとKiCadに移したかったんですよ。
そのとき参考にしたのが、はなちさんのこの記事(2020年公開):
👉 Adobe Illustratorで描いた基板部品の座標を簡単にKiCADへ移入する手順

ただ、KiCadが6系から9系に変わる間にAPIがちょっと変わっちゃって、
そのままだと動かない部分が出てきたんです。
この記事では、KiCad v9で実際に動かしてうまくいった方法と、ハマりどころの対処法をまとめてます。


動かなかったところと解決策

ハマり0: ExtendScript Toolkit CCで座標が出ない!


症状
スクリプトを実行しても、なにも表示されない。
原因
Illustratorで、部品(パス)を選択してなかっただけ。
解決
選択してからスクリプトを実行しましょう。
ほんとにこれだけなんだけど、最初は「え、なにも出ない!?」ってなって焦ったやつ。

ハマり1: KiCadでスクリプトが実行できない/execfileが使えない!

症状
ブログ通りに execfile("set_position-right.py") って入力しても動かない。
原因
KiCad 7以降(v9も含む)はPython 3になってて、execfile() が廃止されてる。
解決
代わりにこれを使えばOK👇

exec(open("set_position-right.py", encoding="cp932").read())

Windowsなら encoding="cp932" のままでOK。
UTF-8保存なら encoding="utf-8" に変えるだけ。

あと、KiCadでは「今開いてる .kicad_pcb ファイルのある場所」が
カレントディレクトリ(=実行フォルダ)になるので、
スクリプトも同じ場所に置いてください。

ハマり2: FindModuleByReferenceが使えない!

症状
スクリプトを動かすと AttributeError が出て止まる。
原因
KiCadのAPIが変わってて、FindModuleByReference はもう使えない。
解決
FindFootprintByReference に置き換えれば動く。
あと、位置指定の仕方も微妙に変わってるので注意。
最後に pcbnew.Refresh() を入れておくと、GUIにもすぐ反映される。

(修正版のコマンドは下の方に書いています)


修正版に基づく全体の流れ(Illustrator → KiCad)

ここからは、上の修正を反映した実際の手順です。
この順番でやれば、KiCad v9でもちゃんと動くはず。

① Illustratorで座標を出す

  1. Adobe ExtendScript Toolkit CC を起動。
  2. はなちさんのブログにあるスクリプトをそのまま使う。
#target "illustrator"
(function(){
    var convMilli = 1 / (25.4 / 72);  
    try {
        if (app.documents.length > 0 ) {
            app.coordinateSystem = CoordinateSystem.DOCUMENTCOORDINATESYSTEM;
          for(i = 0; i < app.selection.length; i++){
            obj = app.selection[i];
            prop = obj.property;
            x1 = pt2mm(obj.geometricBounds[0]);
            y1 = pt2mm(obj.geometricBounds[1] * -1.0);
            x2 = pt2mm(obj.geometricBounds[2]);
            y2 = pt2mm(obj.geometricBounds[3] * -1.0);
            cx = x1 + (x2-x1)/2.0 ;
            cy = y1 + (y2-y1)/2.0 ;
            var rad = 0.0;
            if(obj.tags.length > 0 && obj.tags[0].name == "BBAccumRotation"){
                rad = obj.tags[0].value; //in radians
            }   
            var angle = rad * 180.0 / Math.PI;
            $.writeln( obj.name + "\t" + cx + "\t" + cy + "\t" + angle);
            }
        }
        else{
            throw new Error('no document');
        }
    }
    catch(e) {
        alert( e.message, "script error", true);
    }
   function mm2pt(mm) {
      return mm * convMilli;
   }
   function pt2mm(pt) {
      return pt / convMilli;
   }
})()
  1. 必ず部品を選択してから実行する(未選択だと出力されない)。
  2. Toolkitウィンドウに出た座標(Ref名, X, Y, Angle)をコピー。

② KiCad用スクリプトを用意する

  1. .kicad_pcb同じフォルダset_position-right.py等のファイル名をつけて保存。
  2. pyファイルに以下をコピペし、parts = [...] の中に、さっきコピーした座標を貼り付け。
import pcbnew

OFFSET_X = 0.0
OFFSET_Y = 0.0

pcb = pcbnew.GetBoard()

def set_footprint_position(name, xp, yp, rot):
    module = pcb.FindFootprintByReference(name)
    module.SetPosition(pcbnew.VECTOR2I(pcbnew.wxPointMM(xp  + OFFSET_X, yp + OFFSET_Y)))
    module.SetOrientationDegrees(rot)  

parts = [
"('SW1', 	1, 	0,	0),"
"('SW2', 	5, 	0,	0),"
"('SW3', 	9, 	0,	0),"
"('SW4', 	13, 	0,	0),"
"('SW5', 	17, 	0,	0),"
"('SW6', 	21, 	0,	0),"
"('SW7', 	25, 	0,	0),"
"('SW8', 	29, 	0,	0),"
]

for p in parts:
    set_footprint_position(p[0], p[1], p[2], p[3])

③ KiCadで実行する

  1. KiCadのツール → スクリプトコンソールを開く。
  2. さっきの一行を入力して実行。
exec(open("set_position-right.py", encoding="cp932").read())

UTF-8保存なら encoding="utf-8" に変更。
実行するとコンソールに [OK] SW1: (1.000, 0.000) mm, 0° みたいな出力が出て、
部品が整列してたら成功です。

実行前

実行後

実行前後のKiCadボードの比較(ビフォー・アフター)

まとめ

  • KiCad v9では execfile() は使えないので exec(open(...)) に変える。
  • .py.kicad_pcb と同じフォルダに置くのが確実。
  • FindModuleByReferenceFindFootprintByReference に変更。
  • pcbnew.Refresh() を忘れずに。

これで、Illustratorの座標出力をもとに、
KiCad v9でもサクッと部品を整列できるようになります。

Discussion