Compétence de Reconstruction d'Objet à partir de Média (Image / Vidéo / Pack de Références) vers Fusion 360
Lorsque l'utilisateur fournit une photo, un dossier de références multi-angles ou une vidéo (.mp4, .mov, .png, .jpg, .webp) et demande de recréer l'objet dans Autodesk Fusion 360, suivez ce flux de travail d'ingénierie déterministe en 6 phases.
ORDRE STRICT EN CAO :
- Ne jamais passer directement à l'écriture d'extrusions Fusion MCP sans avoir exécuté
process_media.py, établi un datum d'échelle en millimètres dans le monde réel et rédigé une nomenclature cinématique (BOM). - Chaque composant doit être reconstruit en utilisant des Esquisses, Plans de Construction, Lignes/Arcs/Cercles d'Esquisse, Paramètres Utilisateur et Fonctions d'Extrusion/Congé/Assemblage natifs dans la chronologie de Fusion 360. Ne jamais générer de corps maillés bruts (
root.meshBodies.add).
Phase 0 : Porte de Sécurité de Pré-Vol et Environnement Monorepo (Obligatoire)
Avant de créer la géométrie CAO dans Fusion 360, alignez votre espace de travail et vérifiez la connectivité MCP en direct :
-
Alignement du Monorepo CAO :
- Espace de travail principal : Monorepo CAO actif ou racine du projet (par exemple,
CAD_MONOREPO_ROOTou l'espace de travail actuel). - Garantie d'Isolation Stricte : Ne créez jamais de fichiers temporaires, de scripts ou de rendus dans la racine du dépôt et ne modifiez pas
shared/. - Stockez les nouveaux modèles sous
models/<NN>_<Nom_Modèle>/(par exemplemodels/02_Rangement_Bureau_Modulaire/). Si vous commencez un nouveau modèle, créez la structure avecscaffold_text_model.py "<Nom_Modèle>". - Importez les aides CAO universelles depuis
shared/(fusion_client,cad_primitives,hardware_library,scene_animator). - Lisez la mémoire de référence du domaine avant d'écrire les scripts :
references/kinematic-archetypes.md(équations de mécanismes vérifiées)references/fdm-hardware-tolerances.md(jeux d'impression et avant-trous pour fixations)references/fusion-api-gotchas.md(animations à haute vitesse et corrections API)
- Espace de travail principal : Monorepo CAO actif ou racine du projet (par exemple,
-
Sonde de Vérification : Appelez l'outil
fusion-mcpexecute_api_scriptavec :def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app: raise RuntimeError("Instance de l'application Autodesk Fusion 360 introuvable.") design = adsk.fusion.Design.cast(app.activeProduct) if not design: raise RuntimeError("Aucun document de conception Fusion 360 actif ouvert.") print("FUSION_MCP_READY") -
Règle d'Échec Rapide :
- Vous pouvez exécuter les phases 1 à 3 de métrologie des médias alors que Fusion 360 est fermé, mais si
FUSION_MCP_READYéchoue avant la phase 4, ARRÊTEZ avant d'envoyer des scripts de construction CAO et demandez à l'utilisateur d'ouvrir Fusion 360 avec un document de conception actif.
- Vous pouvez exécuter les phases 1 à 3 de métrologie des médias alors que Fusion 360 est fermé, mais si
Phase 1 : Ingestion des Médias et Extraction d'Images Clés / Contours
[!IMPORTANT] Règle d'Isolation de l'Espace de Travail: Ne placez jamais les fichiers de traitement des médias dans la racine du dépôt principal (par exemple,
./media_workspaceest interdit). Assurez-vous toujours qu'un dossier de modèle dédié existe sousmodels/<NN>_<Nom_Modèle>/et acheminez tout le traitement des médias dansmodels/<NN>_<Nom_Modèle>/workspace/media.
- Exécutez le moteur de prétraitement et de métrologie sur l'image, la vidéo ou le répertoire d'entrée dans l'espace de travail isolé du modèle :
python3 <chemin_vers_skills>/media-to-fusion/scripts/process_media.py "<chemin_du_média_ou_dossier>" --out-dir models/<NN>_<Nom_Modèle>/workspace/media - Inspectez
models/<NN>_<Nom_Modèle>/workspace/media/media_manifest.jsonet visualisez les artefacts visuels générés avecread_file:- Pour les Dossiers de Références : Visualisez d'abord
dataset_overview.png, puis inspectez les sous-espaces de travail individuels (models/<NN>_<Nom_Modèle>/workspace/media/<slug>/). - Pour les Vidéos : Visualisez
contact_sheet.pnget les fichierskeyframe_XX_grid.pngindividuels (automatiquement filtrés pour rejeter les fondus au noir, le flou de mouvement et les passages de main tout en capturant les états cinématiques repliés, intermédiaires et déployés). - Pour les Images : Visualisez
annotated_grid.png(grille de repère de pixels à double contraste : majeure de 100px / mineure de 50px) etcontours_preview.png(contours Canny détectés + centroïdes de fentes/trous et pas de pixels médian sur la même ligne). - Vérification en Écran Partagé : Vérifiez
viewport_layout.is_splitdansmedia_manifest.json(par exemple, vues orthographiques Frontale et Droite côte à côte dans une seule image) afin que les étendues en pixels soient mesurées indépendamment dans chaque sous-zone d'affichage.
- Pour les Dossiers de Références : Visualisez d'abord
Phase 2 : Calibration Multi-Niveaux de l'Échelle (Trouver le "Datum d'Or")
Avant de modéliser quoi que ce soit, établissez l'échelle en millimètres du monde réel (mm_per_px) en utilisant cette hiérarchie de priorité stricte :
- Priorité 1 — Cotations Dimensionnelles Explicites ou Contraintes de Plateau d'Impression dans le Média :
- Vérifiez les images de référence pour la présence de cotations dimensionnelles (par exemple, largeur totale
35 cm / 350 mm, hauteur63 cm / 630 mm, profondeur32 cm / 320 mm, ou cotations de bacs intérieurs comme330 x 100 x 70 mm). - Vérifiez la présence de cotations de plateau d'impression 3D (par exemple,
"POUR IMPRIMANTES 220 x 220 mm"$ ightarrow$ la largeur/longueur maximale d'une pièce monobloc est généralement de200–210 mm).
- Vérifiez les images de référence pour la présence de cotations dimensionnelles (par exemple, largeur totale
- Priorité 2 — Écosystème Standard et Éléments Matériels Visibles dans le Cadre :
- Motif de Panneau Perforé IKEA Skådis :
- Pas horizontal entre fentes d'une même rangée (centre à centre) :
40.0 mm - Pas vertical entre rangées :
20.0 mm(les rangées alternées sont décalées horizontalement de20.0 mm) - Dimensions de la fente :
5.0 mmde large $ imes$15.0 mmde haut (fente stade/oblongue : entraxe vertical droit de10.0 mmavecR = 2.5 mmaux extrémités arrondies) - Épaisseur standard du panneau :
5.0 mm(3.2 mm – 4.0 mmpour les panneaux perforés modulaires imprimés en 3D)
- Pas horizontal entre fentes d'une même rangée (centre à centre) :
- Électronique et Matériel Mécanique :
- Découpe pour interrupteur MX de clavier mécanique :
14.0 x 14.0 mm(pas d'une touche 1u =19.05 mm) - Largeur standard d'un smartphone (par exemple, lorsqu'il repose sur un support) :
~71.5 mm - Ouverture pour réceptacle USB-C :
8.94 x 3.26 mm - Fixations : diamètre de tête vis à métaux M3 =
5.5 mm(trou de passage =3.2–3.4 mm), tête M4 =7.0 mm
- Découpe pour interrupteur MX de clavier mécanique :
- Motif de Panneau Perforé IKEA Skådis :
- Priorité 3 — Référence Ergonomique / Main :
- Si des mains humaines tiennent la pièce et qu'aucun datum matériel n'existe, utilisez la largeur moyenne du pouce d'un adulte (
~20.0 mm) ou la largeur de la paume (~85.0 mm), et exposez la largeur totale en tant que paramètre utilisateur maître dans Fusion (Tray_Width) afin que l'utilisateur puisse remettre à l'échelle en un clic.
- Si des mains humaines tiennent la pièce et qu'aucun datum matériel n'existe, utilisez la largeur moyenne du pouce d'un adulte (
Phase 3 : Décomposition Cinématique et Structurelle (BOM)
Décomposez l'assemblage en une Nomenclature de Composants (BOM) structurée avant d'écrire un script Fusion MCP :
- Classifiez les Composants Fixes vs. Mobiles :
- Composants de Base / Cadre Fixes : par exemple,
Top_Anchor_Tray,Rear_Support_Legs(s'étendant jusqu'au plan de sol $Z = 0$), etBackboard_Pegboard_Panels. - Composants Entraînés / Coupleurs : par exemple,
Stepped_Trays(Niveaux 2..N), tiroirs coulissants ou portes tournantes. - Composants de Liaison / Contrainte : par exemple,
Parallel_Link_Bars,Side_Joiner_Clips(clips en H joignant les moitiés de panneaux perforés séparés),Pivot_Pins. - Accessoires / Inserts Modulaires : par exemple,
Divider_Sub_Trays(largeurs $1/3$, $1/2$ ou $1/1$ avec 1 à 3 compartiments),Skadis_Hooks.
- Composants de Base / Cadre Fixes : par exemple,
- Appliquez les Lois Cinématiques sur le Bruit de la Perspective :
- Loi du Parallélogramme Multi-Broches Échelonnées Coplanaires (Barres Monocouches Non-Chevauchantes) :
Avant de modéliser une liaison, comptez le nombre exact de barres et de broches par barre dans les vues orthographiques/de perspective latérale :
- Ne supposez jamais que les barres de liaison partagent des broches bout à bout dans des couches latérales qui se chevauchent si la référence montre des barres coplanaires parallèles et non-chevauchement (par exemple, 4 barres parallèles disposées en échelon :
Barre 1= barre courte à 2 broches,Barre 2= barre longue à 3 broches,Barre 3= barre longue à 3 broches,Barre 4= barre courte à 2 broches). - Dans une liaison échelonnée coplanaire à $N$ niveaux, chaque bac $t \in {0, \dots, N-1}$ a des stations de broches horizontales $s \in {0, 1, 2}$ espacées de
Pin_Station_Pitch$\Delta y_{\text{station}}$ le long de la profondeur du bac (Station Aavant,Station Bmilieu,Station Carrière), et chaque barre relie (Bac $t$, Station $s$) $\longrightarrow$ (Bac $t+1$, Station $s+1$) avec un pas de trou de niveau unique $L_{\text{step}} = \sqrt{\Delta y_{\text{station}}^2 + \Delta Z_{\text{replié}}^2}$ :Barre 1 (2 broches, longueur L_step):(Bac 0, Station B) -> (Bac 1, Station C)Barre 2 (3 broches, longueur 2*L_step):(Bac 0, Station A) -> (Bac 1, Station B) -> (Bac 2, Station C)Barre 3 (3 broches, longueur 2*L_step):(Bac 1, Station A) -> (Bac 2, Station B) -> (Bac 3, Station C)Barre 4 (2 broches, longueur L_step):(Bac 2, Station A) -> (Bac 3, Station B)
- Pour un angle de barre $\theta$ par rapport à la verticale, la translation bac-à-bac est :
$$\Delta Y_{\text{bac}}(\theta) = -L_{\text{step}}\sin(\theta) - \Delta y_{\text{station}}, \qquad \Delta Z_{\text{bac}}(\theta) = -L_{\text{step}}\cos(\theta)$$
- Dans l'État Replié ($\theta_{\text{col}} = -\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$), $\Delta Y_{\text{bac}} = + \Delta y_{\text{station}} - \Delta y_{\text{station}} = 0\text{ mm}$ (les bacs s'empilent 100% verticalement tandis que les barres sont à $-\theta_{\text{col}}$, et les parois arrière des bacs sont affleurantes contre l'avant des pieds de support arrière).
- Dans l'État Ouvert ($\theta_{\text{open}} = +\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$), les mêmes barres pivotent à travers la verticale jusqu'à $+\theta_{\text{open}}$, avançant chaque bac de $\Delta Y_{\text{bac}} = -2 \Delta y_{\text{station}}$ tout en maintenant les 4 barres dans une seule couche coplanaire avec zéro broche partagée !
- Ne supposez jamais que les barres de liaison partagent des broches bout à bout dans des couches latérales qui se chevauchent si la référence montre des barres coplanaires parallèles et non-chevauchement (par exemple, 4 barres parallèles disposées en échelon :
- Loi du Parallélogramme Multi-Broches Échelonnées Coplanaires (Barres Monocouches Non-Chevauchantes) :
Avant de modéliser une liaison, comptez le nombre exact de barres et de broches par barre dans les vues orthographiques/de perspective latérale :
- Règle de Modularité du Plateau d'Impression :
- Si un panneau plat (comme un panneau arrière Skådis de grande hauteur) dépasse la hauteur du plateau d'impression cible (par exemple
> 210 mm), divisez-le horizontalement enUpper_PaneletLower_Panelet générez des clips de jonction en profilé H latéraux correspondants (jeu de coulissement0.20 mm).
- Si un panneau plat (comme un panneau arrière Skådis de grande hauteur) dépasse la hauteur du plateau d'impression cible (par exemple
- Redressement Optionnel par Homographie de Perspective (
--rectify) :- Pour des photos inclinées de plaques à motifs plats ou de silhouettes 2D complexes, exécutez :
~/.gemini/antigravity/skills/media-to-fusion/scripts/process_media.py "<chemin_image>" \ --out-dir ./media_workspace \ --rectify "x1,y1,x2,y2,x3,y3,x4,y4" \ --real-w <largeur_mm> --real-h <hauteur_mm> process_media.pytrie automatiquement les 4 coins dans le sens horaire (TG, TD, BD, BG), redresse le plan versrectified_ortho.pngà0.1 mm/px, exporterectified_contour.dxf, et enregistre les boucles de polygones fermés simplifiés (points_xy_mm) dansmedia_manifest.json.
- Pour des photos inclinées de plaques à motifs plats ou de silhouettes 2D complexes, exécutez :
Phase 4 : Modélisation Paramétrique via Fusion 360 MCP
Construisez l'assemblage CAO proprement dans Fusion 360 via execute_api_script :
- Conversion Obligatoire en Centimètres (
cm = mm / 10.0) :- L'API interne de Fusion 360 (
adsk.core.ValueInput.createByReal(),adsk.core.Point3D.create()) utilise strictement les centimètres (cm). - Définissez toujours
def cm(val_mm): return val_mm / 10.0en haut de chaqueexecute_api_script.
- L'API interne de Fusion 360 (
- Enregistrez les Paramètres Utilisateur Maîtres (
design.userParameters) : Créez d'abord des paramètres millimétriques/degrés modifiables afin que l'utilisateur puisse reconfigurer l'échelle, le nombre de niveaux ou l'état de pliage à tout moment :Paramètres recommandés pour les assemblages pliables/modulaires :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(défaut2.4 mm)Link_Step_Pitch,Link_Width,Link_Thickness(défaut3.5 mm)Deploy_Angle_Deg(par exemple,40 degpour l'état Ouvert/Déployé,0 degpour la pile verticale Repliée)Clearance(défaut0.25 mm)
- Jeux Mécaniques pour l'Impression 3D :
- Broches de pivot tournantes / trous de liaison : Jeu radial de
0.25 mm(0.50 mmdiamétral), avec une lèvre de0.8 mmou un alésage pour fixation M3 afin que les liaisons restent retenues. - Clips de jonction coulissants / inserts amovibles de séparation : Jeu de
0.20 mmde chaque côté (0.40 mmde déduction totale en largeur/profondeur sur les bacs d'insertion). - Ergonomie du Bac Inférieur et Pieds de Support Arrière :
- Incluez des découpes de poignée latérale oblongues arrondies sur le bac le plus bas si elles sont visibles dans le média de référence.
- Assurez-vous que
Rear_Support_Legss'étendent du bac d'ancrage supérieur jusqu'au plan de sol ($Z = Z_{\text{sol_bac_inférieur}}$) afin que l'assemblage repose à niveau lorsqu'il est déployé.
- Broches de pivot tournantes / trous de liaison : Jeu radial de
Phase 5 : Vérification Visuelle et d'Interférence en Boucle Fermée
Ne concluez jamais après une exécution aveugle de script. Effectuez à la fois une vérification visuelle et mathématique :
- Comparaison Visuelle Multi-Angles (
get_screenshot) :- Appelez l'outil
fusion-mcpget_screenshotavec :view="iso-top-right", width=1024, height=1024view="right", width=1024, height=1024(crucial pour inspecter l'alignement des barres de liaison, l'angle en marche d'escalier et le contact au sol des pieds arrière !)view="front", width=1024, height=1024(crucial pour inspecter la symétrie de la grille de fentes Skådis et les proportions des séparateurs !)
- Comparez les captures d'écran rendues côte à côte avec les images clés/ photos de référence (
keyframe_XX_grid.png/annotated_grid.png).
- Appelez l'outil
- Vérification Automatisée de la Chronologie et des Interférences :
Exécutez un passage de vérification via
execute_api_scriptpour affirmer la géométrie solide native et rechercher les collisions physiques entre les composants :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, "Aucune esquisse native trouvée !" assert root.features.extrudeFeatures.count > 0, "Aucune fonction d'extrusion trouvée !" assert root.meshBodies.count == 0, "Objets MeshBody interdits détectés !" # Collecter tous les corps solides visibles dans les occurrences et la racine 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) if bodies.count > 1: results = design.analyzeInterference(bodies) if results and results.count > 0: for i in range(results.count): inter = results.item(i) interference_volume = inter.interferenceVolume if interference_volume > 0.001: print(f"INTERFERENCE: Volume={interference_volume:.4f} cm^3 between bodies {inter.entityOne.name} and {inter.entityTwo.name}") print("INTERFERENCE_CHECK_PASSED") # Acknowledge detected interference else: print("INTERFERENCE_CHECK_CLEAR: No interference detected.") else: print("INTERFERENCE_CHECK_SKIP: Less than 2 bodies; skipping interference.") print("VERIFICATION_PASSED")
Phase 6 : Finalisation, Validation des Fichiers et Rapport
- Format de Fichier et Orientation d'Impression :
- Assurez-vous que les fichiers
.f3det.stlsont exportés via le flux de travail de conception de Fusion 360 (ou viafusion-mcpexport_component). - Rapport d'Orientation d'Impression : Fournissez une note textuelle dans votre réponse finale, par exemple :
- "Ce modèle s'imprime mieux avec les faces du plateau d'impression orientées vers le bas pour minimiser les porte-à-faux sur les liaisons."
- "Les barres doivent être imprimées debout pour que les trous de broches soient parfaitement ronds."
- Assurez-vous que les fichiers
- Récapitulatif de la Nomenclature :
- Résumez la nomenclature (BOM) finale dans votre réponse :
(1x) Top_Anchor_Tray(4x) Parallel_Link_Bars(2x barres à 2 broches, 2x barres à 3 broches)(1x) Kit de broches de pivot(8 pièces)(2x) Rear_Support_Legs(1x) Stepped_Tray_1
- Résumez la nomenclature (BOM) finale dans votre réponse :
- Propriétés du Modèle Final :
- Dimensions physiques (par exemple "185 mm de large × 140 mm de profondeur × 260 mm de haut").
- État déployé ou état de pliage par défaut.
- Jeux d'impression résumés (par exemple "Trous de broche avec jeu de 0,25 mm, inserts avec jeu de 0,20 mm de chaque côté").