Fenster-Dialog: Oberlicht + Kämpfer-/Sprossenzeilen exponiert

Zwei vom Renderer bereits konsumierte Felder im Flügel/Sprossen-Panel
zugänglich gemacht + in der Live-Ansicht dargestellt:
- transomHeight (Oberlicht): 2D-Kämpferlinie im Grundriss + 3D-Oberlichtscheibe
  waren schon da; Kämpferlinie jetzt auch in der Dialog-Vorschau
- mullionRows (Kämpfer-/Sprossenzeilen): 3D-Kämpfer bei 'fein'; waagrechte
  Teiler in der Vorschau

Kein Renderer-Aufwand — reine UI-/Vorschau-Freischaltung. 659/659 grün.
This commit is contained in:
2026-07-10 01:20:40 +02:00
parent e3cdc86f46
commit 82d5710ddb
3 changed files with 52 additions and 1 deletions
+2
View File
@@ -391,6 +391,8 @@ export const de = {
"oed.f.frameThickness": "Rahmenstärke quer (m)",
"oed.f.frameDepth": "Rahmentiefe (m)",
"oed.f.frameWidth": "Rahmenbreite Ansicht (m)",
"oed.f.transomHeight": "Oberlichthöhe (m)",
"oed.f.mullionRows": "Kämpfer-/Sprossenzeilen",
"oed.kind.dreh": "Dreh",
"oed.kind.kipp": "Kipp",
"oed.kind.drehkipp": "Dreh-Kipp",
+2
View File
@@ -391,6 +391,8 @@ export const en: Record<TranslationKey, string> = {
"oed.f.frameThickness": "Frame depth across (m)",
"oed.f.frameDepth": "Frame depth (m)",
"oed.f.frameWidth": "Frame face width (m)",
"oed.f.transomHeight": "Transom height (m)",
"oed.f.mullionRows": "Transom/muntin rows",
"oed.kind.dreh": "Casement",
"oed.kind.kipp": "Tilt",
"oed.kind.drehkipp": "Turn-tilt",
+48 -1
View File
@@ -478,6 +478,20 @@ function FluegelPanel({
return (
<>
<div className="oed-hint">{t("oed.fluegel.hint")}</div>
{/* Oberlicht (festes Feld über einem Kämpfer) + Kämpfer-/Sprossen-Zeilen. */}
<NumField
label={t("oed.f.transomHeight")}
value={wt.transomHeight ?? 0}
min={0}
onCommit={(n) => patchWt({ transomHeight: n || undefined })}
/>
<NumField
label={t("oed.f.mullionRows")}
value={wt.mullionRows ?? 1}
step={1}
min={1}
onCommit={(n) => patchWt({ mullionRows: Math.max(1, Math.round(n)) })}
/>
<table className="oed-table">
<thead>
<tr>
@@ -832,7 +846,40 @@ function ElevationPreview({
)}
</>
) : (
segEls
<>
{segEls}
{/* Oberlicht-Kämpfer (waagrechte Linie transomHeight unter der OK). */}
{!dt && wt && (wt.transomHeight ?? 0) > 0 && (
<line
x1={pad}
y1={originY + px(wt.transomHeight ?? 0)}
x2={pad + px(w)}
y2={originY + px(wt.transomHeight ?? 0)}
stroke={strokeMain}
/>
)}
{/* Kämpfer-/Sprossen-Zeilen (mullionRows 1 waagrechte Teiler im
Hauptfeld unterhalb eines etwaigen Oberlichts). */}
{!dt &&
wt &&
(() => {
const rows = Math.max(1, Math.round(wt.mullionRows ?? 1));
if (rows <= 1) return null;
const top = originY + px(wt.transomHeight ?? 0);
const fieldH = px(h) - px(wt.transomHeight ?? 0);
return Array.from({ length: rows - 1 }, (_, k) => (
<line
key={k}
x1={pad}
y1={top + (fieldH * (k + 1)) / rows}
x2={pad + px(w)}
y2={top + (fieldH * (k + 1)) / rows}
stroke={strokeMuted}
strokeWidth={0.75}
/>
));
})()}
</>
)}
</svg>
);