feat(P3): add GMSH Frontal-Delaunay tessellation engine

Introduces GMSH as an alternative to OCC BRepMesh for STEP→GLB tessellation.
GMSH produces conforming meshes that eliminate fan triangles at cylinder seam
edges — a structural limitation of OCC BRepMesh that cannot be fixed via
deflection parameters.

Changes:
- render-worker/Dockerfile: install gmsh>=4.15.0 + libglu1-mesa + libxft2
- export_step_to_gltf.py: --tessellation_engine occ|gmsh CLI arg +
  _tessellate_with_gmsh() using BRep→GMSH→Poly_Triangulation write-back
- admin.py: tessellation_engine setting (SETTINGS_DEFAULTS, SettingsOut,
  SettingsUpdate, validation)
- export_glb.py: pass tessellation_engine to export_step_to_gltf.py CLI in
  both geometry and production GLB tasks
- Admin.tsx: radio button UI for OCC vs GMSH selection

Tested: 121 faces meshed, 0 BRepMesh fallback, 649K triangles on sample part.
Clean seam edges for UV unwrap — GMSH respects B-rep periodic face boundaries.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 19:17:26 +01:00
parent 9c6ae18b28
commit af320bcdc8
6 changed files with 236 additions and 17 deletions
+6 -6
View File
@@ -33,7 +33,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
## Tasks (in Reihenfolge)
### Task 1: Dockerfile — `gmsh` installieren
### [x] Task 1: Dockerfile — `gmsh` installieren
- **Datei**: `render-worker/Dockerfile`
- **Was**: Nach der `trimesh`-Zeile einfügen:
@@ -44,7 +44,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
- **Akzeptanzkriterium**: `docker compose exec render-worker python3 -c "import gmsh; print(gmsh.__version__)"` gibt `4.15.x`.
- **Abhängigkeiten**: keine
### Task 2: `export_step_to_gltf.py` — CLI-Argument `--tessellation_engine`
### [x] Task 2: `export_step_to_gltf.py` — CLI-Argument `--tessellation_engine`
- **Datei**: `render-worker/scripts/export_step_to_gltf.py`
- **Was**: In `parse_args()` ein neues Argument:
@@ -57,7 +57,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
- **Akzeptanzkriterium**: `--help` listet `--tessellation_engine`.
- **Abhängigkeiten**: keine
### Task 3: `export_step_to_gltf.py` — Funktion `_tessellate_with_gmsh()`
### [x] Task 3: `export_step_to_gltf.py` — Funktion `_tessellate_with_gmsh()`
- **Datei**: `render-worker/scripts/export_step_to_gltf.py`
- **Was**: Neue Funktion vor `main()`. Nimmt den XCAF-Compound und Deflection-Parameter. Strategie:
@@ -120,7 +120,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
- **Abhängigkeiten**: Task 1, Task 2
### Task 4: Admin-Setting `tessellation_engine`
### [x] Task 4: Admin-Setting `tessellation_engine`
- **Datei**: `backend/app/api/routers/admin.py`
- **Was**: In `SETTINGS_DEFAULTS` eintragen:
@@ -135,7 +135,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
- **Akzeptanzkriterium**: `GET /api/admin/settings` gibt `tessellation_engine: "occ"` zurück.
- **Abhängigkeiten**: keine
### Task 5: `export_glb.py` — Setting durchreichen
### [x] Task 5: `export_glb.py` — Setting durchreichen
- **Datei**: `backend/app/domains/pipeline/tasks/export_glb.py`
- **Was**: In `generate_gltf_geometry_task()` (und `generate_gltf_production_task()` wo der OCC-Befehl aufgebaut wird):
@@ -150,7 +150,7 @@ Diese Fehler können **nicht** mit Deflection-Parametern behoben werden — auch
- **Akzeptanzkriterium**: Admin stellt `tessellation_engine` auf `gmsh` → nächster GLB-Export nutzt GMSH.
- **Abhängigkeiten**: Task 2, Task 4
### Task 6: Frontend — Dropdown in Admin-Settings
### [x] Task 6: Frontend — Dropdown in Admin-Settings
- **Datei**: `frontend/src/pages/Admin.tsx`
- **Was**: Im Tessellation-Settings-Abschnitt ein Select-Element für `tessellation_engine`: