Communitygithub.com

media-to-fusion

Convertit des images, des séries de photos multi-angles, des dessins techniques ou des vidéos d'objets mécaniques/physiques en modèles CAO 3D paramétriques fonctionnels et assemblages dans Fusion 360 via la métrologie par vision par ordinateur, la synthèse cinématique et le serveur MCP Fusion 360.

Qu'est-ce que media-to-fusion ?

Cette compétence permet à un agent d'IA de reconstruire des objets physiques en modèles CAO 3D entièrement paramétriques dans Autodesk Fusion 360 à partir de photos, vidéos ou séries de références. Elle suit un workflow rigoureux en six phases : ingestion des médias et extraction de contours, calibration multi-niveaux de l'échelle (en utilisant des repères de l'écosystème standard comme les motifs de panneaux perforés IKEA Skådis ou les dimensions de matériel électronique), décomposition cinématique en nomenclature de composants, modélisation paramétrique via le serveur MCP Fusion 360, vérification visuelle et d'interférence en boucle fermée, et exportation des fichiers de fabrication. La compétence insiste sur l'utilisation exclusive de fonctions CAO natives (esquisses, plans de construction, paramètres utilisateur, extrusions) et interdit strictement l'utilisation de corps maillés bruts. Elle est conçue pour fonctionner avec Claude Code, nécessite un monorepo CAO structuré et le serveur Fusion 360 MCP, et intègre des règles de modularité pour l'impression 3D (découpage de panneaux, jeux mécaniques).

Compatible avec~Claude Code~Codex CLI~Cursor✓Antigravity✓Gemini CLI
npx skills add https://github.com/Kamish76/To-Fusion-Skill-Sets/tree/HEAD/skills/media-to-fusion

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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 :

  1. Alignement du Monorepo CAO :

    • Espace de travail principal : Monorepo CAO actif ou racine du projet (par exemple, CAD_MONOREPO_ROOT ou 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 exemple models/02_Rangement_Bureau_Modulaire/). Si vous commencez un nouveau modèle, créez la structure avec scaffold_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)
  2. Sonde de Vérification : Appelez l'outil fusion-mcp execute_api_script avec :

    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")
    
  3. 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.

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_workspace est interdit). Assurez-vous toujours qu'un dossier de modèle dédié existe sous models/<NN>_<Nom_Modèle>/ et acheminez tout le traitement des médias dans models/<NN>_<Nom_Modèle>/workspace/media.

  1. 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
    
  2. Inspectez models/<NN>_<Nom_Modèle>/workspace/media/media_manifest.json et visualisez les artefacts visuels générés avec read_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.png et les fichiers keyframe_XX_grid.png individuels (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) et contours_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_split dans media_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.

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 :

  1. 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, hauteur 63 cm / 630 mm, profondeur 32 cm / 320 mm, ou cotations de bacs intérieurs comme 330 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 de 200–210 mm).
  2. 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 de 20.0 mm)
      • Dimensions de la fente : 5.0 mm de large $ imes$ 15.0 mm de haut (fente stade/oblongue : entraxe vertical droit de 10.0 mm avec R = 2.5 mm aux extrémités arrondies)
      • Épaisseur standard du panneau : 5.0 mm (3.2 mm – 4.0 mm pour les panneaux perforés modulaires imprimés en 3D)
    • É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
  3. 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.

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 :

  1. 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$), et Backboard_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.
  2. 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 A avant, Station B milieu, Station C arriè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 !
  3. 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 en Upper_Panel et Lower_Panel et générez des clips de jonction en profilé H latéraux correspondants (jeu de coulissement 0.20 mm).
  4. 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.py trie automatiquement les 4 coins dans le sens horaire (TG, TD, BD, BG), redresse le plan vers rectified_ortho.png à 0.1 mm/px, exporte rectified_contour.dxf, et enregistre les boucles de polygones fermés simplifiés (points_xy_mm) dans media_manifest.json.

Phase 4 : Modélisation Paramétrique via Fusion 360 MCP

Construisez l'assemblage CAO proprement dans Fusion 360 via execute_api_script :

  1. 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.0 en haut de chaque execute_api_script.
  2. 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 :
    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
        )
    
    Paramètres recommandés pour les assemblages pliables/modulaires :
    • Tray_Width, Tray_Depth, Tray_Height, Wall_Thickness (défaut 2.4 mm)
    • Link_Step_Pitch, Link_Width, Link_Thickness (défaut 3.5 mm)
    • Deploy_Angle_Deg (par exemple, 40 deg pour l'état Ouvert/Déployé, 0 deg pour la pile verticale Repliée)
    • Clearance (défaut 0.25 mm)
  3. Jeux Mécaniques pour l'Impression 3D :
    • Broches de pivot tournantes / trous de liaison : Jeu radial de 0.25 mm (0.50 mm diamétral), avec une lèvre de 0.8 mm ou 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 mm de chaque côté (0.40 mm de 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_Legs s'é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é.

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 :

  1. Comparaison Visuelle Multi-Angles (get_screenshot) :
    • Appelez l'outil fusion-mcp get_screenshot avec :
      • view="iso-top-right", width=1024, height=1024
      • view="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).
  2. Vérification Automatisée de la Chronologie et des Interférences : Exécutez un passage de vérification via execute_api_script pour 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

  1. Format de Fichier et Orientation d'Impression :
    • Assurez-vous que les fichiers .f3d et .stl sont exportés via le flux de travail de conception de Fusion 360 (ou via fusion-mcp export_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."
  2. 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
  3. 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é").

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés