Schnitt: Dämmschraffur-Orientierung + Terminierung bei Decken-Anschluss

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.
This commit is contained in:
2026-07-11 02:42:48 +02:00
parent c02a02cffe
commit a612ae55cd
+20 -4
View File
@@ -418,11 +418,16 @@ export function applyWallTermination(
const wb = bbox(b); const wb = bbox(b);
// Dominante Decken-Cutter mit u-Überlapp — dieselbe Auswahl wie die // Dominante Decken-Cutter mit u-Überlapp — dieselbe Auswahl wie die
// bandZCuts im 3D (nur STRIKT höhere Priorität schneidet/terminiert). // 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( const cutters = slabBands.filter(
(s) => (s) =>
s.joinPriority > (b.joinPriority as number) && s.joinPriority > (b.joinPriority as number) &&
s.box.uMax > wb.uMin + EPS_T && s.box.uMax > wb.uMin - TOUCH &&
s.box.uMin < wb.uMax - EPS_T, s.box.uMin < wb.uMax + TOUCH,
); );
if (cutters.length === 0) { if (cutters.length === 0) {
out.push(b); out.push(b);
@@ -776,7 +781,12 @@ function splitSlabLayers(
let acc = 0; // kumulierte Dicke von OK (oben) nach UK (unten) let acc = 0; // kumulierte Dicke von OK (oben) nach UK (unten)
for (const layer of wt.layers) { for (const layer of wt.layers) {
const comp = getComponent(project, layer.componentId); 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; const vTop = vMax - acc * scale;
acc += layer.thickness; acc += layer.thickness;
const vBottom = vMax - acc * scale; const vBottom = vMax - acc * scale;
@@ -805,7 +815,13 @@ function splitSlabLayers(
* (Achse entlang v, atan2(1,0) = 90°). Damit drehen wandrelative Muster * (Achse entlang v, atan2(1,0) = 90°). Damit drehen wandrelative Muster
* (Dämmung, Backstein) im Schnitt genauso mit der Wand wie im Grundriss. * (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 * Zerlegt das EINE geschnittene Wandrechteck (`cp`, vier Ecken in u/v-Metern) in