Build123D

TF01 Build123D

この記事は約6分で読めます。

Build123Dの覚書です。
前提は、エージェント機能によるモデリングです。

2D図からの押出

Build123Dについて

モデリングに必要な項目を書いたり、ポンチ絵を読ませたりして作業します。
stepファイルへの書き出しもそのように書いて指示します。

build123d は、Python を使用して 3D/2D モデルを作成するための、強力でモダンな 「Code-as-CAD(コードによる設計)」 ライブラリです。

従来の GUI ベースの CAD(Fusion 360 や SOLIDWORKS など)とは異なり、プログラミングによって形状を定義します。特に、先行するライブラリである CadQuery の精神的後継として開発されており、より直感的で Python らしい書き方ができるように設計されています。


1. build123d の主な特徴

  • 直感的な構文(Builder パターン):with BuildPart() as my_part: のようなコンテキストマネージャを使用し、順を追って形状を追加・削除していく流れが非常に分かりやすいです。
  • 強力な幾何エンジン:産業グレードの CAD で使われる Open CASCADE (OCCT) をベースにしており、複雑なフィレット、面取り、ブーリアン演算が可能です。
  • 代数的な操作:+(結合)や -(切り抜き)といった演算子を使って直感的に形状を操作できます。
  • 高い互換性:STEP, STL, DXF などの標準フォーマットでの書き出しはもちろん、FreeCAD や SOLIDWORKS などのツールとも連携可能です。

2. なぜ build123d を使うのか?(CadQuery との比較)

CadQuery も素晴らしいツールですが、build123d は以下の点で改善されています。

特徴CadQuerybuild123d
設計思想流れるようなインターフェース(メソッドチェーン)Python らしい構造化(コンテキストマネージャ)
デバッグ途中の状態を確認しにくい場合がある各ステップの状態にアクセスしやすく、デバッグが容易
柔軟性厳格なルールがあるユーザーが自由にオブジェクトを操作しやすい

インストール

エージェントにインストールしてもらうのが楽だと思います。環境から作成するように指示します。

前提条件

  • Python 3.11〜3.13 インストール済み
  • VS Code インストール済み

手順

1. VS Code 拡張機能のインストール

VS Code の拡張機能マーケットプレイスから以下をインストール:

bernhard-42.ocp-cad-viewer

2. プロジェクトフォルダの作成と仮想環境の構築

mkdir my_project
cd my_project

# 仮想環境を作成
python -m venv venv

# 仮想環境を有効化(Windows)
venv\Scripts\Activate.ps1

3. 必要パッケージをインストール

pip install build123d ocp-vscode

これだけで OCP CAD Viewer に表示するために必要なものはすべて入ります。

4. OCP CAD Viewer バックエンドの起動

VS Code コマンドパレット(Ctrl+Shift+P)から:
 OCP CAD Viewer: Open Viewer

を実行してビューアパネルを開く。

5. サンプルコードを実行

from build123d import *
from ocp_vscode import show

box = Box(10, 10, 10)
show(box)

パッケージの依存関係

pip install build123d
└── cadquery-ocp(OCC カーネル)

pip install ocp-vscode
└── ocp-tessellate(メッシュ変換)
└── Flask / websockets(VS Code との通信)

ポイントbuild123d と ocp-vscode は独立したパッケージですが、セットで使うのが標準的なワークフローです。ocp-vscode が VS Code の OCP CAD Viewer 拡張機能とポート 3939 経由で WebSocket 通信してモデルを表示します。

cadqueryと同じ要領で作業できると思います。

作成例

アセンブリ

from build123d import *
from ocp_vscode import show

# 寸法パラメータ
W = 80       # 棚の幅
D = 30       # 棚の奥行き
T = 3        # 棚板の厚み
PR = 2       # 支柱の半径
LH = 40      # 各段の高さ
LEVELS = 3   # 段数

cx = W / 2 - 5
cy = D / 2 - 5
total_h = LH * (LEVELS - 1) + T

# ---- サブアセンブリ: 支柱 x4 を個別部品として作成 ----
pillar_defs = [
    ( cx,  cy, "柱-前右"),
    (-cx,  cy, "柱-前左"),
    ( cx, -cy, "柱-後右"),
    (-cx, -cy, "柱-後左"),
]

pillar_parts = []
for px, py, label in pillar_defs:
    with BuildPart() as p:
        with Locations((px, py, 0)):
            Cylinder(radius=PR, height=total_h,
                     align=(Align.CENTER, Align.CENTER, Align.MIN))
    part = p.part
    part.label = label
    part.color = Color("sienna")
    pillar_parts.append(part)

# 支柱4本をサブアセンブリ(Compound)にまとめる
# children= を明示することでOCPが階層として認識する
pillar_sub = Compound(pillar_parts, label="支柱サブアセンブリ", children=pillar_parts)

# ---- 棚板 ----
with BuildPart() as s_bottom:
    with Locations((0, 0, 0)):
        Box(W, D, T, align=(Align.CENTER, Align.CENTER, Align.MIN))
s_bottom.part.label = "底板"
s_bottom.part.color = Color("burlywood")

with BuildPart() as s_mid:
    with Locations((0, 0, LH)):
        Box(W, D, T, align=(Align.CENTER, Align.CENTER, Align.MIN))
s_mid.part.label = "中段"
s_mid.part.color = Color("burlywood")

with BuildPart() as s_top:
    with Locations((0, 0, LH * 2)):
        Box(W, D, T, align=(Align.CENTER, Align.CENTER, Align.MIN))
s_top.part.label = "天板"
s_top.part.color = Color("burlywood")

# ---- トップレベルアセンブリ ----
top_children = [pillar_sub, s_bottom.part, s_mid.part, s_top.part]
shelf = Compound(top_children, label="棚アセンブリ", children=top_children)

show(shelf)

コメント

Translate »
タイトルとURLをコピーしました