生成AIをつかって作業してみたログです。AI環境は、常に変化が起こっているのでログの意味でしかないかもしれません。
操作レベルを追加しました。それに従うと、2026年現在では、レベル4が進行しているといったところでしょうか。
2025年現在では、大規模言語モデルが主流になっていますので、そのAIを使ってモデル生成コードを出力してもらいます。料金の発生しないモデルにしています。
自然言語の入力からシームレスに生成されるような仕組み(VScode経由)がありそうですが(MCPが活発)、ひとまずコードの確認もできるので、手動でコンソールに貼り付けることにします。
操作レベル
レベル1:コード生成(Scripting)
AIに「FreeCADのPythonスクリプト」をゼロから書かせ、それをコピー&ペーストして実行する最も基本的な方法です。
- 手法: AIに「Build123dやFreeCAD APIを使って、〇〇の形状を作るコードを書いて」と依頼。
- 役割分担:
- AI: プログラマー(コードを書くだけ)。
- 人間: 実行役(コピペ、エラーが出たらAIに報告)。
- メリット: MCPなどの特別な環境構築が不要。複雑な幾何学計算をAIに任せられる。
- 課題: 言語化の負担が最大。少しの修正でも「コードの再生成→コピペ」の手間が発生する。
レベル2:コマンド実行(Basic Tool Use)
MCP(freecad-mcp など)を導入し、AIが直接FreeCADのコマンドを叩く段階です。
- 手法: AIエージェントから「50mmの立方体を作って」と指示。AIが背後でツールを選択し、即座にFreeCADに反映。
- 役割分担:
- AI: オペレーター(指示された道具を動かす)。
- 人間: 監督(口頭で指示を出し、結果を確認)。
- メリット: コピペが不要。対話するように「次にあそこに穴を開けて」と指示を繋げられる。
- 課題: AIが「今の3D空間の状態」を正確に把握していないと、座標のズレが生じやすい。
レベル3:文脈理解(Context-Aware Modeling)
AIが現在のFreeCAD内のオブジェクト構成やスクリーンショットを取得し、状況を判断しながらモデリングする段階です。
- 手法: 高機能MCPを使用。AIが
get_view(画像)やget_objects(構成)を自ら実行。 - 役割分担:
- AI: パートナー(状況を見て「この面ですね?」と確認してくる)。
- 人間: 設計者(大まかな方針と意図を伝える)。
- メリット: 「今選んでいる面に~」といった、曖昧な指示が通るようになる。言語化の苦労が劇的に減る。
- 課題: AIの推論コスト(API使用料やローカルPCの負荷)が高くなる。
レベル4:自律的最適化(Autonomous Design)
AIによる自律的な設計提案が含まれる段階です。
- 手法: エージェントが、設計要件(強度、重量、コスト)を元に、複数の設計案を勝手に作り、人間に選択させる。
- 役割分担:
- AI: 設計コンサルタント。
- 人間: 意思決定者(AIが出した案からベストなものを選ぶだけ)。
- メリット: 「作りたいものを言語化する」必要すらなく、「示された選択肢から選ぶ」だけで設計が完了する。
FreeCAD
レベル1の実施
100x100x10の簡単なモデルを作成します。
生成AIへ入力してコードを出力してもらいます。コードをpythonコンソールへ貼り付けます。
Copilot

FreeCADのpythonターミナルにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
import FreeCAD
import Part
# ドキュメントの作成
doc = FreeCAD.newDocument("BoxCreation")
# 直方体のパラメータ
length = 100 # x方向の長さ
width = 100 # y方向の幅
height = 10 # z方向の高さ
# 直方体の作成
box = Part.makeBox(length, width, height)
# 直方体をドキュメントに追加
Part.show(box)
# ビューを更新
doc.recompute()
簡単な指示だと、Sketchを使用しないので、いくつかの指示を繰り返し行います。

スケッチを使ったモデルにできますか。

スケッチに拘束を与えてください。

