PENDENZEN: BIM-Tiefe-Studie + Rest-Prioritäten (Decken-Aussparungen P0 usw.) eingetragen
This commit is contained in:
@@ -61,6 +61,19 @@
|
||||
|
||||
## ⏭️ Als Nächstes
|
||||
|
||||
- [ ] **BIM-Elemente „wirklich 1:1" (Tür/Fenster/Dach/Decke)** — volle Studie + Priorisierung: **[docs/design/bim-elements-depth-study.md](docs/design/bim-elements-depth-study.md)** (623 Zeilen, Referenzmatrix VW/ArchiCAD/Revit/Allplan gegen IST). ✅ **Bereits erledigt 2026-07-10:** Fenster-Schachtelung Blendrahmen→Flügelrahmen→Glas + fest/öffenbar + Einbaulage 2D (`9a38636`); Mansard-Untertypen Giebel/Walm/Zelt + Knick (`bfb80b3`); Dach-Dicke 3D (`e99bb24`) + **Dach-Schichtlogik RoofType/Layer[]** (`3a986ec`); zweiflügelige Türen leafCount 2D+3D (`4319e12`); getrennter Traufe/Ortgang-Überstand (`c9baff5`); Glas/glazingPanes 2D+3D + Rollladenkasten (`2e13ec3`/`d131683`). **Offen (nach Doc-Priorität):**
|
||||
- [ ] **Decken-Aussparungen** `Ceiling.openings?: Vec2[][]` (Treppenauge/Schacht) — **P0**, grösster Praxiswert. Braucht Loch-Support im `polygon`-Primitiv (`generatePlan.ts:207`, aktuell KEINE Löcher) + SVG-/glPlan-Renderer + 3D-Slab-Loch (Vorlage `wallMeshCut.ts`). Cross-cutting, ~3 PT.
|
||||
- [ ] **2D-Schnitt-Poché der Dachschichten** — `toSection.ts` behandelt Dächer heute gar nicht; Grundriss-Poché der Dachschichten (`addRoof` in generatePlan analog `addCeilingPoche`).
|
||||
- [ ] **RoofType-ResourceManager-Tab** (Schicht-Editor wie Wand/Decke) — heute nur über sampleProject-Default wählbar, kein Anlegen/Editieren im UI.
|
||||
- [ ] **Decken-Randschicht-Override** (`Ceiling.edgeOverride`, Ringzone anderer Aufbau, Tropfkante/Randdämmung) — P1; **Deckentrenn-Werkzeug** für thermisch getrennte Auskragung (Isokorb, UI-only) — P1.
|
||||
- [ ] **Tür 1:1 Rest:** `glazingRatio` (Teilverglasung), Kassettentür-Geometrie, `frameKind` im 3D (Zarge vs. Blockrahmen), echtes Schwellenprofil; Alt-`Door[]`-Pfad in `Opening` konsolidieren (technische Schuld, zwei Datenwege).
|
||||
- [ ] **Fenster 1:1 Rest:** asymmetrische Rahmenbreiten, echtes Sprossengitter, Bank/Nische, Laibungsverkleidung, Form (Rund/Spitz/Schräg).
|
||||
- [ ] **Dach 1:1 Rest:** Kniestock/Drempel, Krüppelwalm, Kehlen bei L-Grundriss (Straight-Skeleton), Gauben/Dachfenster, Aufschieblinge; Dach im Vertikalschnitt (`toSection.ts`).
|
||||
- [ ] **Geneigte Decke** (Rampe/Gefälle), Deckenspiegel (zweite abgehängte Fläche) — P2/P3.
|
||||
- **Nicht bauen** (Doc §6): VW-Massketten-Apparat, volle Sichtbarkeitsmatrix, Eck-Fenster/-Dach generisch, Beschlags-Produktbibliothek, IFC-Void-Semantik nachrüsten.
|
||||
|
||||
- [ ] **`make2D`-Befehl (Sicht → 2D-Zeichnung mit Füllungen)** (Nutzer-Wunsch 2026-07-10). Aus der AKTUELLEN Sicht — egal ob Grundriss, Schnitt oder 3D — eine flache 2D-Zeichnung aus reinen 2D-Geometrien erzeugen (Linien + Füllungen/Schraffuren, „mit allem"). Zwei Ausgaben: (a) als neue `Drawing2D`-Elemente ins Modell einfügen (auf einer Ziel-Ebene), ODER (b) in die Zwischenablage kopieren (SVG/DXF-Fragment) zum Einfügen anderswo. Vorbild: Vectorworks „2D-Darstellung erzeugen" / Rhino `Make2D`. **Bausteine vorhanden:** Grundriss/Schnitt laufen bereits über `generatePlan()`/`generateSectionPlan()` → RScene → SVG (`sceneToPrintSvg`); für 3D braucht es eine Projektion (HLR/Silhouette) der `projectToModel3d`-Meshes auf die Bildebene (neuer Teil). MVP: Grundriss/Schnitt → Drawing2D + Clipboard; 3D-Projektion als zweite Phase. Scope/Format (SVG vs. DXF vs. native Drawing2D) mit Nutzer schärfen.
|
||||
|
||||
- [x] ~~**Dächer: Auswahl + Attribut-Editieren + Löschen**~~ — **erledigt (`80121a3` + Folge-Commits `7cfdf59`/`eaf57e2`/`64f6179`/`826685c`):** Klick-Auswahl (Traufe-Pick-Polygon + pickRoof), `selectedRoofIds`/`updateRoof`/`RoofInfo`/`roofSelection`; RoofSection-Panel voll editierbar (Form, Firstrichtung X/Y, Neigung(en), **Breite/Tiefe**, Überstand, Dicke, **Traufhöhe**) + Firsthöhe/Fläche read-only; **Auswahl-Hervorhebung im 2D UND 3D** (Draht-Umriss); Löschen; Abwählen an ALLEN Reset-Stellen. **Optional Folge:** ~~3D-Griffe zum Ziehen (Traufe/First)~~ ✅ **erledigt `4ef40a0`** (Eckpunkt-Resize + Verschieben + First-Griff für Neigung). **Noch offen:** Dachfenster, Kehlen bei nicht-rechteckigem Grundriss (Straight-Skeleton).
|
||||
|
||||
- [ ] **Ribbon-UI + modulare Bars** (Nutzer-Vision 2026-07-05, bestätigt: Tab-Schema **2D·3D·BIM·Ansichten**). Voller Plan + datengetriebene Architektur: **[docs/design/ribbon-ui-plan.md](docs/design/ribbon-ui-plan.md)**. Ribbon-Oberleiste mit Tabs ersetzt die Werkzeug-Sidebar; datengetriebene Registry (RibbonItem = tool|command|action) ermöglicht auch eine **modulare Custom-Bar** (gleiche Items, vom Nutzer gewählt). Attribute bekommen volle Höhe, Objektinfo darunter gemergt; XYZ-Box oben rechts bleibt. **Phasen:** ~~(1) Gerüst + 2D/BIM-Tab~~ ✅ (`9d6e86d`), ~~(2) TopBar → Ansichten-Tab mergen~~ ✅ (`85011cb`), ~~(2b) Tabs in die TopBar-Zeile~~ ✅ (`456ebc8`), ~~(2c) OCS-Chrome (kleine Wortmarke + Quick-Access-Icons statt Burger, Zeile 26px)~~ ✅ (`4e3b074`), ~~(2d) Text + Ansichten auf eine Leiste, „Ansichten" als Standard-Tab zuerst~~ ✅ (`fe22cbf`), (3) **teilweise** ✅: Werkzeug-Sidebar aus Default-Layout raus + Attribute volle linke Höhe + Wandtyp-/Deckentyp-Picker ins Attribute-Panel verschoben (Nutzer-Entscheid), `LAYOUT_VERSION`→8; ~~**offen:** Objektinfo unter Attribute mergen~~ ✅ (`3a2cef3`): element-spezifische Abschnitte (Wand/Decke/Öffnung/Treppe/Raum) + Wand-Referenzlinie ins Attribute-Panel verschoben; ObjectInfo trägt nur noch Bezugspunkt + Masse (Nutzer-Wunsch). ~~(4) modulare Custom-Bar~~ ✅ (Tab „Eigene" + +-Picker, localStorage-persistiert). **Offen:** 3D-Tab füllen (aktuell leer; ggf. 3D-spezifisch statt Doppelung mit Ansichten), Band-Höhe/Abstände + 26px-Zeile visuell im Tauri abnehmen, Dauer-Zoom-Anzeige (Statusleiste?) klären. ✅ Vorarbeit: Eigenschaften-Grid im OCS-Stil (`00733d8`), Kreis+Bogen-Werkzeuge (`e454eab`/`bd2b12b`). **Nächster Schritt: im Tauri visuell prüfen (Band-Höhe, Icons, Aktiv-Highlight), dann Phase 2/3.**
|
||||
|
||||
@@ -0,0 +1,623 @@
|
||||
# BIM-Elementtiefe — Tür, Fenster, Dach, Decke ("wirklich 1:1")
|
||||
|
||||
## 0. Zweck und Abgrenzung
|
||||
|
||||
DOSSIER modelliert Bauteile heute semantisch (kein reines Zeichenprogramm) und
|
||||
hat für Wand/Decke bereits eine mehrschichtige Aufbaulogik (`Component[]` via
|
||||
`WallType`/`CeilingType`). Türen und Fenster haben seit
|
||||
`docs/design/window-editor-vectorworks-study.md` einen dedizierten,
|
||||
phasierten Ausbauplan (Flügeltabelle, Verglasung, Sonnenschutz). Was fehlt,
|
||||
ist die gleiche Tiefe für **Dach** (keine Schichtlogik, keine Mansard-
|
||||
Untertypen, kein Kehl-/Gaubenmodell) und für die **Decken-Randterminierung**
|
||||
(Deckenrand als reines Polygon ohne Kantendetail).
|
||||
|
||||
Dieses Dokument nimmt die vier Bauteile Tür, Fenster, Dach, Decke und hält
|
||||
sie gegen die reale Tiefe vollständiger BIM-Programme (Vectorworks Architektur,
|
||||
ArchiCAD, Revit, Allplan). Ziel ist NICHT, jedes Feature dieser Programme zu
|
||||
kopieren, sondern zu benennen, welche Lücken einen echten "1:1-Zuwachs" für
|
||||
ein Einfamilienhaus-/Wohnbau-Tool wie DOSSIER bringen — und welche reiner
|
||||
Ballast wären (Abschnitt 6).
|
||||
|
||||
Für Fenster/Tür dupliziert dieses Dokument NICHT die Mapping-Tabelle aus
|
||||
`window-editor-vectorworks-study.md` — es referenziert sie und ergänzt, was
|
||||
dort fehlt (v. a. Tür-Tiefe, die die Studie nur am Rand behandelt, und die
|
||||
architektonischen Grenzen des heutigen Öffnungsmodells). Für Wand-Schichtlogik
|
||||
siehe `docs/design/parametric-walls.md` (Raster/Modul-Regeln, nicht
|
||||
Gegenstand hier) und `docs/design/elements.md` (ältere Gesamtplanung, Stand
|
||||
vor der aktuellen `Component`/`Layer`-Implementierung — dort abweichende
|
||||
Typnamen wie `Slab`/`ProfileDef`, hier durchgängig der IST-Code zitiert).
|
||||
|
||||
Alle IST-Aussagen sind mit Datei:Zeile belegt (verifiziert per Lesen des
|
||||
Codes, Stand dieses Commits). Status-Legende der Lücken-Tabellen: **✓**
|
||||
vorhanden und gerendert · **~** Feld existiert, Renderer liest es nicht oder
|
||||
nur grob · **✗** fehlt vollständig. Priorität P0 (grösster 1:1-Zuwachs, bald)
|
||||
… P3 (Ballast, nur auf Nachfrage). Aufwand grob in Personentagen (PT).
|
||||
|
||||
---
|
||||
|
||||
## 1. Gemeinsames Fundament: das Schicht-Muster
|
||||
|
||||
Der zentrale Baustein, den DOSSIER bereits hat und der sich wiederverwenden
|
||||
lässt, ist `Component`/`Layer`:
|
||||
|
||||
- `Component` (`src/model/types.ts:196`) — ein Bauteil-Material: Poché-Farbe
|
||||
(`color`/`foreground`/`background`), Schnitt-Schraffur (`hatchId`) UND
|
||||
Ansichts-Schraffur (`viewHatchId`, für unaufgeschnittene Aufsicht),
|
||||
optionales PBR-Material (`material`), Kürzel (`abbrev`) und ein
|
||||
Verschneidungs-Rang (`joinPriority`, `types.ts:241`) für die Boolean-
|
||||
Dominanz am Stoss.
|
||||
- `Layer` (`types.ts:245`) — eine Schicht: `componentId` + `thickness` +
|
||||
optionaler Fugen-Linienstil (`jointLineStyleId`).
|
||||
- `WallType` (`types.ts:260`) und `CeilingType` (`types.ts:273`) sind BEIDE
|
||||
nur `{ id, name, layers: Layer[] }` — bewusst derselbe Typ, "das
|
||||
horizontale Gegenstück zum WallType" (Kommentar `types.ts:266-271`).
|
||||
|
||||
Das Muster ist also bereits zweimal (Wand, Decke) verifiziert:
|
||||
`ceilingThickness()` (`types.ts:2104`) summiert die Layer-Dicken,
|
||||
`emitSlabs()` (`src/plan/toWalls3d.ts:1352-1419`) stapelt sie im 3D als
|
||||
einzelne `RSlab`-Scheiben proportional in `[zBottom, zTop]`, `addCeilingPoche`
|
||||
(`src/plan/generatePlan.ts:2453`) zeichnet die Aufsicht mit der
|
||||
Ansichts-Schraffur der ERSTEN Schicht, und `toSection.ts:633`
|
||||
(`splitSlabLayers`) zerlegt die Decke im ECHTEN Schnitt in
|
||||
Einzel-Bänder je Schicht (mit `resolveCeilingSectionStyle`,
|
||||
`generatePlan.ts:591`, als Schraffur-/Farbquelle).
|
||||
|
||||
**Der Dach-Vorschlag in Abschnitt 4 ist im Kern: dasselbe Muster ein drittes
|
||||
Mal anwenden.** Das ist der günstigste Weg zu echter Dach-1:1-Tiefe, weil
|
||||
Layer-Resolver, Schraffur-Ketten (`resolveHatch`/`resolveForeground` etc.,
|
||||
`generatePlan.ts:409-536`) und die 3D-Stapel-Logik bereits bestehen und nur
|
||||
auf einen neuen Aufbau-Typ angewendet werden müssen statt neu erfunden.
|
||||
|
||||
Architektonische Randbemerkung: `Project` führt bereits `wallTypes`,
|
||||
`ceilingTypes?`, `doorTypes?`, `windowTypes?`, `stairTypes?`
|
||||
(`types.ts:1936-1958`) als eigene Bibliotheken — aber **kein `roofTypes?`**.
|
||||
`Roof` (`types.ts:1022`) trägt nur ein einzelnes `thickness: number`
|
||||
(`types.ts:1044`), keinen Aufbau-Verweis. Das ist die strukturelle Lücke,
|
||||
die Abschnitt 4 schliesst.
|
||||
|
||||
---
|
||||
|
||||
## 2. Tür (Door)
|
||||
|
||||
### 2.1 Was ein vollständiges BIM-Tool bietet
|
||||
|
||||
| Bereich | Typische Parameter (VW/ArchiCAD/Revit/Allplan) |
|
||||
|---|---|
|
||||
| Bauart | Dreh-, Schiebe- (auf/vor Wand), Falt-, Pendel-, Karusselltür, reiner Durchbruch |
|
||||
| Blattzahl/-teilung | 1-/2-flügelig, Gangflügel + Standflügel (unterschiedliche Breite), Seitenteile links/rechts |
|
||||
| Blattausführung | glatt, kassettiert, Glasfüllung (Anteil/Sprossenbild), Brandschutz-/Schallschutz-Kennwert |
|
||||
| Rahmen/Zarge | Zarge vs. Blockrahmen, Rahmenbreite je Kante, Zargentiefe, Bekleidung/Abdeckleiste, Falz |
|
||||
| Schwelle | ohne, Alu-Flachschwelle, Anschlagdichtung, Bodenanschluss/Gefälle bei Aussentüren |
|
||||
| Sturz/Oberlicht | festverglastes Oberlicht mit eigenem Rahmen, Kämpfer, Sprossenbild |
|
||||
| Seitenteile | fest verglaste Seitenteile links/rechts, eigene Breite |
|
||||
| Form | rechteckig, Rundbogen, Segmentbogen, Stichbogen — bei Aussen-/Haustüren verbreitet |
|
||||
| Beschlag | Drücker/Knauf-Typ, Schild, Schliesszylinder, Bänder sichtbar/verdeckt |
|
||||
| 2D-Darstellung | Blatt + Schwenkbogen (Grundriss), eigene Ansichtssymbolik in Schnitt/Elevation, Sturzlinien |
|
||||
| Material/Schichten | Blatt-Kernaufbau (bei Brand-/Schallschutztüren mehrschichtig, analog Wand) |
|
||||
| IFC-Rolle | `IfcDoor` mit `IfcDoorType` (PredefinedType), `OverallWidth/Height`, `IfcDoorPanelProperties`, Void in der Wirtswand |
|
||||
|
||||
### 2.2 IST in DOSSIER
|
||||
|
||||
`Opening` mit `kind: "door"` (`src/model/types.ts:1068`) referenziert
|
||||
optional einen `DoorType` (`types.ts:296`). Vorhanden am Typ: `kind`
|
||||
("dreh"/"schiebe"/"wandoeffnung", :303), `leafCount` (1|2, :305), `leafStyle`
|
||||
("glatt"/"kassette"/"glas", :307), `glazingRatio` (:309), `frameThickness`/
|
||||
`frameDepth`/`frameKind`("zarge"/"blockrahmen")/`frameWidth`
|
||||
(:311-328), `insetFromFace`/`insetFace` (:335-337), `transomHeight` (:343),
|
||||
`threshold` (:349). Am Element selbst: `swing`/`hinge`/`swingAngle`/
|
||||
`openingDir` (:1104-1108), `lintelLines` (Sturzlinien, :1119) und
|
||||
`doorType: "normal"|"wandoeffnung"` (:1100) — ein zweites, mit `DoorType.kind`
|
||||
teilweise redundantes Feld.
|
||||
|
||||
Renderer-Konsum, real geprüft:
|
||||
|
||||
- **2D-Blatt ist IMMER einflügelig.** `addOpeningSymbol` (Tür-Zweig,
|
||||
`src/plan/generatePlan.ts:2091-2213`) zeichnet genau EINE Blattlinie
|
||||
(`sym.hinge → sym.openEnd`) und EINEN Schwenkbogen — `DoorType.leafCount`
|
||||
wird an keiner Stelle in `generatePlan.ts` gelesen (kein Treffer für
|
||||
`leafCount` im ganzen Plan-Renderer). Eine zweiflügelige Tür sieht im Plan
|
||||
aus wie eine einflügelige.
|
||||
- **3D genauso**: `resolveOpeningFrame` (`src/plan/toWalls3d.ts:1861-1886`)
|
||||
setzt für Türen hart `wingCount: 1`, unabhängig von `leafCount`.
|
||||
- `leafStyle` wirkt NUR binär: `"glas"` schaltet eine volle Verglasung frei
|
||||
(`glazed: dt.leafStyle === "glas"`, `toWalls3d.ts:1883`) — `glazingRatio`
|
||||
(Teilverglasung, z. B. 60 % Glasanteil im oberen Blattbereich) wird an
|
||||
keiner Stelle gelesen. "kassette" (Kassettentür) hat keine eigene Geometrie,
|
||||
fällt auf dieselbe Quader-Darstellung wie "glatt" zurück.
|
||||
`frameKind: "blockrahmen"` wirkt NUR im 2D-Rahmenband
|
||||
(`generatePlan.ts:1996`, `isBlock`), im 3D gibt es keinen Unterschied zur
|
||||
Zarge (`frameMeshesForOpening`, `toWalls3d.ts:1936`, kennt kein
|
||||
`frameKind`).
|
||||
- `threshold` steuert `hasSill` im 3D-Rahmen (`toWalls3d.ts:1880`), was einen
|
||||
einfachen Schwellen-Riegel zeichnet — kein eigenes Schwellenprofil,
|
||||
keine Gefälle-/Dichtungsdarstellung.
|
||||
- Es gibt eine ZWEITE, ältere Tür-Repräsentation: `Door`
|
||||
(`types.ts:1333`, `project.doors: Door[]`) mit eigenem Symbol-Renderer
|
||||
`addDoorSymbol` (`generatePlan.ts:1840-1899`) — strukturell identisch zum
|
||||
`Opening`-Pfad, aber ohne jeden Typ-Bezug. Zwei parallele Datenwege für
|
||||
dieselbe Bauteilart sind selbst technische Schuld, nicht nur ein
|
||||
BIM-Feature-Gap.
|
||||
- Form (Rundbogen etc.) existiert nicht: `Opening.width`/`height` sind ein
|
||||
reines Rechteck, `wallGaps`/`buildWallFootprints`
|
||||
(`generatePlan.ts:1363-1457`) schneiden nur rechteckige Bänder aus der
|
||||
Wand-Poché.
|
||||
- IFC-Export: `IfcDoor` wird erzeugt (`src/export/exportIfc.ts:30-31`), aber
|
||||
als reine Box-Geometrie ohne `IfcDoorType`/`PredefinedType` und ohne
|
||||
`IfcOpeningElement`-Void (bewusste Design-Entscheidung, siehe Kommentar
|
||||
`exportIfc.ts:18-31`: das Loch steckt bereits im geschnittenen Wand-Mesh).
|
||||
|
||||
### 2.3 Lücken (Tür)
|
||||
|
||||
| Feature | Status | Priorität | Aufwand |
|
||||
|---|---|---|---|
|
||||
| Zweiflügelige Tür rendert 2 Blätter (2D+3D) | ✗ (`leafCount` ungelesen) | **P0** | 2 PT |
|
||||
| Teilverglasung nach `glazingRatio` (2D-Linie + 3D-Split) | ✗ | P1 | 1.5 PT |
|
||||
| Kassettentür eigene Blattgeometrie (Füllungsfelder) | ✗ | P2 | 2 PT |
|
||||
| `frameKind` (Blockrahmen) auch im 3D wirksam | ~ | P1 | 1 PT |
|
||||
| Seitenteile (feste Verglasung links/rechts der Tür) | ✗ | P1 | 2 PT |
|
||||
| Rundbogen-/Segmentbogen-Türform | ✗ | P2 | 4 PT (braucht gekrümmten Wandausschnitt, s. §5.3) |
|
||||
| Schwellenprofil (Alu-Flachschwelle, Dichtung) statt Riegel | ✗ | P2 | 1 PT |
|
||||
| `Door`/`Opening`-Doppelpfad konsolidieren | technische Schuld | P1 | 3 PT (Migration) |
|
||||
| Beschlag (Drücker/Knauf) als Mesh + 2D-Symbol | ✗ | P2 | 1.5 PT |
|
||||
| IFC `IfcDoorType`/PredefinedType/OverallWidth-Height-Properties | ~ | P2 | 1 PT |
|
||||
|
||||
### 2.4 Umsetzungsvorschlag
|
||||
|
||||
**Modell**: `DoorType.leafs?: { width: number; hingeSide: "left"|"right";
|
||||
fixed?: boolean }[]` analog `WindowType.sashes` (`SashDef`, `types.ts:367`) —
|
||||
bewusst dieselbe Struktur, damit `resolveSashSpans` (`toWalls3d.ts:2019`) UND
|
||||
die 2D-Pfostenlinien-Logik direkt wiederverwendet werden können, statt eine
|
||||
Tür-eigene Variante zu bauen. Ein `fixed: true`-Leaf ist das Seitenteil.
|
||||
`glazingRatio` wandert vom Skalar zu einer klaren Geometrie: Kämpferhöhe
|
||||
innerhalb des Blatts, gerendert wie das bestehende Oberlicht
|
||||
(`transomHeight`), nur INNERHALB des Blattrahmens statt darüber.
|
||||
|
||||
**2D**: `addOpeningSymbol` (Tür-Zweig) über die Leaf-Liste iterieren statt
|
||||
einer festen Blattlinie; pro Leaf ein eigenes `hinge`/`swing` (Default:
|
||||
alternierend wie bei Fenstern, `sashesOfWindowType`, `types.ts:2132`).
|
||||
|
||||
**3D**: `resolveOpeningFrame` liefert `wingCount = leafs.length` statt hart 1;
|
||||
`frameMeshesForOpening` (bereits generisch über `params.sashes`) übernimmt
|
||||
die Mehrflügel-Darstellung ohne Änderung — das ist der Vorteil der
|
||||
Struktur-Wiederverwendung.
|
||||
|
||||
**UI**: Im Tür-Editor (sofern nach dem Muster von
|
||||
`window-editor-vectorworks-study.md` gebaut) eine Flügeltabelle wie bei
|
||||
Fenstern, nur mit Tür-Vokabular (Gangflügel/Standflügel statt Flügel 1/2).
|
||||
|
||||
---
|
||||
|
||||
## 3. Fenster (Window)
|
||||
|
||||
Für Fenster existiert bereits eine vollständige Referenzmatrix in
|
||||
`docs/design/window-editor-vectorworks-study.md` §2 (Basiseinstellungen,
|
||||
Grösse, Brüstung, Rahmen, Flügeltabelle, Laibung/Form/Ober-Unterlicht,
|
||||
Sonnenschutz/Beschlag, Attribute/IFC) mit eigener P0–P3-Phasierung. Diese
|
||||
Studie ist der massgebliche Bezugspunkt; hier nur die Delta-Punkte, die dort
|
||||
fehlen oder seither vom IST abweichen.
|
||||
|
||||
### 3.1 IST-Ergänzung (was die Studie nicht/knapp behandelt)
|
||||
|
||||
- `WindowType.glazing` (einfach/zweifach/dreifach) ist bis heute NICHT
|
||||
renderwirksam — bestätigt weiterhin: `glazingPanesOf()` (`types.ts:2149`)
|
||||
wird von `glassPanesForOpening` in `toWalls3d.ts` konsumiert, aber die
|
||||
Studie selbst vermerkt (Zeile 61-65 dort), dass der 2D-Pfad die
|
||||
Scheibenzahl weiterhin allein aus `DetailLevel` ableitet, nicht aus
|
||||
`glazingPanes`. Das ist über ein Jahr nach der Studie noch offen — ein
|
||||
Hinweis, dass P0/P1-Posten aus Fenster-Studien real liegen bleiben, wenn
|
||||
niemand sie explizit nachzieht.
|
||||
- `sillBoard` (Fensterbank keine/innen/aussen/beide, `types.ts:447`) ist
|
||||
weiterhin ungenutzt (kein Treffer für `sillBoard` in `toWalls3d.ts` oder
|
||||
`generatePlan.ts` ausserhalb der Typ-Definition und des Editors) —
|
||||
entspricht dem in der Studie als P1 markierten "Fensterbank erstellen".
|
||||
|
||||
### 3.2 Architektonische Grenze: gekrümmte Öffnungen
|
||||
|
||||
Sowohl die Fenster-Studie (§2.6, "Form Eckig/Schräg/Spitz/Rund", P2, 4 PT)
|
||||
als auch dieser Auftrag nennen Rundbogen-/Spitzbogenfenster. Das ist teurer,
|
||||
als die Aufwandschätzung suggeriert, weil das gesamte Öffnungsmodell auf
|
||||
GERADEN Bändern basiert: `buildWallFootprints`/`wallGaps`
|
||||
(`generatePlan.ts:1363-1457`) schneiden ein rechteckiges Intervall `[from,to]`
|
||||
entlang der Wandachse aus der Poché, `openingAxisBox`
|
||||
(`toWalls3d.ts:1739`) baut im 3D ebenso einen achsparallelen Quader. Eine
|
||||
Bogenform braucht entweder (a) eine gekrümmte Zusatzkontur, die die
|
||||
Rechteck-Aussparung oben kappt (2D: zusätzliche Polygon-Boolean gegen die
|
||||
Poché; 3D: gekrümmte Deckfläche statt ebenem Sturz) oder (b) ein komplett
|
||||
neues, polygonbasiertes Öffnungsmodell. Vorschlag: (a) zuerst — ein
|
||||
`headShape: "eckig"|"segment"|"spitz"|"rund"` mit Zusatzparametern
|
||||
(Stichhöhe/Radius), das NUR die obere Kante der bestehenden Rechteck-Öffnung
|
||||
ersetzt, während Pfosten/Sohlbank rechteckig bleiben. Deckt die reale
|
||||
Mehrheit der Fälle (Haustür mit Rundbogen, Dachflächenfenster-Giebel) ohne
|
||||
das Kernmodell umzubauen.
|
||||
|
||||
### 3.3 Lücken (Fenster, Delta zur Studie)
|
||||
|
||||
| Feature | Status | Priorität | Aufwand |
|
||||
|---|---|---|---|
|
||||
| `glazing`/`glazingPanes` 2D-wirksam (Scheibenzahl statt nur DetailLevel) | ~ (weiter offen seit Studie) | **P0** | 1 PT |
|
||||
| `sillBoard` gerendert (2D-Kontur + 3D-Box) | ✗ | P1 | 2 PT |
|
||||
| Kopfform (Rundbogen/Spitzbogen/Schräge) über Zusatzkontur | ✗ | P2 | 5 PT (s. §3.2) |
|
||||
| Echtes Sprossengitter (Glasteilung UNABHÄNGIG von Flügelrahmen) | ✗ | P1 | 2 PT |
|
||||
| Alle übrigen Fenster-Lücken | siehe window-editor-vectorworks-study.md §2/§4 | — | — |
|
||||
|
||||
---
|
||||
|
||||
## 4. Dach (Roof)
|
||||
|
||||
### 4.1 Was ein vollständiges BIM-Tool bietet
|
||||
|
||||
| Bereich | Typische Parameter |
|
||||
|---|---|
|
||||
| Grundform | Pult, Sattel, Walm, Krüppelwalm, Zeltdach, Mansarde (mit Untertyp Giebel-/Walm-/Zeltmansarde), Flach/Terrassendach, Sheddach, Tonnendach, freie Neigungsflächen je Kante |
|
||||
| Grundriss | beliebiges Polygon (nicht nur Rechteck), automatische Kehlen/Grate über Straight-Skeleton bei L-/T-/U-Grundrissen |
|
||||
| Neigung | je Dachfläche einzeln editierbar, unterschiedliche Neigungen je Seite |
|
||||
| Schichtaufbau | Eindeckung (Ziegel/Blech/Bitumen), Lattung, Konterlattung, Unterdach/-spannbahn, Sparren/Dämmung zwischen Sparren, Dampfbremse, Innenverkleidung — analog Wandaufbau, mit Deckenanschluss |
|
||||
| Überstand | Traufe und Ortgang UNABHÄNGIG editierbar (Betrag + Ausbildung), Aufschiebling (Neigungsknick am Traufende), Ortganddetail (Windbrett, Blech) |
|
||||
| Kniestock/Drempel | vertikale Wandaufkantung zwischen Deckenoberkante und Dach-Traufpunkt, definiert First-/Trauf-Geometrie mit |
|
||||
| Öffnungen im Dach | Dachflächenfenster (schräg, in der Dachebene), Dachgauben (Schlepp-, Sattel-, Walm-, Spitzgaube, Fledermausgaube) als eigenständige Sekundärdächer mit eigenem First |
|
||||
| First/Grat/Kehl/Ortgang | eigene Linientypen in 2D-Ansicht (Dachaufsicht) UND im Schnitt sichtbar (Sparrenlage, Dämmstärke) |
|
||||
| Material/Poché | Dachfläche in der Aufsicht mit Eindeckungs-Symbol/-Schraffur (Ziegel-Textur o. Ä.), im Schnitt Vollschichten wie eine geneigte Wand |
|
||||
| IFC-Rolle | `IfcRoof` (aggregiert `IfcRoofType`), Dachflächen selbst oft als `IfcSlab`-artige Elemente mit `IfcMaterialLayerSetUsage`, Gauben als eigene `IfcRoof`/`IfcBuildingElementProxy`-Unterobjekte |
|
||||
|
||||
### 4.2 IST in DOSSIER
|
||||
|
||||
`Roof` (`src/model/types.ts:1022-1047`) rechnet ausschliesslich auf der
|
||||
**Bounding-Box** des Umrisses (Kommentar `types.ts:1016-1020`: "First entlang
|
||||
einer Hauptachse ... die gängige, intuitive Vereinfachung"). Geometrie kommt
|
||||
aus `roofGeometry()`/`computeCanonical()` (`src/geometry/roof.ts:80-267`),
|
||||
explizit **"ohne Straight-Skeleton"** (Kommentar `roof.ts:5`). Unterstützte
|
||||
`RoofShape` (`types.ts:1013`): flach/pult/sattel/walm/mansarde/zelt — je EINE
|
||||
feste Berechnung, keine Untertypen. Mansarde hat eine feste, nicht editierbare
|
||||
Knick-Geometrie (`d1 = halfD * 0.4`, `roof.ts:181` — 40 % der Tiefe von der
|
||||
Traufe, hart codiert, keine Möglichkeit den Umbruchpunkt zu verschieben).
|
||||
|
||||
Konkrete, verifizierte Lücken:
|
||||
|
||||
- **Kein Schichtaufbau.** `Roof.thickness` (`types.ts:1044`) ist ein
|
||||
einzelner Skalar. Er wird an KEINER Stelle im Code gelesen (`grep
|
||||
"roof.thickness"` über `toWalls3d.ts`/`generatePlan.ts`/`roof.ts` liefert
|
||||
null Treffer) — das Feld existiert im Typ, ist aber komplett tot. Die
|
||||
3D-Dachfläche ist eine unendlich dünne, einfarbige Fläche
|
||||
(`emitRoofs()`, `src/plan/toWalls3d.ts:1670-1684`: nur `plane.pts`/
|
||||
`gable`-Fans, EINE Farbe `ROOF_RGB` bzw. `roof.color`, keine Dicke, keine
|
||||
Materialschichten).
|
||||
- **Kein `RoofType`.** `Project` hat `wallTypes`, `ceilingTypes?`,
|
||||
`doorTypes?`, `windowTypes?`, `stairTypes?` (`types.ts:1936-1958`), aber
|
||||
kein `roofTypes?`. Es gibt keinen Bauteil-Bibliothekseintrag für Dächer.
|
||||
- **2D-Grundriss zeigt keine Poché.** `addRoof()`
|
||||
(`src/plan/generatePlan.ts:2549-2605`) zeichnet AUSSCHLIESSLICH Linien
|
||||
(Traufe/First/Grat/Knick, je feste Strichstärke `ROOF_EAVES_MM`/
|
||||
`ROOF_RIDGE_MM`/`ROOF_HIP_MM`) — keine Fläche, keine Schraffur, keine
|
||||
Materialkennzeichnung. Deckungsgleich mit Wand/Decke, die BEIDE eine
|
||||
Poché-Füllung mit Schraffur haben (`addWallPoche`, `addCeilingPoche`),
|
||||
bleibt das Dach in der Aufsicht ein reines Liniendiagramm.
|
||||
- **Kein Schnitt.** `src/plan/toSection.ts` hat KEINE Roof-Behandlung (kein
|
||||
Treffer für `roof`/`Roof` im gesamten Datei-Grep). Ein Vertikalschnitt
|
||||
durch ein Gebäude mit Satteldach zeigt heute keine Dachlinie, keine
|
||||
Sparrenlage, keine Firstprojektion — ein Kernstück der BIM-1:1-Erwartung
|
||||
fehlt vollständig.
|
||||
- **Kein IFC.** `exportIfc.ts` erzeugt `IfcWall`, `IfcSlab`, `IfcDoor`/
|
||||
`IfcWindow`, `IfcStair`, `IfcBuildingElementProxy` (Kommentar
|
||||
`exportIfc.ts:18-36`) — `Roof`/`IfcRoof` ist in der Abbildungsliste NICHT
|
||||
aufgeführt und wird beim Export komplett übersprungen.
|
||||
- **Kein Straight-Skeleton, kein L-Grundriss mit Kehle.** Ein L-förmiger
|
||||
Baukörper mit durchgehendem Satteldach (Kehle an der Innenecke) lässt sich
|
||||
nicht abbilden — die BBox-Rechnung würde ein Rechteck über die ganze
|
||||
L-Ausdehnung legen.
|
||||
- **Keine Gauben, keine Dachfenster.** Kein Treffer für Gaube/Dormer im
|
||||
gesamten `src`-Baum (verifiziert per Suche).
|
||||
- **Kein Kniestock als Bauteilbeziehung.** `baseElevation` (`types.ts:1042`)
|
||||
erlaubt zwar, die Traufhöhe manuell über die Geschoss-Oberkante zu heben
|
||||
(ein Kommentar in `ObjectInfoPanel.tsx:549` erwähnt das explizit als
|
||||
Nutzungsmuster), aber es gibt keine Wand-Dach-Kopplung, die einen
|
||||
Drempel/Kniestock als eigenes, vermasstes Bauteil führt — der Nutzer muss
|
||||
die Zahl manuell abstimmen.
|
||||
- **Traufe/Ortgang nicht unabhängig.** `overhang` (`types.ts:1038`) ist EIN
|
||||
Wert "ringsum" — Traufüberstand und Ortgangüberstand (oft unterschiedlich,
|
||||
z. B. 0.5 m Traufe / 0.3 m Ortgang) sind nicht trennbar.
|
||||
- **UI**: `ObjectInfoPanel.tsx:479-561` bietet volle Instanz-Bearbeitung
|
||||
(shape/ridgeAxis/pitch/pitchUpper/width/depth/overhang/thickness/
|
||||
baseElevation), aber keine Typ-/Stil-Verwaltung (kein `ResourceManager`-
|
||||
Eintrag für Dächer, anders als Wand/Decke/Tür/Fenster/Treppe).
|
||||
|
||||
### 4.3 Dach-Schichtlogik — konkreter Vorschlag (Kernthema dieses Dokuments)
|
||||
|
||||
Der Vorschlag überträgt exakt das `WallType`/`CeilingType`-Muster:
|
||||
|
||||
```
|
||||
export interface RoofType {
|
||||
id: string;
|
||||
name: string;
|
||||
/** Aussen (Eindeckung) → innen (Verkleidung), analog WallType.layers. */
|
||||
layers: Layer[];
|
||||
}
|
||||
```
|
||||
|
||||
Kein neuer Layer-Typ nötig — `Layer` (`types.ts:245`) ist bereits
|
||||
"Bauteil + Dicke + optionaler Fugen-Linienstil", unabhängig davon ob sie
|
||||
horizontal (Decke), vertikal (Wand) oder GENEIGT (Dach) gestapelt wird, weil
|
||||
die Stapel-Richtung beim jeweiligen Renderer entschieden wird, nicht im
|
||||
Datentyp. Typische Schichtfolge eines Steildachs (Eindeckung → Konterlattung
|
||||
→ Lattung → Unterdach/Unterdeckbahn → Sparren+Dämmung → Dampfbremse →
|
||||
Innenverkleidung/GKB) bildet sich 1:1 auf `Layer[]` ab, jede Schicht bekommt
|
||||
ein `Component` mit eigener Schraffur/Farbe/Material wie bei Wand/Decke.
|
||||
|
||||
`Roof.thickness: number` wird zu `Roof.roofTypeId?: string` (Verweis, analog
|
||||
`Ceiling.ceilingTypeId`) mit optionaler `thicknessOverride?: number` — exakt
|
||||
das Muster aus `Ceiling.thickness?` (`types.ts:952-953`, "Optionale
|
||||
Übersteuerung der Gesamtdicke ... sonst Typ-Dicke"). `Project.roofTypes?:
|
||||
RoofType[]` ergänzt die Bibliothek.
|
||||
|
||||
**3D-Konsum**: `emitRoofs()` (`toWalls3d.ts:1670`) baut heute EINE
|
||||
Dreiecksfläche je Dachfläche+Giebel. Mit Layern wird daraus — analog
|
||||
`emitSlabs()` (`toWalls3d.ts:1352-1419`, das bereits genau diese
|
||||
Proportional-Stapel-Logik für Decken hat) — ein Stapel PARALLEL versetzter
|
||||
Flächen entlang der Flächennormalen (nicht entlang Z wie bei der Decke,
|
||||
sondern entlang der Dachflächen-Normalen `n`, siehe `RoofGeometry.planes`
|
||||
in `roof.ts:19-21`). Jede Schicht wird zum eigenen `RMesh` mit eigener Farbe/
|
||||
Schraffur-Metadaten (`RCutMeta`, wie bei `emitSlabs`). Der Versatz macht
|
||||
zugleich die Dachdicke sichtbar (heute unendlich dünn) — ein Nebengewinn ohne
|
||||
Mehraufwand.
|
||||
|
||||
**2D-Konsum (Grundriss/Aufsicht)**: `addRoof()` bekommt eine Poché-Fläche
|
||||
analog `addCeilingPoche` — Füllung mit der `viewHatchId` der obersten Schicht
|
||||
(Eindeckungssymbol), gerahmt von den bestehenden Traufe/First/Grat/Knick-
|
||||
Linien (die bleiben unverändert, sie sind flächen-unabhängig).
|
||||
|
||||
**2D-Konsum (Schnitt, der grössere Umbau)**: `toSection.ts` braucht einen
|
||||
neuen Roof-Zweig. Ansatz: die Dachebene mit der Schnittebene schneiden
|
||||
(Ebene-Ebene-Schnitt, da `RoofPlane` eben ist), daraus ein Liniensegment je
|
||||
betroffener Dachfläche gewinnen, dann `Layer[]` senkrecht ZUR
|
||||
Dachneigung als Bandsequenz auftragen (wie `resolveWallBands`,
|
||||
`toWalls3d.ts:521`, aber gedreht um den Neigungswinkel `pitchDeg`) und mit
|
||||
`splitSlabLayers`-Logik (`toSection.ts:633`) füllen. Das ist der aufwendigste
|
||||
Einzelposten dieses Dokuments (siehe Prioritätsliste), aber ohne ihn bleibt
|
||||
"Dach im Schnitt" eine reine Lücke.
|
||||
|
||||
**UI**: Ein `RoofType`-Eintrag im `ResourceManager`
|
||||
(`src/ui/ResourceManager.tsx`), identisch zum bestehenden Ceiling-Typ-Editor
|
||||
(Schicht-Liste, Dicke, Bauteil-Zuweisung) — kein neues UI-Paradigma.
|
||||
|
||||
### 4.4 Dach 1:1 — Formen, Kehlen, Gauben (konkreter Vorschlag)
|
||||
|
||||
Reihenfolge nach Aufwand/Nutzen, NICHT alles auf einmal:
|
||||
|
||||
1. **Traufe/Ortgang trennen**: `overhang` → `{ eaves: number; gable: number
|
||||
}`. Kleine, lokale Änderung in `roof.ts` (zwei statt einer Offset-Variable
|
||||
je nach Kantentyp), grosser optischer Gewinn (das ist die häufigste
|
||||
Rückmeldung "sieht nicht echt aus" bei Steildächern mit gleich langem
|
||||
Überstand allseitig).
|
||||
2. **Mansard-Untertyp** (`mansardVariant: "walm"|"giebel"|"zelt"`, wie in der
|
||||
älteren Planung `elements.md:298` bereits vorgesehen, aber nie gebaut):
|
||||
steuert nur, wie die STIRNSEITE der Mansarde behandelt wird (heute IMMER
|
||||
`gables` = vertikale Giebelfläche, `roof.ts:200-203`) — bei "walm" wird
|
||||
daraus eine geneigte Fläche wie beim Walmdach. Mittlerer Aufwand, da die
|
||||
Mansard-Berechnung (`roof.ts:176-206`) bereits alle Eckpunkte hat, nur die
|
||||
Gable-Erzeugung muss konditional werden.
|
||||
3. **Editierbarer Mansard-Knickpunkt** (`kinkDepthRatio?: number` statt hart
|
||||
`0.4`, `roof.ts:181`) — 0.5 PT, reine Parametrisierung einer bestehenden
|
||||
Konstante.
|
||||
4. **Krüppelwalm** (`hipTruncation?: number`, 0 = voller Walm, 1 = voller
|
||||
Giebel/Sattel): der First bleibt voll lang, nur ein kleines Walmstück am
|
||||
First-Ende — technisch eine Variation der bestehenden `walm`-Berechnung
|
||||
(`roof.ts:147-174`, der First-Verkürzungs-Faktor `halfD` wird
|
||||
parametrisiert statt fix).
|
||||
5. **Dachflächenfenster** (kein neues Bauteil — ein `Opening`-ähnliches
|
||||
Element, das in eine Dachfläche statt eine Wand einschneidet): neuer
|
||||
`hostRoofId`-Pfad, eigenständiger Vorschlag; lohnt sich erst NACH der
|
||||
Schichtlogik, weil das Fenster sonst nicht "in die Dämmebene" passt.
|
||||
6. **Gauben** (Schlepp-/Sattelgaube als eigenständiges Sekundär-`Roof` mit
|
||||
eigenem `outline`/`baseElevation`, das in die Hauptdachfläche einschneidet):
|
||||
grösster Einzelposten, weil er eine echte Boolean-Verschneidung zwischen
|
||||
zwei Dachkörpern braucht (ähnlich der bestehenden Wand-Boolean-Dominanz
|
||||
über `joinPriority`, aber räumlich in 3D). Realistisch erst nach einem
|
||||
Mesh-Boolean-Werkzeug (die begonnene truck-Integration,
|
||||
`src-tauri/trucksolid/`, ist ein Kandidat dafür).
|
||||
7. **L-/T-Grundriss mit Kehle (Straight-Skeleton)**: bewusst NICHT vor 6,
|
||||
weil es die Bounding-Box-Vereinfachung komplett ersetzt (neue
|
||||
Geometrie-Engine, kein inkrementeller Ausbau von `roof.ts`) — separates,
|
||||
grosses Vorhaben, siehe Prioritätsliste.
|
||||
|
||||
### 4.5 Lücken (Dach)
|
||||
|
||||
| Feature | Status | Priorität | Aufwand |
|
||||
|---|---|---|---|
|
||||
| `RoofType`/`Layer[]`-Schichtaufbau (Modell) | ✗ (`thickness` toter Skalar) | **P0** | 3 PT |
|
||||
| 3D-Schichten (gestapelte Flächen entlang Normalen) | ✗ | **P0** | 3 PT |
|
||||
| 2D-Aufsicht-Poché (Eindeckungssymbol) | ✗ | P1 | 1.5 PT |
|
||||
| Dach im Vertikalschnitt (Ebene-Ebene-Schnitt + Bänder) | ✗ | **P0** | 5 PT |
|
||||
| Traufe/Ortgang getrennter Überstand | ✗ | **P0** | 1 PT |
|
||||
| Mansard-Untertyp (Walm/Giebel/Zelt-Stirn) | ✗ | P1 | 2 PT |
|
||||
| Editierbarer Mansard-Knick | ✗ | P2 | 0.5 PT |
|
||||
| Krüppelwalm | ✗ | P2 | 1.5 PT |
|
||||
| Dachflächenfenster | ✗ | P2 | 4 PT |
|
||||
| Gauben (Boolean-Einschnitt) | ✗ | P3 | 8+ PT |
|
||||
| L-/T-Grundriss, Straight-Skeleton-Kehle | ✗ | P3 | 10+ PT |
|
||||
| `RoofType`-Ressourcen-UI | ✗ | P1 (folgt aus RoofType) | 1 PT |
|
||||
| IFC `IfcRoof`-Export | ✗ | P2 | 1.5 PT |
|
||||
|
||||
---
|
||||
|
||||
## 5. Decke (Ceiling / Slab)
|
||||
|
||||
### 5.1 Was ein vollständiges BIM-Tool bietet
|
||||
|
||||
| Bereich | Typische Parameter |
|
||||
|---|---|
|
||||
| Grundfläche | beliebiges Polygon inkl. Aussparungen (Treppenauge, Schacht, Kamindurchbruch) |
|
||||
| Schichtaufbau | Rohdecke, Trittschalldämmung, Estrich, Bodenbelag — analog Wand, mit Deckenspiegel/Untersicht (abgehängte Decke, Akustikplatten) als eigene Schicht(en) |
|
||||
| Randausbildung | gerader Rand, auskragender Balkon-/Vordachrand mit thermischer Trennung (Isokorb/Randdämmstreifen), Randschalung/Abschalungsprofil, Attika-Anschluss, Tropfkante |
|
||||
| Deckenspiegel | abgehängte Untersicht mit eigener Höhe/Raster (Akustik-/Gipskarton-Decke), UNABHÄNGIG von der tragenden Rohdecke |
|
||||
| Öffnungen | Deckenaussparungen als eigene, editierbare Polygone (nicht nur Gesamtumriss) |
|
||||
| Neigung | geneigte Decke (Garagenrampe, Terrasse mit Gefälle) — nicht nur horizontal |
|
||||
| 2D-Darstellung | Aufsicht mit Ansichts-Poché (unaufgeschnitten), Schnitt mit Vollschichten je Lage, Deckenspiegel-Plan (reflected ceiling plan) als eigene Zeichnungsart |
|
||||
| IFC-Rolle | `IfcSlab` (PredefinedType FLOOR/ROOF/BASESLAB), `IfcMaterialLayerSetUsage` für den Schichtaufbau, `IfcCovering` für abgehängte Decken |
|
||||
|
||||
### 5.2 IST in DOSSIER
|
||||
|
||||
`Ceiling` (`types.ts:928-1000`) hat bereits die stärkste Tiefe der vier
|
||||
Bauteile in diesem Dokument: geschlossenes Umriss-Polygon (`outline`),
|
||||
`ceilingTypeId` mit Legacy-Fallback auf `wallTypeId` (`getCeilingType`,
|
||||
`types.ts:2089`), volle Attribut-Override-Kette (`foreground`/`background`/
|
||||
`strokeWeight`/`hatchId` + `*Source`, wie bei `Wall`) und unabhängige
|
||||
vertikale Bindung von OK/UK über `VerticalAnchor` (`top?`/`bottom?`,
|
||||
`types.ts:990-999` — "floor"-gebunden oder "custom"-Z, exakt wie bei
|
||||
`Wall.top`/`Wall.bottom`, `types.ts:887-893`). 3D-Schichtstapel ist
|
||||
implementiert (`emitSlabs`, `toWalls3d.ts:1352-1419`), Schnitt-Schichtsplit
|
||||
ebenfalls (`splitSlabLayers`, `toSection.ts:633`).
|
||||
|
||||
Verifizierte Lücken:
|
||||
|
||||
- **Keine Aussparungen.** `Ceiling.outline: Vec2[]` ist EIN geschlossenes
|
||||
Polygon (`types.ts:936-939`) — kein `openings?: Vec2[][]` für
|
||||
Treppenauge/Schacht/Kamin. Ein Treppenloch in der Decke muss heute über
|
||||
die Aussenkontur der Decke "herumgeschnitten" werden (Decke als
|
||||
komplexes, nicht-konvexes Polygon), nicht als saubere Innenaussparung.
|
||||
(`elements.md:217` sah dieses Feld in der älteren Planung explizit vor,
|
||||
es wurde nie in `types.ts` übernommen.)
|
||||
- **Kein Randdetail.** Die Decke ist über die gesamte `outline` exakt
|
||||
`thickness` dick, EINHEITLICH. Es gibt kein Feld für eine abweichende
|
||||
Randausbildung (Aufkantung, Randdämmstreifen, Tropfkante, andere Dicke am
|
||||
Balkonrand). Ein auskragender Balkon lässt sich zwar über eine erweiterte
|
||||
`outline` modellieren, bekommt aber zwangsläufig denselben Vollschicht-
|
||||
Aufbau wie die Innendecke — eine thermisch getrennte Balkonplatte
|
||||
(Isokorb) ist nicht abbildbar.
|
||||
- **Kein Deckenspiegel.** Abgehängte Untersicht (Akustik-/GKB-Decke mit
|
||||
eigener, tieferer Kote) existiert nicht als eigenes Konzept — nur der
|
||||
tragende Aufbau über `ceilingTypeId`.
|
||||
Ein "Deckenspiegel-Plan" (reflected ceiling plan) fehlt als Zeichnungsart
|
||||
komplett (`DrawingLevelKind`, `types.ts:722`, kennt nur "floor"/"section"/
|
||||
"elevation"/"drawing").
|
||||
(Randbemerkung: Beleuchtungsplanung/Deckenspiegel ist ein Elektro-Thema und
|
||||
damit bewusst ausserhalb des DOSSIER-Kernscopes — siehe "nicht bauen",
|
||||
Abschnitt 6. Die reine Geometrie einer zweiten, tiefer liegenden Fläche
|
||||
bleibt aber ein legitimer BIM-1:1-Punkt.)
|
||||
- **Keine Neigung.** `top`/`bottom` sind je EIN `VerticalAnchor` (ein
|
||||
Z-Wert), keine Neigungsebene — eine geneigte Garagen-/Terrassendecke ist
|
||||
nicht modellierbar, nur über mehrere ebene Teildecken behelfsweise
|
||||
annäherbar.
|
||||
- **2D-Aufsicht nutzt nur die erste Schicht.** `addCeilingPoche`
|
||||
(`generatePlan.ts:2453-2536`) liest `wt.layers[0]` (Kommentar/Code
|
||||
`generatePlan.ts:2465`) für die Ansichts-Schraffur — bei einer
|
||||
mehrschichtigen Decke (z. B. Beton unten, Dämmung oben) zeigt die Aufsicht
|
||||
immer nur die OBERSTE (erste) Schicht, was für eine unaufgeschnittene
|
||||
Draufsicht baupraktisch korrekt ist (man sieht von unten die
|
||||
Untersicht/erste Lage), aber nicht konfigurierbar ist, welche Lage als
|
||||
"sichtbare" gilt, falls der Deckenaufbau umgekehrt sortiert wäre.
|
||||
- IFC: `IfcSlab` wird erzeugt (`exportIfc.ts:28`), aber laut Kopfkommentar
|
||||
(`exportIfc.ts:38-41`) bewusst OHNE `IfcMaterialLayerSet`/-`Usage` — der
|
||||
Export verliert den Schichtaufbau, den DOSSIER intern bereits hat.
|
||||
|
||||
### 5.3 Deckenrand/Randterminierung — vertieft
|
||||
|
||||
Der Nutzer nennt explizit "Deckenränder, Stirnabschlüsse, Anschluss an Wand/
|
||||
Aussenkante, auskragende Ränder, Randabschalung" als Schwerpunkt. IST-Bild:
|
||||
keines davon existiert als eigenes Konzept — die Decke ist ein reines
|
||||
Extrusions-Polygon. Konkreter Vorschlag, dreistufig nach Aufwand:
|
||||
|
||||
1. **Aussparungen** (`Ceiling.openings?: Vec2[][]`) — niedrigster Aufwand,
|
||||
grösster praktischer Nutzen (Treppenauge ist im Wohnbau der Regelfall,
|
||||
nicht die Ausnahme). 2D: zusätzliche Ausschnitts-Polygone in
|
||||
`addCeilingPoche` (Loch im Fill, zusätzliche Randlinien). 3D: `emitSlabs`
|
||||
bekommt Löcher im Extrusions-Profil (analog dem bereits vorhandenen
|
||||
Loch-Schnitt bei Wand-Öffnungen, `wallMeshCut.ts`, als Vorlage).
|
||||
2. **Randschicht-Override** (`Ceiling.edgeOverride?: { ringOffset: number;
|
||||
ceilingTypeId: string }` — ein schmaler Innenring der Decke entlang des
|
||||
Randes bekommt einen ANDEREN Layer-Aufbau, z. B. mit zusätzlicher
|
||||
Randdämmschicht oder reduzierter Dicke für eine Tropfkante). Technisch:
|
||||
`emitSlabs` erzeugt für den Ringbereich einen zweiten Layer-Stapel mit dem
|
||||
Override-Typ, geometrisch als Offset-Polygon-Differenz (`outline` minus
|
||||
`outline.offset(-ringOffset)`), eine Operation, die für Wandbänder
|
||||
bereits ähnlich existiert (`buildWallFootprints`).
|
||||
3. **Thermisch getrennte Auskragung (Isokorb-Fall)**: ein eigenes,
|
||||
sekundäres `Ceiling`-Objekt für den auskragenden Teil mit eigenem
|
||||
`ceilingTypeId` (dünnerer/anderer Aufbau) UND eigener `top`/`bottom`-
|
||||
Bindung, das an die Hauptdecke stösst — kein neues Feld nötig, nur eine
|
||||
UI-Erleichterung ("Deckenrand abtrennen"-Werkzeug, das die Decke entlang
|
||||
einer gewählten Kante in zwei `Ceiling`-Objekte teilt). Niedrigster
|
||||
Modell-Aufwand, weil er das bestehende Mehrfach-Decken-Prinzip nutzt statt
|
||||
ein neues Konzept einzuführen.
|
||||
|
||||
### 5.4 Lücken (Decke)
|
||||
|
||||
| Feature | Status | Priorität | Aufwand |
|
||||
|---|---|---|---|
|
||||
| Aussparungen (`openings?: Vec2[][]`) in 2D+3D | ✗ | **P0** | 3 PT |
|
||||
| Randschicht-Override (Ringzone anderer Aufbau) | ✗ | P1 | 3 PT |
|
||||
| Deckentrenn-Werkzeug für Isokorb-Fall (UI, kein neues Modellfeld) | ✗ | P1 | 1.5 PT |
|
||||
| Geneigte Decke (Rampe/Gefälle) | ✗ | P2 | 3 PT |
|
||||
| Deckenspiegel (zweite, abgehängte Fläche) | ✗ | P3 | 2 PT (reine Geometrie) |
|
||||
| IFC `IfcMaterialLayerSetUsage` für Decke (UND Wand) | ~ (bewusst ausgelassen) | P2 | 2 PT |
|
||||
| Konfigurierbare "oberste Schicht" für Aufsicht-Poché | ✓ implizit (Layer-Reihenfolge = Sortierung) | — | — |
|
||||
|
||||
---
|
||||
|
||||
## 6. Konsolidierte Priorisierung (über alle vier Bauteile)
|
||||
|
||||
Sortiert nach "1:1-Zuwachs pro Aufwand", nicht nach Aufwand allein:
|
||||
|
||||
1. **Dach-Schichtaufbau (Modell + 3D-Stapel)** — schliesst die grösste
|
||||
strukturelle Lücke (totes `thickness`-Feld, kein `RoofType`) und liefert
|
||||
sofort sichtbaren Tiefengewinn im 3D (§4.3, ~6 PT gesamt).
|
||||
2. **Traufe/Ortgang getrennter Überstand** — 1 PT, sofortiger optischer
|
||||
Sprung bei jedem Steildach-Projekt (§4.4 Punkt 1).
|
||||
3. **Zweiflügelige Tür rendert wirklich 2 Blätter** — das `leafCount`-Feld
|
||||
existiert seit der Türtyp-Einführung, wird aber komplett ignoriert; sehr
|
||||
sichtbarer Bug-artiger Gap (§2.3, 2 PT).
|
||||
4. **Deckenaussparungen** — Treppenauge ist der Wohnbau-Regelfall, heute nur
|
||||
über Umweg (nicht-konvexes Aussenpolygon) lösbar (§5.3 Punkt 1, 3 PT).
|
||||
5. **Fenster-Glazing 2D-wirksam** — seit über einem Jahr als P0 in der
|
||||
Fenster-Studie dokumentiert und weiterhin offen; niedriger Aufwand,
|
||||
sollte nicht liegen bleiben (§3.1, 1 PT).
|
||||
6. **Dach im Vertikalschnitt** — grösster Einzelposten (5 PT), aber ohne ihn
|
||||
bleibt jeder Gebäudeschnitt mit Steildach unvollständig; das ist die
|
||||
Art Lücke, die bei einer Bemusterung/Baueingabe sofort auffällt.
|
||||
7. **Deckenrand-Override / Isokorb-Trennwerkzeug** — folgt danach, weil er
|
||||
auf demselben Mehrfach-Decken-Prinzip aufbaut wie Punkt 4.
|
||||
8. **Mansard-Untertyp + editierbarer Knick** — mittlere Priorität, weil
|
||||
Mansarde in der Schweiz/Süddeutschland baupraktisch häufig ist und die
|
||||
heutige starre 40 %-Konstante sichtbar unrealistisch wirkt.
|
||||
9. **Tür/Fenster-Rahmentiefe** (asymmetrische Rahmenbreiten, Beschlag,
|
||||
Kopfform) — bewusst NACH den strukturellen Lücken, weil sie additive
|
||||
Detailverbesserungen an einem bereits funktionierenden Pfad sind, während
|
||||
1–7 fehlende oder falsch dargestellte Kernfunktionen betreffen.
|
||||
10. **Gauben, L-Grundriss/Kehle, Dachflächenfenster** — grösste Einzel-
|
||||
Aufwände (8–10+ PT), architektonisch am voraussetzungsreichsten (Boolean-
|
||||
Werkzeug bzw. neue Geometrie-Engine); erst nach 1–9 angehen.
|
||||
|
||||
### 6.1 NICHT bauen (VW/Revit-Ballast ohne Nutzen für DOSSIER)
|
||||
|
||||
- **Vollständiger Massketten-/Bezugsapparat** (VW B1..B5/H1..H7,
|
||||
Roh-/Fertigmass-Umschaltung) — DOSSIER arbeitet mit lichten Massen, das
|
||||
genügt für ein Schweizer Wohnbau-/Kleinprojekt-Tool (bereits so in
|
||||
`window-editor-vectorworks-study.md` §5 entschieden, hier bestätigt für
|
||||
Dach/Decke: keine Dach-Rohmass-/Fertigmass-Unterscheidung).
|
||||
- **Sichtbarkeitsmatrix 3D-Objekte × Ansichten** (Augen-Tabelle je
|
||||
Kategorie×Ansicht×Detailstufe) — DOSSIERs Layer-Sichtbarkeit +
|
||||
`DetailLevel` deckt den praktischen Bedarf; eine volle Matrix ist
|
||||
Verwaltungsaufwand ohne Mehrwert für Einzelprojekte.
|
||||
- **Eckfenster/Eckdach als generischer Sonderfall über zwei Wirtsbauteile**
|
||||
— seltene Geometrie, hoher Modellierungsaufwand (zwei Hosts, ein Element);
|
||||
bei Bedarf als manueller Workaround (zwei separate Öffnungen) lösbar.
|
||||
Ebenso: freie Neigungsflächen je Dachkante (VW erlaubt jede Kante einzeln
|
||||
zu kippen) — für die abgedeckten Standardformen (Pult/Sattel/Walm/
|
||||
Mansarde/Zelt/Krüppelwalm) nicht nötig; wer eine Freiform-Dachlandschaft
|
||||
braucht, ist besser mit den `ExtrudedSolid`/truck-Werkzeugen bedient.
|
||||
- **Vollständige Beschlags-/Baubeschlag-Bibliothek** (Marken-Beschlagsätze,
|
||||
Schliessplan) — Beschlag als generisches Griff-Mesh (§2.4) genügt für die
|
||||
visuelle 1:1-Wirkung; eine Beschlags-PRODUKTBIBLIOTHEK ist Kataloggeschäft,
|
||||
kein CAD-Kernfeature.
|
||||
- **Deckenspiegel als vollwertige Beleuchtungsplanung** (Leuchtenraster,
|
||||
Lichtberechnung) — reine Geometrie einer zweiten Fläche ist ok (P3), die
|
||||
Elektro-/Lichtplanungslogik selbst liegt ausserhalb des Tool-Zwecks.
|
||||
- **IFC `IfcOpeningElement`/Void-Semantik nachrüsten** — bewusste
|
||||
Design-Entscheidung im bestehenden Export (`exportIfc.ts:22-27`), NICHT
|
||||
revidieren: die heutige "Loch steckt im Mesh"-Lösung liefert visuelle
|
||||
Parität in jedem Viewer ohne Boolean-Pflicht beim Empfänger; der reine
|
||||
IFC4-Purismus (Wand als parametrische Extrusion + Void) würde
|
||||
bestehende, bewusst getroffene Trade-offs zunichtemachen.
|
||||
- **Straight-Skeleton/Kehlen und Gauben SOFORT** — nicht "nicht bauen", aber
|
||||
bewusst zurückgestellt (§6, Punkt 10): ohne die Schichtlogik (Punkt 1)
|
||||
vorher zu bauen, würde jede Kehlen-/Gauben-Lösung auf dem unendlich dünnen,
|
||||
ungeschichteten Dach aufsetzen und müsste bei Einführung der Schichten
|
||||
ohnehin neu gefasst werden.
|
||||
Reference in New Issue
Block a user