fusion: nuovo script ExportKinematicGraph_ATL (10 fix per export ATL)

Standalone add-in che importa ExportKinematicGraph come 'base' e ridefinisce solo le funzioni joint con: snap axis (1e-9), limits None se entrambi enable false, origin fallback su entityOne/Two per AsBuilt revolute, disambiguazione nomi duplicati (#2, #3...), flag _orphan, _token per matching, joint1Token/joint2Token sui motionLinks, glbNodeName troncato a 63 char. Log diagnostico + metadata.fixes nel JSON. Script plotter NON toccato.
This commit is contained in:
marco
2026-06-18 21:01:09 +02:00
parent 3725b486a4
commit bbdeb39ab0
2 changed files with 733 additions and 0 deletions

View File

@@ -570,3 +570,61 @@ Quando hai applicato i fix nel nuovo script ATL, aggiungi qui sotto una sezione
Io rifaccio il giro su `/atl` e marco gli esiti.
Grazie 🙏
---
## Risposta agent Fusion del 2026-06-18 - secondo script ExportKinematicGraph_ATL
Confermato: nuovo file [ExportKinematicGraph_ATL.py](ExportKinematicGraph_ATL.py) standalone come add-in Fusion separato. Lo script plotter NON viene toccato. Implementazione tramite import del modulo plotter (riusa colore/mesh/hierarchy/walk component) + override puntuali sui joint.
### Fix implementati nel JSON ATL
| # | Punto | Stato | Implementazione |
|---|---|---|---|
| 1 | Log diagnostico contatori joint | OK | `[ATL-export] joints: N, asBuiltJoints: M, motionLinks: K` su stdout + `export_atl.log` accanto al `joints.json` |
| 2 | Nomi joint duplicati | OK | `_disambiguate_names()`: prima occorrenza tiene il nome, dalla seconda in poi `#2`, `#3`... Il nome originale e' conservato in `_originalName`. Applicato sia a `joints` che ad `asBuiltJoints`. Conteggio rinominati riportato nel `metadata.fixes.duplicateNames` |
| 3 | `origin` mancante sui revolute AsBuilt | OK (best-effort) | Pipeline a 3 stadi (`_origin_for_as_built`): 1) `joint.geometry.origin`, 2) centro di `joint.entityOne` (BRepFace cilindrica -> `surface.origin`, BRepEdge circolare -> `curve.center`), 3) idem su `entityTwo`. Campo `_originSource` indica la provenienza |
| 4 | Joint orfani (parent + child null) | OK | Flag esplicito `_orphan: true` sui record con entrambi null. NON vengono scartati: rimangono nel JSON per ispezione ma il viewer puo' filtrarli su `_orphan` |
| 5 | Rumore numerico ~1e-16 sugli axis | OK | `_snap_axis()` con epsilon `1e-9`: snap a `0` per moduli sotto soglia, snap a `+/-1` per valori molto vicini. Applicato a `axis` e `secondaryAxis` |
| 6 | Limits `0..0` con flag enable false | OK | `_normalize_limits()`: se `isMinimumValueEnabled` AND `isMaximumValueEnabled` sono entrambi `false` -> `rotationLimits`/`slideLimits` = `null`. Mantiene il dict se almeno uno e' attivo (es. solo upper bound) |
| 7 | MotionLink con `joint1` + `joint2` null | OK (limite API noto) | Aggiunti `joint1Token` e `joint2Token` (hex string da `entityToken`) come fallback. Quando `jointOne`/`jointTwo` API ritornano `None`, tentiamo `entityOne`/`entityTwo` del motion link. Il viewer ora ha qualcosa con cui matchare anche quando i nomi sono persi |
| 8 | Material fibra di carbonio | gia' presente | `materialName` e `appearanceName` per nodo sono gia' emessi dallo script plotter (riga `_extract_color_and_names_for_occurrence`). Il viewer puo' fare mapping nominale su `materialName == 'Carbon Fiber'` |
| 9 | Body-per-body attivo | OK | Lo script ATL riusa `base.export_meshes_and_hierarchy()` -> stesso fix del 2026-06-10. Logga `[ATL-export] body-per-body mode: ON` in cima |
| 10 | Sanitizzazione nomi Blender | OK | Aggiunto `glbNodeName` per ogni nodo di `hierarchy.json`: uguale a `name` se <= 63 char, troncato a 63 altrimenti (limite `bpy.types.ID.name`). Campo `metadata.blenderNameMax: 63` per esplicitare la convenzione |
Aggiunto inoltre il blocco `metadata.fixes` in `joints.json` con un sommario dei contatori (rinominazioni, snap epsilon, origin recuperati, ecc.) per facilitare l'ispezione lato viewer.
### Note di implementazione
- L'import del modulo plotter cerca `ExportKinematicGraph.py` in tre posizioni (cartella ATL, cartella sorella `ExportKinematicGraph/`, hard-coded repo). Se non lo trova, lo script abortisce con `ImportError`: niente fallback silenzioso che mascheri il problema.
- `importlib.reload(base)` forzato a ogni esecuzione: cosi' se modifichi il plotter durante una sessione Fusion attiva, le modifiche vengono raccolte senza riavviare.
- I joint orfani NON vengono scartati: solo flaggati. Decisione operativa: meglio averli visibili nel JSON (anche per capire perche' sono orfani) che farli sparire silenziosamente.
### Installazione lato utente
Lo script va installato come **secondo add-in** in Fusion:
1. `Utilities` -> `ADD-INS` -> `Scripts` -> `Green +` -> `Create from existing script`
2. Selezionare `C:\Users\croce\OneDrive\Desktop\export grafo fusion\ExportKinematicGraph_ATL.py`
3. (Gia' fatto da me) Sincronizzato in `%APPDATA%\Autodesk\Autodesk Fusion 360\API\Scripts\ExportKinematicGraph_ATL\`
### Cosa serve da te (viewer)
1. Aprire il modello ATL in Fusion, lanciare lo script `ExportKinematicGraph_ATL`, cartella di destinazione `C:\Users\croce\OneDrive\Desktop\export_ATL\`.
2. Lanciare il bat Blender sulla nuova cartella (genera `ATL.glb` in posa neutra).
3. `scp` ai soliti path sul server (`/home/marco/automation_kriz/ATL/`).
4. Verifica su `/atl`: i record duplicati ora hanno nomi univoci, i revolute AsBuilt dovrebbero animarsi correttamente attorno al loro perno (vedi `_originSource` per capire da dove arriva l'origin), i motion link rotti vanno ispezionati su `joint1Token`/`joint2Token` per il matching manuale.
### Cosa rimane fuori dall'orizzonte dello script
- `joints: []` vuoto e tutti i motion link con `joint1==joint2==null`: sono dati del modello Fusion (asbuilt-only e rename post-link). Lo script non puo' inventarseli. Da chiarire con Croce se ha creato solo As-built Joint nel modello ATL.
- Material PBR avanzato (fibra di carbonio con normal map + anisotropy): lo script Fusion non puo' generarlo, e' un layer viewer (mapping `materialName` -> material custom).
### Verifica preliminare lato script
- `py_compile` OK
- Sync verso `%APPDATA%\...\ExportKinematicGraph_ATL\` OK
- Test runtime: serve Fusion attivo, lo lancia Croce.
Quando hai il nuovo export, aggiorna qui sotto con "Verifica export ATL del 2026-06-XX": contatori di `metadata.fixes`, lista degli `_orphan` (se ce ne sono), e quali asBuilt revolute hanno `_originSource == null` (cioe' niente origin neanche col fallback).