feat(M5-M7): embed canonical material names in USD via customData + pxr direct read

- export_step_to_usd.py: accept --material_map CLI arg, write
  schaeffler:canonicalMaterialName as customData on each Mesh prim,
  fix geometry transform (strip shape Location before face exploration,
  apply both face_loc and shape_loc sequentially)
- import_usd.py: after Blender USD import, use pxr to read customData
  directly from the USD file — builds {part_key: material_name} lookup
  (Blender ignores STRING primvars and customData, but pxr reads both)
- _blender_materials.py: add apply_material_library_direct() for exact
  dict-based material assignment without name-matching heuristics
- _blender_scene_setup.py: prefer direct USD lookup, fall back to
  name-matching for legacy USD files without material metadata
- export_glb.py (generate_usd_master_task): resolve material_map via
  material_service.resolve_material_map() and pass to subprocess;
  include material hash in cache key for invalidation
- ROADMAP.md: update P5 status, add M5-M7 milestones

Tested: 3/3 parts matched (ans_lfs120), 172/175 parts matched
(F-802007.TR4-D1-H122AG). Previous: 0/25 matched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 23:04:26 +01:00
parent 1321ef2bd4
commit cc3071297b
15 changed files with 488 additions and 246 deletions
+2 -2
View File
@@ -5,7 +5,7 @@ You are a specialist for the render script chain in the Schaeffler Automat proje
## Pipeline Overview
```
Celery task: render_step_thumbnail [queue: thumbnail_rendering]
Celery task: render_step_thumbnail [queue: asset_pipeline]
├─ subprocess: export_step_to_gltf.py (OCC/GMSH → geometry GLB)
│ └─ _extract_sharp_edge_pairs() (GCPnts curve sampling)
@@ -23,7 +23,7 @@ Celery task: render_step_thumbnail [queue: thumbnail_rendering]
└─ _activate_gpu() × 3 (before file, after file, after engine)
└─ Cycles render → PNG thumbnail
Celery task: render_order_line_task [queue: thumbnail_rendering]
Celery task: render_order_line_task [queue: asset_pipeline]
├─ subprocess: still_render.py (order-line PNG)
└─ subprocess: turntable_render.py (order-line MP4)
```