Lizenz: - AGPL-3.0 LICENSE-File im Repo-Root (GNU Volltext) - SPDX-Header + Copyright in allen Source-Files (Python/JSX/JS/Rust) - license-Feld in package.json + Cargo.toml - About-App komplett neu: Dual-Lizenz-Block (AGPL + Commercial), openbureau-Branding, Version-Pills, made-in-Switzerland-Footer UI-Restyle (3 Wellen) — alle Dialoge + Satellites + Panel-Sidebars auf gemeinsamen Pill-Stil aus BarControls (BarToggle/BarButton/BarCombo): - Welle 1: GeschossDialog/Settings, AusschnittSettings, LayoutDialog - Welle 2: ConfirmDeleteEbene, Kamera, MasseSettings, Osm, Swisstopo, TextEditor, AusschnittLayerDialog, LayerCombinations - Welle 3: LayoutsApp, MassstabApp, WerkzeugeApp, OverridesApp, ZeichnungsebenenApp; Werkzeuge mit ElementeApp-PillGroup-Layout GeschossDialog Header-Refactor: +Geschoss/+Zeichnung in Toolbar oben, move-Pfeile-Spalte breiter (kein Overlap mit G-Haken) Ausschnitte Rows als Pills, kein Outer-Border ums Suchfeld Section-Style komplett neu (gestaltung.py + GestaltungApp.jsx): - ObjectSectionAttributesSource.FromObject (richtiger Enum-Name fuer Mac) - HatchPatternPrintColor + BoundaryPrintColor mit-setzen (Display = Print) - BoundaryColor nur bei explizitem User-Override, sonst Rhino-Default - background_color_hex Parameter (BackgroundFillMode=SolidColor) - Readback aus GetCustomSectionStyle statt direkt aus Attributes - UI: Schnittkante > Section Style > Solid-Fill mit proper SectionHead - 'Boundary' (3D Pen) -> 'Background' weil sich's wie Section-Hintergrund verhaelt Plan-Mode 'Dossier Plan' via Template: - rhino/templates/dossier_plan.ini wird direkt geladen - Fallback auf Technical-Clone + ini-Patch wenn Template fehlt - Auto-Cleanup von Orphan-Modes vor Import (Name- oder Guid-Match) - ClipSectionUsage=1 + TechnicalMask=15 als bekannte Soll-Werte - Bei Template-Pfad keine ini-Patches (1:1 wie User exportiert) - Sanity-Print listet alle registrierten Modes nach Anlegen Bridge-Unification: 4 Settings-Apps (Ebenen/Project/Geschoss*Dialog) benutzen jetzt chunkende send() statt eigene bridgeSend ohne Chunk- Logik -> grosse Payloads (Hatch-Refs etc.) kommen nicht mehr truncated bei Python an (loeste 'JSON-Fehler char 990'-Regression in Ebenen- Settings) Library-Imports robust: 'import library' jetzt Top-Level in elemente.py + rhinopanel.py (statt Lazy in Methoden) -> 'No module named library'- Crashes weg auch wenn sys.path zwischendurch resettet wird Tools fuer Display-Mode-Maintenance: - _clean_display_modes.py (loescht alle Custom-Modes, Built-ins bleiben) - _inspect_plan_mode.py / _inspect_obj_section.py / _inspect_obj_boundary.py (Diagnose-Skripte fuer SectionStyle-Property-Reverse-Engineering) - _reset_rhino_settings.sh (Backup + Nuke der Rhino-Settings als letzte Bastion gegen korrupte Display-Modes)
Dossier Launcher
Standalone macOS-App, die als Projekt-Hub für Dossier-Projekte in Rhino 8 dient.
Wählt eine .3dm aus, konfiguriert pro Projekt welche Module aktiv sind, startet
Rhino mit der Datei. Das Python-Plugin in rhino/ liest beim Start die
dossier.project.json (neben der .3dm) und lädt nur die aktivierten Module.
Setup (einmalig)
1. Dependencies installieren
cd launcher
npm install
Beim ersten npm run tauri dev zieht Cargo zusätzlich die Rust-Dependencies
(dauert ein paar Minuten).
2. Rhino Auto-Run einrichten
Damit die Module bei jedem Rhino-Start automatisch laden:
- Rhino 8 starten
Rhinoceros 8→Preferences→General→ Startup commands- Folgende Zeile eintragen:
_-RunPythonScript "/Users/karim/STUDIO/DOSSIER/rhino/startup.py" - OK → Rhino neu starten
Ab jetzt lädt startup.py bei jedem Rhino-Start:
- mit
dossier.project.jsonneben der.3dm→ nur konfigurierte Module - ohne Config → alle Module (Backwards-Compat zum bisherigen Verhalten)
Entwicklung
npm run tauri dev
Startet Vite (Port 5174) und öffnet die Tauri-Window. Hot-Reload für React, Rust-Änderungen brauchen einen Rebuild.
Build (.app + .dmg)
npm run tauri build
Output: src-tauri/target/release/bundle/macos/Dossier.app und
src-tauri/target/release/bundle/dmg/Dossier_0.1.0_*.dmg
Vor dem ersten Build: Icons hinterlegen. Aktuell ist bundle.icon in
src-tauri/tauri.conf.json leer. Mit
npm run tauri icon path/zur/icon.png
generiert Tauri das vollständige Icon-Set (1024×1024 PNG als Quelle reicht).
Architektur
launcher/
├── modules.json # Modul-Manifest (statisch, in Binary einkompiliert)
├── src/ # React-Frontend
│ ├── App.jsx # Project Hub + Modul-Dialog
│ └── styles.css
└── src-tauri/ # Rust-Backend
├── src/lib.rs # Tauri-Commands
└── tauri.conf.json
Datenfluss:
- Launcher liest
~/Library/Application Support/Dossier/recent.json - User klickt „Öffnen" → Launcher schreibt
dossier.project.jsonneben die.3dmund ruftopen -a "Rhinoceros 8" file.3dm - Rhino startet,
startup.pyläuft, liest die Config, lädt nur die aktivierten Module - Jedes Modul registriert sein eigenes Panel via
panel_base.register_and_open
Module-Manifest erweitern
Wenn ein neues Modul dazukommt, drei Stellen synchron halten:
launcher/modules.json— Eintrag mitid,name,description,pythonModule,dependsOnrhino/startup.py—_MODULE_TO_PYMap ergänzenrhino/<pythonModule>.py— die Python-Implementierung
Launcher rebuilden (npm run tauri build), neue .app ersetzt die alte.