"""Normalize individual exports through Fusion; preserve the editable source document."""
import adsk.core,adsk.fusion,pathlib,json,traceback
OUT=pathlib.Path(C28_ROOT)
app=adsk.core.Application.get();source_doc=app.activeDocument;source_design=adsk.fusion.Design.cast(app.activeProduct)
tm=adsk.fusion.TemporaryBRepManager.get()
try:
    data=[]
    for o in source_design.rootComponent.allOccurrences:
        if o.component.bRepBodies.count and '_REF_' not in o.component.name:
            data.append((o.component.name,[tm.copy(b) for b in o.bRepBodies]))
    tempdoc=app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
    dd=adsk.fusion.Design.cast(app.activeProduct);dd.designType=adsk.fusion.DesignTypes.DirectDesignType
    tempdoc.name='28 manufacturing exports / world coordinates'
    ex=dd.exportManager
    progress=[]
    for name,bodies in data:
        o=dd.rootComponent.occurrences.addNewComponent(adsk.core.Matrix3D.create());c=o.component;c.name=name
        for i,b in enumerate(bodies):c.bRepBodies.add(b).name=name+(f'_{i+1}' if len(bodies)>1 else '')
        if not (globals().get('C28_REUSE_STOCK_MESH',False) and 'Woven_Mesh_REFERENCE_RODS' in name):
            assert ex.execute(ex.createSTEPExportOptions(str(OUT/'cad/parts'/f'{name}.step'),c))
            stl=ex.createSTLExportOptions(c,str(OUT/'meshes/parts'/f'{name}.stl'));stl.meshRefinement=adsk.fusion.MeshRefinementSettings.MeshRefinementHigh;assert ex.execute(stl)
        progress.append(name);(OUT/'audit/world_export_progress.json').write_text(json.dumps(progress))
    assert ex.execute(ex.createSTEPExportOptions(str(OUT/'cad/Walkie_One_28_R1_CASE.step')))
    (OUT/'audit/world_export_done.txt').write_text('All individual STEP/STL files use assembly world coordinates. Source Fusion occurrence transforms are preserved in native F3D.\n')
    tempdoc.close(False);source_doc.activate()
    print('Individual manufacturing exports normalized to assembly coordinates in Fusion.')
except:
    (OUT/'audit/world_export_error.txt').write_text(traceback.format_exc());print(traceback.format_exc())
