From a612ae55cd205517bc8251bfe0a77a9827132c8f Mon Sep 17 00:00:00 2001 From: Karim Date: Sat, 11 Jul 2026 02:42:48 +0200 Subject: [PATCH] =?UTF-8?q?Schnitt:=20D=C3=A4mmschraffur-Orientierung=20+?= =?UTF-8?q?=20Terminierung=20bei=20Decken-Anschluss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Nutzer-Reports: 1. Wandrelative Muster (Dämmwellen) waren im Schnitt bei Wand UND Decke je 90° verdreht: die geschnittene Wand STEHT (Achswinkel 0 statt 90), die geschnittene Decke LIEGT (Achswinkel 90 statt absolut) — beide Bänder bekommen jetzt die richtige Achse. 2. applyWallTermination terminiert jetzt auch bei blossem ANSCHLUSS (±5 cm): eine Decke, die nur bis zur Wand-Innenkante gezeichnet ist, beendet die Wand trotzdem (vorher liefen Innenputz/Backstein durch, weil die Prioritäts-Subtraktion echten Überlapp braucht — den es dort geometrisch nicht gibt). Demo-Verhalten (Outline auf Wandachse) unverändert korrekt: dort schneidet die Decke exakt die überlappte innere Wandhälfte. 737/737 grün. --- src/plan/toSection.ts | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/plan/toSection.ts b/src/plan/toSection.ts index 1610bd8..e92defb 100644 --- a/src/plan/toSection.ts +++ b/src/plan/toSection.ts @@ -418,11 +418,16 @@ export function applyWallTermination( const wb = bbox(b); // Dominante Decken-Cutter mit u-Überlapp — dieselbe Auswahl wie die // bandZCuts im 3D (nur STRIKT höhere Priorität schneidet/terminiert). + // Überlapp ODER Anschluss (±5 cm): eine Decke, die nur bis zur Wand- + // Innenkante gezeichnet ist, terminiert die Wand trotzdem (VW-Verhalten; + // ohne die Toleranz liefen Innenputz/Backstein durch die Decke, wenn die + // Decken-Outline die Wand geometrisch nicht überlappt — Nutzer-Report). + const TOUCH = 0.05; const cutters = slabBands.filter( (s) => s.joinPriority > (b.joinPriority as number) && - s.box.uMax > wb.uMin + EPS_T && - s.box.uMin < wb.uMax - EPS_T, + s.box.uMax > wb.uMin - TOUCH && + s.box.uMin < wb.uMax + TOUCH, ); if (cutters.length === 0) { out.push(b); @@ -776,7 +781,12 @@ function splitSlabLayers( let acc = 0; // kumulierte Dicke von OK (oben) nach UK (unten) for (const layer of wt.layers) { const comp = getComponent(project, layer.componentId); - const hatch = resolveHatch(project, comp.hatchId, undefined, resolveForeground(comp)); + const hatch = resolveHatch( + project, + comp.hatchId, + SECTION_SLAB_AXIS_ANGLE_DEG, + resolveForeground(comp), + ); const vTop = vMax - acc * scale; acc += layer.thickness; const vBottom = vMax - acc * scale; @@ -805,7 +815,13 @@ function splitSlabLayers( * (Achse entlang v, atan2(1,0) = 90°). Damit drehen wandrelative Muster * (Dämmung, Backstein) im Schnitt genauso mit der Wand wie im Grundriss. */ -const SECTION_WALL_AXIS_ANGLE_DEG = 90; +// Wandachse im Schnitt: die geschnittene Wand STEHT (Band entlang v). Wand- +// relative Muster (Dämmwellen laufen ENTLANG der Wand) müssen im Schnitt also +// VERTIKAL laufen — Winkel 0 lieferte sie horizontal (90° falsch, Nutzer-Report). +const SECTION_WALL_AXIS_ANGLE_DEG = 0; +// Deckenachse im Schnitt: die geschnittene Decke LIEGT (Band entlang u) — +// wandrelative Muster laufen horizontal. +const SECTION_SLAB_AXIS_ANGLE_DEG = 90; /** * Zerlegt das EINE geschnittene Wandrechteck (`cp`, vier Ecken in u/v-Metern) in