Text to Fusion 360 純粋パラメトリックCADスキル
ユーザーが機械オブジェクト、部品、改造、アクセサリトレイ、ファスナー仕様、分解組立図、またはキネマティックアニメーションを自然言語で説明し、参照用の3Dファイル(.3mf/.stl → 3mf-to-fusion を使用)やビジュアルメディア(.png/.mp4 → media-to-fusion を使用)を提供しない場合は、以下の6フェーズの決定論的CADワークフローに従ってください。
厳格なCAD命令:
- すべてのジオメトリを、Fusion 360タイムライン内のネイティブなスケッチ、構築平面、ユーザーパラメータ、押出/回転/ジョイントフィーチャーを使用して再構築してください。生のメッシュボディ(
root.meshBodies.add)やファセットメッシュ変換を決して生成しないでください。 - すべてのコードは、
execute_api_script内でセンチメートル(cm = mm / 10.0)を使用してクリーンに実行される必要があります。 get_screenshotを使用して、生成または変更されたすべてのボディを常に目視確認してください。
フェーズ0: 事前確認とワークスペース調整
-
Fusion 360 MCPセッションの有効性を確認:
fusion-mcpツールexecute_api_scriptを使用してカナリアプローブを実行:def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app or not adsk.fusion.Design.cast(app.activeProduct): raise RuntimeError("アクティブなFusion 360設計ドキュメントが開いていません。") print("FUSION_MCP_READY")即時失敗ルール: プローブが失敗した場合は停止し、ユーザーにAutodesk Fusion 360を開くよう指示してください。
-
ワークスペースとモノレポルーティング:
- プライマリリポジトリ: アクティブなCADモノレポまたはプロジェクトルート(
CAD_MONOREPO_ROOTまたは現在のワークスペース)。 - 厳格な分離保証: リポジトリルートに一時ファイル、スクリプト、レンダリングを作成したり、
shared/を変更したりしないでください。 - 完全に新しいモデルを開始する場合は、専用のフォルダをスキャフォールディング:
python3 <path_to_skills>/text-to-fusion/scripts/scaffold_text_model.py "<Model_Name>" - モデルスクリプトを
models/<NN>_<Model_Name>/scripts/に、ビジュアルレンダリングをmodels/<NN>_<Model_Name>/renders/に、中間ワークスペースファイルをmodels/<NN>_<Model_Name>/workspace/に保存します。 - 汎用CADヘルパーを
../../shared/(fusion_client、cad_primitives、hardware_library、scene_animator)からインポートします。
- プライマリリポジトリ: アクティブなCADモノレポまたはプロジェクトルート(
-
ドメインリファレンス: カスタムジオメトリを作成する前に、ローカル参照ライブラリを参照してください:
references/prompt-to-geometry-patterns.md— 自然言語をパラメトリックスケッチ拘束に変換します。references/exploded-view-guidelines.md— 分解ベクトル、ゴールデンガイドロッド、正投影フレーミング。references/assembly-animation-pipeline.md— Matrix3DオカレンストランスフォームアニメーションとGIFコンパイル。references/variant-management-and-undo.md— 安全なA/Bバリアントショーケースと非破壊的な非表示。
フェーズ1: 曖昧さの解消とパラメトリック仕様
ユーザーが会話的にジオメトリを説明する場合、不足しているエンジニアリング制約を特定して形式化します:
- エンベロープと主要寸法:
- 全体のバウンディングボックス($W \times D \times H$、単位mm)。
- 最小肉厚(構造部品のデフォルトは
2.0 - 2.5 mm、内部仕切りは1.6 mm)。 - 3Dプリンターベッドサイズ制限(例
220 × 220 × 250 mm)。
- マスターユーザーパラメータの登録(
design.userParameters): 常に主要寸法をユーザーパラメータとして公開し、ユーザーがワンクリックで再スケールできるようにします:def set_user_param(design, name, expr_str, units="mm", comment=""): existing = design.userParameters.itemByName(name) if existing: existing.expression = expr_str return existing return design.userParameters.add( name, adsk.core.ValueInput.createByString(expr_str), units, comment )
フェーズ2: バリアントステージングと可逆的探索
ユーザーが設計オプションを要求した場合(「第2案を見せて」「蓋なしバージョンを試して」):
- ショールームパターン:
- 実験的なオプションを専用コンポーネント(例
Sample_Options_Showroom:1)にモデリングします。 - バリアントを仮想ワークスペースフロア上に横並びに配置し(例 $Y = -350\text{ mm}$ または $X = -200\text{ mm}$)、特徴的な外観(
Rack_Desert_Tan、Rack_Matte_White)を適用します。 - ラベル付きの横並び概要スクリーンショットを撮影します。
- 実験的なオプションを専用コンポーネント(例
- 非破壊的採用:
- ユーザーが勝者を選択したら、選択されたボディをアクティブアセンブリにクローンします(
InSitu_Tier3_Option2)。 - 却下されたショールームのボディは
bRepBody.isLightBulbOn = Falseで非表示にします。 - 下流のタイムライン参照を壊す可能性のあるオブジェクトに対して、決して
body.deleteMe()を呼び出さないでください。
- ユーザーが勝者を選択したら、選択されたボディをアクティブアセンブリにクローンします(
フェーズ3: 標準ファスナーとハードウェアBOM合成
ユーザーがネジ、ナット、または組み立てハードウェアを要求した場合:
- ハードウェア標準化:
- すべてのピボットと構造ジョイントには、デフォルトでDIN 7991 M3皿ネジとDIN 934 M3六角ナットを使用します。
- 標準ポケット寸法:
- 六角ナットポケット: 二面幅(AF)
5.70 mm(5.50 mmナットに対してFDMクリアランス+0.20 mm)、深さ**2.50 mm**。 - ネジ穴: $\varnothing 3.20\text{ mm}$の貫通穴で、90°円錐形の皿穴($\varnothing 6.20\text{ mm} \times 1.80\text{ mm}$)。
- 保持ワッシャー: 3Dプリントワッシャー($\varnothing 9.50\text{ mm}$ OD × $\varnothing 3.20\text{ mm}$ ID ×
1.80 mm厚、90°皿穴)で、ピボットボスの先端をクランプし、リンクバーが自由に回転できるようにします。
- 六角ナットポケット: 二面幅(AF)
- テンプレート配置ルール:
- マスターハードウェアテンプレート(
Template_DIN_7991_M3x10、Template_DIN_934_M3)はisLightBulbOn = Trueに設定する必要があります。 - テンプレートは地下深く(
Z = -500.0 cm)に配置し、アセンブリ内の子インスタンスは表示されたまま、テンプレートが完全に画面外に表示されないようにします。
- マスターハードウェアテンプレート(
フェーズ4: 分解図とテクニカルイラスト
ユーザーが部品の組み立て方を図示するよう要求した場合:
- 線形分解オフセット:
- リンクバーを主軸に沿って外側にオフセット($+X$ 方向に
35 - 50 mm)。 - 構造スタンドまたはフレームをY方向に後方にオフセット(
+45 - 60 mm)。 - モジュラードロップインインサートをZ方向に上方にオフセット(
+40 - 50 mm)。
- リンクバーを主軸に沿って外側にオフセット($+X$ 方向に
- ゴールデンアライメントガイドロッド:
- 細い円筒ロッド($\varnothing 1.2 - 1.4\text{ mm}$、外観
Rack_Mustard_YellowまたはGold - Polished)を、すべてのネジ/ピボットジョイント軸に沿って、最内部のネジ頭から最外部のナットまで押し出します。 - すべてのロッドを専用コンポーネント
Opened_Explosion_Guidesにグループ化します。
- 細い円筒ロッド($\varnothing 1.2 - 1.4\text{ mm}$、外観
- 正投影カメラ設定:
cam.cameraType = OrthographicCameraTypeを設定し、バウンディング範囲をターゲットにして、遠近歪みのない平行な軸を確保します。
フェーズ5: 高速アセンブリアニメーションパイプライン
ユーザーが部品が所定の位置に組み立てられるアニメーションGIFを要求した場合:
- オカレンスベースのシーングラフリギング:
- 移動する各アセンブリを専用の
Occurrence(Anim_Bars、Anim_Stand、Anim_Fasteners)にグループ化します。 - フレームループ内で
features.moveFeatures.add()を使用しないでください(フレームあたり約2.2秒のタイムライン再構築が発生します)。 - 直接
occ.transform = Matrix3D(0.005秒/フレーム)を再割り当てします。
- 移動する各アセンブリを専用の
- マルチステージスムーズステップ:
スムーズステップイージング $s(\tau) = 3\tau^2 - 2\tau^3$ を段階的なサブアセンブリ間隔($t \in [0.0, 1.0]$)に適用します:
- スタンドドッキング: $t \in [0.00, 0.40]$
- リンクバーシート: $t \in [0.15, 0.60]$
- 保持ワッシャーシート: $t \in [0.30, 0.70]$
- ファスナークランプ: $t \in [0.40, 0.92]$
- ガイドフェード:
guides_occ.isLightBulbOn = (t < 0.88)
- スクリプト内バッチレンダリングとピンポンコンパイル:
- フレームを直接ディスクにレンダリング:
vp.saveAsImageFile('/tmp/frames/frame_%03d.png', 800, 800)。 PIL.Imageを使用してコンパイル: 28フレーム(45ms)→ 28フレームホールド(50ms)→ 26逆方向フレーム(45ms)→ 20フレームホールド分解(50ms)。- 128色適応パレットとFloyd-Steinbergディザリング(約
2.3 MB)で量子化。 - ブラウザチャット画像キャッシュを無効にするために、ユニーク/バージョン管理されたファイル名(例
_final.gif)を使用します。
- フレームを直接ディスクにレンダリング:
フェーズ6: 数学的自己検証とDevBrain同期
- 合わせ面を数学的に検証:
- 予期しないギャップ(「置き去りに見える」)のある部品が現れた場合は、ワールド座標を検査します:
delta = target_face.x - moving_face.x。 - 正確な数学的デルタを適用し、推測で調整しないでください。
- 予期しないギャップ(「置き去りに見える」)のある部品が現れた場合は、ワールド座標を検査します:
- ラップアップとメモリ同期を実行:
- スコープされた変更をアクティブなCADリポジトリにコミットします。
- 新しいメカニズム、許容ルール、またはAPIの癖を解決した場合は、
references/に記録し、CHANGELOG.mdに変更をログします。