原点を完全拘束するようにして十分な拘束状態にできますか。
import FreeCAD
import Part
import Sketcher
# ドキュメントの作成
doc = FreeCAD.newDocument("FullyConstrainedSketchBox")
# 新しいスケッチを作成
sketch = doc.addObject('Sketcher::SketchObject', 'Sketch')
sketch.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0), FreeCAD.Rotation(0,0,0,1))
# スケッチに長方形を追加
line1 = sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(0,0,0), FreeCAD.Vector(100,0,0)), False)
line2 = sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(100,0,0), FreeCAD.Vector(100,100,0)), False)
line3 = sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(100,100,0), FreeCAD.Vector(0,100,0)), False)
line4 = sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(0,100,0), FreeCAD.Vector(0,0,0)), False)
# 拘束の追加
sketch.addConstraint(Sketcher.Constraint('Coincident', line1, 2, line2, 1)) # line1の終点とline2の始点を重合
sketch.addConstraint(Sketcher.Constraint('Coincident', line2, 2, line3, 1)) # line2の終点とline3の始点を重合
sketch.addConstraint(Sketcher.Constraint('Coincident', line3, 2, line4, 1)) # line3の終点とline4の始点を重合
sketch.addConstraint(Sketcher.Constraint('Coincident', line4, 2, line1, 1)) # line4の終点とline1の始点を重合
sketch.addConstraint(Sketcher.Constraint('Horizontal', line1)) # line1を水平に拘束
sketch.addConstraint(Sketcher.Constraint('Horizontal', line3)) # line3を水平に拘束
sketch.addConstraint(Sketcher.Constraint('Vertical', line2)) # line2を垂直に拘束
sketch.addConstraint(Sketcher.Constraint('Vertical', line4)) # line4を垂直に拘束
sketch.addConstraint(Sketcher.Constraint('DistanceX', line1, 1, line1, 2, 100)) # line1の長さを100mmに拘束
sketch.addConstraint(Sketcher.Constraint('DistanceY', line2, 1, line2, 2, 100)) # line2の長さを100mmに拘束
# 原点を完全拘束
sketch.addConstraint(Sketcher.Constraint('Coincident', line1, 1, -1, 1)) # line1の始点を原点に拘束
# スケッチを押し出して直方体を作成
extrude = doc.addObject('Part::Extrusion', 'Extrude')
extrude.Base = sketch
extrude.Dir = (0,0,10)
extrude.Solid = True
extrude.TaperAngle = 0
# ビューを更新
doc.recompute()

ChatGPT v2

FreeCADのpythonターミナルにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
import FreeCAD as App
import Part
# ドキュメントを作成または取得
doc = App.newDocument("BoxExample") if App.ActiveDocument is None else App.ActiveDocument
# 直方体を作成
box = doc.addObject("Part::Box", "Box")
box.Length = 100 # x方向の長さ
box.Width = 100 # y方向の幅
box.Height = 10 # z方向の高さ
# モデルを更新
doc.recompute()
print("直方体が作成されました")
できたのはここまでで、指示の仕方が悪いのか、スケッチを正常に作成できませんでした。
Gemini 1.5Flash

FreeCADのpythonターミナルにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
import FreeCAD
# ドキュメントを作成 (既にドキュメントが存在する場合は不要)
doc = FreeCAD.activeDocument()
if not doc:
doc = FreeCAD.newDocument("MyDocument")
# 直方体を作成
box = doc.addObject("Part::Box", "Box")
box.Length = 100
box.Width = 100
box.Height = 10
# ビューを更新
doc.recompute()レベル2の実施
MCPサーバーによる操作
CadQuery
レベル1の実施
同じく、100x100x10の簡単なモデルを作成します。
Copilot

cadqueryのeditorにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
import cadquery as cq
# 直方体を作成
box = cq.Workplane("front").box(100, 100, 10)
# 結果を表示
show_object(box)

Workplaneをつかって押出で作成することはできますか。
import cadquery as cq
# ワークプレーンを作成し、長方形をスケッチ
rect = cq.Workplane("front").rect(100, 100)
# スケッチから押出して直方体を作成
box = rect.extrude(10)
# 結果を表示
show_object(box)

ChatGPT v2

cadqueryのeditorにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
import cadquery as cq
# x=100, y=100, z=10 の直方体を作成
box = cq.Workplane("XY").box(100, 100, 10)
# モデルを表示(CadQueryエディタでは、この行で生成された形状が表示されます)
show_object(box)

Workplaneをつかって押出で作成することはできますか。
import cadquery as cq
# Workplaneを作成してスケッチを描画
box = (
cq.Workplane("XY") # XY平面上で作業開始
.rect(100, 100) # 幅100、高さ100の矩形を作成
.extrude(10) # 矩形を高さ10で押し出し
)
# モデルを表示
show_object(box)
OpenSCAD
レベル1の実施
同じく、100x100x10の簡単なモデルを作成します。
Copilot

OpenSCADのeditorにコードを添付してモデル作成します。 x100y100z10の直方体形状を作成するコードを生成してください。
//直方体を作成
cube([100, 100,10]);

2D輪郭線を定義し、それを押し出すように作成してください。
// 2D輪郭線を定義
polygon(points=[[0,0], [100,0], [100,100], [0,100]]);
// 2D輪郭線を押し出して3D形状に変換
linear_extrude(height=10) {
polygon(points=[[0,0], [100,0], [100,100], [0,100]]);
}

コードエディタ拡張
VScodeなどのエディタの拡張機能を追加すると、フォーマットなどを考慮してくれます。

MCPサーバー





コメント