Initial commit: DOSSIER Hugo website

This commit is contained in:
2026-05-26 11:23:18 +02:00
commit 53c0532f60
417 changed files with 32891 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
---
title: Dokumentation
linkTitle: Dokumentation
next: docs/erste-schritte
weight: 1
sidebar:
open: true
---
Willkommen zur DOSSIER-Dokumentation. DOSSIER ist ein **Rhino 8 Plugin** für architektonisches Entwerfen mit smarten Bauteilen — Teil von **OpenBureau**.
{{< cards >}}
{{< card link="erste-schritte" title="Erste Schritte" icon="play" subtitle="Installation, Setup, erster Workflow." >}}
{{< card link="../features" title="Features" icon="cube" subtitle="Alle Panels und ihre Funktionen." >}}
{{< card link="../launcher" title="Launcher" icon="desktop-computer" subtitle="Standalone-App für Projekte und Settings." >}}
{{< card link="architektur" title="Architektur" icon="template" subtitle="Module, Bridge-Pattern, Sticky-Storage." >}}
{{< card link="roadmap" title="Roadmap" icon="map" subtitle="Erledigt, in Arbeit, geplant." >}}
{{< card link="../faq" title="FAQ" icon="question-mark-circle" subtitle="Häufige Fragen und Antworten." >}}
{{< /cards >}}
## Auf einen Blick
Dossier bündelt den gesamten architektonischen Workflow in Rhino:
- **Modellieren** mit smarten Bauteilen (Source ↔ Volume Pattern, Wand v1 mit Polyline-Achse)
- **Strukturieren** über Geschosse, Multi-Geschoss-Clipping und eine automatische Layer-Hierarchie
- **Schneiden & Anschauen** mit der vollen Section-Style-API und Schnitt-Perspektive
- **Material- & Symbol-verwalten** projektzentral aus den Project-Settings (PBR-Texturen, 2D+3D-Symbol-Pairs)
- **Auswerten** nach SIA 416 (HNF / NNF / FF / VF)
- **Darstellen** mit Massstab, Display-Modes und Overrides
- **Beschriften** mit Bemassung, Raumstempeln und Rich-Text
- **Ausgeben** als Plan-Set in PDF oder PNG
## Laufzeit
DOSSIER läuft als **CPython 3.9** über Rhinos neuen Python-3-Engine. Die UI wird in einem React-WebView-Panel über Rhinos Eto.Forms-Layer eingebettet (inline via `LoadHtml`).
Lese die [Architektur-Übersicht](architektur) für Details zum Bridge-Pattern und den Sticky-Storage-Konventionen.
+142
View File
@@ -0,0 +1,142 @@
---
title: Architektur
linkTitle: Architektur
weight: 2
---
DOSSIER ist als **Plugin-Verbund** aufgebaut: jedes Feature lebt in einem eigenen Modul, alle teilen sich ein gemeinsames Bridge-Pattern für die React-↔-Python-Kommunikation.
## Module-Map
| Modul | LOC | Rolle |
|----------------------|------:|----------------------------------------------------------------|
| `panel_base.py` | 697 | Fundament: BaseBridge, WebView-IO, Panel-Registration, Icons |
| `rhinopanel.py` | 798 | EBENEN — Zeichnungsebenen, Layer-Hierarchie, Presets |
| `elemente.py` | 7'244 | ELEMENTE — Wände, Decken, Öffnungen, Treppen, Tragwerk, Räume |
| `gestaltung.py` | 1'635 | GESTALTUNG — Selektions-Attribute (Farbe, Lineweight, Hatch) |
| `oberleiste.py` | 981 | OBERLEISTE — Top-Bar, Display, Massstab, Snaps, Settings |
| `massstab.py` | 1'096 | MASSSTAB — Viewport 1:N, Auto-DPI, PlotWeight |
| `overrides.py` | 797 | Engine — regelbasierte Overrides (Bedingung → Aktion) |
| `overrides_panel.py` | 226 | UI für Overrides-Engine |
| `ausschnitte.py` | 708 | AUSSCHNITTE — Viewport-Snapshots (Kamera + Display + Layer) |
| `dimensionen.py` | 613 | DIMENSIONEN — Bemassung (Wand-Dicken, Geschoss-Höhen, …) |
| `layouts.py` | 749 | LAYOUTS — Plan-Editor, Titelblock, PDF-Export |
| `werkzeuge.py` | 58 | WERKZEUGE — Quick-Tools (Batch) |
| `layer_builder.py` | 436 | Helper — Ebenen-Hierarchie aufbauen, Sublayer-Sync |
| `startup.py` | 136 | Init — liest `dossier.project.json`, lädt Module selektiv |
## Tragende Patterns
### Bridge-Pattern (Pflicht für jedes Panel)
```python
class MyBridge(panel_base.BaseBridge):
def __init__(self):
panel_base.BaseBridge.__init__(self, "mymodule")
def _on_ready(self):
self.send("STATE_SYNC", {...}) # WebView fertig geladen
def handle(self, data):
t = data.get("type")
if t == "ACTION": self._do_action()
def _bridge_factory():
b = MyBridge()
_install_listeners(b) # Rhino-Events registrieren
return b
panel_base.register_and_open(
"mymodule", "MY PANEL", PANEL_GUID_STR,
_bridge_factory,
icon_spec=("foundation", "#5fa896"), # Material-Icon + Petrol
min_size=(400, 300),
)
```
### React ↔ Python Kommunikation
- **React → Python**: `document.title = "RHINOMSG::{json}"` — gepollt im Idle-Handler
- **Python → React**: `bridge.send(type, payload)``webview.ExecuteScript("window.onRhinoMessage(…)")`
- **Chunking**: Messages > 200 KB werden in `panel_base.handle_raw` automatisch gesplittet und reassembliert. Subklassen kümmern sich nicht drum.
### Source ↔ Volume Pattern
Jedes Smart-Element hat:
1. eine **Source-Geometrie** (Achse / Outline / Punkt) — vom User editierbar
2. ein generiertes **Volume** (Brep) — automatisch regeneriert bei Source-Änderungen
Beispiel Wand: Source = Achs-Linie, Volume = Brep mit Dicke × Höhe.
### Sticky-Storage (Cross-Module-State)
Konventionen für `sc.sticky`-Keys:
- `"{modul}_bridge"` — Bridge-Instanz
- `"{modul}_listeners"` — Bool-Flag: Listener bereits registriert?
- `"_dossier_*"` — globale States (z.B. `_dossier_joints_cache`)
- `"{modul}_*_cache"` — Modul-Cache
### Listener-Hookup (Idempotent)
```python
def _install_listeners(bridge):
flag = "mymodule_listeners"
sc.sticky["mymodule_bridge"] = bridge
if sc.sticky.get(flag): return # Schon registriert
Rhino.RhinoApp.Idle += _on_idle
Rhino.RhinoDoc.ActiveDocumentChanged += _on_view_change
sc.sticky[flag] = True
```
## Datenhaltung
- **Geschosse** in `doc.Strings["dossier_ebenen"]` als JSON
- **Smart-Elemente** als Rhino-Objekte mit UserStrings — `dossier_element_id`, `dossier_element_type`, …
- **Section-Styles** über `Rhino.DocObjects.SectionStyle()` + `layer.SetCustomSectionStyle()`
- **Settings**: `~/Library/Application Support/ch.gabrielevarano.Dossier/dossier_settings.json`
Eine `.3dm`-Datei bleibt eine Datei — keine externen Datenbanken.
## Layer-Hierarchie
```text
10_GRUNDRISSE
└── EG
├── 20_WAENDE
├── 30_DECKEN
├── 31_DAECHER
└── 40_TREPPEN
└── 1OG (gleiche Sublayer)
20_SCHNITTE
30_ANSICHTEN
00_RASTER · 01_VERMESSUNG · 40_SITUATION · 90_REFERENZEN · 99_KONSTRUKTION
```
## Cross-Module-Pfade
| Sender → Empfänger | Trigger | Effekt |
|-----------------------------|-------------------------------|---------------------------------------------------------|
| `rhinopanel``elemente` | Apply von Ebenen-Struktur | `elemente_bridge._regenerate_all()` regeneriert Wände/Decken |
| `elemente``rhinopanel` | Wand/Decken-Delete | `ebenen_bridge_ref._send_state()` |
| `oberleiste``overrides` | Preset-Auswahl in Topbar | `overrides_bridge._send_state()` |
| `massstab``ausschnitte` | Viewport-/Zoom-Wechsel | Bi-direktional Skala lesen / setzen |
| `gestaltung``rhinopanel` | Hatch-Pattern auf Selektion | Pattern + Scale + Rotation-Signatur vergleichen |
## Konventionen
- **Python-Identifier ohne Umlaute** — `ue/oe/ae` statt `ü/ö/ä` in Code-Bezeichnern, Layer-Codes, UserString-Keys. UI-Strings dürfen Umlaute.
- **`LoadHtml`-inline** statt `file://`-URL — Rhinos WKWebView blockiert sonst `<script type="module">` durch CORS.
- **TextEntity-RTF** — Rhinos eingebauter Parser unterstützt nur `\b \i \ul \strike \fN \tab {}` plus Newline-via-`\par`. **Kein `\fs`** (eine TextEntity hat global eine Schriftgröße).
- **Sticky-Reads** immer mit `is not None`-Check.
## Launcher-Anbindung
Der **Dossier-Launcher** (`launcher/`) ist eine separate Tauri-2-App. IPC zu Rhino läuft **dateibasiert**, nicht über Socket:
- Settings: `~/Library/Application Support/ch.gabrielevarano.Dossier/dossier_settings.json`
- Live-Push: `pendingApplyLayout`-Key, `oberleiste.tick_idle()` pollt und cleart
- System-Tray mit Quick-Open der letzten 5 Projekte
Rhino läuft ohne Launcher, Launcher läuft ohne Rhino.
+111
View File
@@ -0,0 +1,111 @@
---
title: Erste Schritte
linkTitle: Erste Schritte
weight: 1
next: docs/architektur
---
DOSSIER in **5 Minuten** zum Laufen bringen.
## Voraussetzungen
| Tool | Version |
|--------|------------------------------------------|
| Rhino | 8 (Mac · Windows getestet, primär Mac) |
| Python | CPython 3.9 (Rhino 8 Script-Editor-Engine) |
| Node | ≥ 20 (nur für UI-Builds — fertige Distribution braucht das nicht) |
Optional — für den Standalone-Launcher:
| Tool | Version |
|---------------|------------------------------------------------|
| Rust toolchain| ≥ 1.77 (`rustup`) |
| Build-Tools | siehe [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/) |
## Installation
{{% steps %}}
### Repository klonen
```bash
git clone https://git.kgva.ch/karim/DOSSIER.git
cd DOSSIER
npm install
```
### Frontend bauen
```bash
npm run build # → dist/index.html (inline-fähig)
```
### Plugin in Rhino starten
In Rhino 8 den Initialisierer über `_ScriptEditor` öffnen — die Datei `rhino/startup.py` laden und auf **Run** klicken. Sie liest die `dossier.project.json` neben der `.3dm` und lädt nur die dort gelisteten Module (oder alle, falls keine Projekt-Datei vorhanden).
Für automatisches Laden bei jedem Rhino-Start: Rhino-Optionen → *General**Run these commands every time a model is opened*:
```text
_-RunPythonScript "<DOSSIER_PFAD>/rhino/startup.py"
```
{{< callout type="info" >}}
**`<DOSSIER_PFAD>`** durch den absoluten Pfad zum geklonten Repository ersetzen — z.B. `/Users/dein_user/STUDIO/DOSSIER` auf macOS oder `C:\Users\dein_user\STUDIO\DOSSIER` auf Windows. Rhino expandiert `~` in diesem Kontext nicht.
{{< /callout >}}
Der Launcher trägt diesen Eintrag automatisch mit dem korrekten Pfad ein.
### Auto-Reset nach Änderungen
Bei Python-Änderungen die Panels neu laden:
```text
_RunPythonScript <DOSSIER_PFAD>/rhino/_reset_panels.py
```
{{% /steps %}}
## Erster Workflow
{{% steps %}}
### Projekt anlegen
In Rhino `DossierInit` aufrufen. Bürodaten, Projektnummer und Phasenbezeichnung werden im `.3dm` hinterlegt und in jedem Plankopf eingesetzt.
### Geschosse definieren
Im **EBENEN**-Panel Geschosse mit Name (`EG`, `1OG`, …), Höhe und OKFF anlegen. Dossier baut daraus die Layer-Hierarchie:
```text
10_GRUNDRISSE
└── EG
├── 20_WAENDE
├── 30_DECKEN
├── 31_DAECHER
└── 40_TREPPEN
└── 1OG (gleiche Sublayer)
```
### Smart-Elemente platzieren
Im **ELEMENTE**-Panel das gewünschte Bauteil wählen — Wand, Decke, Öffnung, Treppe, Tragwerk oder Raum. Source-Geometrie zeichnen (Achse, Outline, Punkt), Volumen wird automatisch generiert.
### Plan generieren
**Named Views** für Grundrisse, Schnitte und Axonometrien speichern. Im **LAYOUTS**-Panel Vorlage wählen, Views auf das Blatt ziehen, Plannummer vergeben. Dossier erzeugt das Layout mit Titelblock und passt den Massstab automatisch an.
### Export
Stapelexport aller Pläne als PDF oder PNG aus dem **LAYOUTS**-Panel. Optional mit Plannummer-Suffix im Dateinamen und Vektordaten für die Druckfreigabe.
{{% /steps %}}
## Wo geht's weiter?
{{< cards >}}
{{< card link="../features" title="Features" subtitle="Alle Panels im Detail." >}}
{{< card link="architektur" title="Architektur" subtitle="Module, Bridges, Sticky-Storage." >}}
{{< card link="../faq" title="FAQ" subtitle="Häufige Fragen." >}}
{{< /cards >}}
+122
View File
@@ -0,0 +1,122 @@
---
title: Roadmap
linkTitle: Roadmap
weight: 3
toc: true
---
DOSSIER ist ein **Design-Studio für Rhino**, keine BIM-Cloud. Der Fokus liegt auf **3D-Modell-Qualität** und sauberer Planabgabe direkt aus dem Modell — keine externe Datenbank, keine Zwangs-Synchronisation, keine Cloud-Lock-in.
Diese Seite hält den Status der grösseren Bauteile fest. Detail-Issues und Bugfixes laufen auf [Gitea](https://git.kgva.ch/karim/DOSSIER/issues).
## Erledigt
Die folgenden Bauteile sind im aktiven Einsatz und Teil der Pre-Release 0.1.0:
### Wand-System v1
Polyline-Wand mit **Chain-Anchor**, **Cmd+Z** über alle Joints stabil, native Rhino-**Grips** für Achs-Editierung. Siehe [Smart-Elemente](../../features/smart-elemente).
### Schnitte & Ansichten
Schnitt-Perspektive plus die volle **SectionStyle-API** (Schnittlinien-Stil, Section-Hatch, Hidden-Line-Removal). War der **konkrete Anlass** für die Migration von IronPython 2.7 zu CPython 3. Siehe [Schnitte & Ansichten](../../features/schnitte-ansichten).
### Geschoss-Management
**Multi-Geschoss-Clipping** mit konfigurierbaren Modi, **Top-View Z-Guard** gegen versehentliche Z-Drifts und **Snap-Bar** pro Geschoss. Siehe [Geschosse & Ebenen](../../features/geschosse).
### Project-Settings (5 Tabs)
Zentraler Dialog für Voreinstellungen + Projektdaten, Materialien, Linientypen, Schraffuren und Symbole. Siehe [Project-Settings](../../features/project-settings).
### Material/Library-System
**ArchiCAD-style List/Detail**-UI, **Auto-Regen** über die Smart-Element-Hierarchie, **`.lin`/`.pat`-Import** für Linetypes und Hatches, bewusste **Material/Ebene-Separation**. Siehe [Material-Library](../../features/materialien).
### Symbol-Library — Phase A + B
**2D+3D Pair-Files**, **Satellite-Picker** als persistenter Floating-Window, **Multi-Format-Import** (`.3dm` · `.dwg` · `.obj` · `.fbx` · `.dae` · `.stl`), **Auto-Thumbnails** als Base64-PNG und volle **CRUD**-Operationen. Siehe [Symbol-Library](../../features/symbol-library).
### Swisstopo-Integration
**Adress-Prefill** aus den Projektdaten, **Terrain-Import** aus dem AlMo-DOM-Layer und **m.ü.M** in der Plankopf-Variable. Siehe [Swisstopo & OSM](../../features/swisstopo-osm).
### Launcher (Tauri 2)
Standalone-App für Projekt-Management, **Auto-Update** über `tauri-plugin-updater`, **System-Tray** mit Quick-Open und **file-based IPC** zu Rhino. Siehe [Launcher](../../launcher).
## In Arbeit
### Display-Mode "Dossier Plan"
{{< callout type="warning" >}}
Game-Changer für Plan-Qualität direkt aus 3D — kein Umweg über separate 2D-CAD-Dateien.
{{< /callout >}}
Drei kombinierte Effekte:
- **Hidden-Line-Removal** über die aktive Section-Plane (Rhino-natives Verfahren)
- **Weisser Hintergrund**, Layer-Display-Farben werden zu reinem Schwarz remappt
- **Section-Hatch** aus der Layer-Property-Tabelle gerendert (siehe [Schnitte & Ansichten](../../features/schnitte-ansichten))
Ziel: Wettbewerbs- und Konkurrenz-Pläne ohne Plot-Konvertierung über AutoCAD oder ArchiCAD. Siehe [Massstab & Display-Modes](../../features/massstab).
## Geplant
### Raumstempel-Redesign (4 Stufen)
Der aktuelle Raum-Stempel zeigt Bezeichnung + Fläche, hat aber einen **Wert-Bug** beim Refresh nach Outline-Änderung. Geplant:
1. **Stufe 1 — Wert-Bug fixen** — Centroid-Berechnung und Fläche werden synchron neu gelesen, Cache-Invalidation greift bei Polyline-Replace.
2. **Stufe 2 — Massstäblich-Modus** — Stempel-Schrift folgt dem aktiven Massstab (1:50 → grössere Schrift als 1:100), nicht der Welt-Geometrie.
3. **Stufe 3 — Settings-Dialog** — pro Projekt definieren, welche Felder am Stempel erscheinen (Nr · Bezeichnung · SIA · Fläche · Höhe · Material).
4. **Stufe 4 — Wettbewerb-Features** — alternative Stempel-Sets für Wettbewerbsabgaben (anonymisierte Codes, vereinfachte Geometrie).
### Custom Linetype-Editor
Visueller **Pattern-Editor** für `.lin`-kompatible Linetypes — Drag-Handles für Strich/Lücke-Längen, Live-Preview im Massstab des aktiven Layouts. Der `.lin`-Import existiert bereits (siehe [Materialien](../../features/materialien)); der Editor schreibt in denselben Datentyp.
**User-Pause** — kommt nach dem Display-Mode "Dossier Plan".
### PBR-Erweiterungen
Drei konkrete Lücken im aktuellen Material-Editor:
- **Separate Roughness-Textur** — heute nur Roughness-Slider, geplant ist eine zusätzliche Roughness-Map (PNG, Graustufen)
- **UV-Rotation** — Texturen können bisher nur skaliert werden, nicht rotiert
- **Bump-Strength-Slider** — Normal-Map-Intensität soll feinjustierbar werden, statt nur ein/aus
### Library Phase C — Cloud-Sync
Symbol-Library erweitern um **Team-Sharing** über GitHub-Releases:
```text
Bürobibliothek-Repo (GitHub)
├── releases/v1.4.0/
│ ├── symbols/sofa-3sitz.3dm
│ ├── symbols/sofa-3sitz.2d.3dm
│ └── manifest.json (semver, thumbnails, kategorien)
```
Im PROJECT-SETTINGS-Symbole-Tab wird die Bürobibliothek-URL gesetzt, DOSSIER pullt periodisch Releases und mergt sie mit der projekt-lokalen Library. Pull-Request-Workflow für neue Symbole vom Team.
### Satellite-Windows-Restyle
Alle Satellite-Floating-Windows (Symbol-Picker, Material-Picker, Hatch-Picker, …) auf einheitliches **Pill-Style** umstellen — runde Ecken, weicher Schatten, einheitliche Header-Höhe. Konsistente UX über alle Picker-Tools.
## Strategischer Anker
DOSSIER bleibt:
- **Lokal** — `.3dm` + `dossier.project.json` ist alles, kein Server zwingend nötig
- **Schweizer-Standard-aware** — SIA 102 / SIA 416, Swisstopo, m.ü.M direkt eingebaut
- **AGPL-3.0** — Open Source, keine Telemetrie, keine versteckten Kosten
- **Rhino-nativ** — kein eigenes Datei-Format, alle Daten in Rhinos eigenen Tabellen (Materials, Linetypes, Hatches, UserStrings)
Was DOSSIER **nicht** ist:
- Keine BIM-Cloud, kein zentraler Server
- Keine IFC-Schema-Konformität (es ist kein BIM-Tool)
- Kein Ersatz für ArchiCAD / Revit — Dossier bündelt Rhino-Workflows, ersetzt aber keine Statik-Software, kein Mengen-Auswertungs-Tool, keine Quantity-Take-Off
Wenn dir ein Feature fehlt, das in diesen Rahmen passt → [Issue auf Gitea](https://git.kgva.ch/karim/DOSSIER/issues).