Files
karim 961b3c0396 Snapshot: Wand/Öffnung Multi-Surface-Select + Z-Drag + Brüstungs-Mitnahme
Stable working state after a long iteration session. The plugin now supports:
- Multi-Surface-Select für alle Element-Typen (Türen/Fenster/Treppen/Tragwerk)
- Wand-Z-Drag → unbound mode (UK/OK-Override, Wand vom Geschoss entkoppelt)
- Wand-Z-Drag nimmt verknüpfte Öffnungen mit (Brüstung += delta_z via Idle-Pfad)
- Öffnungs-XY-Drag snapt direktional auf Wand-Tangente
- Öffnungs-Z-Drag passt Brüstung an (Fenster sofort sync, Tür deferred)
- Wand-Delete kaskadiert Öffnungen (deferred via Idle, robust gegen _Rotate/_Move)
- Source-Cascade beim Öffnungs-Delete (deferred analog Wand-Kaskade)
- Listener-Cleanup robust gegen _reset_panels.py Reload (Refs in
  _dossier_runtime_event_refs gespeichert, vor Re-Install deregistriert)
- _count_same_id_type filtert IsDeleted (verhindert Source-Duplikat-Bug bei Move)
- Frontend: Brüstungs-Slider für Tür ("Schwelle"), Flügel-Block nur bei Fenster

Plus aus früherer Phase dieser Session:
- Dossier-Launcher Auto-Load via Rhinos StartupCommands-XML
- Default-Pfad zeigt auf gebundeltes startup.py (out-of-the-box für neue User)
- Splash-Window beim Plugin-Load mit native macOS rounded corners
- Diverse Launcher-Verbesserungen (Brüstungs-Default, tauri.conf, capabilities)

Known issue: bei Multi-Select-Move mit vielen Sub-Volumen kann sporadisch
"Unable to transform" auftreten (Rhinos Move-Operation kollidiert mit Wand-
Regen). Tür-spezifischer Defer-Pfad mildert das, Fenster läuft sync.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 01:50:45 +02:00

148 lines
6.4 KiB
Markdown

