a6c2c04736
Vollständige Bestandsaufnahme der Codebasis als neue STATUS.md (Kennzahlen, Feature-Inventar, Mist-Liste: toter Code, verwaiste WASM-Crates, Doku-Widersprüche). ARCHITECTURE.md/README.md/CONVENTIONS.md waren noch auf dem Tag-1-Planungsstand (Electron/Three.js/OpenCascade/Zustand/HLR-Worker) und beschrieben nicht mehr, was tatsächlich gebaut wurde (eigene Rust/WASM-Engines, eigener Store, analytische Rust-Schnitt-Pipeline, Tauri auf macOS + Electron auf Linux). ROADMAP.md und HANDOVER.md als historisch markiert (Hinweis-Box), Inhalt unverändert.
168 lines
10 KiB
Markdown
168 lines
10 KiB
Markdown
# Dokumentation — Standalone Browser-BIM (cad)
|
||
|
||
> Stand: 2026-06-29 · **Historische Recherche-/Design-Dokumente aus der ersten
|
||
> Woche.** Mehrere Kern-Empfehlungen hier (replicad/OCCT als B-Rep-Kernel,
|
||
> Manifold, web-ifc, `three/webgpu`) wurden im tatsächlichen Bau **nicht**
|
||
> umgesetzt — stattdessen entstanden eigene Rust/WASM-Rendering-Engines
|
||
> („Nordstern"). Für den aktuellen Ist-Zustand: **[../STATUS.md](../STATUS.md)**
|
||
> und **[../ARCHITECTURE.md](../ARCHITECTURE.md)**. Die Dokumente unten sind als
|
||
> Recherche-Hintergrund weiterhin lesenswert, aber nicht mehr aktueller Plan.
|
||
> Übergeordnet: [ROADMAP.md](../ROADMAP.md) (Vision & Phasen, ebenfalls historisch) ·
|
||
> [CONVENTIONS.md](../CONVENTIONS.md) (Konventionen) · [ARCHITECTURE.md](../ARCHITECTURE.md).
|
||
|
||
Dieses Verzeichnis bündelt die Recherche- und Design-Dokumente für `cad`, die
|
||
eigenständige Browser-Variante des DOSSIER-Rhino-Plugins (React + TypeScript +
|
||
Three.js + SVG, alles client-side). **Leitprinzip aller Dokumente:** ein
|
||
semantisches Modell ist die einzige Wahrheit; jede Sicht (3D, Grundriss, Schnitt)
|
||
wird **abgeleitet**, Darstellung erst beim Rendern angewandt. Bezeichner im Code
|
||
englisch (Vectorworks-Terminologie), Prosa deutsch, Einheiten intern in Metern.
|
||
|
||
Die Dokumente sind in vier Gruppen geordnet: **Tech** (Bibliotheken/Kernel),
|
||
**Architektur/Design** (Aufbau & Bauteile), **UX** (Oberfläche & Interaktion),
|
||
**Swisstopo/SIA** (CH-Geodaten & Flächenstandards).
|
||
|
||
---
|
||
|
||
## Tech — Technologie- & Bibliotheksauswahl
|
||
|
||
### [research/tech-selection.md](research/tech-selection.md)
|
||
Evaluiert den kompletten Client-Stack für ein serverloses BIM-Werkzeug und
|
||
empfiehlt **`replicad`** (idiomatische TS-Schicht über `opencascade.js`/OCCT, MIT)
|
||
als primären B-Rep-Kernel im Web Worker, ergänzt durch **`Manifold`** (Apache-2.0)
|
||
für schnelle, robuste Mesh-Booleans auf Importgeometrie — denn nur ein echter
|
||
B-Rep-Kernel liefert exakte 2D-Ableitungen, und genau das löst replicads
|
||
`drawProjection` (OCC-HLR, `{visible, hidden}`-Kanten direkt im Browser). Weitere
|
||
Wahl: Import via **web-ifc + Fragments** (IFC), `dxf-parser` (DXF) und
|
||
`libredwg-web` (DWG, aber **GPL-3.0 → vorab klären/kapseln**); Vektor-Export über
|
||
**`svg2pdf.js` + `jsPDF`** (PDF) und **`@tarikjabiri/dxf`** (echte Hatch-Entities);
|
||
Schraffuren als SVG-`<pattern>` mit `userSpaceOnUse` (maßstabskorrekt); Rendering
|
||
über **`three/webgpu`** mit automatischem WebGL2-Fallback. Top-Risiken: DWG-Lizenz,
|
||
OCCT-WASM-Größe, HLR-Kosten (pro Ansicht cachen), WebGPU vor Migration benchmarken.
|
||
|
||
---
|
||
|
||
## Architektur/Design — Aufbau, Datenmodell & Bauteile
|
||
|
||
### [../ARCHITECTURE.md](../ARCHITECTURE.md)
|
||
Die übergreifende Standalone-Architektur und die systematische Übersetzung jedes
|
||
DOSSIER-Konzepts in ein Browser-Äquivalent (30-zeilige **Rhino→Browser-Mapping-
|
||
Tabelle**). Kern: das semantische `Project` (JSON) als einzige Wahrheit mit pure
|
||
`derive()` zu Scene3D/Plan/Section; ein **Zwei-Achsen-Datenmodell**
|
||
(`drawingLevels` × `layers`) plus `Resources`/`WallType`/`Element`/`Sheet`; ein
|
||
**Zustand-Store** ersetzt DOSSIERs `sc.sticky`-Bus, **`.cad.json`** (File System
|
||
Access API) + IndexedDB-Autosave ersetzen `doc.Strings`, und ein **Immer-Patch-
|
||
Undo/Redo** eliminiert die Cache-Stale-Bugs strukturell. Ziel-Repo-Struktur mit
|
||
**kleinen Bauteil-Modulen** statt des 7244-LOC-`elemente.py`-Monolithen; Rendering
|
||
über einen `THREE.Group`-Baum, der den Ebenen-Baum spiegelt.
|
||
|
||
### [design/parametric-walls.md](design/parametric-walls.md)
|
||
Regelbasierte Wandgenerierung als Alternative zum Direktzeichnen. Vier Regel-Varianten
|
||
(`GridRule`, `ModuleRule`, `ConditionalRule`, `PolylineRule`) erzeugen `Wall[]`-Arrays
|
||
über einen reinen Auflöser (`resolveParametricWall`). Deckungsbereich: Schweizer 3-m-
|
||
Wohnraster, bedingte Außen-/Innenwand-Dicken, 6-m-Jochbauweise. Phase A: Typsystem +
|
||
Resolver isoliert, kein UI. Phase B: Command + Formular-Editor. Phase C: Grid-Ressource
|
||
und IFC-Export.
|
||
|
||
### [design/elements.md](design/elements.md)
|
||
Legt **Daten, Generierung (3D + Plan) und Grip-Editing pro Bauteil** fest. Wichtigste
|
||
Empfehlung: die **Prioritäts-T-/X-Verschneidung mehrschichtiger Wände** (Backbone-
|
||
Algorithmus, Port von `_t_junction_layer_overrides`) — das höchstpriorisierte
|
||
gemeinsame Material läuft durch, der Rest mitert an; Priorität sitzt am **Component**
|
||
(`joinPriority` als Daten, nicht Hardcode). Deckt zudem gehostete Öffnungen mit
|
||
LoD-Stufen (`_OEFF_PIECE_DEFS`), Decken mit Aussparungen, Treppen (gerade/L/Wendel,
|
||
geschossübergreifend, normgerechtes 2D-Symbol), Dächer, Tragwerk und **SIA-416-Räume**
|
||
(Shoelace-Fläche, Stempel, Färbung über Override-Preset) ab; das `Tool`-Interface +
|
||
Snap-Engine ersetzt DOSSIERs Rhino-Command-Aliases.
|
||
|
||
### [design/plans-output.md](design/plans-output.md)
|
||
Der Weg zu **schönen, normgerechten, druckfertigen 2D-Plänen** (Vektor-PDF). Zentrale
|
||
Erkenntnis: Ansichten = Kamera + optionaler Schnitt, und es gibt **zwei Plan-Pfade**
|
||
(symbolischer Grundriss aus Parametern vs. Schnitt/Ansicht via **HLR im Worker**,
|
||
gecacht). Empfiehlt SVG/Paper-Space als Maßstabsmodell — Strichstärke/Schraffur sind
|
||
direkt in mm definiert (`dpi = 96·devicePixelRatio`, Hatch-Faktor `sqrt(N)/10`), was
|
||
DOSSIERs fragiles Plotweight-Rescaling überflüssig macht. Behandelt außerdem
|
||
Ausschnitte/View-Snapshots, Layer-Kombinationen, Kamera-Presets + Norden-Rotation,
|
||
Bemaßung sowie Sheets + Vektor-PDF-Export (`svg2pdf.js`/`jsPDF`, `PAPER_MM`).
|
||
|
||
### [design/resources-graphics.md](design/resources-graphics.md)
|
||
Die **Stil-Schicht**: verwaltete Ressourcen-Bibliotheken (Component-/Hatch-/Line-
|
||
Manager, alles per id referenziert), die `resolveStyle`-Kette
|
||
(ByLayer → Element-Style → Override) und die **regelbasierte Overrides-Engine**.
|
||
Schlüssel-Empfehlung: Overrides als **reine Render-Reads** modellieren (kein
|
||
Backup/Restore wie in DOSSIER, da nichts mutiert wird) — inklusive eines
|
||
**SIA-416-Presets** statt hartcodierter Färbung. Ergänzt Symbol-Bibliothek,
|
||
Rich-Text-Annotationen, den LoD-Resolver (`resolveDetail`) und den Section-Style für
|
||
geschnittene Bauteile; eine Tabelle zeigt, was der Browser hier gegenüber DOSSIER
|
||
vereinfacht.
|
||
|
||
---
|
||
|
||
## UX — Oberfläche, Interaktion & gefühlte Geschwindigkeit
|
||
|
||
### [research/ux-patterns.md](research/ux-patterns.md)
|
||
Untersucht UX-Muster moderner Browser-CAD/BIM-Tools (Arcol, Snaptrude, TestFit,
|
||
Onshape, Vectorworks, Figma) und leitet **priorisierte Leitplanken** ab. Empfehlung
|
||
für die Grundstruktur: eine feste, Figma-artige **3-Zonen-Shell**
|
||
(Navigator/Viewport/Inspector) — explizit gegen Paletten-Wildwuchs —, mit
|
||
Vectorworks-Navigation-Tabs für unsere zwei Achsen und einem zwei/drei-spaltigen
|
||
Resource-Manager als Vorbild. Größte Differenzierungs-Hebel laut Doku:
|
||
**Snapping/Inferencing** im Onshape-Stil (Vertex-Highlights, Achsenlinien, Shift
|
||
unterdrückt) und **Grip-Editing über Sicht-Grenzen** (Schnittlinie im Plan ziehen);
|
||
dazu perceived-performance-Muster (Skeletons, optimistic UI, 150-ms-Delay-then-show),
|
||
eine Command-Palette (Cmd/Ctrl-K) und learn-by-doing-Onboarding am Sample-Projekt.
|
||
|
||
---
|
||
|
||
## Swisstopo/SIA — Schweizer Geodaten & Flächenstandards
|
||
|
||
### [research/swisstopo-sia.md](research/swisstopo-sia.md)
|
||
Dokumentiert die **live getesteten** geo.admin.ch-Dienste und die SIA-Flächenlogik.
|
||
Überraschendster Befund: **alles ist ohne eigenen Backend-Proxy nutzbar** — alle vier
|
||
Hosts senden `access-control-allow-origin: *`, und der Height-Service antwortet
|
||
faktisch frei. Schlüssel fürs Browser-Gelände-Mesh ist **swissALTI3D als Cloud-
|
||
Optimized GeoTIFF** (Range-Requests via `geotiff.js`, kein Full-Download); die
|
||
**Parzelle** kommt direkt als LV95-Polygon + EGRID aus dem Identify-Service. Empfiehlt
|
||
einen konkreten Library-Satz (`proj4`, `geotiff`, `3DTilesRendererJS`/`loaders.gl`)
|
||
und ordnet die Umsetzung in ROADMAP-Phasen ein (Phase 2 SIA-Räume = reine Logik →
|
||
Phase 4a Koordinaten → 4b Gelände/Orthofoto → 4c Nachbargebäude). SIA-Teil:
|
||
verifizierte SIA-416-Formeln, DOSSIERs SIA-Logik 1:1 portierbar (Shoelace,
|
||
`compute_sia_bilanz`, CSV mit BOM); Origin-Shift (LV95 → 0/0/0) ist Pflicht wegen
|
||
float32-Jitter, Caching über IndexedDB.
|
||
|
||
---
|
||
|
||
## Top-5 Querschnitts-Empfehlungen für die ROADMAP
|
||
|
||
Diese fünf Punkte tauchen in mehreren Dokumenten auf und sollten die ROADMAP-Planung
|
||
und Priorisierung leiten:
|
||
|
||
1. **Pure-Ableitungs-Architektur als unverhandelbares Fundament** — ein
|
||
semantisches Modell, alle Sichten abgeleitet, Darstellung erst beim Rendern.
|
||
Trägt ARCHITECTURE.md, beide Plan-/Stil-Designs und die UX-Doku (billiger
|
||
Split-View, optimistic Edits, kein Cache-Stale-/Override-Restore-Aufwand). Muss
|
||
früh stehen (Store + Undo, Phase 0–1), weil sie alles Spätere prägt.
|
||
|
||
2. **OCCT/replicad im Web Worker früh als Spike absichern** — der B-Rep-Kernel und
|
||
sein `drawProjection`-HLR sind der kritische Pfad für Schnitt/Ansicht (Risiko #4)
|
||
*und* für exakte Wand-Booleans (Risiko #1) *und* für IFC. WASM-Größe, HLR-Kosten
|
||
(pro Ansicht cachen) und das Worker-Pattern sollten vor Phase 3 mit einer echten
|
||
Szene validiert werden.
|
||
|
||
3. **Component-getriebene Prioritäts-Verschneidung (Backbone-T/X) als zentrales
|
||
Geometrie-Risiko** — `joinPriority` als Daten am Component; höchstes gemeinsames
|
||
Material läuft durch, Rest mitert. Verbindet elements.md + resources-graphics.md;
|
||
2D-Plan rein analytisch, exakte 3D-Booleans im Worker. Stufenweise umsetzen
|
||
(Risiko #1, Phase 1).
|
||
|
||
4. **SVG/Paper-Space-Maßstabsmodell + maßstabskorrekte Schraffuren durchgängig** —
|
||
Strichstärke/Text/Hatch in mm, `dpi = 96·devicePixelRatio`, Hatch `sqrt(N)/10`,
|
||
SVG-`<pattern>` mit `userSpaceOnUse`. Eliminiert DOSSIERs Plotweight-Rescaling und
|
||
speist denselben Serializer für Bildschirm, PDF und DXF (tech-selection +
|
||
plans-output + resources-graphics).
|
||
|
||
5. **Schweiz-Spezifika als Differenzierer ohne Backend-Last** — SIA-416-Bilanz
|
||
(reine Logik, Phase 2, ⭐) und der serverlose Swisstopo-Flow (CORS-offen,
|
||
COG-Terrain, Parzelle/EGRID, Norden-Rotation, Origin-Shift). Klein im Aufwand,
|
||
groß im CH-Marktwert; SIA-Färbung läuft über das Override-Preset, nicht über
|
||
Sonderpfade.
|