Dach-Schichtlogik: RoofType/Layer[] wie Decken (3D mehrschichtig)

Kernthema der BIM-Tiefe (Designdoc docs/design/bim-elements-depth-study.md, P0):
Dächer bekommen einen mehrschichtigen Aufbau analog WallType/CeilingType.

- Modell: RoofType { layers: Layer[] }, Project.roofTypes, Roof.roofTypeId
  (Roof.thickness bleibt einschichtiger Fallback). Resolver roofLayers()/
  roofTotalThickness() — wiederverwendet den bestehenden Layer-Typ.
- 3D (emitRoofs): je Schicht ein eigenes Mesh mit Bauteilfarbe, entlang der
  Flächennormalen unter die vorige gestapelt (Eindeckung aussen → Verkleidung
  innen). Ohne roofTypeId einschichtiger thickness-Slab (Default-Dachfarbe).
- UI: Dachtyp-Dropdown im Dach-Panel (leer = einschichtig). Default-Dachtyp
  'Steildach gedämmt' in sampleProject.
- +2 Tests (Schicht-Meshes/Stapelung; einschichtig = Slab+Giebel).

Offen (Designdoc): 2D-Schnitt-Poché der Dachschichten, RoofType-ResourceManager-
Tab, Traufe/Ortgang getrennt. 668/668 grün; 3D-Optik vom Nutzer in Tauri prüfen.
This commit is contained in:
2026-07-10 02:03:55 +02:00
parent e99bb2413f
commit 3a986ecd2f
8 changed files with 197 additions and 26 deletions
+3
View File
@@ -80,6 +80,8 @@ export interface RoofInfo {
pitchDeg: number;
/** Obere Neigung (Grad) — nur Mansarde relevant. */
pitchUpperDeg?: number;
/** Dachtyp-Verweis (mehrschichtiger Aufbau) oder undefined (einschichtig). */
roofTypeId?: string;
/** Mansarde-Untertyp (Giebel/Walm/Zelt) — nur Mansarde relevant. */
mansardType?: "giebel" | "walm" | "zelt";
/** Mansarde-Knicklage (0..0.5 der halben Spannweite) — nur Mansarde relevant. */
@@ -630,6 +632,7 @@ function roofSelection(project: Project, roof: Roof): Selection {
shape: roof.shape,
pitchDeg: roof.pitchDeg,
pitchUpperDeg: roof.pitchUpperDeg,
roofTypeId: roof.roofTypeId,
mansardType: roof.mansardType,
mansardKneeRatio: roof.mansardKneeRatio,
overhang: roof.overhang,