
2026/09/13 4:57
ベンチマーク:エージェント型 CAD 作業における CadQuery と OpenSCAD の比較
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ModelRift 研究の最も重要な見解は、3D プリンティングにおいて独立したメッシュ検査が必須であることである。OpenSCAD および CadQuery はいずれも正しく幾何形状を報告できながら、腐敗した部品を生成する可能性があるためである。無人エージェントが複雑な機械的タスク(壁ブラケット、エンクロージャー、ネジ付きアダプター)を解決したベンチマークにおいて、研究者たちは明確だが危険な故障モードを観察した。OpenSCAD は沈黙してかつ遅れて失敗し、投稿の削除やスロットの誤配置など、サイレントなブーリアン問題に起因するにもかかわらず「クリーンな」メッシュを報告することがしばしば発生する。一方、CadQuery は算術例外(例:
エラー)を引き起こし、水密なレポートが生成される場合でも早期かつ明確に失敗した。BRep_API
OpenSCAD は優れた高速性(幾何形状の再計算で約 16ms vs CadQuery の約 2s)とコンパクトなテキスト形式を提供したが、組み込みの幾何形状照会機能を欠いていた。CadQuery は検証可能性において優れており、エージェントが結果について主張したり幾何形状を問いかけたりすることを可能にするが、これにはスローランタイムおよび Python ランタイムへの依存性が伴う。重要なのは、両ツールからの自己報告は信頼できないという点である。例えば、OpenSCAD の「サイレントな誤った幾何形状」はエラーログなしに発生し、CadQuery は螺旋状の曲線に沿った正確な接ぎによりコアシリンダーがサイレントに廃棄されたにもかかわらず
valid=True を報告する事例があった。したがって、ユーザーはツール報告やレンダラーのみを信頼することはできず、壁厚誤差のような微妙な欠陥を見逃すことが多い。将来に向けて、ModelRift はその高速性とサンドボックス化のために OpenSCAD を主要エンジンとして維持する可能性が高いが、あらゆる実行完了を宣言する前に、体積、角度、干渉に対する数値チェックなどの検証ステップを統合する必要がある。生成デザインエージェントを開発する企業は、単純な構文の利便性よりも堅牢な幾何形状照会機能を優先し、信頼性の高い生産結果を確保すべきである。本文
ModelRift: OpenSCAD と CadQuery の対決——AI エージェントによる CAD ツール検証レポート
ModelRift では、プラットフォーム上のすべてのモデルに対して OpenSCAD を生成しています。しかし、この選択は定期的に見直す価値があります。そこで、OpenCascade B-rep コアを基盤とする Python ライブラリである CadQuery との制御された比較を実施しました。
1. 実験の問いかけ
今回の検証における問いかけは明確かつ狭いものでした:
- 核心: 「誰も見ていない状態で、AI エージェントがどのツールを正しい、印刷可能で機能的な部品に導き出せるでしょうか?」
- 排除事項: 手書きでの記述の快適さや、ユーザーインタフェースの良さなどは考慮外としました。
2. 環境設定
実験構成
- エージェント数: 6 つ
- タスク数: 3 つ
- モデル: Claude Opus 5(1M コンテキスト)
- 実行方法: 各セルは独立した汎用サブエージェントとして動作し、相互通信なし。1 セルに 1 エージェントずつ配置。
- バージョン制御: Python 3.14 環境上の Mac M シリーズマシンを使用。
- OpenSCAD:
2026.06.12 - CadQuery:
2.8.0
- OpenSCAD:
ツールの仕込み(スキル)
- OpenSCAD: 「openscad-skill」を使用して、QA ループ(レンダリング・インスペクション・フィックス)、CLI プレビュー用カメラプリセット、断面デバッグ、カスタマイザー構文を適用。
- CadQuery: OpenSCAD 相当の機能を移植し、OpenSCAD のみで機能する部分は置き換えた独自のオフスクリーンレンダラーと、B-rep の有効性指標を追加。
- 設計ルール: 両ツールとも同じ 3D プリンティングルール(壁厚、クリアランス、オーバーハング)を適用。片方から他方にアドバイスを与えることはせず、独立した検証を行いました。
検証プロセスの厳格化
- コード制約: エージェントはバージョン数 12 を上限とし、「成功を偽装しないこと」「すべての失敗を原文のエラーメッセージと共に報告すること」が義務付けられました。
- エージェント説明への不信: 最終的なすべての STL は、ファイルから直接読み取る独立したパーサーによって検証されました。
- トライアングル数、バウンディングボックス、体積、気密性(Watertight)、非マニフォールドエッジ、逆転した面、連結成分などを報告。
3. 3 つのタスク
両方のエージェントは同じテキストを提示され、ツール固有の手がかりはありませんでした。
- T1: シンプルなブラケット(ウォールマウントシェルフ用 L ブラケット)
- 2 プレート結合、厚さ 4mm、三角継手 2 個、埋头穴 2 個、貫通穴 2 個。
- コーナーラウンド R3/R4。サポート不要で印刷可能。
- T2: 2 部品スナップフィットエンクロージャ
- PCB (50x26mm) 収容用。壁厚 2mm、内部クリアランス 0.4mm。
- M2 ポスト 4 個、USB-C カットアウト、通気スロット 5 つ。
- 重要な要件: 両部品は密着して組み合わさる必要あり(クリアランススタックアップの正確な検証が必要)。
- T3: 真のねじ部付きホースバーブアダプター(最も困難)
- M24x2 ねじ、六角フランジ、実質的な螺旋状のネジ、ID 12mm ホース用バーブ。
- 重要な要件: リングを重ねてはいけないと明言。ねじ部は真の螺旋幾何形状である必要あり(ISO ピッチへの正確な対応)。
4. 結果比較
各タスクごとの詳細指標
| 項目 | T1 OpenSCAD | T1 CadQuery | T2 OpenSCAD | T2 CadQuery | T3 OpenSCAD | T3 CadQuery |
|---|---|---|---|---|---|---|
| バージョン数 | 2 | 3 | 8 | 5 | 1 | 1 |
| コード行数 | 103 | 135 | 220 | 266 | 150 | 172 |
| ツールエラー | 14 | 0 | 1 | 1 | 0 | 1 |
| 沈黙した誤り幾何学 | 0 | 0 | 5 | 3 | 0 | 1 |
| エージェント実行時間 | 461 秒 | 562 秒 | 1,058 秒 | 909 秒 | 542 秒 | 935 秒 |
| トークン数 | 77 k | 89 k | 138 k | 139 k | 82 k | 119 k |
| 再計算時間 | 12 ms | 1.56 秒 | 16 ms | 1.93 秒 | 43 ms | 1.95 秒 |
| 最終判定 (STL) | OK (Clean) | OK (Clean) | OK (Clean) | OK (Clean) | OK (Clean) | OK (Clean) |
総計比較
- OpenSCAD: バージョン数 11、コード行数 473、エラー 25、再計算時間 12ms。
- CadQuery: バージョン数 11、コード行数 573、エラー 4、再計算時間 1.56 秒。
【重要】「OK (Clean)」の意味 これらはツールからの報告ではなく、ファイルから直接測定したものです。気密性あり、連結成分が一つ、非マニフォールドエッジ・境界エッジなし、z=0 面上にあることを指します。
5. タスクごとの分析
T1: シンプルなブラケット
- OpenSCAD: 初回試行で正しいジオメトリをコンパイル(2 バージョンで完了)。2D プロファイルを描画して押出するため、ソリッド組み立てには関心がない特徴あり。
- CadQuery: 実行時間の約 3 分の 1 を単一のエラーに費やしました。
が.fillet(3.0)
で失敗し、原因不明でした。エージェントは「算術的な不整合」(R3 のフィレットが 4mm 壁の中に収まらない)を人手で特定する必要がありました。BRep_API: command not done
T2: 互いに適合する 2 つの部品
- パラメータ連鎖: CadQuery はリップ深さ変更時、他の要素(リム、プレート、スロットなど)が自動で移動する良好な連鎖を示しました。OpenSCAD はカスタマイザー同等物がなく、定数ブロックをインターフェースとして依存しました。
- 適合性の確認方法の違い:
- OpenSCAD: 人間が読むための数値出力(
)のみ。echo - CadQuery: ビルド停止させるアサーションを実行(
)。assert
- OpenSCAD: 人間が読むための数値出力(
- 沈黙した失敗: OpenSCAD では、CadQuery の 5 バージョンに対して 8 バージョンかかりました。そのうち 3 つは設計ではなく、「ブーリアン衛生(スライスや接する面から切り出された薄いスラッジを掃除すること)」に費やされました。
T3: 真のねじ部
- OpenSCAD: 1 バージョンで完了、初回コンパイルで正解。ただしコードにはガードレールがなし。巻き付け順序が間違ってもツールは何も言いません。
- 対策: エージェントは ISO ピッチとルートの算術的な不整合を予期し、スイープされたプロファイルの位置調整を行いました。
- CadQuery: 6 つの行で記述され、初回尝试で成功しました。しかし、最後の行での失敗が QA ループを変えました。
- 失敗:
でネジのルートとコア半径が一致しすぎ、コアシリンダーを「沈黙して丢弃」しました。OCCT はソリッドを丢弃しましたが、**体積測定(期待 10323 mm³ vs 実測 7065 mm³)**によって発覚。union() - 致命的な点: 壊れた部品も
と報告されました。ブーリアンの許容誤差調整で負の体積を持つソリッドが生成され、これも「有効」と判定されました。valid=True
- 失敗:
6. メッシュと検証について
以下はエージェントがエクスポートしたままの最終メッシュです(我々のクリーンアップ・修復は一切行いません)。
| 部品 | OpenSCAD | CadQuery |
|---|---|---|
| T1 シェルフブラケット | STL, 2,660 トライアングル | STL, 4,232 トライアングル |
| T2 エンクロージャボックス | STL, 2,944 トライアングル | STL, 14,136 トライアングル |
| T2 エンクロージャリッド | STL, 2,960 トライアングル | STL, 1,872 トライアングル |
| T3 ねじ付きアダプター | STL, 10,754 トライアングル | STL, 13,748 トライアングル |
すべての部品は気密性あり、連結成分一つ、非マニフォールドエッジゼロです。トライアングル数はメッシュ密度そのものではありませんが、各エージェントが追加したラウンド詳細の量に従います(例:CadQuery のボックスは OpenSCAD にほぼ 5 倍のトライアングルを持ちますが、リッドでは少ない)。
7. 私たちの発見
レンダリングは何も重要なのを捉えませんでした
画像は粗大なミスを検出しましたが、微妙なものは何もありませんでした。失敗モードは鏡像的です:
- CadQuery: 大きくて早期に失敗します。例外が発生して実行停止し、停止したモデルは偶然出荷できません。
- OpenSCAD: 沈黙して遅れて失敗します。T2 では約 45 回の呼び出しでエラーも報告しましたが、削除されたポストや配置ズレのスロットを持つ破損メッシュを「クリーン」と認証しました。无人監視において、「沈黙した成功」は最も高価な失敗です。
検証可能性が重要
- CadQuery: 自身の幾何学について質問に答えます(コーンの角度を読み取って埋头穴の仕様を証明)。
- OpenSCAD: ジオメトリをクエリする方法がないため、バイナリ STL パーサーを書き直す必要がありました。
速度は OpenSCAD に有利だがノイズ
再計算時間は OpenSCAD が 30〜100 倍高速(16ms 対 1.9 秒)。しかし、モデル推論に支配されたエージェントループ内では意味が薄いです。
OpenSCAD の「部品エッジ」の欠如
CSG 後には三角形のスープのみあり、
--view=edges は輪郭線を描くに過ぎません。一方 CadQuery の B-rep は面と面の接合場所を知っています。視覚的反饋は不均一でした。
8. まとめ(Takeaways)
- 出力においてはどちらのツールも優位しません。 清潔で印刷可能な部品は双方から得られました。
- 決定的なのは表現力ではなく検証可能性です。 CadQuery は記述性の差よりも、アサーションによる広いマージンでこれをリードしています。「直前に構築したものを訊く」という核機能が優れています。
- タスクの形状がツールの影響以上に決定的です。 単純なプリズムは OpenSCAD が担当しました。適合性の必要なもの、らせんねじさえも OpenSCAD が完全に解決しました(ただし検証コストが高い)。
- スクリーンショットを頼りにするのは危険です。 数値的なアサーション(壁厚、クリアランス、干渉体積)が強力です。
- メッシュを独立して検証してください。 両方のツールチェーンとも、間違っていたと認定されたジオメトリを検証したからです。
9. ModelRift への示唆
我々は OpenSCAD を継続します。このベンチマークは OpenSCAD の理由を変更するのではなく、なぜそれが正しいのかを鋭く明らかにしました。
- OpenSCAD の強み: LLM が直接書き込むことができる緊密なテキスト形式、安全なサンドボックス環境、高速なレンダリング(16ms)。
- CadQuery の強み: 主に検証において優位です(アサーションによるマージン)。欠点は Python ランタイム対 WASM サンドボックス、再構築の遅さなどです。
より有用な発見はフィードバックに関するものです。視覚的反饋(輪郭線)は khối 量感や比率の問題には適していますが、壁厚やブーリアン演算で静かに半分が削除されたかといった問題には数値的なアサーションが必要です。
今後の OpenSCAD スキルへの反映予定:
- 特徴エッジレンダラー: エージェントに実物の部品輪郭を持つプレビューを提供。
- 数値チェックパス: モデル完了前に壁厚、クリアランス、干渉などを監査する仕組みの追加。
注意点
- 結果にはツールの差だけでなく、エージェントごとの変動性も含まれています(セルごとに 1 エージェント)。
- BOSL2 は意図的に使用しませんでした。これによりライブラリ支援による性能向上を排除しました。
- この測定は「構築のみ」であり、「壊れたモデルの修理」というより困難なスキルは計測していません。