2021年3月14日日曜日

KiCadの基板を行列状に複製する


背景

KiCadのpcbnewで基板を複製して並べるのが思ったより手間だったので、備忘録を兼ねて記事を残します。

使ったもの


標準機能を利用する場合: 配列を作成機能を利用

複製したい部分を選択状態にして右クリックして「配列を作成」を選びます。


間隔を入力してOKを押します。


行列状に複製できました。


Vcutを利用した基板の注文のために複製したい場合は、間隔を基板の幅と高さにすると隙間なく複製できます。



pythonを利用する場合: moduleとそれ以外で、複製方法が異なる

準備

pcbnewのツール -> スクリプトコンソールを選択してpythonの実行画面を表示します。


moduleの場合

module(多分footprintを示すもの)の場合はクラスのコンストラクタを利用して要素を複製し、座標を指定して配置します。
import pcbnew

board = pcbnew.GetBoard()

offsetX = 20000000 # nm
offsetY = 0 # nm

for baseItem in board.GetModules():
newItem = baseItem.__class__(baseItem)
board.Add(newItem)
basePosition = baseItem.GetPosition()
newItem.SetPosition(pcbnew.wxPoint(basePosition[0] + offsetX, basePosition[1] + offsetY))

pcbnew.Refresh()

上記のコードはx方向に20mmのところにmoduleを複製する処理になっており、実行すると下記のようになります。


それ以外の要素の場合

module以外の要素はarea, track, drawingがあります。
それらの要素はDupricate関数を利用して複製できるため、それを利用して複製したあとでMove関数を利用して移動させます。
import pcbnew

board = pcbnew.GetBoard()

offsetX = 20000000 # nm
offsetY = 0 # nm

tracks = list(board.GetTracks())
drawings = list(board.GetDrawings())
areas = [board.GetArea(i) for i in range(0, board.GetAreaCount())]

for baseItem in tracks + drawings + areas:
newItem = baseItem.Duplicate()
newItem.Move(pcbnew.wxPoint(offsetX, offsetY))
board.Add(newItem)

pcbnew.Refresh()

上記のコードを実行すると下記図のようになります。
module以外の要素が20mm右に期待通り複製されます。


必要な要素を行列状に複製するコード

moduleとそれ以外の要素を行列状に複製するコードがこちらです。
import pcbnew

board = pcbnew.GetBoard()

intervalX = 15000000 # nm
intervalY = 20000000 # nm
numberX = 3
numberY = 2

modules = list(board.GetModules())
tracks = list(board.GetTracks())
drawings = list(board.GetDrawings())
areas = [board.GetArea(i) for i in range(0, board.GetAreaCount())]

for x in range(0, numberX):
for y in range(0, numberY):
if x == 0 and y == 0:
continue
offsetX = intervalX * x
offsetY = intervalY * y
for baseItem in tracks + drawings + areas:
newItem = baseItem.Duplicate()
newItem.Move(pcbnew.wxPoint(offsetX, offsetY))
board.Add(newItem)
for baseItem in modules:
newItem = baseItem.__class__(baseItem)
board.Add(newItem)
basePosition = baseItem.GetPosition()
newItem.SetPosition(pcbnew.wxPoint(basePosition[0] + offsetX, basePosition[1] + offsetY))

pcbnew.Refresh()

上記のコードはコードの前半で複製方針を定義しており、x方向に15mm間隔、y方向に20mm間隔、x方向に3回、y方向に2回複製を行う設定になっています。
intervalX = 15000000 # nm
intervalY = 20000000 # nm
numberX = 3
numberY = 2

実行すると下記のように期待する結果を得られます。


大きさの測定やコードのコピペをせずに複製したい: プラグインmatrix_clonerを使う

前回把握した基板の大きさを測定する方法を含めて、基板を複製するKiCad向けのプラグインを作成しました。
インストール方法はREADME以前作ったプラグインの記事を参考にしてください。

https://github.com/asukiaaa/matrix_cloner

これを利用することで基板が四角形なら隙間なく配列でき、特定の大きさに収まる範囲で出来る限り複製も可能です。


上記の設定(基板メーカーの最安価格で製造してくれる最大サイズである100x100mmに収まる範囲)で複製すると下記のようになります。


まとめ

行列状に基板を複製する方法として、下記の3種類を紹介しました。
  • KiCad標準機能の「配列を作成」を利用
  • pythonのコードを実行
  • pcbnewのプラグインmatrix_clonerを利用

この記事にまとめた方法をmatrix_clonerに適用したので、良かったらプラグインをご利用ください。

参考

KiCAD_layout_cloner/layout_cloner.py
参考になったプラグインのコードです。

PCB製造サービス向けのガーバーデータとzipを作るKiCadのプラグインを作ってみた
以前作ったプラグインの記事です。

0 件のコメント :