Communitygithub.com

media-to-fusion

Converte imagens, conjuntos de fotos multiângulo, desenhos técnicos ou vídeos de objetos mecânicos/físicos em modelos CAD 3D paramétricos e montagens funcionais no Fusion 360, utilizando metrologia por visão computacional, síntese cinemática e o servidor MCP do Fusion 360.

O que é media-to-fusion?

Esta skill (media-to-fusion) capacita agentes de IA a transformar mídia visual (fotos, vídeos, pastas de referência) em modelos CAD 3D paramétricos totalmente funcionais no Autodesk Fusion 360. Ela impõe um fluxo de trabalho de engenharia determinístico em 6 fases, começando com a ingestão de mídia e extração de contornos, seguido por uma calibração de escala rigorosa por meio de referências visuais conhecidas (como padrões IKEA Skådis, hardware eletrônico ou dimensões de mãos humanas). Em vez de gerar malhas poligonais brutas, a skill decompõe a montagem em uma Lista de Materiais (BOM) cinemática, distinguindo componentes fixos, acionados e de ligação, e aplica leis físicas como a Lei do Paralelogramo de Pinos Múltiplos para garantir o comportamento articulado correto. A modelagem utiliza exclusivamente recursos CAD nativos do Fusion 360 (sketches, planos de construção, parâmetros de usuário, extrusões) por meio de seu servidor MCP, convertendo automaticamente milímetros para centímetros (exigido pela API interna). Após a construção, a skill executa uma verificação visual comparando capturas de tela multiângulo com as imagens de referência e uma verificação automatizada de interferências e integridade do timeline, rejeitando qualquer resultado que contenha corpos de malha. Ela foi projetada para cenários como a reconstrução de organizadores de mesa modulares a partir de vídeos, a engenharia reversa de suportes para smartphones a partir de fotos ou a conversão de esboços de hardware existentes em montagens CAD totalmente paramétricas e ajustáveis pelo usuário no Fusion 360.

Funciona com~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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Habilidade de Reconstrução de Mídia (Imagem / Vídeo / Pacote de Referência) para Fusion 360

Quando o usuário fornecer uma foto, uma pasta de referência multiângulo ou um vídeo (.mp4, .mov, .png, .jpg, .webp) e pedir para recriar o objeto no Autodesk Fusion 360, siga este fluxo de trabalho de engenharia determinístico de 6 fases.

MANDAMENTO CAD ESTRITO:

  • Nunca pule diretamente para a escrita de extrusões MCP do Fusion sem executar process_media.py, estabelecer um datum de escala em milímetros do mundo real e escrever uma Lista de Materiais (BOM) Cinemática.
  • Cada componente deve ser reconstruído usando Sketches nativos, Planos de Construção, Linhas/Arcos/Círculos de Sketch, Parâmetros de Usuário e Recursos de Extrusão/Filete/Junta na linha do tempo do Fusion 360. Nunca gere corpos de malha brutos (root.meshBodies.add).

Fase 0: Portão de Segurança Pré-Voo e Ambiente Monorepo (Obrigatório)

