Aggiunto _purge_meshes_dir() chiamato all inizio di export_meshes_and_hierarchy. Cancella .obj/.stl/.mtl residui di export precedenti (component rinominati o rimossi dal modello Fusion) che altrimenti rimanevano come orfani nella cartella di output e venivano potenzialmente caricati dal viewer come nodi vuoti. Conteggio in stats.purged_stale, mostrato nel messageBox finale di entrambi gli script (plotter + 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.
createOBJExportOptions(component, ...) includeva i body delle sub-occurrences,
duplicando la geometria nei nodi padre. Ora esportiamo solo comp.bRepBodies
(body propri del Component): per N>1 body, concateniamo gli OBJ riallineando
gli indici v/vt/vn. Container senza body propri non generano meshFile. Fallback STL invariato.