KiCADで部品を円形に並べるスクリプトをChatGPTに作ってもらった
こんにちは、けんです。
KiCADで部品を円形に配置したくなることありませんか?
ありますよね?ね?
円形配列も試したんですが、思ってたんと違う感じでした。
軽く調べた中ではスクリプトを使うのが良さそうでしたが、面倒だったのでChatGPTにお願いしました。
部品を円形に並べるスクリプト
こちらがKiCADで部品を円形に並べるスクリプトです。
KiCAD8.0.3で動作確認しました。
ChatGPT製なのでコメントに色々書いてありますが、気になさらず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import pcbnew import math import builtins as _bi # ================= パラメータ ================= REF_PREFIX = "D" # 参照名の接頭辞(例: D -> D1..D12) COUNT = 12 # 部品数 START_INDEX = 1 # 開始番号(D1からなら1) RADIUS_MM = 40.0 # 半径[mm] START_ANGLE_DEG = 0.0 # +X=0°, CCWが正(開始角度) CLOCKWISE = True # 並び順 True=時計回り, False=反時計回り CENTER_X_MM = 0.0 # 中心X[mm] CENTER_Y_MM = 0.0 # 中心Y[mm] # ── 向き制御 ────────────────────────────── FOLLOW_TANGENT_CW = True # 接線の“進行方向”に合わせる(True=時計回り, False=反時計回り) ROT_OFFSET_DEG = 0.0 # 全体の微調整(極性マークなどを合わせたい時) ANGLE_SIGN = -1.0 # ← あなたの観察どおり「角度にマイナス」を掛けるなら -1.0 # ANGLE_SIGN を +1.0 にすれば通常の向きに戻せます # ── 位置補正 ────────────────────────────── USE_CENTER_COMPENSATION = True # 外形中心を円周に乗せる(原点ズレ対策) # ============================================ def mm_to_nm(v_mm: float) -> int: return int(_bi.round(v_mm * 1e6)) def rot(vx: float, vy: float, deg: float): r = math.radians(deg) c, s = math.cos(r), math.sin(r) return (vx * c - vy * s, vx * s + vy * c) def get_bbox(mod): """KiCad 6/7/8 互換の外形矩形取得""" if hasattr(mod, "GetBoundingBox"): return mod.GetBoundingBox() if hasattr(mod, "GetFootprintRect"): return mod.GetFootprintRect() raise RuntimeError("No bounding box method found for this KiCad version.") board = pcbnew.GetBoard() center = pcbnew.VECTOR2I(mm_to_nm(CENTER_X_MM), mm_to_nm(CENTER_Y_MM)) radius_nm = mm_to_nm(RADIUS_MM) # 並び角ステップ step = 360.0 / COUNT if CLOCKWISE: step = -step missing = [] for i in range(COUNT): ref = f"{REF_PREFIX}{START_INDEX + i}" mod = board.FindFootprintByReference(ref) if not mod: missing.append(ref) continue # 円周上の理想点(アンカー基準) ang_deg = START_ANGLE_DEG + step * i ang_rad = math.radians(ang_deg) px = center.x + int(_bi.round(radius_nm * math.cos(ang_rad))) py = center.y + int(_bi.round(radius_nm * math.sin(ang_rad))) # 接線の基準角 tangent_deg = ang_deg - 90.0 if FOLLOW_TANGENT_CW else ang_deg + 90.0 # 現在角度を保持しつつ長辺(X/Y)を判定 cur_deg = mod.GetOrientationDegrees() # 一瞬だけ0°/90°にして外形サイズを比較(表示更新はしない) mod.SetOrientationDegrees(0.0) bbox0 = get_bbox(mod) w0, h0 = bbox0.GetWidth(), bbox0.GetHeight() mod.SetOrientationDegrees(90.0) bbox90 = get_bbox(mod) w90, h90 = bbox90.GetWidth(), bbox90.GetHeight() # 元の角度に戻す mod.SetOrientationDegrees(cur_deg) # ローカルXが長辺か? long_is_local_x = (w0 >= h0) or (h90 >= w90) # 長辺を接線に合わせる角度 new_deg = tangent_deg if long_is_local_x else (tangent_deg + 90.0) new_deg += ROT_OFFSET_DEG # ★ 観察どおり符号反転を適用(必要な場合) new_deg *= ANGLE_SIGN # 外形中心を円周に乗せる補正(原点ズレ対策) if USE_CENTER_COMPENSATION: bbox_now = get_bbox(mod) # 現在角度の外形(ワールド座標) pos_now = mod.GetPosition() dx_w = bbox_now.Centre().x - pos_now.x dy_w = bbox_now.Centre().y - pos_now.y # ワールド→ローカル(-cur_deg)→新ワールド(+new_deg) dx_l, dy_l = rot(dx_w, dy_w, -cur_deg) dx_n, dy_n = rot(dx_l, dy_l, new_deg) target_x = int(_bi.round(px - dx_n)) target_y = int(_bi.round(py - dy_n)) else: target_x, target_y = px, py # 適用 mod.SetOrientationDegrees(new_deg) mod.SetPosition(pcbnew.VECTOR2I(target_x, target_y)) pcbnew.Refresh() if missing: print("[警告] 見つからなかった参照:", ", ".join(missing)) else: print("[OK] 全部配置完了!") |
パラメータについてはコメントを見ていただければ分かるかと思います。
REF_PREFIXは抵抗ならR、コンデンサならCを指定してください。
使い方ですが、パラメータを修正したらスクリプト丸ごとコピーし、KiCADのPCBエディターのツール→スクリプトコンソールを開き、Shellタブの最下行の>>>にカーソルを持っていった状態で右クリックし、Paste And Runをクリックするだけです。
するとスクリプトが動くので、少し待つといい感じに部品が並んでくれるはずです。
以下はこのスクリプトを使って、LEDと抵抗それぞれ円状に配置した状態です。
キレイに並んでくれて気持ち良いです。
まとめ
KiCADで部品を円形に配置するためのスクリプトをChatGPTに作ってもらいました。
最終的なスクリプトになるまで10回ChatGPTと対話しましたが、それでも30分くらいでできました。
自分の伝え方が良ければ、その半分くらいでもできたと思います。
もし上のスクリプトがご自身の環境でうまく動かなかった場合も、ChatGPTに原因を聞いてみてください。
この記事を書いた人

-
熱しやすく冷めやすく、さらに完全に形から入るタイプ。
電気回路を勉強中のへっぽこ会社員。
好きなレトロゲーム
【FC】テニス、バルーンファイト、ドラゴンバスター、ボンバーマン
【SFC】スーパーマリオワールド、エキサイトステージ、ドラゴンクエストV、VI、ファイナルファンタジーVI
【GB】ラクロアンヒーローズ、モトクロスマニアクス、魔界塔士Sa・Ga
最近の記事
電子工作2025.10.09KiCADで部品を円形に並べるスクリプトをChatGPTに作ってもらった
アクセサリー製作2025.10.08JLCPCBで新しいメテオ基板を試作してみた【PR】
電子工作2025.10.02KiCADで書き出したSVGファイルをAutodesk Fusion(旧Fusion360)に実寸で取り込む方法
アクセサリー製作2025.09.08JLCPCBでマルチカラーシルク基板を発注してみた!【PR】