Antes de criar geometria CAD no Fusion 360, alinhe seu espaço de trabalho e verifique a conectividade MCP ao vivo:

  1. Alinhamento do Monorepo CAD:

    • Espaço de trabalho principal: Monorepo CAD ativo ou raiz do projeto (por exemplo, CAD_MONOREPO_ROOT ou espaço de trabalho atual).
    • Garantia de Isolamento Estrito: Nunca crie arquivos temporários, scripts ou renders na raiz do repositório nem mude shared/.
    • Armazene novos modelos em models/<NN>_<Model_Name>/ (ex: models/02_Modular_Desk_Organizer/). Se estiver iniciando um novo modelo, crie o esqueleto com scaffold_text_model.py "<Model_Name>".
    • Importe ajudantes CAD universais de shared/ (fusion_client, cad_primitives, hardware_library, scene_animator).
    • Leia a memória de referência de domínio antes de escrever scripts:
      • references/kinematic-archetypes.md (equações de mecanismos verificadas)
      • references/fdm-hardware-tolerances.md (folgas de impressão e rebaixos para fixadores)
      • references/fusion-api-gotchas.md (animação de alta velocidade e correções de API)
  2. Sonda Canário: Chame a ferramenta fusion-mcp execute_api_script com:

    def run(context):
        import adsk.core, adsk.fusion
        app = adsk.core.Application.get()
        if not app:
            raise RuntimeError("Instância do aplicativo Autodesk Fusion 360 não encontrada.")
        design = adsk.fusion.Design.cast(app.activeProduct)
        if not design:
            raise RuntimeError("Nenhum documento de design ativo do Fusion 360 aberto.")
        print("FUSION_MCP_READY")
    
  3. Regra de Falha Rápida:

    • Você pode executar as Fases 1-3 de metrologia de mídia enquanto o Fusion 360 está fechado, mas se FUSION_MCP_READY falhar antes da Fase 4, PARE antes de enviar scripts de construção CAD e instrua o usuário a abrir o Fusion 360 com um documento de design ativo.

Fase 1: Ingestão de Mídia e Extração de Keyframe / Contorno

[!IMPORTANT] Regra de Isolamento do Espaço de Trabalho: Nunca gere arquivos de processamento de mídia na raiz principal do repositório (por exemplo, ./media_workspace é proibido). Sempre garanta que exista uma pasta de modelo dedicada em models/<NN>_<Model_Name>/ e direcione todo o processamento de mídia para models/<NN>_<Model_Name>/workspace/media.

  1. Execute o motor de pré-processamento e metrologia na imagem, vídeo ou diretório de entrada no espaço de trabalho isolado do modelo:
    python3 <caminho_para_skills>/media-to-fusion/scripts/process_media.py "<caminho_da_mídia_ou_pasta>" --out-dir models/<NN>_<Model_Name>/workspace/media
    
  2. Inspecione models/<NN>_<Model_Name>/workspace/media/media_manifest.json e visualize os artefatos visuais gerados com read_file:
    • Para Pastas de Referência: Veja dataset_overview.png primeiro, depois inspecione sub-espaços de trabalho individuais (models/<NN>_<Model_Name>/workspace/media/<slug>/).
    • Para Vídeos: Veja contact_sheet.png e arquivos individuais keyframe_XX_grid.png (filtrados automaticamente para rejeitar fade-ins pretos, desfoque de movimento e passagens de mão, capturando estados cinemáticos colapsados, intermediários e implantados).
    • Para Imagens: Veja annotated_grid.png (grade de régua de pixels de contraste duplo: 100px maior / 50px menor) e contours_preview.png (contornos Canny detectados + centroides de furos/ranhuras e passo mediano de pixels na mesma linha).
    • Verificação de Tela Dividida: Verifique viewport_layout.is_split em media_manifest.json (por exemplo, vistas ortográficas Frontal e Direita lado a lado em uma única imagem) para que as extensões de pixel sejam medidas dentro de cada sub-viewport independentemente.

Fase 2: Calibração de Escala em Múltiplos Níveis (Encontrando o "Datum Áureo")

