Schnitt/Ansicht Phase 1: Wand unter Schnittebene als Ansichts-Umriss (viewOnly, keine Poché), mit Tests

This commit is contained in:
2026-07-05 21:22:51 +02:00
parent cdc71621c4
commit 9c911e6d43
3 changed files with 114 additions and 2 deletions
+30 -1
View File
@@ -677,7 +677,14 @@ export function generatePlan(
const openings = openingsOfWall(project, wall.id);
const gaps = wallGaps(wall, doors, openings);
const cuts = joins.get(wall.id) ?? { startCut: null, endCut: null };
addWallPoche(primitives, project, wall, gaps, cuts, wallGreyed, detail, wallLwMm, wallCategory);
// Schnitt vs. Ansicht nach Schnitthöhe (BIM-Standard): erreicht die Wand die
// Grundriss-Schnittebene nicht (Höhe < Schnitthöhe des Geschosses, z. B. eine
// Brüstung/ein Podestrand), wird sie nur als Ansichts-Umriss gezeichnet —
// keine Schnitt-Poché. Normale Wände (Höhe ≥ Schnitthöhe) sind unberührt.
const wallViewOnly = wall.height < (floor?.cutHeight ?? 1.0);
addWallPoche(
primitives, project, wall, gaps, cuts, wallGreyed, detail, wallLwMm, wallCategory, wallViewOnly,
);
// Referenzlinie: dünne gestrichelte Wand-Achslinie (von der Oberleiste
// umschaltbar). Wird über der Poché gezeichnet, damit sie sichtbar bleibt.
if (showReferenceLines) addReferenceLine(primitives, wall, wallGreyed);
@@ -1258,6 +1265,10 @@ function addWallPoche(
detail: DetailLevel,
wallLwMm: number,
category: LayerCategory | undefined,
// Wand liegt GANZ unter der Grundriss-Schnittebene (z. B. 30-cm-Brüstung bei
// 1 m Schnitthöhe) → „von oben gesehen": nur Ansichts-Umriss (Haarlinie), KEINE
// Schnitt-Poché/Schraffur/Schichten. Der reguläre Schnittfall bleibt `false`.
viewOnly: boolean,
): void {
const wt = getWallType(project, wall);
const total = wallTypeThickness(wt);
@@ -1326,6 +1337,24 @@ function addWallPoche(
const startCut = s <= 1e-6 ? cuts.startCut : null;
const endCut = e >= axisLen - 1e-6 ? cuts.endCut : null;
if (viewOnly) {
// Ansichts-Wand (unter der Schnittebene): ein Umriss über die volle Dicke
// als Haarlinie, ohne Füllung/Schraffur. Segment-/Gehrungs-/Öffnungs-Logik
// bleibt dieselbe wie im Schnittfall (nur eben ohne Poché).
out.push({
kind: "polygon",
pts: clippedBand(p1, p2, refOff - total / 2, refOff + total / 2, startCut, endCut),
fill: "none",
stroke,
strokeWidthMm: layerLineMm,
hatch: NO_HATCH,
greyed,
noStrokeEdges: joinEdges(startCut, endCut),
wallId,
});
continue;
}
if (detail === "grob") {
// Eine Sammelfläche über die volle Dicke, ohne Schraffur, dicker Umriss.
out.push({