# Dossier — Projekt-Anweisungen für Claude
## Was das ist
**Dossier** ist ein Rhino 8 Plugin (Mac) mit React-WebView-Panels für
architektonische Workflows (Wände, Decken, Öffnungen, Räume, SIA-416,
Plan-Layouts). Teil der OpenStudio-Suite. Schwester-App: Rapport.
**Dossier-Launcher** ist eine separate Tauri-App (`launcher/`), die Projekte
verwaltet, Settings hält (auch für den Plugin), Auto-Updates liefert und im
System-Tray lebt.
## Runtime: Python 3.9 CPython (verifiziert 2026-05-17)
Dieser Ordner `DOSSIER/` läuft mit Rhinos **neuem Python-3-Engine** (CPython
3.9.10 via Script Editor). Der Vorgänger `rhino-panel/` bleibt **frozen** als
IPy-2.7-Referenz.
**Wie geladen wird (WICHTIG):**
-**`_ScriptEditor`** → Datei öffnen + Run-Button → CPython 3.9 (Shebang
`#! python3` wird respektiert). Das ist der **funktionierende Pfad**.
- ✅ **Rhino Options → General → Command Lists → „Run these commands every
time a model is opened"** → Form: `_-RunPythonScript "/voller/pfad.py"`
(mit Dash + Quotes). Persistiert in `Options/General/StartupCommands` der
`settings-Scheme__Default.xml`. Lädt das Skript bei jedem Rhino-Start
silent, ohne File-Dialog. Trotz Dash bleibt Shebang `#! python 3`
wirksam → CPython 3.9 (verifiziert 2026-05-17 Mac Rhino 8). Der Launcher
trägt diesen Eintrag automatisch ein.
- ⚠️ `_-RunPythonScript "path.py"` mit Dash in der **interaktiven Command-
Line** → IronPython 2.7 (Legacy). NICHT benutzen für DOSSIER, sonst
crasht die SectionStyle-Logik etc.
- ⚠️ `_RunPythonScript path.py` ohne Dash — in der Command-Line OK (Py3
via Shebang, ohne Quotes, in einer Zeile). Im StartupCommands-Feld
öffnet diese Form aber einen File-Dialog statt zu laufen.
**Migration-Stand:**
- ✅ Repo kopiert nach `DOSSIER/`, alle Pfade umgestellt
- ✅ Shebangs aller Files auf `#! python3` (ohne Space) — Format das Rhino erkennt
- ✅ Code war bereits Py3-syntax-kompatibel (kein xrange/iteritems/unicode())
- ✅ Plugin läuft als CPython 3.9.10, alle 9 Panels registrieren
- ✅ Reflection.Emit + Eto.Forms + Bridge funktionieren
-**`Rhino.DocObjects.SectionStyle()` instanziierbar** + `layer.SetCustomSectionStyle()`
verfügbar — die volle Section-Style-API ist jetzt zugänglich (Anlass der Migration)
## Bei Code-Arbeit — Reihenfolge
1. **`ARCHITECTURE.md` zuerst lesen** — Module-Map, Konventionen, Schwachstellen.
2. **Dann das relevante Modul lesen**. Nicht raten was drin steht.
3. **Erst danach editieren**.
## Anti-Over-Engineering
Diese Regeln sind nicht verhandelbar — Verstöße kosten Zeit beim Aufräumen.
- **Keine Abstraktionen einführen, die ein konkretes Problem lösen.**
Drei ähnliche Zeilen sind besser als eine Hilfsfunktion mit drei Aufrufstellen.
- **Kein „aufräumen drumherum".** Ein Bugfix bleibt ein Bugfix.
- **Kein Error-Handling für Szenarien, die nicht eintreten können.**
- **Keine Feature-Flags, keine Migrations-Shims parallel zur alten Funktion.**
- **Keine Kommentare die WAS sagen** — nur WARUM-Kommentare wenn nicht-offensichtlich.
- **Keine erfundenen Module/Funktionen/Flags.** Erst `grep`, dann editieren.
## Anti-Patterns (aus echten Sessions)
- **`try/except: pass` als Bug-Verstecker.** Lieber `print("[MODUL] err:", ex)` und weiter.
- **Sticky-Reads ohne `is not None`-Check.** Siehe `ARCHITECTURE.md §4.4`.
- **„Cleveres" Refactoring von Wand-Geometrie.** `elemente.py` (7244 LOC)
enthält BIM-Logik die in Echtbau-Projekten läuft. NIE in einem Rutsch
modularisieren ohne expliziten Auftrag + Test-Plan.
- **Mac vs. Windows Rhino-Pfade verwechseln.** Mac Rhino 8 speichert
Window-Layouts als **XML in `Scheme__Default/workspaces/<GUID>.xml`**, nicht
als `.rwl`.
- **Python-Runtime annehmen statt prüfen.** Diagnose mit `print(sys.version)`
— das hat uns 4 Wochen versteckte IPy2.7 gekostet.
- **`document.title` mit Umlauten kaputt machen.** UI-Strings dürfen Umlaute;
**Python-Backend bevorzugt `ue/oe/ae`** in Identifiern, Layer-Codes,
UserString-Values.
## Python-Konventionen — POST-MIGRATION TARGET
Sobald die Migration durch ist, gilt:
- Datei-Header: `# ! python3` + `# -*- coding: utf-8 -*-` (werden dann wirksam)
- **Aufruf in Rhino:** `_RunPythonScript "path"` (ohne Dash!) — sonst startet
IPy 2.7. Alternative: `_-ScriptEditor` mit Code-Engine
- `print(x)` — IMMER mit Klammern (Python-3-Style)
- `builtins` statt `__builtin__`
- f-strings erlaubt: `f"value: {x}"`
- CLR: `import clr; clr.AddReference("System.Drawing"); from System.Drawing import Color`
- UI-Strings dürfen Umlaute, Code-Identifier nicht (`tuer`, nicht `tür`)
## Build & Reset (Cheatsheet)
```bash
# Rhino-Panels Frontend
npm run build # im Repo-Root
# Launcher Frontend
cd launcher && npm run build
# Launcher Backend Check
cd launcher/src-tauri && cargo check
# Launcher Release (signiert, schreibt latest.json)
cd launcher && ./scripts/release.sh
# Python-Syntax-Check (kein Rhino nötig)
python3 -c "import ast; ast.parse(open('rhino/elemente.py').read())"
# Runtime-Verify in Rhino (welcher Python-Engine läuft wirklich?)
_RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/startup.py
# Erste Zeile sollte zeigen: [STARTUP] Python: 3.x ... nach Migration
```
**Plugin reset in Rhino** (nach Python-Änderungen):
```python
_RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/_reset_panels.py
```
## Design-System
- Petrol-Grün `--accent: #5fa896` (Hauptakzent), dunkles Petrol `#2f5d54`
- Hintergrund `--bg: #0e1413`
- Fonts: Krungthep/Archivo Black für „DOSSIER"-Logo, Playfair Display für
Headings, DM Mono für Body
- Konsistent zur Website (`/Users/karim/STUDIO/DOSSIER-WEBSITE/`)
## Settings-Files (Pfade)
- **Launcher → Rhino IPC** (file-based, kein Socket):
`~/Library/Application Support/ch.gabrielevarano.Dossier/dossier_settings.json`
- Legacy-Fallback (read-only): `~/Library/Application Support/RhinoPanel/dossier_settings.json`
- Launcher-Cache: `~/Library/Application Support/ch.gabrielevarano.Dossier/recent.json`
## Vorgänger-Codebase
Der alte Ordner `/Users/karim/STUDIO/rhino-panel/` bleibt als **read-only
Referenz** stehen. Wenn ein Feature dort funktioniert das hier noch nicht
portiert ist — dort schauen, dann hier neu in Python-3-Style implementieren.
**Nicht** einfach kopieren, sondern beim Übertragen den Migrations-Style
anpassen.
## Wenn unklar — fragen, nicht raten
Wenn die Aufgabe ambig ist oder Konsequenzen über die offensichtlichen
hinausgehen: erst nachfragen.