Antes de modelar qualquer coisa, estabeleça a escala em milímetros do mundo real (mm_per_px) usando esta hierarquia de prioridades estrita:

  1. Prioridade 1 — Indicações de Dimensão Explícitas ou Restrições de Base de Impressão na Mídia:
    • Verifique as imagens de referência em busca de setas de indicação de dimensão (por exemplo, largura total 35 cm / 350 mm, altura 63 cm / 630 mm, profundidade 32 cm / 320 mm ou indicações de bandeja interna como 330 x 100 x 70 mm).
    • Verifique as indicações de base de impressão 3D (por exemplo, "PARA IMPRESSORAS 220 x 220 mm" → largura/comprimento máximo de peça única é tipicamente 200–210 mm).
  2. Prioridade 2 — Ecossistema Padrão e Características de Hardware Visíveis no Quadro:
    • Padrão de Painel Pegboard IKEA Skådis:
      • Passo horizontal de ranhuras na mesma linha (centro a centro): 40,0 mm
      • Passo vertical linha a linha: 20,0 mm (linhas alternadas deslocadas horizontalmente em 20,0 mm)
      • Dimensões da ranhura: 5,0 mm de largura × 15,0 mm de altura (ranhura estadual/oblonga: 10,0 mm de centro a centro vertical reto com R = 2,5 mm de extremidades totalmente arredondadas)
      • Espessura padrão da placa: 5,0 mm (3,2 mm – 4,0 mm em painéis pegboard modulares impressos em 3D)
    • Eletrônicos e Hardware Mecânico:
      • Recorte de switch MX de teclado mecânico: 14,0 x 14,0 mm (passo de tecla 1u = 19,05 mm)
      • Largura padrão de smartphone (por exemplo, quando mostrado apoiado em um suporte): ~71,5 mm
      • Abertura do receptáculo USB-C: 8,94 x 3,26 mm
      • Fixadores: diâmetro da cabeça do parafuso M3 = 5,5 mm (furo de folga = 3,2–3,4 mm), cabeça M4 = 7,0 mm
  3. Prioridade 3 — Referência Ergonômica / Mão:
    • Se mãos humanas seguram a peça e não existe datum de hardware, use a largura média do polegar adulto (~20,0 mm) ou a largura da palma (~85,0 mm), e exponha a largura total como um Parâmetro de Usuário mestre do Fusion (Tray_Width) para que o usuário possa redimensionar com um clique.

Fase 3: Decomposição Cinemática e Estrutural (BOM)

