メディア(画像/動画/参考パック)からFusion 360への再構築スキル
ユーザーが写真、マルチアングル参照フォルダ、または動画(.mp4、.mov、.png、.jpg、.webp)を提供し、そのオブジェクトをAutodesk Fusion 360で再現するよう依頼した場合は、以下の6フェーズの決定論的エンジニアリングワークフローに従ってください。
厳格なCAD命令:
process_media.pyを実行し、現実世界のミリメートルスケールデータムを確立し、運動学的部品表(BOM)を作成せずに、直接Fusion MCP押し出しを記述してはいけません。- すべてのコンポーネントは、Fusion 360タイムライン内でネイティブのスケッチ、構築平面、スケッチ線/円弧/円、ユーザーパラメータ、および押し出し/フィレット/ジョイントフィーチャを使用して再構築する必要があります。生のメッシュボディ(
root.meshBodies.add)を生成しないでください。
フェーズ 0: プリフライト安全ゲート & モノレポ環境(必須)
Fusion 360でCADジオメトリを作成する前に、ワークスペースを整え、ライブなMCP接続を確認します。
-
CADモノレポの調整:
- プライマリワークスペース: アクティブなCADモノレポまたはプロジェクトルート(例:
CAD_MONOREPO_ROOTまたは現在のワークスペース)。 - 厳格な分離保証: リポジトリルートに一時ファイル、スクリプト、レンダリングを作成したり、
shared/を変更したりしないでください。 - 新しいモデルは
models/<NN>_<Model_Name>/の下に保存します(例:models/02_Modular_Desk_Organizer/)。新しいモデルを開始する場合は、scaffold_text_model.py "<Model_Name>"でスキャフォールディングします。 shared/からユニバーサルCADヘルパーをインポートします(fusion_client、cad_primitives、hardware_library、scene_animator)。- スクリプトを記述する前に、ドメイン参照メモリを読み取ります。
references/kinematic-archetypes.md(検証済みの機構方程式)references/fdm-hardware-tolerances.md(印刷クリアランスとファスナーのザグリ穴)references/fusion-api-gotchas.md(高速アニメーションとAPI修正)
- プライマリワークスペース: アクティブなCADモノレポまたはプロジェクトルート(例:
-
カナリアプローブ:
fusion-mcpツールexecute_api_scriptを以下のコードで呼び出します。def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app: raise RuntimeError("Autodesk Fusion 360 application instance not found.") design = adsk.fusion.Design.cast(app.activeProduct) if not design: raise RuntimeError("No active Fusion 360 design document open.") print("FUSION_MCP_READY") -
フェイルファストルール:
- Fusion 360が閉じている間にフェーズ1〜3のメディア計測を実行しても構いませんが、フェーズ4の前に
FUSION_MCP_READYが失敗した場合は、CADビルドスクリプトを送信する前に停止し、ユーザーにアクティブなデザインドキュメントを開いたFusion 360を起動するよう指示してください。
- Fusion 360が閉じている間にフェーズ1〜3のメディア計測を実行しても構いませんが、フェーズ4の前に
フェーズ 1: メディアインジェスト & キーフレーム/輪郭抽出
[!IMPORTANT] ワークスペース分離ルール: メディア処理ファイルをメインのリポジトリルート(例:
./media_workspaceは禁止)に出力しないでください。必ずmodels/<NN>_<Model_Name>/の下に専用のモデルフォルダが存在することを確認し、すべてのメディア処理をmodels/<NN>_<Model_Name>/workspace/mediaにルーティングしてください。
- 前処理および計測エンジンを、入力された画像、動画、またはディレクトリに対して、モデルの分離されたワークスペース内で実行します。
python3 <path_to_skills>/media-to-fusion/scripts/process_media.py "<input_media_or_folder_path>" --out-dir models/<NN>_<Model_Name>/workspace/media models/<NN>_<Model_Name>/workspace/media/media_manifest.jsonを検査し、read_fileで生成されたビジュアルアーティファクトを確認します。- 参照フォルダの場合: 最初に
dataset_overview.pngを表示し、次に個々のサブワークスペース(models/<NN>_<Model_Name>/workspace/media/<slug>/)を検査します。 - 動画の場合:
contact_sheet.pngと個々のkeyframe_XX_grid.pngファイルを表示します(黒フェードイン、モーションブラー、手の拭き取りを自動的に拒否し、折りたたまれた状態、中間スイング状態、展開された運動学的状態をキャプチャします)。 - 画像の場合:
annotated_grid.png(デュアルコントラスト100px主目盛/50px副目盛ピクセル定規グリッド)とcontours_preview.png(検出されたCanny輪郭 + スロット/穴の重心と、同じ行の中央ピクセルピッチ)を表示します。 - 分割画面チェック:
media_manifest.jsonのviewport_layout.is_splitを確認します(例: 単一画像内に並んだ正面図と右側面図の直交ビュー)。これにより、ピクセルスパンが各サブビューポート内で独立して測定されます。
- 参照フォルダの場合: 最初に
フェーズ 2: マルチティアスケールキャリブレーション(「ゴールデンデータム」を見つける)
モデリングを開始する前に、以下の厳格な優先順位階層を使用して、現実世界のミリメートルスケール(mm_per_px)を確立します。
- 優先順位 1 — メディア内の明示的な寸法指示またはビルドプレート制約:
- 参照画像に寸法指示矢印がないか確認します(例: 全幅
35 cm / 350 mm、高さ63 cm / 630 mm、奥行32 cm / 320 mm、またはインセット内部トレイ指示330 x 100 x 70 mm)。 - 3Dプリンタのビルドプレート指示がないか確認します(例:
"FOR 220 x 220 mm PRINTERS"→ 最大単品幅/長さは通常200–210 mm)。
- 参照画像に寸法指示矢印がないか確認します(例: 全幅
- 優先順位 2 — フレーム内に見える標準エコシステムとハードウェアフィーチャ:
- IKEA Skådis Pegboardパターン:
- 水平方向の同列スロットピッチ(中心間):
40.0 mm - 垂直方向の列間ピッチ:
20.0 mm(交互の列は水平方向に20.0 mmずつ千鳥配置) - スロット寸法: 幅
5.0 mm× 高さ15.0 mm(スタジアム/オブラウンドスロット: 垂直中心間10.0 mm、端部はR = 2.5 mmの完全丸型) - 標準ボード厚:
5.0 mm(3Dプリントされたモジュラーペグボードパネルでは3.2 mm – 4.0 mm)
- 水平方向の同列スロットピッチ(中心間):
- 電子機器と機械的ハードウェア:
- メカニカルキーボードMXスイッチ切り欠き:
14.0 x 14.0 mm(1uキーキャップピッチ =19.05 mm) - 標準スマートフォン幅(例: スタンドに置かれている場合):
~71.5 mm - USB-Cレセプタクル開口部:
8.94 x 3.26 mm - ファスナー: M3ソケットヘッドキャップ径 =
5.5 mm(クリアランス穴 =3.2–3.4 mm)、M4ヘッド径 =7.0 mm
- メカニカルキーボードMXスイッチ切り欠き:
- IKEA Skådis Pegboardパターン:
- 優先順位 3 — 人間工学的/手の参照:
- 人間の手が部品を保持しており、ハードウェアデータムが存在しない場合は、平均的な成人の親指の幅(
~20.0 mm)または手のひらの幅(~85.0 mm)を使用し、全体の幅をマスターFusionユーザーパラメータ(Tray_Width)として公開して、ユーザーがワンクリックで再スケーリングできるようにします。
- 人間の手が部品を保持しており、ハードウェアデータムが存在しない場合は、平均的な成人の親指の幅(
フェーズ 3: 運動学的および構造的分解(BOM)
Fusion MCPスクリプトを作成する前に、アセンブリを構造化された**コンポーネント部品表(BOM)**に分解します。
- 固定コンポーネントと可動コンポーネントの分類:
- 固定ベース/フレームコンポーネント: 例:
Top_Anchor_Tray、Rear_Support_Legs(地面平面 $Z = 0$ まで延長)、Backboard_Pegboard_Panels。 - 駆動/カプラコンポーネント: 例:
Stepped_Trays(ティア2..N)、スライド引き出し、または回転ドア。 - リンケージ/拘束コンポーネント: 例:
Parallel_Link_Bars、Side_Joiner_Clips(分割ペグボード半分を接合するHクリップ)、Pivot_Pins。 - モジュラーインサート/アクセサリ: 例:
Divider_Sub_Trays($1/3$、$1/2$、または $1/1$ 幅で1〜3区画)、Skadis_Hooks。
- 固定ベース/フレームコンポーネント: 例:
- 運動学法則をパースペクティブピクセルノイズよりも優先させる:
- 共平面エシュロンマルチピンパラレルグラム則(非オーバーラップ単層バー):
リンケージをモデリングする前に、側面直交図/パース図でバーとバーごとのピンの正確な数を数えます。
- 参照が平行で非オーバーラップの共平面バー(例: エシュロン状に配置された4本の平行バー:
バー1= 2ピンショートバー、バー2= 3ピンロングバー、バー3= 3ピンロングバー、バー4= 2ピンショートバー)を示している場合、リンケージバーがエンドツーエンドでピンを共有し、横方向に重なるレイヤーになっていると決して想定しないでください。 - $N$段の共平面エシュロンリンケージでは、各トレイ $t \in {0, \dots, N-1}$ は、トレイ奥行に沿って
Pin_Station_Pitch$\Delta y_{\text{station}}$ の間隔で配置された水平ピンステーション $s \in {0, 1, 2}$(ステーションA前面、ステーションB中央、ステーションC背面)を持ち、すべてのバーは (トレイ $t$、ステーション $s$) $\longrightarrow$ (トレイ $t+1$、ステーション $s+1$) を単段ホールピッチ $L_{\text{step}} = \sqrt{\Delta y_{\text{station}}^2 + \Delta Z_{\text{collapsed}}^2}$ で接続します。バー1 (2ピン、長さ L_step):(トレイ 0, ステーション B) -> (トレイ 1, ステーション C)バー2 (3ピン、長さ 2*L_step):(トレイ 0, ステーション A) -> (トレイ 1, ステーション B) -> (トレイ 2, ステーション C)バー3 (3ピン、長さ 2*L_step):(トレイ 1, ステーション A) -> (トレイ 2, ステーション B) -> (トレイ 3, ステーション C)バー4 (2ピン、長さ L_step):(トレイ 2, ステーション A) -> (トレイ 3, ステーション B)
- 垂直からのバー角度 $\theta$ における、トレイ間の移動量:
$$\Delta Y_{\text{tray}}(\theta) = -L_{\text{step}}\sin(\theta) - \Delta y_{\text{station}}, \qquad \Delta Z_{\text{tray}}(\theta) = -L_{\text{step}}\cos(\theta)$$
- 折りたたみ状態($\theta_{\text{col}} = -\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$)では、$\Delta Y_{\text{tray}} = + \Delta y_{\text{station}} - \Delta y_{\text{station}} = 0\text{ mm}$(トレイはバーが $-\theta_{\text{col}}$ にある間100%垂直に積み重なり、トレイ後壁は後部サポート脚の前面にぴったりと接触します)。
- 展開状態($\theta_{\text{open}} = +\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$)では、まったく同じバーが垂直を通過して $+\theta_{\text{open}}$ までスイングし、各トレイを $\Delta Y_{\text{tray}} = -2 \Delta y_{\text{station}}$ だけ前方にステップさせながら、4本すべてのバーを単一共平面レイヤーに保持し、ピンを共有しません。
- 参照が平行で非オーバーラップの共平面バー(例: エシュロン状に配置された4本の平行バー:
- 共平面エシュロンマルチピンパラレルグラム則(非オーバーラップ単層バー):
リンケージをモデリングする前に、側面直交図/パース図でバーとバーごとのピンの正確な数を数えます。
- プリントベッドモジュラリティルール:
- 平らなパネル(背の高いSkådisバックボードなど)がターゲットプリンタのベッド高さ(例:
> 210 mm)を超える場合は、水平方向にUpper_PanelとLower_Panelに分割し、対応するサイドHプロファイルジョイナークリップ(0.20 mmスライディングクリアランス)を生成します。
- 平らなパネル(背の高いSkådisバックボードなど)がターゲットプリンタのベッド高さ(例:
- オプションのパースペクティブホモグラフィーデワーピング(
--rectify):- 角度の付いた平面パターン板や複雑な2Dシルエットの写真の場合、以下を実行します:
~/.gemini/antigravity/skills/media-to-fusion/scripts/process_media.py "<image_path>" \ --out-dir ./media_workspace \ --rectify "x1,y1,x2,y2,x3,y3,x4,y4" \ --real-w <width_mm> --real-h <height_mm> process_media.pyは自動的に4つのコーナーを時計回りに並べ替え(TL, TR, BR, BL)、平面を0.1 mm/pxでrectified_ortho.pngにデワープし、rectified_contour.dxfをエクスポートし、media_manifest.json内に簡略化された閉じたポリゴンループ(points_xy_mm)を保存します。
- 角度の付いた平面パターン板や複雑な2Dシルエットの写真の場合、以下を実行します:
フェーズ 4: Fusion 360 MCPによるパラメトリックモデリング
execute_api_script を介して、Fusion 360でCADアセンブリをクリーンに構築します。
- 必須のセンチメートル変換(
cm = mm / 10.0):- Fusion 360の内部API(
adsk.core.ValueInput.createByReal()、adsk.core.Point3D.create())は、厳密に**センチメートル(cm)**を使用します。 - すべての
execute_api_scriptの先頭で、必ずdef cm(mm_val): return mm_val / 10.0を定義します。
- Fusion 360の内部API(
- マスターユーザーパラメータを登録する(
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 )Tray_Width、Tray_Depth、Tray_Height、Wall_Thickness(デフォルト2.4 mm)Link_Step_Pitch、Link_Width、Link_Thickness(デフォルト3.5 mm)Deploy_Angle_Deg(例: 展開/配備状態では40 deg、折りたたまれた垂直スタックでは0 deg)Clearance(デフォルト0.25 mm)
- 3Dプリンティングのメカニカルクリアランス:
- 回転ピボットピン/リンケージ穴:
0.25 mmのラジアル(0.50 mmの径方向)クリアランス、リンクが保持されるように0.8 mmのリップまたはM3ファスナーボアを設けます。 - スライディングジョイナークリップ/取り外し可能な仕切りインサート: 片側
0.20 mmのクリアランス(インサートトレイでは合計0.40 mmの幅/奥行き差し引き)。 - ボトムトレイの人間工学とリアサポート脚:
- 参照メディアで確認できる場合は、最下段のトレイに丸みを帯びた長方形のサイドハンドル切り欠きを含めます。
Rear_Support_Legsがトップアンカートレイから地面平面($Z = Z_{\text{bottom_tray_floor}}$)まで達していることを確認し、展開時にアセンブリが水平に立つようにします。
- 回転ピボットピン/リンケージ穴:
フェーズ 5: クローズドループのビジュアル & 干渉検証
ブラインドスクリプト実行後に結論を出さないでください。ビジュアルと数学的の両方の検証を実行します。
- マルチアングルビジュアル比較(
get_screenshot):fusion-mcpツールget_screenshotを以下の設定で呼び出します。view="iso-top-right"、width=1024、height=1024view="right"、width=1024、height=1024(リンケージバーの位置合わせ、階段状の角度、リアレッグの地面接触を検査するために重要!)view="front"、width=1024、height=1024(Skådisスロットグリッドの対称性と仕切りの比率を検査するために重要!)
- レンダリングされたスクリーンショットを、参照キーフレーム/写真(
keyframe_XX_grid.png/annotated_grid.png)と並べて比較します。
- 自動タイムライン & 干渉検証:
execute_api_scriptを介して検証パスを実行し、ネイティブソリッドジオメトリをアサートし、コンポーネント間の物理的衝突をチェックします。def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() design = adsk.fusion.Design.cast(app.activeProduct) root = design.rootComponent assert root.sketches.count > 0, "No native sketches found!" assert root.features.extrudeFeatures.count > 0, "No extrude features found!" assert root.meshBodies.count == 0, "Forbidden MeshBody objects detected!" # Collect all visible solid bodies across occurrences and root bodies = adsk.core.ObjectCollection.create() for b in root.bRepBodies: if b.isVisible: bodies.add(b) for occ in root.allOccurrences: for b in occ.bRepBodies: if b.isVisible: bodies.add(b) # Check interference between all bodies if bodies.count > 1: interference_result = adsk.fusion.Interference.calculateInterference(bodyList) if interference_result.count > 0: print(f"WARNING: {interference_result.count} interference(s) detected between components!") for i in range(interference_result.count): interference = interference_result.item(i) print(f" - Interference {i+1}: between '{interference.bodyOne.name}' and '{interference.bodyTwo.name}'") else: print("No interferences detected.") print("All checks passed.")
フェーズ 6: 最終レポートとクリーンアップ
すべての検証が完了したら、明確なサマリーをユーザーに提供します。
-
再構築レポートの生成:
- 使用したすべてのメディアパス、確立されたスケールデータム、パラメトリックなFusion 360ユーザーパラメータ、コンポーネント構造BOM、検出された干渉(もしあれば)、そして生成された最終的な3Dビューのスクリーンショットを含む、簡潔な再構築サマリーをエージェントがコンパイルする必要があります。
-
ワークスペースのクリーンアップ:
- すべての作業ファイルは
models/<NN>_<Model_Name>/workspace/の下に保持されます。これらのファイルは、将来の参照や、異なる構成での再実行のために保存されたままにしておく必要があります。 - リポジトリルートまたは
shared/ディレクトリに残っている一時ファイルやスクリプトを削除します。
- すべての作業ファイルは
-
ユーザーへの最終指示
- ユーザーに次のことを通知します。
Deploy_Angle_Deg(展開角度)パラメータを変更することで、機構の折りたたみ状態と展開状態を切り替えることができること。- 3Dプリンティングで必要なクリアランス(例:
0.25 mmラジアルクリアランス)がモデルに適用されていること。 - モデル内のキーパラメータを編集することで、スケールやトレイの数を簡単に調整できること。
models/<NN>_<Model_Name>/workspace/media/の下に、すべての中間メディア処理ファイルが保存されていること。
- ユーザーに次のことを通知します。