概要
製造業の設計現場では、「既存のブラケットの穴をM6のタップに変えたい」「このプレートを20mm伸ばして、図面の寸法も合わせたい」といった小さな変更が日常的に発生します。こうした作業のたびにCADを起動し、フィーチャの履歴をたどって修正するのは、専任の設計者でなければ負担の大きい作業です。
生成AIをCADに組み合わせると、こうした変更を自然言語で指示できるようになります。ただし、LLMは寸法を「それらしく」間違えることがあり、穴径や図面の寸法の誤りはそのまま加工ミスにつながります。そのため、AIに何をさせ、何を決定的な処理で保証するかの切り分けが設計の中心になります。
DigitalBaseで実装を進めているAI支援CADの仕組みをもとに、コードベースのCADカーネル、標準部品と穴の扱い、図面の生成と保存、直接編集までを整理します。なお、本記事で扱う機能の多くは2026年10月末から11月にかけて実装したもので、現在検証を進めている段階です。
なぜコードベースのCADカーネルか
OpenCascadeとbuild123d
形状の計算には、オープンソースの3D CADカーネルであるOpenCascadeを使っています。FreeCADの内部でも使われているカーネルで、B-rep(境界表現)による正確な立体演算、STEPなどの交換形式の読み書きができます。その上に、Pythonで形状を組み立てるライブラリであるbuild123dを載せています。
コードで形状を記述するCADは、AIと相性のよい特徴を持っています。
- 形状が「操作の列」で表せる:直方体を置き、穴をあけ、角を丸める、という手順がそのまま記録になる
- 寸法をパラメータで持てる:板厚や穴ピッチを変数にしておけば、値を変えるだけで形状が追従する
- 検証を差し込める:形状を組み立てる各段階で、寸法や参照の妥当性をプログラムで確かめられる
build123dでの記述は、一般に次のような形になります。
from build123d import * with BuildPart() as plate: Box(80, 50, 10) fillet(plate.edges().filter_by(Axis.Z), radius=3) top = plate.faces().sort_by(Axis.Z)[-1] with Locations(top): with GridLocations(64, 34, 2, 2): CounterSinkHole(radius=3.3, counter_sink_radius=6.0, counter_sink_angle=90) export_step(plate.part, "plate.step")
AIにはコードではなく「操作」を出させる
ただし、AIにPythonのコードをそのまま書かせて実行する方式は採っていません。複数の利用者が使うサーバーで、AIの生成したコードを実行することになるためです。代わりに、モデルを フィーチャの列(JSON) として保存し、AIには「フィーチャを足す・直す・消す・パラメータを変える」といった 操作の列 を構造化出力で返させます。
{ "operations": [ {"action": "add", "type": "box", "size_mm": [80, 50, 10]}, {"action": "add", "type": "hole", "screw": "M6", "fit": "tap", "positions": [[-32, -17], [32, -17], [-32, 17], [32, 17]]} ] }
操作はスキーマで検査してから適用し、形状を組み立てます。適用できなかったり、触ったフィーチャの組み立てに失敗したりした場合は、エラーと前回の操作を添えて、AIに1回だけ出し直させます。
形状の組み立ては本体とは別の常駐子プロセスで1件ずつ行い、一定時間で返事が無ければプロセスごと止めて作り直します。OpenCascadeの計算は途中で中断できないためです。CADエンジンは依存を含めると大きいため本体には同梱せず、必要な環境で管理者が後から追加する構成にしています。
標準部品と穴:数値をAIに任せない
標準部品の一覧
ねじ・ナット・座金・軸受は、AIが形状を一から作るのではなく、標準部品のライブラリ(bd_warehouse)から呼び出します。六角穴付きボルト、六角ボルト、皿ねじ、なべ小ねじ、六角ナット、平座金、深溝玉軸受、円すいころ軸受などを、ISOやDINなどの規格と呼び径(例:M6、608)で指定します。
部品は穴に「付ける」形で配置できます。
- 穴の各位置に1本ずつ入り、穴を動かしたり径を変えたりすると部品も付いてくる
- 反対側に付ける指定で、板の裏に出たボルトにナットを付けられる
- 面からの浮かせ量で、頭の下の座金の厚みを表せる
- 部品はそれぞれ別の物体として扱い、通す相手の形状と結合しない
ねじ山は既定では省略した丸棒で表します。ねじ山まで形状にすると計算が重くなるためです。
穴径はねじの呼びから決める
穴は径を直接書く代わりに、「M6の通し穴(きつめ・標準・ゆるめ)」「M6のタップ下穴」のように、ねじの呼びとはめあいで指定できます。径はライブラリの表から引くので、AIが下穴径を記憶に頼って書く必要がありません。
表の値も検証する:タップ下穴の補正
ところが、表の値も常に正しいとは限りません。検証の過程で、ライブラリの下穴表に めねじの内径より小さい値 が含まれていることが分かりました(M21×2が18.0mm、M22×2.5が18.5mmなど)。メートル並目ねじの下穴径は、呼び径からピッチを引いた値(M22×2.5なら19.5mm)が一般的な目安です。
そこで、表の値がめねじの内径の基準寸法(呼び径 − 1.0825×ピッチ)を下回る場合は、呼び径 − ピッチに置き換える補正を入れています。
def checked_tap_drill(nominal_mm: float, pitch_mm: float, table_mm: float) -> float: """下穴表の値が、めねじの内径(基準寸法)より小さければ補正する。""" minor = nominal_mm - 1.0825 * pitch_mm if table_mm < minor - 0.01: return round(nominal_mm - pitch_mm, 3) return table_mm checked_tap_drill(22, 2.5, 18.5) # → 19.5 checked_tap_drill(20, 2.5, 17.5) # → 17.5(正しい値はそのまま)
皿穴の寸法を検証する
皿穴も同様に、組み立ての前に寸法を確かめます。皿の径が穴径以下の場合や、皿の角度が0〜180度の範囲に無い場合は、形状を作らずに理由を返します。たとえば「M10のゆるめの通し穴(12mm)に、径12mmの皿」は皿として成り立たないため、エラーになります。
エラーの文面も、AIと人の両方が読めるように直しています。「#3の穴が無効になっているため部品を付けられない」のように、フィーチャの通し番号と名前で参照先を示します。
図面:三面図・寸法・PDFを1つの文書から作る
三面図は1つのDXF文書
3Dモデルからは、正面図・平面図・右側面図の三面図(第三角法)を作ります。三面図は1つのDXFの文書として組み立て、画面の表示・DXFの書き出し・PDFの書き出しがすべて同じ文書を使う ようにしています。画面で足した寸法が書き出した図面に入っていない、という食い違いを構造的に防ぐためです。
利用者が足した寸法と注記は、形状のフィーチャとは別に持ちます。寸法は辺の中心位置で参照し、図を描くたびに今の形状から辺を探し直すので、形状を直しても寸法が付いてきます。辺が見つからないほど形が変わった場合は、描かずに「見つからない寸法」として一覧に示します。
既存のDXF図面は差分だけを書き戻す
過去のDXF図面を開いて直す場合は、DXFを正本とし、保存では変えた要素だけをハンドルで探して書き戻します。直した要素も、変わった属性だけを書きます。触っていないハッチング・ブロック・寸法などはそのまま残ります。図面を丸ごと書き直す方式では、往復のたびに要素や書式が落ちることがあるためです。
開いた後に元のファイルが変わっていた場合は上書きしません。印刷用のPDFは、保存済みのDXFからA3横で作ります。
図面のストレッチ
図面の編集では、「この部分を20mm伸ばす」という操作をストレッチで行えます。伸ばしたい範囲を枠で囲み、基点と行き先を指定すると、枠の中にある線の端点や頂点が動きます。円・円弧・文字は中心や位置が枠の中にあれば全体が動きます。
寸法も、測っている点が枠の中にあれば一緒に動き、保存時に描き直されて値が測り直されます。円の半径を変えた場合も、その円の半径・直径の寸法が追従します。AIに「右端を20mm伸ばして」と指示した場合も、同じ操作が適用されます。
履歴の無い形状を直接直す
取引先から受け取ったSTEPファイルや、過去のSTLには、フィーチャの履歴がありません。こうした形状に対しては、面を直接操作する編集を用意しています。
| 操作 | 内容 |
|---|---|
| 面を動かす | 平らな面を法線方向に動かす。立体を面と平行な断面で切り、面の側を動かして間を断面の押し出しで埋める。切る位置は断面形状が一様な所から選ぶので、面の近くの丸めや穴も一緒に動く |
| 穴の径を変える | 穴の壁を選び、穴を埋めてから同じ軸と深さで新しい径の穴をあけ直す |
| 面を除く | 選んだ穴・角の丸め・面取りを形状から取り除く |
「この穴の径を8mmに」「この面を3mm下げて」といった指示も、これらの操作に置き換えて適用します。保存すると元のファイルと同じ形式で書き出しますが、元を残したい場合は別名で保存します。
現時点の限界
実装と並行して、オープンソースの2D・3D CADと機能を比較しました。製造の図面で気付かれやすい差として、次の点が残っています。
- 2Dの角の丸め・面取り、作図中に長さや角度を数値で打ち込む操作
- 角度寸法、寸法公差、表面粗さ記号、穴の中心線・中心マーク
- 垂線・接線への吸着、ハッチングの作成、ブロックの挿入と分解
- 断面図・詳細図、図枠と表題欄
また、仕組み上の制約として次の点があります。
- STEPの書き直しで失われる情報:STEPはOpenCascadeで書き直すため、元のファイルの色・名前・アセンブリ構造は残らない
- 編集できる図面の範囲:DWGは閲覧のみ、古い形式(R12)のDXFは閲覧のみ
- 2D図面から3Dへの変換:自動変換は持たない。図面を図ごとの線データにしてAIに渡し、押し出しや回転で組み立てさせるが、2つの投影図だけで形が決まらない部品はAIの読み取りに左右される
AIが出した形状は、最終的に設計者が寸法と干渉を確認する前提です。チャットからファイルを書き換える操作は承認を経て保存され、操作は監査ログに残ります。
まとめ
AIと自然言語でCADを扱う際の要点は、次のとおりです。
- カーネルはコードベースで:OpenCascadeとbuild123dで形状を操作の列として表し、寸法をパラメータで持つ
- AIには操作を出させる:生成コードを実行せず、スキーマで検査できる操作の列を返させ、失敗時はエラーを添えて出し直させる
- 数値はAIに任せない:穴径はねじの呼びとはめあいから表で引き、表の値や皿穴の寸法もプログラムで検証する
- 図面は1つの文書から:画面・DXF・PDFを同じ文書から作り、既存のDXFは変えた要素だけを書き戻す
- 履歴の無い形状も直せる:面の移動・穴径の変更・面の除去で、受け取ったSTEPを直接直す
いずれも検証を進めている段階の機能であり、製造の図面として必要な記号や寸法の種類には不足も残っています。「AIが作り、決定的な処理が検証し、設計者が確認する」という役割分担を前提に、現場の図面で確かめながら範囲を広げていく考えです。