Fenster: echte Sprossen-Spalten (mullionCols) analog Kämpfer-Zeilen

Vertikale Sprossenteilung im Glasfeld (mullionCols−1 Spalten), spiegelbildlich
zur bestehenden mullionRows-Logik: 3D-Rahmen-Riegel, Ansichts-Trennlinien +
Glasscheiben als echtes rows×cols-Raster, Eingabefeld im Fenstertyp-Editor und
im ResourceManager.
This commit is contained in:
2026-07-12 17:38:21 +02:00
parent 61313777da
commit 00bff27b02
9 changed files with 212 additions and 8 deletions
+29
View File
@@ -492,6 +492,13 @@ function FluegelPanel({
min={1}
onCommit={(n) => patchWt({ mullionRows: Math.max(1, Math.round(n)) })}
/>
<NumField
label={t("oed.f.mullionCols")}
value={wt.mullionCols ?? 1}
step={1}
min={1}
onCommit={(n) => patchWt({ mullionCols: Math.max(1, Math.round(n)) })}
/>
<table className="oed-table">
<thead>
<tr>
@@ -879,6 +886,28 @@ function ElevationPreview({
/>
));
})()}
{/* Sprossen-Spalten (mullionCols − 1 vertikale Teiler im
Hauptfeld unterhalb eines etwaigen Oberlichts). */}
{!dt &&
wt &&
(() => {
const cols = Math.max(1, Math.round(wt.mullionCols ?? 1));
if (cols <= 1) return null;
const top = originY + px(wt.transomHeight ?? 0);
const fieldH = px(h) - px(wt.transomHeight ?? 0);
const fieldW = px(w);
return Array.from({ length: cols - 1 }, (_, k) => (
<line
key={k}
x1={pad + (fieldW * (k + 1)) / cols}
y1={top}
x2={pad + (fieldW * (k + 1)) / cols}
y2={top + fieldH}
stroke={strokeMuted}
strokeWidth={0.75}
/>
));
})()}
</>
)}
</svg>
+9
View File
@@ -2336,6 +2336,15 @@ function WindowStylesTab({
max={4}
/>
</FieldRow>
<FieldRow label={t("resources.field.mullionCols")}>
<NumberField
value={win.mullionCols ?? 1}
onChange={(mullionCols) => patch({ mullionCols: Math.max(1, Math.round(mullionCols)) })}
step={1}
min={1}
max={4}
/>
</FieldRow>
<FieldRow label={t("resources.field.glazing")}>
<SelectField
value={win.glazing}