Decomponha a montagem em uma Lista de Materiais (BOM) de Componentes estruturada antes de escrever qualquer script MCP do Fusion:

  1. Classifique Componentes Fixos vs. Móveis:
    • Componentes de Base / Estrutura Fixos: por exemplo, Top_Anchor_Tray, Rear_Support_Legs (estendendo-se até o plano do solo $Z = 0$) e Backboard_Pegboard_Panels.
    • Componentes Acionados / Acopladores: por exemplo, Stepped_Trays (Nível 2..N), gavetas deslizantes ou portas giratórias.
    • Componentes de Ligação / Restrição: por exemplo, Parallel_Link_Bars, Side_Joiner_Clips (clipes H unindo metades de pegboard divididas), Pivot_Pins.
    • Inserções Modulares / Acessórios: por exemplo, Divider_Sub_Trays (largura $1/3$, $1/2$ ou $1/1$ com 1–3 compartimentos), Skadis_Hooks.
  2. Aplique Leis Cinemáticas sobre Ruído de Pixel de Perspectiva:
    • Lei do Paralelogramo de Pinos Múltiplos em Escalonamento Coplanar (Barras de Camada Única Não Sobrepostas): Antes de modelar qualquer ligação, conte o número exato de barras e pinos por barra nas vistas ortográficas/de perspectiva lateral:
      • Nunca presuma que barras de ligação compartilham pinos ponta a ponta em camadas laterais sobrepostas se a referência mostra barras coplanares paralelas e não sobrepostas (por exemplo, 4 barras paralelas organizadas em escalonamento: Barra 1 = barra curta de 2 pinos, Barra 2 = barra longa de 3 pinos, Barra 3 = barra longa de 3 pinos, Barra 4 = barra curta de 2 pinos).
      • Em uma ligação coplanar escalonada de $N$ níveis, cada bandeja $t \in {0, \dots, N-1}$ tem estações de pino horizontais $s \in {0, 1, 2}$ espaçadas por Pin_Station_Pitch $\Delta y_{\text{station}}$ ao longo da profundidade da bandeja (Estação A frontal, Estação B média, Estação C traseira), e cada barra conecta (Bandeja $t$, Estação $s$) $\longrightarrow$ (Bandeja $t+1$, Estação $s+1$) com passo de furo de nível único $L_{\text{step}} = \sqrt{\Delta y_{\text{station}}^2 + \Delta Z_{\text{colapsado}}^2}$:
        • Barra 1 (2 pinos, comprimento L_step): (Bandeja 0, Estação B) -> (Bandeja 1, Estação C)
        • Barra 2 (3 pinos, comprimento 2*L_step): (Bandeja 0, Estação A) -> (Bandeja 1, Estação B) -> (Bandeja 2, Estação C)
        • Barra 3 (3 pinos, comprimento 2*L_step): (Bandeja 1, Estação A) -> (Bandeja 2, Estação B) -> (Bandeja 3, Estação C)
        • Barra 4 (2 pinos, comprimento L_step): (Bandeja 2, Estação A) -> (Bandeja 3, Estação B)
      • No ângulo da barra $\theta$ a partir da vertical, a translação bandeja a bandeja é: $$\Delta Y_{\text{bandeja}}(\theta) = -L_{\text{step}}\sin(\theta) - \Delta y_{\text{station}}, \qquad \Delta Z_{\text{bandeja}}(\theta) = -L_{\text{step}}\cos(\theta)$$
        • No Estado Colapsado ($\theta_{\text{col}} = -\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$), $\Delta Y_{\text{bandeja}} = + \Delta y_{\text{station}} - \Delta y_{\text{station}} = 0\text{ mm}$ (as bandejas empilham 100% verticalmente enquanto as barras estão em $-\theta_{\text{col}}$, e as paredes traseiras das bandejas ficam rentes à frente das pernas de suporte traseiras).
        • No Estado Aberto ($\theta_{\text{open}} = +\arcsin(\Delta y_{\text{station}} / L_{\text{step}})$), as mesmas barras balançam através da vertical para $+\theta_{\text{open}}$, avançando cada bandeja em $\Delta Y_{\text{bandeja}} = -2 \Delta y_{\text{station}}$, mantendo todas as 4 barras em uma única camada coplanar com zero pinos compartilhados!
  3. Regra de Modularidade da Base de Impressão:
    • Se um painel plano (como uma placa traseira Skådis alta) exceder a altura da base da impressora de destino (por exemplo, > 210 mm), divida-o horizontalmente em Upper_Panel e Lower_Panel e gere clipes de união de perfil H laterais correspondentes (folga deslizante de 0,20 mm).
  4. Dewarping de Homografia de Perspectiva Opcional (--rectify):
    • Para fotos anguladas de placas padronizadas planas ou silhuetas 2D complexas, execute:
      ~/.gemini/antigravity/skills/media-to-fusion/scripts/process_media.py "<caminho_da_imagem>" \
        --out-dir ./media_workspace \
        --rectify "x1,y1,x2,y2,x3,y3,x4,y4" \
        --real-w <largura_mm> --real-h <altura_mm>
      
    • process_media.py ordena automaticamente os 4 cantos no sentido horário (SE, SD, ID, IE), dewarpa o plano para rectified_ortho.png a 0,1 mm/px, exporta rectified_contour.dxf e salva loops de polígono fechado simplificados (points_xy_mm) dentro de media_manifest.json.

Fase 4: Modelagem Paramétrica via Fusion 360 MCP

