3MF / STL → Fusion 360 分析逆工学スキル
.3mf または .stl ファイルをAutodesk Fusion 360にコピー、逆工学、または再作成するよう指示された場合は、次の決定論的分析パイプラインに従ってください。
CAD逆工学の必須要件
[!IMPORTANT] 厳禁: Fusion 360の組み込み「メッシュをBRepに変換」機能(
MeshToBREPまたはbRepBodies.addByMesh)を決して使用しないでください。メッシュ面を直接BRepに変換すると、何万もの三角形平面が生成され、ビューポートがフリーズし、フィレットや面取りができなくなり、下流のCAMや図面が破壊され、パラメトリック設計の意図がすべて失われます。
必須: メッシュを数学的に分析(「スライス&ダイス」)し、その2D断面と幾何学的プリミティブ(スロット、外接穴、ザグリ穴、旋盤加工形状、長方形パターン)を抽出し、Fusion 360のタイムライン上で、スケッチ、駆動ユーザーパラメータ、押し出し、回転、パターンフィーチャを使用して、100%ネイティブなパラメトリックソリッドボディを構築します。
フェーズ0: 事前セーフティゲート(必須)
ファイルを処理する前に、Autodesk Fusion 360とそのMCPサーバーが動作していることを確認します。
-
カナリアプローブ:
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") -
フェイルファスト中断ルール:
- 呼び出しが失敗またはタイムアウトした場合は、直ちに停止します。
- 抽出スクリプトやCADコマンドを実行しないでください。
- ユーザーにFusion 360を開き、アドインが起動していること、およびアクティブなドキュメントが開いていることを確認するよう指示します。
フェーズ1: スライス、ダイス、分類(測定エンジン)
[!IMPORTANT] ワークスペース隔離ルール: 抽出ファイルをメインリポジトリルート(例:
./extracted_cad)に出力してはいけません。必ずmodels/<NN>_<Model_Name>/の下に専用のモデルフォルダが存在することを確認し(新しい場合はscaffold_text_model.py "<Model_Name>"でスキャフォールド)、スライス/ダイス出力はすべてmodels/<NN>_<Model_Name>/workspace/extracted_cadにルーティングします。
-
モデルの隔離されたワークスペースに対して深層計測エンジンを実行します。
python3 <path_to_skills>/3mf-to-fusion/scripts/inspect_3mf.py <path_to_file.3mf_or_stl> --out-dir models/<NN>_<Model_Name>/workspace/extracted_cad -
models/<NN>_<Model_Name>/workspace/extracted_cad/manifest.jsonを読み込みます。 -
各パーツの
archetypeと検出されたフィーチャを確認します。- タイプA: プリズム/段付きCAD: 平面ベース押し出し + ポケットカット + 穴配列。
- タイプT: 旋盤加工/軸対称: Z軸に沿った共線円形スライス。単一の半断面スケッチ + 360°
RevolveFeatureを使用してモデリングします。 - タイプB: 多段エンクロージャ/シェル: 段付き構築平面 + 薄肉押し出し + シェル。
- タイプC: 有機的自由形状彫刻: 高い非平面曲率(15段階超)。直ちにユーザーに警告します。
"このパーツは、不連続な平面もプリズムスケッチも持たない連続的な有機彫刻です。平面スケッチを使用して再構築すると、滑らかな有機的形状ではなく、階段状の近似が生成されます。"
-
ユーザーに要約表を提示します。
パーツID アーキタイプ バウンディングボックス ($X \times Y \times Z$ mm) 段階数 検出された主要プリミティブ/パターン
フェーズ2: 測定の数学とルール
- 単位変換 (
cm = mm / 10.0):- Fusion 360の内部データベース (
adsk.core.ValueInput.createByReal()) はセンチメートル (cm) を厳格に使用します。 - すべてのスクリプトの先頭で定義します。
def mm(val): return adsk.core.ValueInput.createByReal(float(val) / 10.0)
- Fusion 360の内部データベース (
- 外接円補正(コード誤差):
- STLテッセレーションは、円形の穴を内接多角形で近似し、そのエッジが弦に沿って内側に切れ込みます。
- 内部最小直径を決して使用しないでください。常に
manifest.json["primitives"]["circles"]のradius_mm(95パーセンタイル外接半径)を、最も近い $0.05$ mm に丸めて使用します。
- スロット/オブロング認識:
- ループに2本の平行な直線と2つの半円端がある場合、複数セグメントのポリゴンではなく、シードスロット(
sketchLines+sketchArcs)としてモデリングします。
- ループに2本の平行な直線と2つの半円端がある場合、複数セグメントのポリゴンではなく、シードスロット(
- パターン認識(グリッド/極):
manifest.json["patterns"]が規則的なピッチ ($\Delta X, \Delta Y$) を検出した場合、1つのマスターシードカットアウトをモデリングし、comp.features.rectangularPatternFeaturesを使用して複製します。同一の形状を手動で繰り返し描かないでください。
フェーズ3: 純粋パラメトリックFusion 360再構築
execute_api_script を介してCAD生成を実行します。クリーンなタイムラインフィーチャを使用して各パーツを再構築します。
ステップ1: オカレンスとユーザーパラメータ
transform = adsk.core.Matrix3D.create()
occ = root.occurrences.addNewComponent(transform)
comp = occ.component
comp.name = part_name
# 駆動パラメータを追加
params = design.userParameters
params.add(f"{part_name}_width", mm(width_mm), "mm", "Base width")
params.add(f"{part_name}_length", mm(length_mm), "mm", "Base length")
params.add(f"{part_name}_height", mm(height_mm), "mm", "Base height")
ステップ2: プライマリソリッド形状
- タイプT(旋盤加工)の場合:
comp.xZConstructionPlane上に半断面スケッチを描き、comp.features.revolveFeatures.add(prof, comp.zConstructionAxis, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)を呼び出します。 - タイプA/B(プリズム)の場合:
comp.xYConstructionPlane上にベースアウトラインスケッチを描き(原点中心)、ベースソリッドを押し出します。
ステップ3: 二次カットアウトとパターン
- マスターシードカットアウト(スロット、ザグリ穴、ポケット)を描きます。
comp.features.extrudeFeatures.addをadsk.fusion.FeatureOperations.CutFeatureOperationと共に適用します。comp.features.rectangularPatternFeatures.addをcomp.xConstructionAxisとcomp.yConstructionAxisにわたって適用します。
ステップ4: 仕上げ
- コーナーフィレット (
comp.features.filletFeatures) と面取り (comp.features.chamferFeatures) を適用します。
フェーズ4: リファレンスゴーストオーバーレイとCAD内検査
最終モデルを汚染せずに数学的および寸法的一致を検証するには:
- ゴーストリファレンスメッシュ(オプション):
詳細な視覚的アライメントが必要な場合は、生メッシュを一時的なリファレンスオカレンスにインポートします。
# Import mesh as reference backdrop ref_occ = root.occurrences.addNewComponent(transform) ref_occ.component.name = "Reference_Mesh_Ghost" # Set transparent visual style - 視覚および干渉検査:
- パラメトリックソリッドがメッシュエンベロープを完全に包含し、位置合わせされていることを確認します。
- 確認後、
ref_occを非表示にするか削除します。
フェーズ5: タイムラインヘルスと視覚的自己検証ゲート
- タイムラインフィーチャ検証:
再構築されたパーツにメッシュボディが存在しないことを確認します。
assert comp.bRepBodies.count > 0, "No solid bodies produced!" assert comp.meshBodies.count == 0, "Forbidden MeshBody detected in component!" assert comp.sketches.count > 0, "No sketches found in timeline!" - 視覚検査:
get_screenshot(view="iso-top-right", width=1024, height=1024)を呼び出して、クリーンなパラメトリックソリッドモデルとクリーンなタイムラインツリーを視覚的に確認します。