Skip to content

Fusion360でキー配列を決めて、KiCadでフットプリントを自動配置する方法

skeletonkbd edited this page Nov 26, 2022 · 6 revisions

Fusion360のスケッチ上でキー配列を決めて、その位置情報をKiCadにもっていきたい。

キーごとに座標を確認して入力していけばいいけど、面倒なので省力化する方法を考える。

1. Fusion360のスケッチでキー配列を作り込む

image

XY平面でスケッチを作って、19.05mmの正方形などを作って並べる。

真ん中の座標が知りたいのでバッテン付けて点を打っておく。(もしくは「中心の長方形」で作る)

2. キーごとの座標を取得する

Fusion360とKiCadでY軸の方向が違うので、Y座標だけ正負を反転する必要あり。

import adsk.core, adsk.fusion

def run(context):
    app = adsk.core.Application
    ui  = app.get().userInterface

    selFilter = 'SketchPoints'
    msg = 'スケッチ内の点を選択'

    while True: # 無限ループ
        selection = ui.selectEntity(msg, selFilter)
        result = selection.entity.geometry.getData()

        if (result[0]):
            (returnValue, x, y, z) = result
            message = "[%f, %f]," % (x*10, -y*10)
            # ui.messageBox(message, "座標")
            app.log(message)

Fusion360のスケッチでこのスクリプトを実行して、ひとつずつ点を選択していく。

image

こんな風に座標情報が表示されるので、コピペして次の工程で使う。

スクリプト内で無限ループしてるので、「スケッチを終了」して抜ける。

3. KiCadのPCBエディターで自動配置

レファレンス指定子"SW1"~でキースイッチのフットプリントを用意しておく。

先程の座標情報を使ってフットプリント自動配置のスクリプトを書く。

import pcbnew

def arrange() :

	keys = [
		[40.807724, 35.602021],
		[59.857724, 35.602021],
		[78.907724, 34.287539],
		[99.309000, 38.456401],
		[117.942712, 42.417118],
		[136.576424, 46.377836],
		[155.210136, 50.338554],
		[183.502535, 48.358195],
		[202.136247, 44.397477],
		[220.769959, 40.436759],
		[239.403671, 36.476042],
		[260.225885, 34.861430],
		[279.275885, 35.602021],
		[307.850885, 35.602021],
		[344.525005, 33.375001],
		[41.396712, 54.652021],
		[65.209212, 54.652021],
		[86.031427, 55.109754],
		[104.665138, 59.070471],
		[123.298850, 63.031189],
		[141.932562, 66.991907],
		[180.889140, 68.389277],
		[199.522852, 64.428560],
		[218.156564, 60.467842],
		[236.790276, 56.507124],
		[257.525939, 53.911430],
		[276.575939, 54.652021],
		[295.625939, 54.652021],
		[319.438439, 54.652021],
		[346.525005, 52.425001],
		[39.713172, 73.702021],
		[65.906922, 73.702021],
		[86.729137, 74.733645],
		[105.362849, 78.694362],
		[123.996560, 82.655080],
		[142.630272, 86.615798],
		[186.765543, 86.615798],
		[205.399254, 82.655080],
		[224.032966, 78.694362],
		[242.666678, 74.733645],
		[263.488893, 73.702021],
		[282.538893, 73.702021],
		[313.495143, 73.702021],
		[348.525005, 71.475001],
		[40.393361, 92.752021],
		[71.349611, 92.752021],
		[92.085275, 95.347715],
		[110.718987, 99.308433],
		[129.352699, 103.269151],
		[147.986410, 107.229869],
		[181.409405, 107.229869],
		[200.043116, 103.269151],
		[218.676828, 99.308433],
		[237.310540, 95.347715],
		[258.046203, 92.752021],
		[277.096203, 92.752021],
		[303.289953, 92.752021],
		[329.483703, 92.752021],
		[33.249611, 111.802021],
		[61.824611, 111.802021],
		[113.745911, 119.427414],
		[144.025693, 125.863580],
		[201.674620, 122.397952],
		[241.395176, 114.564415],
		[286.621203, 111.802021],
		[310.433703, 111.802021],
		[329.483703, 111.802021],
		[348.533703, 111.802021]
	]

	for index, key in enumerate(keys):
		ref = 'SW' + str(index +1)
		print(ref)
		x = key[0]
		y = key[1]
		fp = pcbnew.GetBoard().FindFootprintByReference(ref)
		fp.SetPosition(pcbnew.wxPointMM(x,y))

	pcbnew.Refresh()

プラグインディレクトリーにkeys.pyで保存したら、スクリプトコンソールで以下を実行。

import keys
keys.arrange()

実行直後は表示が怪しいので、PCBエディターを再起動したほうが良さそう。 .Refresh()が抜けていたので修正しました。

角度の情報は今回取得していないので、必要なら向きを変える。

スクリーンショット 2022-11-25 214024