Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge

Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit
Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem,
dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en)
sowie Projektdokumentation und Probe-Harness.
This commit is contained in:
2026-06-30 20:52:27 +02:00
commit ca859c4aa4
157 changed files with 37921 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
# Dokumentation — Standalone Browser-BIM (cad)
> Stand: 2026-06-29 · Übergeordnet: [ROADMAP.md](../ROADMAP.md) (Vision & Phasen) ·
> [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 server­loses 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/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 01), 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.