Tür/Fenster-Typmodell vertiefen: Rahmenart, Rahmenbreite, Schichteinzug, Oberlicht, Kämpfer

Erweitert DoorType/WindowType um architektonische Detailparameter und
verdrahtet sie im ResourceManager-Typeditor (Tür-/Fenstertypen):
- Tür: frameKind (Zarge/Blockrahmen), frameWidth (Ansichtsbreite Profil),
  insetFromFace + insetFace (Schichteinzug ab Aussen-/Innenfläche),
  transomHeight (Oberlicht über Kämpfer).
- Fenster: mullionRows (horizontale Kämpfer-Teilung), frameWidth,
  insetFromFace + insetFace, transomHeight.
- Seeds: Haustür „Blockrahmen (Oberlicht)" + Fenster „2-flügl. + Oberlicht"
  demonstrieren Einzug/Oberlicht/Kämpfer.
- i18n de/en für alle neuen Felder + Optionen.

Reine Modell-/UI-Schicht; 2D- und 3D-Darstellung folgen separat. Alle
Felder optional → rückwärtskompatibel. tsc sauber.
This commit is contained in:
2026-07-09 01:03:05 +02:00
parent 35299307d6
commit fa40429e63
5 changed files with 207 additions and 0 deletions
+38
View File
@@ -212,9 +212,29 @@ export const sampleProject: Project = {
leafCount: 1,
leafStyle: "glatt",
frameThickness: 0.05,
frameKind: "zarge",
frameWidth: 0.06,
defaultWidth: 0.9,
defaultHeight: 2.0,
},
{
// Aussentür: Blockrahmen, in die Aussenschale zurückgesetzt, mit Oberlicht.
id: "door-entry",
name: "Haustür Blockrahmen (Oberlicht)",
kind: "dreh",
leafCount: 1,
leafStyle: "glas",
glazingRatio: 0.35,
frameThickness: 0.07,
frameKind: "blockrahmen",
frameWidth: 0.09,
insetFromFace: 0.14,
insetFace: "aussen",
transomHeight: 0.45,
threshold: true,
defaultWidth: 1.1,
defaultHeight: 2.1,
},
],
windowTypes: [
{
@@ -224,10 +244,28 @@ export const sampleProject: Project = {
wingCount: 1,
glazing: "zweifach",
frameThickness: 0.06,
frameWidth: 0.06,
defaultSillHeight: 0.9,
defaultWidth: 1.2,
defaultHeight: 1.4,
},
{
// Zweiflügliges Fenster mit Kämpfer, Oberlicht und Schichteinzug.
id: "window-double",
name: "Fenster 2-flügl. + Oberlicht",
kind: "drehkipp",
wingCount: 2,
mullionRows: 1,
glazing: "dreifach",
frameThickness: 0.07,
frameWidth: 0.07,
insetFromFace: 0.12,
insetFace: "aussen",
transomHeight: 0.4,
defaultSillHeight: 0.85,
defaultWidth: 1.8,
defaultHeight: 1.9,
},
],
stairTypes: [
{
+55
View File
@@ -311,6 +311,36 @@ export interface DoorType {
frameThickness: number;
/** Rahmen-/Zargen-Tiefe in Wandrichtung (Meter); fehlt ⇒ aus Wanddicke. */
frameDepth?: number;
/**
* Rahmenart:
* • "zarge" — Zarge, umschliesst die Laibung (schmales Profil, in der
* Wandlaibung sitzend — der Standard im Innenausbau).
* • "blockrahmen" — Blockrahmen, sitzt als kräftiges Rechteckprofil VOR/auf
* der Laibung (typisch bei Aussentüren/älterem Bestand).
* Fehlt es, gilt "zarge".
*/
frameKind?: "zarge" | "blockrahmen";
/**
* Ansichtsbreite des Rahmenprofils (Meter) — die sichtbare Rahmen-Randbreite
* in der Öffnungsebene (Elevation), NICHT die Tiefe quer zur Wand. Fehlt es,
* gilt ein schmaler Default (~0.06 m). Steuert 2D-Rahmenkontur + 3D-Rahmen.
*/
frameWidth?: number;
/**
* Schichteinzug: Abstand der Rahmen-Vorderkante von einer Wandfläche (Meter).
* 0/fehlt ⇒ bündig. > 0 ⇒ der Rahmen sitzt um diesen Betrag in die Wand
* zurückgesetzt (z. B. hinter die Aussenschale eines mehrschichtigen Aufbaus).
* Gemessen von der über {@link insetFace} gewählten Fläche.
*/
insetFromFace?: number;
/** Von welcher Wandfläche der {@link insetFromFace} gemessen wird; Default "aussen". */
insetFace?: "aussen" | "innen";
/**
* Oberlicht: Höhe eines festen, verglasten Oberlichts über dem Türblatt
* (Meter). 0/fehlt ⇒ kein Oberlicht. Das Oberlicht sitzt oberhalb eines
* Kämpfers innerhalb derselben lichten Öffnungshöhe.
*/
transomHeight?: number;
/** Default-Lichtbreite (Meter) für neu platzierte Türen dieses Typs. */
defaultWidth: number;
/** Default-Lichthöhe (Meter). */
@@ -331,12 +361,37 @@ export interface WindowType {
kind: "dreh" | "kipp" | "drehkipp" | "fest" | "schiebe";
/** Anzahl Flügel (14) → Mittelpfosten = wingCount 1 (vgl. `Opening.wingCount`). */
wingCount: number;
/**
* Anzahl horizontaler Felder (Kämpfer-Zeilen): 1 = keine Querteilung, 2 = ein
* Kämpfer, usw. Zusammen mit {@link wingCount} (Spalten) ergibt sich das
* Sprossen-/Flügelraster. Fehlt es, gilt 1.
*/
mullionRows?: number;
/** Verglasung: Einfach/Zweifach/Dreifach (3D-Scheibenzahl). */
glazing: "einfach" | "zweifach" | "dreifach";
/** Rahmenstärke quer zur Wand (Meter). */
frameThickness: number;
/** Rahmen-Tiefe in Wandrichtung (Meter); fehlt ⇒ aus Wanddicke. */
frameDepth?: number;
/**
* Ansichtsbreite des Rahmen-/Flügelprofils (Meter) — sichtbare Randbreite in
* der Öffnungsebene. Fehlt es, gilt ein schmaler Default (~0.06 m). Steuert die
* 2D-Rahmen-/Sprossenkontur und den 3D-Rahmen.
*/
frameWidth?: number;
/**
* Schichteinzug: Abstand der Rahmen-Vorderkante von einer Wandfläche (Meter).
* 0/fehlt ⇒ bündig; > 0 ⇒ der Rahmen sitzt zurückgesetzt (klassisch hinter der
* Aussenschale eines mehrschichtigen Wandaufbaus). Von {@link insetFace} gemessen.
*/
insetFromFace?: number;
/** Von welcher Wandfläche der {@link insetFromFace} gemessen wird; Default "aussen". */
insetFace?: "aussen" | "innen";
/**
* Oberlicht: Höhe eines festen, verglasten Oberlichts über dem Hauptflügel
* (Meter), abgeteilt durch einen Kämpfer. 0/fehlt ⇒ kein Oberlicht.
*/
transomHeight?: number;
/** Default-Brüstungshöhe über Wand-UK (Meter). */
defaultSillHeight: number;
/** Default-Lichtbreite (Meter). */