Construa a montagem CAD de forma limpa no Fusion 360 através de execute_api_script:

  1. Conversão Obrigatória para Centímetros (cm = mm / 10.0):
    • A API interna do Fusion 360 (adsk.core.ValueInput.createByReal(), adsk.core.Point3D.create()) usa estritamente centímetros (cm).
    • Sempre defina def cm(mm_val): return mm_val / 10.0 no topo de cada execute_api_script.
  2. Registre Parâmetros Mestre de Usuário (design.userParameters): Crie parâmetros editáveis em milímetros/graus primeiro para que o usuário possa reconfigurar escala, número de níveis ou estado de dobra a qualquer momento:
    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
        )
    
    Parâmetros recomendados para montagens dobráveis/modulares:
    • Tray_Width, Tray_Depth, Tray_Height, Wall_Thickness (padrão 2.4 mm)
    • Link_Step_Pitch, Link_Width, Link_Thickness (padrão 3.5 mm)
    • Deploy_Angle_Deg (por exemplo, 40 deg para estado Aberto/Implantado, 0 deg para pilha vertical Colapsada)
    • Clearance (padrão 0.25 mm)
  3. Folgas Mecânicas para Impressão 3D:
    • Pinos pivotantes rotativos / furos de ligação: folga radial de 0,25 mm (0,50 mm diametral), com um lábio de 0,8 mm ou furo de fixador M3 para que as ligações permaneçam retidas.
    • Clipes de união deslizantes / inserções de divisória removíveis: folga de 0,20 mm por lado (0,40 mm de dedução total de largura/profundidade em bandejas de inserção).
    • Ergonomia da Bandeja Inferior e Pernas de Suporte Traseiras:
      • Inclua recortes de alça lateral oblongos arredondados na bandeja mais baixa se visíveis na mídia de referência.
      • Garanta que Rear_Support_Legs alcancem desde a bandeja de ancoragem superior até o plano do solo ($Z = Z_{\text{chão_bandeja_inferior}}$) para que a montagem fique nivelada quando implantada.

Fase 5: Verificação Visual e de Interferência em Malha Fechada

Nunca conclua após uma execução cega de script. Realize a verificação visual e matemática:

  1. Comparação Visual Multiângulo (get_screenshot):
    • Chame a ferramenta fusion-mcp get_screenshot com:
      • view="iso-top-right", width=1024, height=1024
      • view="right", width=1024, height=1024 (crucial para inspecionar alinhamento da barra de ligação, ângulo de escada e contato das pernas traseiras com o solo!)
      • view="front", width=1024, height=1024 (crucial para inspecionar simetria da grade de slots Skådis e proporções das divisórias!)
    • Compare as capturas de tela renderizadas lado a lado com os keyframes/fotos de referência (keyframe_XX_grid.png / annotated_grid.png).
  2. Verificação Automatizada de Timeline e Interferência: Execute uma passagem de verificação via execute_api_script para afirmar a geometria sólida nativa e verificar colisões físicas entre componentes:
    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, "Nenhum sketch nativo encontrado!"
        assert root.features.extrudeFeatures.count > 0, "Nenhum recurso de extrusão encontrado!"
        assert root.meshBodies.count == 0, "Objetos MeshBody proibidos detectados!"
    
        # Coletar todos os corpos sólidos visíveis em ocorrências e raiz
        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)
    

Fase 6: Finalização & Ajuste de Parâmetros de Usuário (ID da Ferramenta: media-to-fusion)

  1. Relatório do Modelo — Gere um resumo conciso do modelo para o usuário:
    • Número de componentes na montagem
    • Parâmetros de usuário expostos (com explicações curtas)
    • Relação de transmissão cinemática (se aplicável)
    • Avaliação de adequação para impressão 3D (destacar quaisquer saliências >45°, pontes ou áreas que exigem suportes)
  2. Toque Final — Se solicitado ou se melhorar a estética:
    • Adicione filetes/chanfros em cantos externos (raio 1.0 mm – 2.0 mm)
    • Aplique uma Aparência simples (por exemplo, "Plastic - Matte" para impressão 3D, "Paint - Matte" para peças usinadas)
  3. Fluxo de Trabalho de Finalização da Ferramenta:
    • Defina finalizado = True
    • Saia com uma mensagem clara para o usuário: "Modelo reconstruído em models/<NN>_<Model_Name>/. Os parâmetros de usuário no Fusion 360 (Tray_Width, Tray_Depth, etc.) podem ser ajustados a qualquer momento."

Individual skills in this repo

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

Habilidades Relacionadas