Fenster-Grundriss: Sims/Stulp folgen der eingezogenen Rahmenkante, mittel ohne Glaslinie

Sims (Fensterbank) und Anschlag-Kerben nutzten pauschal die volle Wandfläche
statt der tatsächlichen (ggf. per insetFromFace eingezogenen) Rahmen-
Aussenkante — bei rückversetzten Rahmen sass die Fensterbank dadurch sichtbar
falsch. Stulp-Marken nutzen jetzt die bereits korrekt (tiefenbewusst) in
windowSymbol berechneten meetingMarks statt einer zweiten, abweichenden
Neuberechnung. Ausserdem: SIA fig. 37 (1:50) zeigt noch keine Glaslinie, nur
Rahmen + Stulp-Quadrat — die kommt gemäss fig. 38 erst bei 1:20 dazu.
This commit is contained in:
2026-07-12 17:58:27 +02:00
parent 6ac054ea71
commit e65a6b7de1
3 changed files with 51 additions and 44 deletions
+12 -11
View File
@@ -446,11 +446,16 @@ export function windowSymbol(
const clearTo = seg.to - fw;
if (clearTo - clearFrom <= 1e-6) continue;
const operable = !!seg.sash.opening && seg.sash.opening !== "fest";
// „mittel" (SIA fig. 37) zeigt NUR Blendrahmen + Pfosten/Stulp — noch KEINE
// Glaslinie/Flügelrahmen (Nutzer-Vorgabe: „im 1:50 muss man die Fenster-
// linie noch nicht sehen, nur die Vierecke aussen/innen"). Das kommt erst
// bei „fein" (SIA fig. 38) dazu.
if (!fein) continue;
const gOuterN = frameOuterN - (operable ? reveal : 0);
const gInnerN = frameInnerN + (operable ? reveal : 0);
// Verschachtelter Flügelrahmen NUR bei „fein" (SIA fig. 38); „mittel" bleibt
// beim reinen Blendrahmen-Band (SIA fig. 37).
if (fein && operable) {
if (operable) {
const sFrom = along(jambStart, jambEnd, clearFrom);
const sTo = along(jambStart, jambEnd, clearTo);
sashFrames.push([
@@ -460,22 +465,18 @@ export function windowSymbol(
add(sFrom, scale(n, gInnerN)),
]);
}
const gInsetU = fein && operable ? fw * 0.6 : 0;
const gInsetU = operable ? fw * 0.6 : 0;
const gFrom = clearFrom + gInsetU;
const gTo = clearTo - gInsetU;
if (gTo - gFrom <= 1e-6) continue;
const gMid = (gOuterN + gInnerN) / 2;
const a = along(jambStart, jambEnd, gFrom);
const b = along(jambStart, jambEnd, gTo);
// fein: Glas als Doppellinie (Isolierverglasung, ~15 mm Abstand); mittel:
// eine Glaslinie mittig.
if (fein) {
const half = Math.min(0.0075, bandDepth * 0.18);
for (const off of [gMid - half, gMid + half]) {
glassLines.push([add(a, scale(n, off)), add(b, scale(n, off))]);
}
} else {
glassLines.push([add(a, scale(n, gMid)), add(b, scale(n, gMid))]);
// Glas als Doppellinie (Isolierverglasung, ~15 mm Abstand) — nur „fein"
// erreicht diesen Punkt (mittel bricht oben früh ab, s. o.).
const half = Math.min(0.0075, bandDepth * 0.18);
for (const off of [gMid - half, gMid + half]) {
glassLines.push([add(a, scale(n, off)), add(b, scale(n, off))]);
}
}
return { frame, glassLines, mullionLines, sashFrames, sashOpeningLines: [], meetingMarks };