# RhinoPanel — Projektdokumentation für Claude ## Was ist das? Ein React-Plugin für Rhino 8 (Mac) das als schwebendes Fenster läuft und Architektur-Workflows aus Vectorworks/ArchiCAD nachbildet. Die React-UI wird in Rhinos Eto.Forms WebView über `LoadHtml` (inline) eingebettet. ## Kommunikation React ↔ Python **React → Python:** `document.title = "RHINOMSG::{json}"` (queue-basiert, 80ms delay) **Python → React:** `webview.ExecuteScript("window.onRhinoMessage({...})")` Nachrichten-Typen: - `APPLY` — Ebenen auf Rhino anwenden, GH triggern - `LAYER_VISIBILITY` — Layer sofort ein/ausblenden - `LAYER_LOCK` — Layer sperren/entsperren - `SET_ACTIVE` — Aktiven Rhino-Layer setzen - `STATE_SYNC` — Python → React, beim Panel-Start ## Datenmodell ```json [ {"id": "eg", "name": "EG", "type": "grundriss", "hoehe": 3.50, "schnitthoehe": 1.00, "okff": 0.00}, {"id": "1og", "name": "1OG", "type": "grundriss", "hoehe": 3.00, "schnitthoehe": 1.00, "okff": 3.50}, {"id": "saa", "name": "Schnitt A-A", "type": "schnitt"}, {"id": "nor", "name": "Nordansicht", "type": "ansicht"} ] ``` Gespeichert in `doc.Strings["rhinopanel_ebenen"]` (JSON). OKFF wird nur für `type: "grundriss"` berechnet (kumulativ). Schnitt/Ansicht haben keine Höhenparameter. ## Rhino Layer-Hierarchie ``` 10_GRUNDRISSE └── EG ├── 01_WAND (schwarz, lw 0.50) ├── 02_TUER_FENSTER (blau, lw 0.25) ├── 03_MOEBEL (grau, lw 0.13) ├── 04_TEXT (hellgrau, lw 0.13) ├── 05_TREPPEN (gold, lw 0.35) └── 06_3D_VOLUMEN (lila, lw 0.25) └── 1OG (gleiche Sublayer) 20_SCHNITTE └── Schnitt A-A ├── 21_PROFIL (rot, lw 0.70) ├── 22_WAND (orange, lw 0.25) └── 23_TEXT (hellgrau, lw 0.13) 30_ANSICHTEN └── Nordansicht ├── 31_FASSADE (türkis, lw 0.35) └── 32_TEXT (hellgrau, lw 0.13) 00_RASTER, 01_VERMESSUNG, 40_SITUATION, 90_REFERENZEN, 99_KONSTRUKTION ``` ## Dateistruktur ``` rhino-panel/ ├── src/ │ ├── App.jsx # Hauptkomponente, State-Management │ ├── main.jsx # Entry point, window.onerror handler │ ├── index.css # Dark theme, CSS-Variablen (Swiss minimal) │ ├── lib/ │ │ └── rhinoBridge.js # Kommunikation React↔Python │ └── components/ │ ├── EbenenManager.jsx # Zeichnungsebenen-Liste (GR/SC/AN Badges) │ ├── EbenenDialog.jsx # Dialog zum Bearbeiten der Ebenen │ ├── LayerPanel.jsx # Layer-Sichtbarkeit/Sperre togglen │ ├── BottomBar.jsx # "Auf Rhino anwenden" Button │ └── Section.jsx # Ausklappbarer Abschnitt ├── rhino/ │ ├── rhinopanel.py # Panel starten, Bridge, LoadHtml-Inline │ ├── layer_builder.py # Rhino-Layer erstellen/aktualisieren │ └── INSTALL.md # Setup-Anleitung inkl. GH ├── dist/ # Gebaute App (npm run build) └── vite.config.js # base: './' wichtig für file:// URLs ``` **Alte Dateien (nicht mehr aktiv, können gelöscht werden):** - `src/components/GeschossManager.jsx` — ersetzt durch EbenenManager - `src/components/GeschossDialog.jsx` — ersetzt durch EbenenDialog ## Kritische technische Details ### Warum LoadHtml statt file:// URL Rhinos WKWebView blockiert `