
2026/03/30 5:58
Build123d:Python 用 CAD プログラミングライブラリ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:
build123d は、Open Cascade をベースにした Python ベースのパラメトリック BREP モデリングフレームワークであり、ユーザーが製造用の 2D/3D ジオメトリを作成・操作できるようにします。完全に Pythonic な API が提供され、2 つのモードがあります:
- Algebra Mode – 状態を持たず、オブジェクトを明示的に変更するモードで、迅速な数値計算に最適です。
- Builder Mode – 状態を保持し、
やBuildPart
などのコンテキストマネージャーを使用したデザイン履歴スタイルのモードで、複雑なモデリングワークフローが可能です。BuildSketch
ライブラリには明示的な 1D/2D/3D ジオメトリクラス、豊富な型ヒント、演算子駆動の代数モデリング、および PEP 8 に準拠したコードが含まれており、サブクラス化によって拡張できます。
ユーザーは
ShapeLists(面積・長さ・体積・向きまたはタイプで)を使用して形状をフィルタリングし、押出し、フィレット、チャンファー、および布尔減算などの操作を実行できます。SVG、STEP、STL のエクスポートとインポートがサポートされており、import_svg や export_stl(part, "bracket.stl") などの例があります。
インストールは
pip install build123d で行い、GitHub からプレリリースを取得できます。推奨ビューアは ocp_vscode です。本プロジェクトは CadQuery から派生していますが、Apache 2.0 ライセンスの下で独立して再構築されています。貢献ガイドラインは CONTRIBUTING.md に記載されており、コミュニティ参加を奨励しています。
Python スクリプトパイプラインに容易に統合できる build123d は、エンジニアやデザイナーが 3D プリント、CNC 加工、レーザー切断などの製造ワークフローで CAD タスクを効率化し、学習曲線を短縮し、生産性を向上させることを可能にします。
この改訂版概要はすべての主要ポイントを網羅し、根拠のない推測を排除し、情報を明確に提示しています。
本文
ドキュメント
- チートシート
- Discord
- Discussions
- Issues
- Contributing
build123d
build123d は、Python ベースのパラメトリック BREP(境界表現)モデリングフレームワークであり、2D および 3D CAD を対象としています。Open Cascade のジオメトリカーネルを基盤としており、3D プリンティング、CNC 加工、レーザー切断などの製造プロセスに適した精密モデルを作成するためのクリーンで完全に Pythonic なインターフェースを提供します。
主な特徴
モダンかつ保守性の高い CAD‑as‑code を想定し、
build123d は明確なアーキテクチャと表現力豊かな代数的モデリングを組み合わせています。以下のような機能があります。
- 内部状態が最小限(または無い)で、使用モードに応じて切り替え可能
- 明確に定義された 1D・2D・3D のジオメトリクラスと操作
- サブクラス化や関数合成による拡張性 – マンキー・パッチは不要
- PEP 8、mypy、pylint 等の標準に準拠したコードで、豊富な型ヒント付き
- Python との深い統合 – セレクタをリストとして扱える、ロケーションをイテラブルで指定できる、自然な変換(
、Solid(shell)
)が可能tuple(Vector) - 演算子駆動のモデリング(例:
,obj += sub_obj
)により、代数的で読みやすく、組み合わせ可能な設計ロジックを実現Plane.XZ * Pos(X=5) * Rectangle(1, 1) - FreeCAD や SolidWorks などの人気 CAD ツールへのエクスポート形式
利用方法
ワイルドカードインポートは推奨されませんが、
build123d のスクリプトは通常自己完結しており、多くのオブジェクトやメソッドを名前空間にインポートするケースが一般的です。
1D シェイプの構築
エッジ、ワイヤ(複数の連結エッジ)、曲線(エッジとワイヤの合成)などが 1D のシェイプとして利用できます。
ラインオブジェクトから単一のエッジを作る例:
line = Line((0, -3), (6, -3))
追加のエッジやワイヤは初期ラインに対して加算または減算できます。位置(
@)と接線方向(%)演算子を使って別のライン上の座標を参照し、入力ベクトルを指定します:
line += JernArc(line @ 1, line % 1, radius=3, arc_size=180) line += PolarLine(line @ 1, 6, direction=line % 1)
2D・3D への拡張
フェイス、シェル(複数の連結フェイス)、スケッチ(フェイスとシェルの合成)が 2D のシェイプとして利用可能です。
前述のラインを閉じてフェイスを作るには
make_hull を使います:
sketch = make_hull(line.edges())
円形フェイスは
Pos(位置オブジェクト)や Rot(回転オブジェクト)で変換し、スケッチから減算します。次にそのフェイスを押し出して固体部品に変換:
sketch -= Pos(6, 0, 0) * Circle(2) part = extrude(sketch, amount=2)
部品への追加と修正
ソリッドとパーツ(複数のソリッドをまとめたもの)が 3D のシェイプとして利用できます。
別のフェイスから第二部品を作成し、プレーンで位置決めや向きを指定します。多くのオブジェクトはオブジェクト原点に対する整列機能(
align)を提供しています:
plate_sketch = Plane.YZ * RectangleRounded(16, 6, 1.5, align=(Align.CENTER, Align.MIN)) plate = extrude(plate_sketch, amount=-2)
シェイプのトポロジーはセレクタを使って取得でき、
ShapeLists を返します。ShapeLists はソート・グループ化・フィルタリング(面積や長さで)などのメソッドを備えており、軸に沿った位置選択やリストスライスでターゲット指定も可能です。次の例ではフェイスからプレーンを作成し、複数オブジェクトを配置するイテラブルなロケーションを取得します:
plate_face = plate.faces().group_by(Face.area)[-1].sort_by(Axis.X)[-1] plate -= Plane(plate_face) * GridLocations(13, 3, 2, 2) * CounterSinkHole(.5, 1, 2)
ShapeList のセレクタと演算子は、長さ・面積・体積、軸やプレーンに対する向き、ジオメトリタイプなどのプロパティを用いてシェイプ機能を指定できる強力な手段です:
part = fillet(part.edges() .filter_by(lambda e: e.length == 2) .filter_by(Axis.Z), 1) bore = part.faces().filter_by(GeomType.CYLINDER).filter_by( lambda f: f.radius == 2) part = chamfer(bore.edges(), .2)
Builder Mode
上記の構築は代数モード(Algebra Mode)インターフェースを通じて行われ、各オブジェクトが明示的に追跡・変更されるステートレスパラダイムです。
Builder Mode は状態を追跡し、設計履歴のような構造で各寸法を分離する別の
build123d インターフェースです。ビルドコンテキスト内で保留中のフェイスやエッジに対して操作が認識され、ロケーション変換はビルドとロケーションコンテキスト内のすべての子オブジェクトに適用されます。各ビルドコンテキストは状態を追跡しますが、extrude のような操作は明示的なシェイプ入力を取ることも可能です。Builder mode は mode 属性を導入し、新しいシェイプがコンテキストとどのように結合されるかを指定します:
with BuildPart() as part_context: with BuildSketch() as sketch: with BuildLine() as line: l1 = Line((0, -3), (6, -3)) l2 = JernArc(l1 @ 1, l1 % 1, radius=3, arc_size=180) l3 = PolarLine(l2 @ 1, 6, direction=l2 % 1) l4 = Line(l1 @ 0, l3 @ 1) make_face() with Locations((6, 0, 0)): Circle(2, mode=Mode.SUBTRACT) extrude(amount=2) with BuildSketch(Plane.YZ) as plate_sketch: RectangleRounded(16, 6, 1.5, align=(Align.CENTER, Align.MIN)) plate = extrude(amount=-2) with Locations(plate.faces().group_by(Face.area)[-1].sort_by(Axis.X)[-1]): with GridLocations(13, 3, 2, 2): CounterSinkHole(.5, 1) fillet(edges().filter_by(lambda e: e.length == 2).filter_by(Axis.Z), 1) bore = faces().filter_by(GeomType.CYLINDER).filter_by( lambda f: f.radius == 2) chamfer(bore.edges(), .2)
オブジェクトの拡張
ベースクラスから派生した新しいオブジェクトを作成し、パラメトリック再利用性を高めることができます:
class Punch(BaseSketchObject): def __init__(self, radius: float, size: float, blobs: float, mode: Mode = Mode.ADD): with BuildSketch() as punch: if blobs == 1: Circle(size) else: with PolarLocations(radius, blobs): Circle(size) if len(faces()) > 1: raise RuntimeError("radius is too large for number and size of blobs") add(Face(faces()[0].outer_wire()), mode=Mode.REPLACE) super().__init__(obj=punch.sketch, mode=mode)
使用例:
tape = Rectangle(20, 5) for i, location in enumerate(GridLocations(5, 0, 4, 1)): tape -= location * Punch(.8, 1, i + 1)
データ交換
build123d は多くのデータフォーマットをインポート・エクスポートでき、2D/3D 設計ツール、3D‑プリンタースライサー、従来型 CAM と相互運用できます:
svg = import_svg("spade.svg") step = import_step("nema-17-bracket.step") export_stl(part, "bracket.stl") export_step(part_context.part, "bracket.step")
さらに読む
ドキュメント内にさらに多くの例とチュートリアルがあります。
インストール
ほとんどの場合、
pip でインストールすることを推奨します:
pip install build123d
依存関係が競合した場合は、まず
pip をアップグレードしてから再試行してください:
pip install --upgrade pip
プレリリース版
build123d はアクティブに開発中です。最新機能を利用するには開発ブランチをインストールします:
pip install git+https://github.com/gumyr/build123d
ビューワー
build123d はビューワーと組み合わせて使用すると最適です。最も人気のあるビューワーは ocp_vscode で、スタンドアロンビューワーと VS Code 拡張機能を備えた Python パッケージです。他のエディタ・ビューワーについてはメインドキュメントに記載されています。
コントリビューション
build123d は急速に成長しているプロジェクトであり、アイデア共有・バグ報告・新機能実装などあらゆる貢献を歓迎します。詳細は CONTRIBUTING.md をご覧ください。
アトリビューション
build123d は CadQuery の一部を派生させ、Open Cascade 上に構築された独立フレームワークへと大幅に再設計されました。
ライセンス
本プロジェクトは Apache License 2.0 の下でライセンスされています。