Initial commit — Dossier Rhino 8 Plugin
OpenStudio-Suite Architektur-Plugin fuer Rhino 8 (Mac): - Smart-Elemente: Wand, Decke, Dach (Pult/Sattel/Walm/Mansarde), Oeffnungen (Fenster/Tueren mit Rahmen + Sims + Glas + Fluegel), Treppen (gerade · L · Wendel mit Schrittmass-Validierung) - Live-Previews mit Step-Lines + Soll-Range-Clamping - Bidirektionale Selection-Sync zwischen Source-Linie und Volume - Geschoss-/Ebenen-Verwaltung mit OKFF-Persistenz - Layouts mit PDF-Export - Ausschnitte / Massstab / Override-Regeln - Petrol-Gruen Theme (Rapport-konform) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@@ -0,0 +1,46 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Node / Vite
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Tauri (launcher/)
|
||||
launcher/src-tauri/target/
|
||||
launcher/node_modules/
|
||||
launcher/dist/
|
||||
launcher/.tauri/
|
||||
*.key
|
||||
*.key.pub
|
||||
|
||||
# Python / Rhino
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
|
||||
# Claude Code
|
||||
.claude/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# OS
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
@@ -0,0 +1,160 @@
|
||||
# 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 `<script type="module">` bei `file://` URLs (CORS/module restrictions). Lösung: Python liest `dist/index.html`, inliniert CSS und JS, lädt via `webview.LoadHtml(html)`. JS wird in `DOMContentLoaded` eingewickelt damit `#root` existiert wenn React rendert.
|
||||
|
||||
### Warum Idle-Event für URL-Loading
|
||||
`LoadHtml` in `__init__` läuft bevor der WebView in einem Fenster ist → React kann nicht in DOM rendern. Fix: `Rhino.RhinoApp.Idle` Event wartet bis Fenster sichtbar ist.
|
||||
|
||||
### Warum kein Docking
|
||||
`RegisterPanel` schlägt fehl: `"constructor must accept uint, RhinoDoc or no params"`. IronPython `*args` befriedigt Rhinos .NET-Reflection nicht. Panel läuft daher als schwebendes `forms.Form`.
|
||||
|
||||
### IronPython 2 Limitierungen
|
||||
- `# -*- coding: utf-8 -*-` Header in allen .py Dateien
|
||||
- Keine Umlaute in Strings (ue/oe/ae statt ü/ö/ä)
|
||||
- `e.Title` statt `webview.Title` im DocumentTitleChanged Handler
|
||||
|
||||
## Grasshopper-Anbindung
|
||||
|
||||
Wenn "Anwenden" gedrückt wird:
|
||||
1. `layer_builder.build_layers()` erstellt/aktualisiert Rhino-Layer
|
||||
2. JSON wird in `doc.Strings["rhinopanel_ebenen"]` gespeichert
|
||||
3. `canvas.Document.NewSolution(True)` triggert GH-Neuberechnung
|
||||
|
||||
**GH Python-Komponente (eine Komponente, Output `a`):**
|
||||
```python
|
||||
import json, Rhino, Rhino.Geometry as rg
|
||||
doc = Rhino.RhinoDoc.ActiveDoc
|
||||
raw = doc.Strings.GetValue("rhinopanel_ebenen")
|
||||
ebenen = json.loads(raw) if raw else []
|
||||
a = []
|
||||
for e in ebenen:
|
||||
if e.get("type") != "grundriss": continue
|
||||
idx = doc.Layers.FindByFullPath("10_GRUNDRISSE::{}::01_WAND".format(e["name"]), -1)
|
||||
if idx < 0: continue
|
||||
for obj in doc.Objects.FindByLayer(doc.Layers[idx]):
|
||||
crv = obj.Geometry
|
||||
if not isinstance(crv, rg.Curve): continue
|
||||
c = crv.DuplicateCurve()
|
||||
c.Transform(rg.Transform.Translation(0, 0, e.get("okff", 0)))
|
||||
ext = rg.Extrusion.Create(c, e["hoehe"], c.IsClosed)
|
||||
if ext: a.append(ext.ToBrep())
|
||||
```
|
||||
Für Live-Updates: GH `Timer` Komponente (1000ms) mit Python-Komponente verbinden.
|
||||
|
||||
## Design-System
|
||||
|
||||
Dark theme, Swiss minimal, inspiriert von rapport.kgva.ch.
|
||||
CSS-Variablen in `index.css`. Wichtigste:
|
||||
- `--bg-base: #1c1c1e` — Hintergrund
|
||||
- `--accent: #5a9e5a` — Grün (Anwenden-Button)
|
||||
- `--active: #3a5f8a` — Blau (aktive Ebene)
|
||||
- `--font: 'Inter'` — via Google Fonts
|
||||
|
||||
Typ-Badges: GR=blau `#3a6fa8`, SC=orange `#c87050`, AN=türkis `#50c8a0`
|
||||
|
||||
## Workflow Panel starten
|
||||
|
||||
```bash
|
||||
npm run build # nach Code-Änderungen
|
||||
```
|
||||
|
||||
In Rhino (bei Änderungen am Python-Code):
|
||||
```python
|
||||
import scriptcontext as sc
|
||||
sc.sticky["rhinopanel_registered"] = False
|
||||
sc.sticky["rhinopanel_form"] = None
|
||||
```
|
||||
→ `_RunPythonScript` → `rhinopanel.py`
|
||||
|
||||
## Nächste mögliche Schritte
|
||||
|
||||
- **Docking**: Rhino 8 RhinoCode (Python 3) statt IronPython verwenden — hat andere Panel-Registration API
|
||||
- **Live-Vorschau**: Rhino `ObjectAdded`/`ObjectModified` Events in rhinopanel.py für automatischen GH-Trigger ohne Anwenden-Button
|
||||
- **Schnittlinien**: Für SC-Ebenen Schnittlinie/Position als Parameter hinzufügen
|
||||
- **Layerpanel dynamisch**: LayerPanel.jsx zeigt aktuell statische Layer-Gruppen — soll dynamisch aus `ebenen`-State kommen
|
||||
- **2D-Fills**: Schraffuren/Füllungen für Wände (Vectorworks-ähnlich)
|
||||
- **Viewport-Zuweisung**: Grundrisse/Schnitte/Ansichten einem Rhino-Detailbild zuweisen
|
||||
@@ -0,0 +1,137 @@
|
||||
# Dossier
|
||||
|
||||
Rhino-8 Plugin für architektonisches Entwerfen mit smarten Bauteilen — Geschosse, Wände, Decken, Dächer, Öffnungen (Fenster/Türen), Treppen (gerade · L · Wendel). Teil der **OpenStudio-Suite** (mit Rapport als Schwestertool).
|
||||
|
||||
Die React-UI wird in Rhinos Eto.Forms-WebView über `LoadHtml` (inline) eingebettet — die Plugin-Logik läuft in IronPython3 in Rhino 8 (Mac).
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
| Tool | Version |
|
||||
|---|---|
|
||||
| Rhino | 8 (Mac · Windows untestet) |
|
||||
| Node.js | ≥ 20 (für Vite 8) |
|
||||
| npm | ≥ 10 |
|
||||
| Python | IronPython 3 (in Rhino integriert) |
|
||||
|
||||
Optional — für den Standalone-Launcher:
|
||||
|
||||
| Tool | Version |
|
||||
|---|---|
|
||||
| Rust toolchain | ≥ 1.77 (`rustup`) |
|
||||
| Plattform-Build-Tools | siehe [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/) |
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
git clone http://192.168.1.247:3000/karim/DOSSIER.git
|
||||
cd DOSSIER
|
||||
npm install
|
||||
```
|
||||
|
||||
## Entwicklung
|
||||
|
||||
**React-UI bauen** (nach jeder UI-Änderung):
|
||||
|
||||
```bash
|
||||
npm run build # → dist/index.html (inline-fähig)
|
||||
```
|
||||
|
||||
**Im Browser entwickeln** (HMR, ohne Rhino — für reine UI-Arbeit):
|
||||
|
||||
```bash
|
||||
npm run dev # http://localhost:5173
|
||||
```
|
||||
|
||||
**Plugin in Rhino starten:**
|
||||
|
||||
In Rhino 8 das Hauptpanel über `_RunPythonScript` öffnen:
|
||||
|
||||
```python
|
||||
# Hauptmenu
|
||||
_RunPythonScript "/Users/karim/STUDIO/rhino-panel/rhino/rhinopanel.py"
|
||||
```
|
||||
|
||||
Bei Änderungen am Python-Code Panels neu laden:
|
||||
|
||||
```python
|
||||
import importlib, sys, scriptcontext as sc
|
||||
# Bridges zuruecksetzen
|
||||
for k in list(sc.sticky.keys()):
|
||||
if any(p in k.lower() for p in ['elemente','gestaltung','oberleiste','massstab','ausschnitte','layouts','overrides','werkzeuge','dimensionen']):
|
||||
sc.sticky[k] = None
|
||||
# Module neu laden
|
||||
for m in list(sys.modules):
|
||||
if any(p in m for p in ['elemente','gestaltung','oberleiste','massstab','ausschnitte','layouts','overrides','werkzeuge','dimensionen','panel_base']):
|
||||
importlib.reload(sys.modules[m])
|
||||
```
|
||||
|
||||
## Architektur
|
||||
|
||||
### Kommunikation React ↔ Python
|
||||
|
||||
- **React → Python**: `document.title = "RHINOMSG::{json}"` (queue-basiert, 80 ms delay)
|
||||
- **Python → React**: `webview.ExecuteScript("window.onRhinoMessage({...})")`
|
||||
|
||||
### Datenmodell
|
||||
|
||||
- **Geschosse** in `doc.Strings["dossier_ebenen"]` als JSON (Name, Höhe, OKFF, Typ).
|
||||
- **Smart-Elemente** (Wand, Decke, Dach, Öffnung, Treppe) als Rhino-Objekte mit UserStrings — `dossier_element_id`, `dossier_element_type`, etc.
|
||||
- **Source ↔ Volume Pattern**: jedes Element hat eine *Source-Geometrie* (Achse/Outline/Punkt) + ein generiertes *Volume* (Brep). Source-Änderungen triggern automatische Regeneration.
|
||||
|
||||
### Layer-Hierarchie
|
||||
|
||||
```
|
||||
10_GRUNDRISSE
|
||||
└── EG
|
||||
├── 20_WÄNDE
|
||||
├── 30_DECKEN
|
||||
├── 31_DÄCHER
|
||||
└── 40_TREPPEN
|
||||
└── 1OG (gleiche Sublayer)
|
||||
20_SCHNITTE
|
||||
30_ANSICHTEN
|
||||
00_RASTER · 01_VERMESSUNG · 40_SITUATION · 90_REFERENZEN · 99_KONSTRUKTION
|
||||
```
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
.
|
||||
├── src/ Frontend (React)
|
||||
│ ├── App.jsx Hauptpanel (Geschosse + Ebenen)
|
||||
│ ├── ElementeApp.jsx Smart-Elemente Panel
|
||||
│ ├── AusschnitteApp.jsx Ausschnitte (Detail-Views)
|
||||
│ ├── LayoutsApp.jsx Layouts + PDF-Export
|
||||
│ ├── MassstabApp.jsx Massstab/Display-Modes
|
||||
│ ├── DimensionenApp.jsx Objekt-Info (Position/Abmessungen)
|
||||
│ ├── OverridePanel.jsx Override-Regeln + Kombinationen
|
||||
│ ├── components/ EbenenManager, GeschossManager, ...
|
||||
│ └── lib/rhinoBridge.js React↔Python Bridge
|
||||
├── rhino/ Backend (IronPython 3)
|
||||
│ ├── rhinopanel.py Haupt-Entry, Bridge-Pattern
|
||||
│ ├── panel_base.py BaseBridge + Panel-Registration
|
||||
│ ├── elemente.py Smart-Elemente (Wand/Decke/Dach/Oeffnung/Treppe)
|
||||
│ ├── ausschnitte.py Ausschnitte (Detail-Views)
|
||||
│ ├── layouts.py Layouts + PDF-Generierung
|
||||
│ ├── massstab.py Massstab/Display-Modes
|
||||
│ ├── overrides_panel.py Override-Regeln
|
||||
│ ├── dimensionen.py Objekt-Info Panel
|
||||
│ ├── gestaltung.py Gestaltung (Override-Editor)
|
||||
│ ├── werkzeuge.py Werkzeug-Sammlung
|
||||
│ └── oberleiste.py Top-Menue (verbindet alle Panels)
|
||||
├── launcher/ Tauri-2 Standalone-Launcher (optional)
|
||||
├── dist/ Gebaute React-App (npm run build)
|
||||
├── public/ Statische Assets
|
||||
├── icons_export/ Material-Icons als SVG
|
||||
└── vite.config.js `base: './'` (wichtig fuer file:// inline)
|
||||
```
|
||||
|
||||
## Bekannte Limitierungen
|
||||
|
||||
- IronPython3-spezifisch: keine Umlaute in Source-Strings (`ue/oe/ae` statt `ü/ö/ä`); UTF-8-Header-Kommentar in allen `.py`-Files.
|
||||
- **Kein Docking** der Panels (Rhinos `RegisterPanel` schlägt fehl: `"constructor must accept uint, RhinoDoc or no params"`). Panels laufen daher als schwebende `forms.Form`-Fenster.
|
||||
- **`LoadHtml`-inline** statt `file://`-URL — Rhinos WKWebView blockiert sonst `<script type="module">` durch CORS-Restrictions.
|
||||
|
||||
## Lizenz
|
||||
|
||||
[GNU AGPL-3.0-or-later](https://www.gnu.org/licenses/agpl-3.0.html)
|
||||
@@ -0,0 +1,21 @@
|
||||
import js from '@eslint/js'
|
||||
import globals from 'globals'
|
||||
import reactHooks from 'eslint-plugin-react-hooks'
|
||||
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||
import { defineConfig, globalIgnores } from 'eslint/config'
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{js,jsx}'],
|
||||
extends: [
|
||||
js.configs.recommended,
|
||||
reactHooks.configs.flat.recommended,
|
||||
reactRefresh.configs.vite,
|
||||
],
|
||||
languageOptions: {
|
||||
globals: globals.browser,
|
||||
parserOptions: { ecmaFeatures: { jsx: true } },
|
||||
},
|
||||
},
|
||||
])
|
||||
|
After Width: | Height: | Size: 236 B |
|
After Width: | Height: | Size: 233 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 227 B |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 239 B |
|
After Width: | Height: | Size: 239 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 232 B |
|
After Width: | Height: | Size: 236 B |
|
After Width: | Height: | Size: 224 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 233 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 224 B |
|
After Width: | Height: | Size: 224 B |
|
After Width: | Height: | Size: 227 B |
|
After Width: | Height: | Size: 222 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 236 B |
|
After Width: | Height: | Size: 233 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 202 B |
|
After Width: | Height: | Size: 226 B |
|
After Width: | Height: | Size: 237 B |
|
After Width: | Height: | Size: 237 B |
|
After Width: | Height: | Size: 230 B |
|
After Width: | Height: | Size: 233 B |
|
After Width: | Height: | Size: 237 B |
|
After Width: | Height: | Size: 221 B |
|
After Width: | Height: | Size: 215 B |
|
After Width: | Height: | Size: 234 B |
|
After Width: | Height: | Size: 217 B |
|
After Width: | Height: | Size: 231 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M680-160v-120H560v-80h120v-120h80v120h120v80H760v120h-80ZM440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm560-40h-80q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480Z"/></svg>
|
||||
|
After Width: | Height: | Size: 368 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M183.5-183.5Q160-207 160-240t23.5-56.5Q207-320 240-320t56.5 23.5Q320-273 320-240t-23.5 56.5Q273-160 240-160t-56.5-23.5Zm240 0Q400-207 400-240t23.5-56.5Q447-320 480-320t56.5 23.5Q560-273 560-240t-23.5 56.5Q513-160 480-160t-56.5-23.5Zm240 0Q640-207 640-240t23.5-56.5Q687-320 720-320t56.5 23.5Q800-273 800-240t-23.5 56.5Q753-160 720-160t-56.5-23.5Zm-480-240Q160-447 160-480t23.5-56.5Q207-560 240-560t56.5 23.5Q320-513 320-480t-23.5 56.5Q273-400 240-400t-56.5-23.5Zm240 0Q400-447 400-480t23.5-56.5Q447-560 480-560t56.5 23.5Q560-513 560-480t-23.5 56.5Q513-400 480-400t-56.5-23.5Zm240 0Q640-447 640-480t23.5-56.5Q687-560 720-560t56.5 23.5Q800-513 800-480t-23.5 56.5Q753-400 720-400t-56.5-23.5Zm-480-240Q160-687 160-720t23.5-56.5Q207-800 240-800t56.5 23.5Q320-753 320-720t-23.5 56.5Q273-640 240-640t-56.5-23.5Zm240 0Q400-687 400-720t23.5-56.5Q447-800 480-800t56.5 23.5Q560-753 560-720t-23.5 56.5Q513-640 480-640t-56.5-23.5Zm240 0Q640-687 640-720t23.5-56.5Q687-800 720-800t56.5 23.5Q800-753 800-720t-23.5 56.5Q753-640 720-640t-56.5-23.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M560-280h200v-200h-80v120H560v80ZM200-480h80v-120h120v-80H200v200Zm-40 320q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-480H160v480Zm0 0v-480 480Z"/></svg>
|
||||
|
After Width: | Height: | Size: 327 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="m320-160-56-57 103-103H80v-80h287L264-503l56-57 200 200-200 200Zm320-240L440-600l200-200 56 57-103 103h287v80H593l103 103-56 57Z"/></svg>
|
||||
|
After Width: | Height: | Size: 234 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z"/></svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M760-120 480-400l-94 94q8 15 11 32t3 34q0 66-47 113T240-80q-66 0-113-47T80-240q0-66 47-113t113-47q17 0 34 3t32 11l94-94-94-94q-15 8-32 11t-34 3q-66 0-113-47T80-720q0-66 47-113t113-47q66 0 113 47t47 113q0 17-3 34t-11 32l494 494v40H760ZM600-520l-80-80 240-240h120v40L600-520ZM296.5-663.5Q320-687 320-720t-23.5-56.5Q273-800 240-800t-56.5 23.5Q160-753 160-720t23.5 56.5Q207-640 240-640t56.5-23.5ZM494-466q6-6 6-14t-6-14q-6-6-14-6t-14 6q-6 6-6 14t6 14q6 6 14 6t14-6ZM296.5-183.5Q320-207 320-240t-23.5-56.5Q273-320 240-320t-56.5 23.5Q160-273 160-240t23.5 56.5Q207-160 240-160t56.5-23.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 686 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M760-120 480-400l-94 94q8 15 11 32t3 34q0 66-47 113T240-80q-66 0-113-47T80-240q0-66 47-113t113-47q17 0 34 3t32 11l94-94-94-94q-15 8-32 11t-34 3q-66 0-113-47T80-720q0-66 47-113t113-47q66 0 113 47t47 113q0 17-3 34t-11 32l494 494v40H760ZM600-520l-80-80 240-240h120v40L600-520ZM296.5-663.5Q320-687 320-720t-23.5-56.5Q273-800 240-800t-56.5 23.5Q160-753 160-720t23.5 56.5Q207-640 240-640t56.5-23.5ZM494-466q6-6 6-14t-6-14q-6-6-14-6t-14 6q-6 6-6 14t6 14q6 6 14 6t14-6ZM296.5-183.5Q320-207 320-240t-23.5-56.5Q273-320 240-320t-56.5 23.5Q160-273 160-240t23.5 56.5Q207-160 240-160t56.5-23.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 686 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M791-56 567-280H280v-287L56-791l56-57 736 736-57 56ZM360-360h127L360-487v127Zm320-33-80-80v-127H473l-80-80h287v287ZM200-200v80q-33 0-56.5-23.5T120-200h80Zm-80-80v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 480v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 480v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80q33 0 56.5 23.5T840-760h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 559 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-160q-17 0-28.5-11.5T400-200v-240L168-736q-15-20-4.5-42t36.5-22h560q26 0 36.5 22t-4.5 42L560-440v240q0 17-11.5 28.5T520-160h-80Zm40-308 198-252H282l198 252Zm0 0Z"/></svg>
|
||||
|
After Width: | Height: | Size: 271 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M360-120H200q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h160v80H200v560h160v80Zm80 80v-880h80v880h-80Zm160-80v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80q0 33-23.5 56.5T760-120Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80q33 0 56.5 23.5T840-760h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 399 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M554-120q-54 0-91-37t-37-89q0-76 61.5-137.5T641-460q-3-36-18-54.5T582-533q-30 0-65 25t-83 82q-78 93-114.5 121T241-277q-51 0-86-38t-35-92q0-54 23.5-110.5T223-653q19-26 28-44t9-29q0-7-2.5-10.5T250-740q-10 0-25 12.5T190-689l-70-71q32-39 65-59.5t65-20.5q46 0 78 32t32 80q0 29-15 64t-50 84q-38 54-56.5 95T220-413q0 17 5.5 26.5T241-377q10 0 17.5-5.5T286-409q13-14 31-34.5t44-50.5q63-75 114-107t107-32q67 0 110 45t49 123h99v100h-99q-8 112-58.5 178.5T554-120Zm2-100q32 0 54-36.5T640-358q-46 11-80 43.5T526-250q0 14 8 22t22 8Z"/></svg>
|
||||
|
After Width: | Height: | Size: 623 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-440v-80h80v80h-80Zm-80 80v-80h80v80h-80Zm160 0v-80h80v80h-80Zm80-80v-80h80v80h-80Zm-320 0v-80h80v80h-80Zm-80 320q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm80-80h80v-80h-80v80Zm160 0h80v-80h-80v80Zm320 0v-80 80Zm-560-80h80v-80h80v80h80v-80h80v80h80v-80h80v80h80v-80h-80v-80h80v-320H200v320h80v80h-80v80Zm0 80v-560 560Zm560-240v80-80ZM600-280v80h80v-80h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 535 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M120-520v-320h320v320H120Zm0 400v-320h320v320H120Zm400-400v-320h320v320H520Zm0 400v-320h320v320H520ZM200-600h160v-160H200v160Zm400 0h160v-160H600v160Zm0 400h160v-160H600v160Zm-400 0h160v-160H200v160Zm400-400Zm0 240Zm-240 0Zm0-240Z"/></svg>
|
||||
|
After Width: | Height: | Size: 336 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M160-440v-80h640v80H160Z"/></svg>
|
||||
|
After Width: | Height: | Size: 130 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M320-200q-117 0-198.5-81.5T40-480q0-117 81.5-198.5T320-760q27 0 52.5 5t49.5 14q-17 14-32 30.5T362-676q-10-2-20.5-3t-21.5-1q-83 0-141.5 58.5T120-480q0 83 58.5 141.5T320-280q11 0 21.5-1t20.5-3q13 18 28 34.5t32 30.5q-24 9-49.5 14t-52.5 5Zm320 0q-27 0-52.5-5T538-219q17-14 32-30.5t28-34.5q11 2 21 3t21 1q83 0 141.5-58.5T840-480q0-83-58.5-141.5T640-680q-11 0-21 1t-21 3q-13-18-28-34.5T538-741q24-9 49.5-14t52.5-5q117 0 198.5 81.5T920-480q0 117-81.5 198.5T640-200Zm-160-50q-57-39-88.5-100T360-480q0-69 31.5-130T480-710q57 39 88.5 100T600-480q0 69-31.5 130T480-250Z"/></svg>
|
||||
|
After Width: | Height: | Size: 664 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z"/></svg>
|
||||
|
After Width: | Height: | Size: 361 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M204-318q-22-38-33-78t-11-82q0-134 93-228t227-94h7l-64-64 56-56 160 160-160 160-56-56 64-64h-7q-100 0-170 70.5T240-478q0 26 6 51t18 49l-60 60ZM481-40 321-200l160-160 56 56-64 64h7q100 0 170-70.5T720-482q0-26-6-51t-18-49l60-60q22 38 33 78t11 82q0 134-93 228t-227 94h-7l64 64-56 56Z"/></svg>
|
||||
|
After Width: | Height: | Size: 386 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M323-160q-11 0-20.5-5.5T288-181l-78-139h58l40 80h92v-40h-68l-40-80H188l-57-100q-2-5-3.5-10t-1.5-10q0-4 5-20l57-100h104l40-80h68v-40h-92l-40 80h-58l78-139q5-10 14.5-15.5T323-800h97q17 0 28.5 11.5T460-760v160h-60l-40 40h100v120h-88l-40-80h-92l-40 40h108l40 80h112v200q0 17-11.5 28.5T420-160h-97Zm217 0q-17 0-28.5-11.5T500-200v-200h112l40-80h108l-40-40h-92l-40 80h-88v-120h100l-40-40h-60v-160q0-17 11.5-28.5T540-800h97q11 0 20.5 5.5T672-779l78 139h-58l-40-80h-92v40h68l40 80h104l57 100q2 5 3.5 10t1.5 10q0 4-5 20l-57 100H668l-40 80h-68v40h92l40-80h58l-78 139q-5 10-14.5 15.5T637-160h-97Z"/></svg>
|
||||
|
After Width: | Height: | Size: 690 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-80 310-250l57-57 73 73v-166h80v165l72-73 58 58L480-80ZM250-310 80-480l169-169 57 57-72 72h166v80H235l73 72-58 58Zm460 0-57-57 73-73H560v-80h165l-73-72 58-58 170 170-170 170ZM440-560v-166l-73 73-57-57 170-170 170 170-57 57-73-73v166h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 347 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M348.5-611.5Q360-623 360-640t-11.5-28.5Q337-680 320-680t-28.5 11.5Q280-657 280-640t11.5 28.5Q303-600 320-600t28.5-11.5Zm160 0Q520-623 520-640t-11.5-28.5Q497-680 480-680t-28.5 11.5Q440-657 440-640t11.5 28.5Q463-600 480-600t28.5-11.5Zm160 0Q680-623 680-640t-11.5-28.5Q657-680 640-680t-28.5 11.5Q600-657 600-640t11.5 28.5Q623-600 640-600t28.5-11.5ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"/></svg>
|
||||
|
After Width: | Height: | Size: 608 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M600-80v-100L320-320H120v-240h172l108-124v-196h240v240H468L360-516v126l240 120v-50h240v240H600ZM480-720h80v-80h-80v80ZM200-400h80v-80h-80v80Zm480 240h80v-80h-80v80ZM520-760ZM240-440Zm480 240Z"/></svg>
|
||||
|
After Width: | Height: | Size: 297 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Z"/></svg>
|
||||
|
After Width: | Height: | Size: 384 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M80-160v-640h800v640H80Zm80-80h640v-480H160v480Zm0 0v-480 480Z"/></svg>
|
||||
|
After Width: | Height: | Size: 168 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M200-440v-80h560v80H200Z"/></svg>
|
||||
|
After Width: | Height: | Size: 130 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M360-160v-240h240v240H360Zm80-80h80v-80h-80v80ZM88-440l-48-64 440-336 160 122v-82h120v174l160 122-48 64-392-299L88-440Zm392 160Z"/></svg>
|
||||
|
After Width: | Height: | Size: 234 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M522-80v-82q34-5 66.5-18t61.5-34l56 58q-42 32-88 51.5T522-80Zm-80 0Q304-98 213-199.5T122-438q0-75 28.5-140.5t77-114q48.5-48.5 114-77T482-798h6l-62-62 56-58 160 160-160 160-56-56 64-64h-8q-117 0-198.5 81.5T202-438q0 104 68 182.5T442-162v82Zm322-134-58-56q21-29 34-61.5t18-66.5h82q-5 50-24.5 96T764-214Zm76-264h-82q-5-34-18-66.5T706-606l58-56q32 39 51 86t25 98Z"/></svg>
|
||||
|
After Width: | Height: | Size: 465 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M120-120v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80v80h-80Zm160 0v-80h80v80h-80Zm160 0v-80h80v80h-80Zm0-160v-80h80v80h-80Zm80-160h-80v-200q0-50-35-85t-85-35H440v-80h200q83 0 141.5 58.5T840-640v200Z"/></svg>
|
||||
|
After Width: | Height: | Size: 418 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M567-167q-47-47-47-113t47-113q47-47 113-47t113 47q47 47 47 113t-47 113q-47 47-113 47t-113-47Zm169.5-56.5Q760-247 760-280t-23.5-56.5Q713-360 680-360t-56.5 23.5Q600-313 600-280t23.5 56.5Q647-200 680-200t56.5-23.5ZM167-287q-47-47-47-113t47-113q47-47 113-47t113 47q47 47 47 113t-47 113q-47 47-113 47t-113-47Zm169.5-56.5Q360-367 360-400t-23.5-56.5Q313-480 280-480t-56.5 23.5Q200-433 200-400t23.5 56.5Q247-320 280-320t56.5-23.5ZM327-607q-47-47-47-113t47-113q47-47 113-47t113 47q47 47 47 113t-47 113q-47 47-113 47t-113-47Zm169.5-56.5Q520-687 520-720t-23.5-56.5Q473-800 440-800t-56.5 23.5Q360-753 360-720t23.5 56.5Q407-640 440-640t56.5-23.5ZM680-280ZM280-400Zm160-320Z"/></svg>
|
||||
|
After Width: | Height: | Size: 766 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-280v-400h400v400H280Zm80-80h240v-240H360v240ZM200-200v80q-33 0-56.5-23.5T120-200h80Zm-80-80v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm80-160h-80q0-33 23.5-56.5T200-840v80Zm80 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80v80h-80Zm0-640v-80h80v80h-80Zm160 640v-80h80q0 33-23.5 56.5T760-120Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80h80v80h-80Zm0-160v-80q33 0 56.5 23.5T840-760h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 568 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M120-120v-720h720v720H120Zm80-80h560v-560H200v560Zm0 0v-560 560Z"/></svg>
|
||||
|
After Width: | Height: | Size: 170 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M160-240q-33 0-56.5-23.5T80-320v-320q0-33 23.5-56.5T160-720h640q33 0 56.5 23.5T880-640v320q0 33-23.5 56.5T800-240H160Zm0-80h640v-320H680v160h-80v-160h-80v160h-80v-160h-80v160h-80v-160H160v320Zm120-160h80-80Zm160 0h80-80Zm160 0h80-80Zm-120 0Z"/></svg>
|
||||
|
After Width: | Height: | Size: 347 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M360-280q-83 0-141.5-58.5T160-480q0-83 58.5-141.5T360-680q73 0 127.5 45.5T556-520h171l-63-64 56-56 160 160-160 160-57-56 64-64H556q-14 69-68.5 114.5T360-280Zm85-115q35-35 35-85t-35-85q-35-35-85-35t-85 35q-35 35-35 85t35 85q35 35 85 35t85-35Zm-85-85Z"/></svg>
|
||||
|
After Width: | Height: | Size: 355 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M280-160v-520H80v-120h520v120H400v520H280Zm360 0v-320H520v-120h360v120H760v320H640Z"/></svg>
|
||||
|
After Width: | Height: | Size: 189 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-120 300-300l58-58 122 122 122-122 58 58-180 180ZM358-598l-58-58 180-180 180 180-58 58-122-122-122 122Z"/></svg>
|
||||
|
After Width: | Height: | Size: 213 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M160-760v-80h640v80H160Zm280 640v-408L336-424l-56-56 200-200 200 200-56 56-104-104v408h-80Z"/></svg>
|
||||
|
After Width: | Height: | Size: 197 B |
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>EBENEN</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.jsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,3 @@
|
||||
node_modules/
|
||||
dist/
|
||||
.DS_Store
|
||||
@@ -0,0 +1,90 @@
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
1. Rhino 8 starten
|
||||
2. `Rhinoceros 8` → `Preferences` → `General` → **Startup commands**
|
||||
3. Folgende Zeile eintragen:
|
||||
```
|
||||
_-RunPythonScript "/Users/karim/STUDIO/rhino-panel/rhino/startup.py"
|
||||
```
|
||||
4. OK → Rhino neu starten
|
||||
|
||||
Ab jetzt lädt `startup.py` bei jedem Rhino-Start:
|
||||
- mit `dossier.project.json` neben der `.3dm` → nur konfigurierte Module
|
||||
- ohne Config → alle Module (Backwards-Compat zum bisherigen Verhalten)
|
||||
|
||||
## Entwicklung
|
||||
|
||||
```bash
|
||||
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)
|
||||
|
||||
```bash
|
||||
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
|
||||
```bash
|
||||
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:**
|
||||
1. Launcher liest `~/Library/Application Support/Dossier/recent.json`
|
||||
2. User klickt „Öffnen" → Launcher schreibt `dossier.project.json` neben die
|
||||
`.3dm` und ruft `open -a "Rhinoceros 8" file.3dm`
|
||||
3. Rhino startet, `startup.py` läuft, liest die Config, lädt nur die aktivierten
|
||||
Module
|
||||
4. Jedes Modul registriert sein eigenes Panel via `panel_base.register_and_open`
|
||||
|
||||
## Module-Manifest erweitern
|
||||
|
||||
Wenn ein neues Modul dazukommt, **drei Stellen** synchron halten:
|
||||
|
||||
1. `launcher/modules.json` — Eintrag mit `id`, `name`, `description`, `pythonModule`, `dependsOn`
|
||||
2. `rhino/startup.py` — `_MODULE_TO_PY` Map ergänzen
|
||||
3. `rhino/<pythonModule>.py` — die Python-Implementierung
|
||||
|
||||
Launcher rebuilden (`npm run tauri build`), neue `.app` ersetzt die alte.
|
||||
@@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Dossier</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.jsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,65 @@
|
||||
[
|
||||
{
|
||||
"id": "ebenen",
|
||||
"name": "Ebenen-Manager",
|
||||
"description": "Zeichnungsebenen (Geschosse, Schnitte, Ansichten) verwalten.",
|
||||
"pythonModule": "rhinopanel",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"id": "oberleiste",
|
||||
"name": "Oberleiste",
|
||||
"description": "Massstab, Display-Mode, Snaps, Overrides — die Top-Toolbar.",
|
||||
"pythonModule": "oberleiste",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"id": "ausschnitte",
|
||||
"name": "Ausschnitte",
|
||||
"description": "Viewport-Ausschnitte mit Kamera, Massstab und Layer-Sichtbarkeit speichern.",
|
||||
"pythonModule": "ausschnitte",
|
||||
"dependsOn": ["oberleiste"]
|
||||
},
|
||||
{
|
||||
"id": "gestaltung",
|
||||
"name": "Gestaltung",
|
||||
"description": "Wand-Typen, Materialien, Texturen.",
|
||||
"pythonModule": "gestaltung",
|
||||
"dependsOn": ["ebenen"]
|
||||
},
|
||||
{
|
||||
"id": "werkzeuge",
|
||||
"name": "Werkzeuge",
|
||||
"description": "Hilfs-Werkzeuge fuer wiederkehrende Aufgaben.",
|
||||
"pythonModule": "werkzeuge",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"id": "overrides",
|
||||
"name": "Overrides",
|
||||
"description": "Layer-Style Overrides (Linientypen, Farben, Druck-Gewichte).",
|
||||
"pythonModule": "overrides_panel",
|
||||
"dependsOn": ["oberleiste"]
|
||||
},
|
||||
{
|
||||
"id": "dimensionen",
|
||||
"name": "Dimensionen",
|
||||
"description": "Object Info Palette: Position, Abmessungen, Drehung der Selektion bearbeiten (wie in Vectorworks).",
|
||||
"pythonModule": "dimensionen",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"id": "layouts",
|
||||
"name": "Layouts",
|
||||
"description": "Layouts erstellen und Details mit Ausschnitten bestuecken.",
|
||||
"pythonModule": "layouts",
|
||||
"dependsOn": ["ausschnitte"]
|
||||
},
|
||||
{
|
||||
"id": "elemente",
|
||||
"name": "Elemente",
|
||||
"description": "Smart-Elemente: Waende als Achse (editierbar) + Volumen (auto-generiert), verknuepft mit Geschossen.",
|
||||
"pythonModule": "elemente",
|
||||
"dependsOn": ["ebenen"]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "dossier-launcher",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2.0.0",
|
||||
"@tauri-apps/plugin-dialog": "^2.0.0",
|
||||
"react": "^19.2.6",
|
||||
"react-dom": "^19.2.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tauri-apps/cli": "^2.0.0",
|
||||
"@vitejs/plugin-react": "^6.0.1",
|
||||
"esbuild": "^0.28.0",
|
||||
"vite": "^8.0.12"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
/target
|
||||
/gen
|
||||
@@ -0,0 +1,28 @@
|
||||
[package]
|
||||
name = "dossier-launcher"
|
||||
version = "0.1.0"
|
||||
description = "Dossier — Projekt-Launcher fuer Rhino"
|
||||
authors = ["Karim Gabriele Varano"]
|
||||
edition = "2021"
|
||||
|
||||
[lib]
|
||||
name = "dossier_launcher_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "2", features = [] }
|
||||
tauri-plugin-dialog = "2"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
directories = "5"
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
|
||||
[profile.release]
|
||||
panic = "abort"
|
||||
codegen-units = 1
|
||||
lto = true
|
||||
opt-level = "s"
|
||||
strip = true
|
||||
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "Capability fuer das Hauptfenster",
|
||||
"windows": ["main"],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"dialog:default"
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,174 @@
|
||||
// Verhindert ein extra Konsolen-Fenster auf Windows im Release-Build.
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::Command;
|
||||
|
||||
// Statisches Modul-Manifest — in die Binary einkompiliert, sodass die App
|
||||
// keine externe Datei zur Laufzeit braucht. Wer Module aendert: modules.json
|
||||
// im launcher-Root bearbeiten, dann neu bauen.
|
||||
const MODULES_JSON: &str = include_str!("../../modules.json");
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
struct Project {
|
||||
name: String,
|
||||
path: String,
|
||||
modules: Vec<String>,
|
||||
#[serde(rename = "lastOpened")]
|
||||
last_opened: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
struct ProjectConfig {
|
||||
name: String,
|
||||
modules: Vec<String>,
|
||||
#[serde(rename = "dossierVersion")]
|
||||
dossier_version: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
struct Settings {
|
||||
// App-Name oder absoluter Pfad zur Rhino-App. `open -a` akzeptiert beides:
|
||||
// "Rhinoceros 8" -> sucht in /Applications
|
||||
// "/Applications/Rhino 8.app" oder ein Beta-Build irgendwo anders.
|
||||
#[serde(rename = "rhinoApp")]
|
||||
rhino_app: String,
|
||||
}
|
||||
|
||||
impl Default for Settings {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
rhino_app: "Rhinoceros 8".into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn dossier_dir() -> PathBuf {
|
||||
// ~/Library/Application Support/Dossier auf macOS,
|
||||
// entsprechend Plattform-Pendants sonst.
|
||||
let dir = directories::ProjectDirs::from("ch", "gabrielevarano", "Dossier")
|
||||
.map(|p| p.data_dir().to_path_buf())
|
||||
.unwrap_or_else(|| PathBuf::from("."));
|
||||
fs::create_dir_all(&dir).ok();
|
||||
dir
|
||||
}
|
||||
|
||||
fn recent_path() -> PathBuf {
|
||||
dossier_dir().join("recent.json")
|
||||
}
|
||||
|
||||
fn settings_path() -> PathBuf {
|
||||
dossier_dir().join("settings.json")
|
||||
}
|
||||
|
||||
fn load_settings() -> Settings {
|
||||
let p = settings_path();
|
||||
if !p.exists() {
|
||||
return Settings::default();
|
||||
}
|
||||
fs::read_to_string(&p)
|
||||
.ok()
|
||||
.and_then(|raw| serde_json::from_str(&raw).ok())
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn list_recent() -> Vec<Project> {
|
||||
let p = recent_path();
|
||||
if !p.exists() {
|
||||
return vec![];
|
||||
}
|
||||
let raw = fs::read_to_string(&p).unwrap_or_default();
|
||||
serde_json::from_str(&raw).unwrap_or_default()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn save_recent(projects: Vec<Project>) -> Result<(), String> {
|
||||
let p = recent_path();
|
||||
let raw = serde_json::to_string_pretty(&projects).map_err(|e| e.to_string())?;
|
||||
fs::write(&p, raw).map_err(|e| format!("recent.json schreiben: {e}"))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn write_project_config(
|
||||
path3dm: String,
|
||||
name: String,
|
||||
modules: Vec<String>,
|
||||
) -> Result<(), String> {
|
||||
let p = Path::new(&path3dm);
|
||||
let dir = p
|
||||
.parent()
|
||||
.ok_or_else(|| format!("Kein gueltiger Ordner aus Pfad: {path3dm}"))?;
|
||||
let config_path = dir.join("dossier.project.json");
|
||||
let config = ProjectConfig {
|
||||
name,
|
||||
modules,
|
||||
dossier_version: env!("CARGO_PKG_VERSION").to_string(),
|
||||
};
|
||||
let raw = serde_json::to_string_pretty(&config).map_err(|e| e.to_string())?;
|
||||
fs::write(&config_path, raw).map_err(|e| format!("project-config schreiben: {e}"))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn read_project_config(path3dm: String) -> Result<Option<ProjectConfig>, String> {
|
||||
let p = Path::new(&path3dm);
|
||||
let dir = p.parent().ok_or_else(|| "Pfad ungueltig".to_string())?;
|
||||
let config_path = dir.join("dossier.project.json");
|
||||
if !config_path.exists() {
|
||||
return Ok(None);
|
||||
}
|
||||
let raw = fs::read_to_string(&config_path).map_err(|e| e.to_string())?;
|
||||
let cfg: ProjectConfig = serde_json::from_str(&raw).map_err(|e| e.to_string())?;
|
||||
Ok(Some(cfg))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn open_rhino(path3dm: String) -> Result<(), String> {
|
||||
// macOS: `open -a <app> <file>`. `<app>` kann ein App-Name (in /Applications
|
||||
// gesucht) oder ein absoluter Pfad zur .app sein. Aus den Settings — Default
|
||||
// "Rhinoceros 8", falls der User nichts angepasst hat.
|
||||
let settings = load_settings();
|
||||
Command::new("open")
|
||||
.args(["-a", &settings.rhino_app, &path3dm])
|
||||
.spawn()
|
||||
.map_err(|e| format!(
|
||||
"open-Befehl fehlgeschlagen ({}): {e}", settings.rhino_app
|
||||
))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn read_settings() -> Settings {
|
||||
load_settings()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn save_settings(settings: Settings) -> Result<(), String> {
|
||||
let raw = serde_json::to_string_pretty(&settings).map_err(|e| e.to_string())?;
|
||||
fs::write(settings_path(), raw).map_err(|e| format!("settings.json schreiben: {e}"))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn read_modules_manifest() -> Result<serde_json::Value, String> {
|
||||
serde_json::from_str(MODULES_JSON).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_dialog::init())
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
list_recent,
|
||||
save_recent,
|
||||
write_project_config,
|
||||
read_project_config,
|
||||
open_rhino,
|
||||
read_modules_manifest,
|
||||
read_settings,
|
||||
save_settings
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("Fehler beim Starten der Tauri-App");
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
// Tauri 2 Konvention: main.rs ist nur Einstieg, Logik in lib.rs (fuer Mobile-
|
||||
// Unterstuetzung und damit `tauri::generate_context!` korrekt aufgeloest wird).
|
||||
fn main() {
|
||||
dossier_launcher_lib::run()
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "Dossier",
|
||||
"version": "0.1.0",
|
||||
"identifier": "ch.gabrielevarano.dossier",
|
||||
"build": {
|
||||
"beforeDevCommand": "npm run dev",
|
||||
"beforeBuildCommand": "(cd .. && npm run build) && npm run build",
|
||||
"devUrl": "http://127.0.0.1:5183",
|
||||
"frontendDist": "../dist"
|
||||
},
|
||||
"app": {
|
||||
"windows": [
|
||||
{
|
||||
"label": "main",
|
||||
"title": "Dossier",
|
||||
"width": 920,
|
||||
"height": 640,
|
||||
"minWidth": 720,
|
||||
"minHeight": 480,
|
||||
"resizable": true,
|
||||
"fullscreen": false
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"csp": null
|
||||
}
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": ["app", "dmg"],
|
||||
"icon": ["icons/icon.png"],
|
||||
"copyright": "© 2026 Karim Gabriele Varano",
|
||||
"category": "DeveloperTool",
|
||||
"shortDescription": "Dossier Launcher",
|
||||
"longDescription": "Projekt-Launcher fuer das Dossier-Plugin in Rhino 8.",
|
||||
"resources": {
|
||||
"../../dist": "dist",
|
||||
"../../rhino": "rhino"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,325 @@
|
||||
import React, { useEffect, useState, useMemo } from 'react'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { open as openDialog, save as saveDialog } from '@tauri-apps/plugin-dialog'
|
||||
|
||||
// Transitive Dependency-Aufloesung: gibt Set aller Module zurueck, die
|
||||
// aktiviert sein muessen, wenn `selected` aktiviert sind.
|
||||
function resolveDeps(selected, allModules) {
|
||||
const byId = Object.fromEntries(allModules.map(m => [m.id, m]))
|
||||
const out = new Set(selected)
|
||||
let changed = true
|
||||
while (changed) {
|
||||
changed = false
|
||||
for (const id of [...out]) {
|
||||
const m = byId[id]
|
||||
if (!m) continue
|
||||
for (const dep of (m.dependsOn || [])) {
|
||||
if (!out.has(dep)) { out.add(dep); changed = true }
|
||||
}
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// Modul-IDs, die aktuell aktiv sind WEIL eine andere Auswahl sie braucht.
|
||||
function lockedBy(selected, allModules) {
|
||||
const byId = Object.fromEntries(allModules.map(m => [m.id, m]))
|
||||
const locked = new Set()
|
||||
for (const id of selected) {
|
||||
const m = byId[id]
|
||||
if (!m) continue
|
||||
for (const dep of (m.dependsOn || [])) {
|
||||
if (selected.has(dep) || selected.has(id)) locked.add(dep)
|
||||
}
|
||||
}
|
||||
return locked
|
||||
}
|
||||
|
||||
function formatRelative(iso) {
|
||||
if (!iso) return ''
|
||||
try {
|
||||
const d = new Date(iso)
|
||||
const now = new Date()
|
||||
const diff = (now - d) / 1000
|
||||
if (diff < 60) return 'vor wenigen Sek.'
|
||||
if (diff < 3600) return `vor ${Math.floor(diff/60)} Min.`
|
||||
if (diff < 86400) return `vor ${Math.floor(diff/3600)} h`
|
||||
if (diff < 86400 * 7) return `vor ${Math.floor(diff/86400)} Tagen`
|
||||
return d.toLocaleDateString('de-CH')
|
||||
} catch { return '' }
|
||||
}
|
||||
|
||||
export default function App() {
|
||||
const [recent, setRecent] = useState([])
|
||||
const [modules, setModules] = useState([])
|
||||
const [dialog, setDialog] = useState(null) // null | { mode: 'new'|'edit', project? }
|
||||
const [settingsOpen, setSettingsOpen] = useState(false)
|
||||
const [busy, setBusy] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
invoke('list_recent').then(setRecent).catch(console.error)
|
||||
invoke('read_modules_manifest').then(setModules).catch(console.error)
|
||||
}, [])
|
||||
|
||||
const refresh = () => invoke('list_recent').then(setRecent).catch(console.error)
|
||||
|
||||
const openProject = async (proj) => {
|
||||
if (busy) return
|
||||
setBusy(true)
|
||||
try {
|
||||
await invoke('open_rhino', { path3dm: proj.path })
|
||||
const next = recent.map(p =>
|
||||
p.path === proj.path ? { ...p, lastOpened: new Date().toISOString() } : p
|
||||
)
|
||||
await invoke('save_recent', { projects: next })
|
||||
setRecent(next)
|
||||
} catch (ex) {
|
||||
alert(`Rhino-Start fehlgeschlagen: ${ex}`)
|
||||
} finally {
|
||||
setBusy(false)
|
||||
}
|
||||
}
|
||||
|
||||
const editProject = (proj) => {
|
||||
setDialog({ mode: 'edit', project: proj })
|
||||
}
|
||||
|
||||
const saveProject = async ({ name, path, modules: mods }) => {
|
||||
if (!path) { alert('Bitte eine .3dm-Datei auswaehlen.'); return }
|
||||
if (!name.trim()) { alert('Bitte einen Projekt-Namen angeben.'); return }
|
||||
try {
|
||||
await invoke('write_project_config', { path3dm: path, name: name.trim(), modules: mods })
|
||||
const others = recent.filter(p => p.path !== path)
|
||||
const next = [{ name: name.trim(), path, modules: mods,
|
||||
lastOpened: new Date().toISOString() }, ...others]
|
||||
await invoke('save_recent', { projects: next })
|
||||
setRecent(next)
|
||||
setDialog(null)
|
||||
} catch (ex) {
|
||||
alert(`Speichern fehlgeschlagen: ${ex}`)
|
||||
}
|
||||
}
|
||||
|
||||
const removeProject = async (proj) => {
|
||||
const next = recent.filter(p => p.path !== proj.path)
|
||||
await invoke('save_recent', { projects: next })
|
||||
setRecent(next)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="app">
|
||||
<div className="topbar">
|
||||
<span className="brand">DOSSIER</span>
|
||||
<span className="version">0.1.0</span>
|
||||
<div className="spacer" />
|
||||
<button onClick={() => setDialog({ mode: 'new' })}>Neues Projekt</button>
|
||||
<button onClick={() => setSettingsOpen(true)} title="Einstellungen"
|
||||
style={{ padding: '6px 10px' }}>⚙</button>
|
||||
</div>
|
||||
|
||||
<div className="main">
|
||||
<h2 className="section-title">Kuerzlich geoeffnet</h2>
|
||||
{recent.length === 0 ? (
|
||||
<div className="empty">
|
||||
Noch keine Projekte. Klick „Neues Projekt" zum Starten.
|
||||
</div>
|
||||
) : (
|
||||
<div className="project-list">
|
||||
{recent.map(p => (
|
||||
<div key={p.path} className="project-card"
|
||||
onDoubleClick={() => openProject(p)}>
|
||||
<div style={{ flex: 1, minWidth: 0 }}>
|
||||
<div className="name">{p.name}</div>
|
||||
<div className="path">{p.path}</div>
|
||||
</div>
|
||||
<div className="meta">
|
||||
{p.modules?.length || 0} Module · {formatRelative(p.lastOpened)}
|
||||
</div>
|
||||
<button onClick={() => editProject(p)}>Bearbeiten</button>
|
||||
<button className="primary" disabled={busy}
|
||||
onClick={() => openProject(p)}>
|
||||
Öffnen
|
||||
</button>
|
||||
<button onClick={() => removeProject(p)} title="Aus Liste entfernen">×</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{dialog && (
|
||||
<ProjectDialog
|
||||
mode={dialog.mode}
|
||||
project={dialog.project}
|
||||
modules={modules}
|
||||
onCancel={() => setDialog(null)}
|
||||
onSave={saveProject}
|
||||
/>
|
||||
)}
|
||||
{settingsOpen && (
|
||||
<SettingsDialog onClose={() => setSettingsOpen(false)} />
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function SettingsDialog({ onClose }) {
|
||||
const [rhinoApp, setRhinoApp] = useState('')
|
||||
const [loaded, setLoaded] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
invoke('read_settings')
|
||||
.then(s => { setRhinoApp(s.rhinoApp || 'Rhinoceros 8'); setLoaded(true) })
|
||||
.catch(() => { setRhinoApp('Rhinoceros 8'); setLoaded(true) })
|
||||
}, [])
|
||||
|
||||
const pickRhino = async () => {
|
||||
// .app-Bundles sind technisch Ordner, macOS behandelt sie aber im File-Picker
|
||||
// als auswaehlbare Pakete, wenn der Extension-Filter "app" gesetzt ist.
|
||||
// directory:true wuerde stattdessen reinnavigieren — falsch.
|
||||
const sel = await openDialog({
|
||||
title: 'Rhino-App waehlen',
|
||||
filters: [{ name: 'Anwendung', extensions: ['app'] }],
|
||||
defaultPath: '/Applications',
|
||||
})
|
||||
if (typeof sel === 'string') setRhinoApp(sel)
|
||||
}
|
||||
|
||||
const useDefault = () => setRhinoApp('Rhinoceros 8')
|
||||
|
||||
const save = async () => {
|
||||
try {
|
||||
await invoke('save_settings', { settings: { rhinoApp: rhinoApp.trim() || 'Rhinoceros 8' } })
|
||||
onClose()
|
||||
} catch (ex) {
|
||||
alert(`Speichern fehlgeschlagen: ${ex}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (!loaded) return null
|
||||
|
||||
return (
|
||||
<div className="dialog-bg" onClick={(e) => { if (e.target === e.currentTarget) onClose() }}>
|
||||
<div className="dialog" style={{ width: 520 }}>
|
||||
<header>Einstellungen</header>
|
||||
<div className="body">
|
||||
<div className="row">
|
||||
<label>Rhino-Anwendung</label>
|
||||
<div className="file-picker">
|
||||
<input type="text" value={rhinoApp}
|
||||
onChange={e => setRhinoApp(e.target.value)}
|
||||
placeholder="Rhinoceros 8" />
|
||||
<button onClick={pickRhino}>Waehlen…</button>
|
||||
</div>
|
||||
<div style={{ fontSize: 11, color: 'var(--text-muted)', lineHeight: 1.5 }}>
|
||||
App-Name (in /Applications gesucht) oder absoluter Pfad zur .app.
|
||||
Beispiele:<br />
|
||||
<code style={{ fontFamily: 'var(--mono)' }}>Rhinoceros 8</code> · <code style={{ fontFamily: 'var(--mono)' }}>/Applications/Rhino 8.app</code> · <code style={{ fontFamily: 'var(--mono)' }}>/Applications/Rhino 8 WIP.app</code>
|
||||
<button onClick={useDefault} style={{ display: 'block', marginTop: 8, fontSize: 11 }}>
|
||||
Standard verwenden
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<button onClick={onClose}>Abbrechen</button>
|
||||
<button className="primary" onClick={save}>Speichern</button>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function ProjectDialog({ mode, project, modules, onCancel, onSave }) {
|
||||
const [name, setName] = useState(project?.name || '')
|
||||
const [path, setPath] = useState(project?.path || '')
|
||||
const [picked, setPicked] = useState(new Set(project?.modules || ['ebenen', 'oberleiste']))
|
||||
|
||||
const effective = useMemo(() => resolveDeps(picked, modules), [picked, modules])
|
||||
const locked = useMemo(() => {
|
||||
// Module, die aktiv sind, aber NICHT direkt gewaehlt — also nur als Dep
|
||||
const out = new Set()
|
||||
for (const id of effective) {
|
||||
if (!picked.has(id)) out.add(id)
|
||||
}
|
||||
return out
|
||||
}, [picked, effective, modules])
|
||||
|
||||
const toggle = (id) => {
|
||||
if (locked.has(id)) return // nicht direkt abwaehlbar
|
||||
setPicked(prev => {
|
||||
const next = new Set(prev)
|
||||
if (next.has(id)) next.delete(id); else next.add(id)
|
||||
return next
|
||||
})
|
||||
}
|
||||
|
||||
const pickFile = async () => {
|
||||
const sel = mode === 'new'
|
||||
? await openDialog({
|
||||
title: '3dm-Datei auswaehlen',
|
||||
filters: [{ name: 'Rhino', extensions: ['3dm'] }],
|
||||
})
|
||||
: await openDialog({
|
||||
title: '3dm-Datei auswaehlen',
|
||||
filters: [{ name: 'Rhino', extensions: ['3dm'] }],
|
||||
})
|
||||
if (typeof sel === 'string') setPath(sel)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="dialog-bg" onClick={(e) => { if (e.target === e.currentTarget) onCancel() }}>
|
||||
<div className="dialog">
|
||||
<header>{mode === 'new' ? 'Neues Projekt' : 'Projekt bearbeiten'}</header>
|
||||
<div className="body">
|
||||
<div className="row">
|
||||
<label>Projekt-Name</label>
|
||||
<input type="text" value={name} onChange={e => setName(e.target.value)}
|
||||
placeholder="z.B. Wohnhaus Brunner" autoFocus />
|
||||
</div>
|
||||
<div className="row">
|
||||
<label>3dm-Datei</label>
|
||||
<div className="file-picker">
|
||||
<input type="text" value={path} readOnly
|
||||
placeholder="Pfad zur 3dm-Datei" />
|
||||
<button onClick={pickFile}>Waehlen…</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="row">
|
||||
<label>Module ({[...effective].length} aktiv)</label>
|
||||
<div className="module-grid">
|
||||
{modules.map(m => {
|
||||
const isActive = effective.has(m.id)
|
||||
const isLocked = locked.has(m.id)
|
||||
return (
|
||||
<div
|
||||
key={m.id}
|
||||
className={`module-row ${isActive ? 'active' : ''} ${isLocked ? 'locked' : ''}`}
|
||||
onClick={() => toggle(m.id)}
|
||||
title={isLocked ? 'Wird von einem anderen Modul gebraucht' : ''}
|
||||
>
|
||||
<div className="check">{isActive ? (isLocked ? '🔒' : '✓') : ''}</div>
|
||||
<div className="info">
|
||||
<div className="name">{m.name}</div>
|
||||
<div className="desc">{m.description}</div>
|
||||
{(m.dependsOn || []).length > 0 && (
|
||||
<div className="dep">braucht: {m.dependsOn.join(', ')}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<button onClick={onCancel}>Abbrechen</button>
|
||||
<button className="primary"
|
||||
onClick={() => onSave({ name, path, modules: [...effective] })}>
|
||||
Speichern
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import React from 'react'
|
||||
import { createRoot } from 'react-dom/client'
|
||||
import App from './App.jsx'
|
||||
import './styles.css'
|
||||
|
||||
createRoot(document.getElementById('root')).render(<App />)
|
||||
@@ -0,0 +1,231 @@
|
||||
:root {
|
||||
--bg-base: #1c1c1e;
|
||||
--bg-panel: #2a2a2c;
|
||||
--bg-elev: #34343a;
|
||||
--border: #3a3a3e;
|
||||
--text: #eaeaea;
|
||||
--text-muted: #8a8a8e;
|
||||
--accent: #5a9e5a;
|
||||
--accent-hover: #6cb56c;
|
||||
--danger: #c87050;
|
||||
--font: 'Inter', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif;
|
||||
--mono: 'DM Mono', 'Menlo', monospace;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
html, body, #root {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
background: var(--bg-base);
|
||||
color: var(--text);
|
||||
font-family: var(--font);
|
||||
font-size: 13px;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
button {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
background: var(--bg-elev);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
padding: 6px 12px;
|
||||
cursor: pointer;
|
||||
transition: background 0.1s ease;
|
||||
}
|
||||
button:hover:not(:disabled) { background: #404048; }
|
||||
button:disabled { opacity: 0.4; cursor: not-allowed; }
|
||||
button.primary {
|
||||
background: var(--accent);
|
||||
border-color: var(--accent);
|
||||
color: white;
|
||||
}
|
||||
button.primary:hover:not(:disabled) { background: var(--accent-hover); }
|
||||
|
||||
input[type="text"] {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
background: var(--bg-base);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
padding: 6px 10px;
|
||||
outline: none;
|
||||
}
|
||||
input[type="text"]:focus { border-color: var(--accent); }
|
||||
|
||||
.app {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
}
|
||||
.topbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 14px 20px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
background: var(--bg-panel);
|
||||
}
|
||||
.topbar .brand {
|
||||
font-family: var(--mono);
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.12em;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
.topbar .version {
|
||||
font-family: var(--mono);
|
||||
font-size: 10px;
|
||||
color: var(--text-muted);
|
||||
opacity: 0.6;
|
||||
}
|
||||
.topbar .spacer { flex: 1; }
|
||||
|
||||
.main { flex: 1; overflow-y: auto; padding: 20px; }
|
||||
|
||||
.section-title {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text-muted);
|
||||
margin: 0 0 12px 0;
|
||||
}
|
||||
|
||||
.project-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
.project-card {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 12px 14px;
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
transition: border-color 0.1s ease;
|
||||
}
|
||||
.project-card:hover { border-color: #555; }
|
||||
.project-card .name {
|
||||
font-weight: 500;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.project-card .path {
|
||||
font-family: var(--mono);
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
.project-card .meta {
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.empty {
|
||||
padding: 40px;
|
||||
text-align: center;
|
||||
color: var(--text-muted);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.module-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 8px;
|
||||
}
|
||||
.module-row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 10px 12px;
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.module-row.locked { opacity: 0.7; cursor: default; }
|
||||
.module-row .check {
|
||||
flex-shrink: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 4px;
|
||||
border: 1.5px solid var(--border);
|
||||
background: var(--bg-base);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 11px;
|
||||
color: white;
|
||||
}
|
||||
.module-row.active .check { background: var(--accent); border-color: var(--accent); }
|
||||
.module-row.locked .check { background: #555; border-color: #555; }
|
||||
.module-row .info { flex: 1; min-width: 0; }
|
||||
.module-row .info .name { font-weight: 500; margin-bottom: 2px; }
|
||||
.module-row .info .desc { font-size: 11px; color: var(--text-muted); line-height: 1.4; }
|
||||
.module-row .info .dep {
|
||||
font-family: var(--mono);
|
||||
font-size: 10px;
|
||||
color: var(--text-muted);
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.dialog-bg {
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,0.6);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
z-index: 10;
|
||||
}
|
||||
.dialog {
|
||||
width: 600px; max-width: 90vw;
|
||||
max-height: 90vh;
|
||||
background: var(--bg-base);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
}
|
||||
.dialog header {
|
||||
padding: 14px 18px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
font-weight: 500;
|
||||
}
|
||||
.dialog .body {
|
||||
padding: 18px;
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 14px;
|
||||
}
|
||||
.dialog .row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.dialog .row label {
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
letter-spacing: 0.05em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.dialog footer {
|
||||
padding: 12px 18px;
|
||||
border-top: 1px solid var(--border);
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
}
|
||||
.file-picker {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
.file-picker input { flex: 1; font-family: var(--mono); font-size: 11px; }
|
||||
@@ -0,0 +1,26 @@
|
||||
import { defineConfig } from 'vite'
|
||||
import react from '@vitejs/plugin-react'
|
||||
|
||||
// Tauri-spezifisch: kein Browser-Open, fixer Port, ignoriert src-tauri fuer Hot-Reload.
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
clearScreen: false,
|
||||
server: {
|
||||
// Eigener Port (nicht 5173/5174 — die nutzen andere Studio-Projekte wie
|
||||
// Rapport). Host explizit IPv4, weil Tauri's devUrl auf 127.0.0.1
|
||||
// bindet — sonst kann Tauri auf [::1]:<port> eines anderen Vite-Servers
|
||||
// landen, wenn localhost zuerst zu IPv6 resolved.
|
||||
port: 5183,
|
||||
strictPort: true,
|
||||
host: '127.0.0.1',
|
||||
},
|
||||
envPrefix: ['VITE_', 'TAURI_'],
|
||||
build: {
|
||||
outDir: 'dist',
|
||||
target: 'safari14',
|
||||
// Vite 8: 'oxc' ist der eingebaute Rust-Minifier (default). 'esbuild'
|
||||
// wuerde ein separates Paket erfordern — nicht noetig fuer uns.
|
||||
minify: 'oxc',
|
||||
sourcemap: false,
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "dossier",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^19.2.6",
|
||||
"react-dom": "^19.2.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^10.0.1",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@vitejs/plugin-react": "^6.0.1",
|
||||
"eslint": "^10.3.0",
|
||||
"eslint-plugin-react-hooks": "^7.1.1",
|
||||
"eslint-plugin-react-refresh": "^0.5.2",
|
||||
"globals": "^17.6.0",
|
||||
"vite": "^8.0.12"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 9.3 KiB |
@@ -0,0 +1,24 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
||||
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
||||
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
||||
</symbol>
|
||||
<symbol id="discord-icon" viewBox="0 0 20 19">
|
||||
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
||||
</symbol>
|
||||
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
||||
</symbol>
|
||||
<symbol id="github-icon" viewBox="0 0 19 19">
|
||||
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
||||
</symbol>
|
||||
<symbol id="social-icon" viewBox="0 0 20 20">
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
||||
</symbol>
|
||||
<symbol id="x-icon" viewBox="0 0 19 19">
|
||||
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
@@ -0,0 +1,666 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--This file was generated by Rhinoceros, DO NOT modify this file-->
|
||||
<RhinoUI major_ver="1" minor_ver="0" created_on_platform="Mac" created_on_rhino_version="8.31.26126.13432" name="PAUSEUI">
|
||||
<!--Window Layout display name for this file-->
|
||||
<name>
|
||||
<locale_1033>PAUSEUI</locale_1033>
|
||||
</name>
|
||||
<!--Tab panel collection definitions and dock bar placement information-->
|
||||
<dock_bars major_ver="1" minor_ver="0">
|
||||
<dock_bar guid="171011a9-a956-41ee-853e-3ccc0c0db1d8" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="ac3566f9-fe75-4258-9210-b1e9c05a5881">
|
||||
<placement dock_location="Floating" recent_dock_location="Top" dock_band_size="36,48" dock_band_item_size="1,-1" docked_placement="0,0" float_point="226,191" float_size="1000,75" />
|
||||
<tabs name="Standard Toolbars" selected_item="4bb9c817-d19f-45fd-8af2-39e9805f3e9f" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Standard Toolbars</locale_1033>
|
||||
<locale_1029>Standardní palety nástrojů</locale_1029>
|
||||
<locale_1031>Standard-Werkzeugleisten</locale_1031>
|
||||
<locale_1034>Barras de herramientas estándar</locale_1034>
|
||||
<locale_1036>Barres d'outils Standard</locale_1036>
|
||||
<locale_1040>Barre degli strumenti standard</locale_1040>
|
||||
<locale_1041>標準ツールバー</locale_1041>
|
||||
<locale_1042>표준 도구모음</locale_1042>
|
||||
<locale_1045>Standardowe paski narzędzi</locale_1045>
|
||||
<locale_2070>Barras de Ferramentas Standard</locale_2070>
|
||||
<locale_2052>标准工具列</locale_2052>
|
||||
<locale_1028>標準工具列</locale_1028>
|
||||
<locale_1049>Стандартные панели инструментов</locale_1049>
|
||||
</name>
|
||||
<removed_item Item1="3a7f2e1d-4b8c-4d9e-a1b2-c3d4e5f60718" Item2="3a7f2e1d-4b8c-4d9e-a1b2-c3d4e5f60718" />
|
||||
<removed_item Item1="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" Item2="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" />
|
||||
<tool_bar guid="4bb9c817-d19f-45fd-8af2-39e9805f3e9f" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="32318c40-46e9-4aa3-8f73-09371ec27a4d" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="2ed87e2b-d225-4625-aeda-b11a115c9a14" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="720d3154-34fc-4177-8e52-9f417d4b5af3" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="79d0d952-85af-4fe3-8444-46596bbe22fd" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="9772529f-ea7a-4e2f-9dab-5beff3ce96e8" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="0608110b-184c-443f-97ec-0612d9d2b605" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="9f21066b-eb0f-46f5-adeb-d62f80e04fd7" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="d767ebe9-eebd-4e75-a217-03f7431f71bf" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar_colletion="4b37b788-3a60-4c54-a4be-67e756115945" />
|
||||
<tool_bar guid="b977d038-c9b6-4a9b-b097-9592a4117052" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="c8064867-a611-4b55-b747-fc2aee5d9bf3" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="4cd9a071-9337-4389-aa40-2a20f570da3b" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="625e34b2-3b19-4aba-91c2-94f79e2e1d91" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="44619cf6-b73a-46ea-93f8-46f1fa333115" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="12428ca8-b9f4-4954-8f6e-8a139226b383" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="a5379863-ee51-4b77-ab0c-44ee93c92ca3" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="fa6d5bcc-8cd8-416b-8701-f89bd697e94d" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="d0a817a1-dea9-4e03-89e3-0d63d99b5e51" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="54dcdb3a-f098-49a4-9947-d5605d675be3" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="90fd89fc-e41f-49cc-bcf0-29e0d58017a1" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar_colletion="4b37b788-3a60-4c54-a4be-67e756115945" />
|
||||
<tool_bar guid="16770b13-f7fb-4060-a6e6-607f90dd8bb3" file="c7da84fc-2991-4824-832a-4f2509bd0ede" side_bar="42b36785-e767-4c66-8704-4d828bcb0225" side_bar_file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="26b86ed9-12ff-4198-b49e-83bd3dfa7480" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="12428ca8-b9f4-4954-8f6e-8a139226b383">
|
||||
<placement dock_location="Floating" recent_dock_location="Left" float_point="-1431655808,0" float_size="266,255" />
|
||||
<tabs name="SubD Sidebar" selected_item="aaa213c9-f422-477a-9782-a6ae60104171" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>SubD Sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel SubD</locale_1029>
|
||||
<locale_1031>SubD-Seitenleiste</locale_1031>
|
||||
<locale_1034>SubD (lateral)</locale_1034>
|
||||
<locale_1036>Volet SubD</locale_1036>
|
||||
<locale_1040>Barra laterale SubD</locale_1040>
|
||||
<locale_1041>SubDサイドバー</locale_1041>
|
||||
<locale_1042>SubD 사이드바</locale_1042>
|
||||
<locale_1045>SubD - pasek boczny</locale_1045>
|
||||
<locale_2070>Barra Lateral SubD</locale_2070>
|
||||
<locale_2052>细分边栏</locale_2052>
|
||||
<locale_1028>SubD 邊欄</locale_1028>
|
||||
<locale_1049>SubD - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="aaa213c9-f422-477a-9782-a6ae60104171" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e">
|
||||
<placement dock_band_size="314,-1" dock_band_item_size="-1,1" docked_placement="0,0" float_point="1309,275" float_size="200,200" visible="True" />
|
||||
<tabs name="EBENEN" selected_item="3a7f2e1d-4b8c-4d9e-a1b2-c3d4e5f60718" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>EBENEN</locale_1033>
|
||||
</name>
|
||||
<removed_item Item1="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" Item2="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" />
|
||||
<removed_item Item1="3610bf83-047d-4f7f-93fd-163ea305b493" Item2="3610bf83-047d-4f7f-93fd-163ea305b493" />
|
||||
<removed_item Item1="918191ca-1105-43f9-a34a-dda4276883c1" Item2="918191ca-1105-43f9-a34a-dda4276883c1" />
|
||||
<panel guid="3a7f2e1d-4b8c-4d9e-a1b2-c3d4e5f60718" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="EBENEN" />
|
||||
<panel guid="5c9e4f3f-6d0e-4f1f-b3c4-d5e6f7081a2b" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="AUSSCHNITTE" />
|
||||
<panel guid="562bda2a-184f-4b22-9607-79d992f28557" plug_in="02bf604d-799c-4cc2-830e-8d72f21b14b7" name="Layouts" />
|
||||
<panel guid="de6ef821-9355-445f-a5d5-5e19748a3b7e" plug_in="02bf604d-799c-4cc2-830e-8d72f21b14b7" name="Linetypes" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="303293c9-aad0-4419-994d-6765718a58ed" unmanaged="True" text="Command">
|
||||
<placement dock_location="Left" recent_dock_location="Left" dock_band_size="176,200" dock_band_item_size="-1,0.35093898" docked_placement="0,0" float_point="36,104" float_size="200,200" visible="True" />
|
||||
<tabs name="Container" selected_item="971fdb61-b9c6-4080-b38f-d5c72ce7a577" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Container</locale_1033>
|
||||
</name>
|
||||
<removed_item Item1="c7da84fc-2991-4824-832a-4f2509bd0ede" Item2="1990cfb7-2241-4dd1-b01d-735fe3be65fb" />
|
||||
<removed_item Item1="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" Item2="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" />
|
||||
<removed_item Item1="c7da84fc-2991-4824-832a-4f2509bd0ede" Item2="c3eab84e-9994-4c04-b2ef-aa4060f96168" />
|
||||
<tool_bar guid="971fdb61-b9c6-4080-b38f-d5c72ce7a577" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="39716459-9788-492d-adfd-8d89a7585363">
|
||||
<placement dock_band_size="494,-1" dock_band_item_size="-1,1" docked_placement="0,0" float_point="2113,787" float_size="396,796" />
|
||||
<tabs name="Display & Rendering" selected_item="d9ac0269-811b-47d1-aa33-777986b13715" can_be_empty="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Display & Rendering</locale_1033>
|
||||
<locale_1029>Zobrazení a renderování</locale_1029>
|
||||
<locale_1031>Anzeige und Rendering</locale_1031>
|
||||
<locale_1034>Visualización y renderizado</locale_1034>
|
||||
<locale_1036>Affichage et rendu</locale_1036>
|
||||
<locale_1040>Visualizzazione e rendering</locale_1040>
|
||||
<locale_1041>表示 & レンダリング</locale_1041>
|
||||
<locale_1042>표시와 렌더링</locale_1042>
|
||||
<locale_1045>Wyświetlanie i rendering</locale_1045>
|
||||
<locale_2070>Visualização e Renderização</locale_2070>
|
||||
<locale_2052>显示 & 渲染</locale_2052>
|
||||
<locale_1028>顯示 & 彩現</locale_1028>
|
||||
<locale_1049>Отображение и визуализация</locale_1049>
|
||||
</name>
|
||||
<panel guid="d9ac0269-811b-47d1-aa33-777986b13715" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Rendering" />
|
||||
<panel guid="6df2a957-f12d-42ea-9fa6-95d7920c1b76" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Materials" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="4711e685-da6b-40e7-8da8-725c8f104065" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="625e34b2-3b19-4aba-91c2-94f79e2e1d91">
|
||||
<placement dock_location="Floating" recent_dock_location="Top" float_point="-1431655808,0" float_size="276,216" />
|
||||
<tabs name="Solids Sidebar" selected_item="f1c8658b-c36e-4835-9492-14fce56924db" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Solids Sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel Tělesa</locale_1029>
|
||||
<locale_1031>Volumenkörper-Seitenleiste</locale_1031>
|
||||
<locale_1034>Sólidos (lateral)</locale_1034>
|
||||
<locale_1036>Volet Solides</locale_1036>
|
||||
<locale_1040>Barra laterale Solidi</locale_1040>
|
||||
<locale_1041>ソリッドサイドバー</locale_1041>
|
||||
<locale_1042>솔리드 사이드바</locale_1042>
|
||||
<locale_1045>Bryły - pasek boczny</locale_1045>
|
||||
<locale_2070>Barra lateral de Sólidos</locale_2070>
|
||||
<locale_2052>实体边栏</locale_2052>
|
||||
<locale_1028>實體邊欄</locale_1028>
|
||||
<locale_1049>Тела - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="f1c8658b-c36e-4835-9492-14fce56924db" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="49d50abe-9f4d-4043-81f7-7ab1574681e8">
|
||||
<placement dock_location="Top" recent_dock_location="Top" dock_band_size="-1,38" dock_band_item_size="1,-1" docked_placement="0,0" float_point="442,57" float_size="200,200" visible="True" />
|
||||
<tabs name="OBERLEISTE" selected_item="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>OBERLEISTE</locale_1033>
|
||||
</name>
|
||||
<panel guid="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="OBERLEISTE" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="4b37b788-3a60-4c54-a4be-67e756115945">
|
||||
<placement dock_location="Floating" float_point="-1400,688" float_size="200,200" />
|
||||
<tabs name="Curve drawing sidebar" selected_item="1990cfb7-2241-4dd1-b01d-735fe3be65fb" can_be_empty="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Curve drawing sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel Křivka</locale_1029>
|
||||
<locale_1031>Kurvenzeichnung-Seitenleiste</locale_1031>
|
||||
<locale_1034>Dibujo de curvas (lateral)</locale_1034>
|
||||
<locale_1036>Volet Dessin de courbes</locale_1036>
|
||||
<locale_1040>Barra laterale disegno curve</locale_1040>
|
||||
<locale_1041>曲線作成サイドバー</locale_1041>
|
||||
<locale_1042>커브 그리기 사이드바</locale_1042>
|
||||
<locale_1045>Rysowanie krzywych - pasek boczny</locale_1045>
|
||||
<locale_2070>Barra lateral de desenhar curva</locale_2070>
|
||||
<locale_2052>曲线绘制边栏</locale_2052>
|
||||
<locale_1028>繪製曲線邊欄</locale_1028>
|
||||
<locale_1049>Кривые - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="1990cfb7-2241-4dd1-b01d-735fe3be65fb" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="50eb6c7b-0be0-4166-ad17-ea694c97a6f4" text="Drag Strength">
|
||||
<placement dock_location="Floating" dock_band_size="222,69" float_point="500,400" float_size="230,77" />
|
||||
</dock_bar>
|
||||
<dock_bar guid="515a8004-3ff8-49e5-ac9a-356dab83a2d7">
|
||||
<placement dock_location="Floating" recent_dock_location="Bottom" dock_band_size="-1,61" docked_placement="0,1" float_point="526,177" float_size="730,663" />
|
||||
<tabs name="Layers" selected_item="3610bf83-047d-4f7f-93fd-163ea305b493" torn_off="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Layers</locale_1033>
|
||||
</name>
|
||||
<panel guid="3610bf83-047d-4f7f-93fd-163ea305b493" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Layers" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="5a5b89a0-830f-c90d-5f60-35c2e907e18c">
|
||||
<placement dock_location="Floating" dock_band_size="250,200" dock_band_item_size="-1,1" docked_placement="0,0" float_point="318,215" float_size="400,574" />
|
||||
<tabs name="Right Container" selected_item="b68e9e9f-c79c-473c-a7ef-846a11dc4e7b" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Right Container</locale_1033>
|
||||
<locale_1029>Pravý kontejner</locale_1029>
|
||||
<locale_1031>Rechter Container</locale_1031>
|
||||
<locale_1034>Contenedor derecho</locale_1034>
|
||||
<locale_1036>Conteneur droit</locale_1036>
|
||||
<locale_1040>Contenitore destro</locale_1040>
|
||||
<locale_1041>右コンテナ</locale_1041>
|
||||
<locale_1042>오른쪽 컨테이너</locale_1042>
|
||||
<locale_1045>Prawy zbiornik</locale_1045>
|
||||
<locale_2070>Contentor Direito</locale_2070>
|
||||
<locale_2052>右侧容器</locale_2052>
|
||||
<locale_1028>右側容器</locale_1028>
|
||||
<locale_1049>Правый контейнер</locale_1049>
|
||||
</name>
|
||||
<removed_item Item1="562bda2a-184f-4b22-9607-79d992f28557" Item2="562bda2a-184f-4b22-9607-79d992f28557" />
|
||||
<panel guid="b68e9e9f-c79c-473c-a7ef-846a11dc4e7b" name="Display" />
|
||||
<panel guid="0f8fb4f9-c213-4a6e-8e79-0bece02df82a" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Help" />
|
||||
<panel guid="34ffb674-c504-49d9-9fcd-99cc811dcda2" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Properties" />
|
||||
<panel guid="6df55e69-e102-4a72-b181-11664046c93f" plug_in="02bf604d-799c-4cc2-830e-8d72f21b14b7" name="Layer States" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="646dd24d-5637-49bf-a7d1-1610285ea402">
|
||||
<placement dock_location="Left" recent_dock_location="Left" dock_band_size="176,-1" dock_band_item_size="-1,0.649061" docked_placement="0,1" float_point="75,120" float_size="200,200" visible="True" />
|
||||
<tabs name="GESTALTUNG" selected_item="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>GESTALTUNG</locale_1033>
|
||||
</name>
|
||||
<panel guid="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="GESTALTUNG" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="663028ce-8797-466b-a833-9fd338f4bee2">
|
||||
<placement dock_location="Floating" float_point="1186,0" float_size="200,200" />
|
||||
<tabs name="OVERRIDES" selected_item="8f2a7b6c-9f3a-4f4d-e6f7-08192a3c4d62" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>OVERRIDES</locale_1033>
|
||||
</name>
|
||||
<panel guid="8f2a7b6c-9f3a-4f4d-e6f7-08192a3c4d62" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="OVERRIDES" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="78ce0f5a-73ce-4268-b6c9-7d815cfc9f04" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="54dcdb3a-f098-49a4-9947-d5605d675be3">
|
||||
<placement dock_location="Floating" recent_dock_location="Top" float_point="500,215" float_size="276,258" />
|
||||
<tabs name="Render Sidebar" selected_item="ee7a5f30-1d7c-4a0f-9ebc-138d9c096aeb" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Render Sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel Render</locale_1029>
|
||||
<locale_1031>Render-Seitenleiste</locale_1031>
|
||||
<locale_1034>Renderizado (lateral)</locale_1034>
|
||||
<locale_1036>Volet Rendu</locale_1036>
|
||||
<locale_1040>Barra laterale Rendering</locale_1040>
|
||||
<locale_1041>レンダリングサイドバー</locale_1041>
|
||||
<locale_1042>렌더링 사이드바</locale_1042>
|
||||
<locale_1045>Rendering - pasek boczny</locale_1045>
|
||||
<locale_2070>Barra lateral de Renderizar</locale_2070>
|
||||
<locale_2052>渲染边栏</locale_2052>
|
||||
<locale_1028>彩現邊欄</locale_1028>
|
||||
<locale_1049>Визуализация - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="ee7a5f30-1d7c-4a0f-9ebc-138d9c096aeb" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="7ed74116-8783-46fe-9fe1-937283478ea9">
|
||||
<placement dock_location="Floating" float_point="1196,6" float_size="200,200" />
|
||||
<tabs name="OBERLEISTE" selected_item="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>OBERLEISTE</locale_1033>
|
||||
</name>
|
||||
<panel guid="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="OBERLEISTE" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="8b7142c1-c80b-4f2d-aa2a-b53548818d2b">
|
||||
<placement dock_location="Floating" recent_dock_location="Left" dock_band_size="176,-1" dock_band_item_size="-1,0.33333334" docked_placement="0,1" float_point="98,411" float_size="200,200" />
|
||||
<tabs name="WERKZEUGE" selected_item="6d9f5040-7e1f-4f2b-c4d5-f6071829304a" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>WERKZEUGE</locale_1033>
|
||||
</name>
|
||||
<panel guid="6d9f5040-7e1f-4f2b-c4d5-f6071829304a" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="WERKZEUGE" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c">
|
||||
<placement dock_location="Floating" dock_band_size="381,-1" dock_band_item_size="-1,1" docked_placement="1,0" float_point="617,148" float_size="396,796" />
|
||||
<tabs name="Named Views" selected_item="8df2a957-f12d-42ea-9fa6-95d7920c1b76" torn_off="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Named Views</locale_1033>
|
||||
<locale_1029>Pojmenované pohledy</locale_1029>
|
||||
<locale_1031>Benannte Ansichten</locale_1031>
|
||||
<locale_1034>Vistas guardadas</locale_1034>
|
||||
<locale_1036>Vues nommées</locale_1036>
|
||||
<locale_1040>Viste con nome</locale_1040>
|
||||
<locale_1041>名前の付いたビュー</locale_1041>
|
||||
<locale_1042>명명된 뷰</locale_1042>
|
||||
<locale_1045>Nazwane widoki</locale_1045>
|
||||
<locale_2070>Vistas Com Nome</locale_2070>
|
||||
<locale_2052>已命名视图</locale_2052>
|
||||
<locale_1028>已命名視圖</locale_1028>
|
||||
<locale_1049>Именованные виды</locale_1049>
|
||||
</name>
|
||||
<panel guid="77d33034-194d-4cd5-957c-730d9a9eac50" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Named Views" />
|
||||
<panel guid="7df2a957-f12d-42ea-9fa6-95d7920c1b76" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Environments" />
|
||||
<panel guid="987b1930-ecde-4e62-8282-97ab4ad325fe" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Ground Plane" />
|
||||
<panel guid="1012681e-d276-49d3-9cd9-7de92dc2404a" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Sun" />
|
||||
<panel guid="8df2a957-f12d-42ea-9fa6-95d7920c1b76" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Textures" />
|
||||
<panel guid="f4424a46-8281-430a-b03d-911dc9b40294" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Snapshots" />
|
||||
<panel guid="86777b3d-3d68-4965-84f8-9e019c402433" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Lights" />
|
||||
<panel guid="b70a4973-99ca-40c0-b2b2-f03417a5ff1d" plug_in="638a0098-0511-482b-95bf-8cf47fd32c17" name="Render Libraries" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="a3439fb9-29f1-457c-915a-9e67a9876ecb">
|
||||
<placement dock_location="Floating" float_point="119,113" float_size="200,200" />
|
||||
<tabs name="GESTALTUNG" selected_item="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>GESTALTUNG</locale_1033>
|
||||
</name>
|
||||
<panel guid="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="GESTALTUNG" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="a4206be9-c9bf-4cbc-a80d-00369bbb5392" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="c8064867-a611-4b55-b747-fc2aee5d9bf3">
|
||||
<placement dock_location="Floating" recent_dock_location="Top" float_point="-1431655808,0" float_size="276,258" />
|
||||
<tabs name="Surface Sidebar" selected_item="f6534c6e-b451-4c7a-b8ec-8c3ff3596913" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Surface Sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel Plocha</locale_1029>
|
||||
<locale_1031>Flächen-Seitenleiste</locale_1031>
|
||||
<locale_1034>Superficies (lateral)</locale_1034>
|
||||
<locale_1036>Volet Surface</locale_1036>
|
||||
<locale_1040>Barra laterale Superfici</locale_1040>
|
||||
<locale_1041>サーフェスサイドバー</locale_1041>
|
||||
<locale_1042>서피스 사이드바</locale_1042>
|
||||
<locale_1045>Powierzchnia - pasek boczny</locale_1045>
|
||||
<locale_2070>Superfícies</locale_2070>
|
||||
<locale_2052>曲面边栏</locale_2052>
|
||||
<locale_1028>曲面邊欄</locale_1028>
|
||||
<locale_1049>Поверхности - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="f6534c6e-b451-4c7a-b8ec-8c3ff3596913" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="a6e1bdd1-20c0-4768-8fbf-49f8ca435efd">
|
||||
<placement dock_location="Floating" dock_band_size="305,64" dock_band_item_size="0.5,0.29265139" docked_placement="0,1" float_point="924,629" float_size="200,200" />
|
||||
<tabs name="Command History" selected_item="1d3d1785-2332-428b-a838-b2fe39ec50f4" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Command History</locale_1033>
|
||||
<locale_1042>명령 히스토리</locale_1042>
|
||||
<locale_1041>コマンドヒストリ</locale_1041>
|
||||
<locale_1049>История команд</locale_1049>
|
||||
<locale_1031>Befehlsverlauf</locale_1031>
|
||||
<locale_2052>指令历史</locale_2052>
|
||||
<locale_1034>Historial de comandos</locale_1034>
|
||||
<locale_1036>Historique des commandes</locale_1036>
|
||||
<locale_1028>指令歷史</locale_1028>
|
||||
<locale_1045>Historia poleceń</locale_1045>
|
||||
<locale_1040>Storico comandi</locale_1040>
|
||||
<locale_1029>Historie příkazů</locale_1029>
|
||||
<locale_2070>Histórico de Comandos</locale_2070>
|
||||
</name>
|
||||
<panel guid="1d3d1785-2332-428b-a838-b2fe39ec50f4" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Command History" />
|
||||
<panel guid="918191ca-1105-43f9-a34a-dda4276883c1" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Selection Filters" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="b8af1686-2da1-4410-9d37-f5be12356127">
|
||||
<placement dock_location="Floating" float_point="437,471" float_size="200,200" />
|
||||
<tabs name="Rectangle" selected_item="31f7922f-85ce-4387-b923-c08dde67ccca" torn_off="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Rectangle</locale_1033>
|
||||
</name>
|
||||
<tool_bar guid="31f7922f-85ce-4387-b923-c08dde67ccca" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="be2f31c8-f79d-4ca9-953e-8ab3b8cd10e6">
|
||||
<placement dock_location="Floating" float_point="910,176" float_size="92,116" />
|
||||
<tabs name="Help" selected_item="2337f242-b576-41a4-aace-4a74772bc72e" torn_off="True" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Help</locale_1033>
|
||||
<locale_1042>도움말</locale_1042>
|
||||
<locale_1041>ヘルプ</locale_1041>
|
||||
<locale_1049>Справка</locale_1049>
|
||||
<locale_1031>Hilfe</locale_1031>
|
||||
<locale_2052>说明</locale_2052>
|
||||
<locale_1034>Ayuda</locale_1034>
|
||||
<locale_1036>Aide</locale_1036>
|
||||
<locale_1028>說明</locale_1028>
|
||||
<locale_1045>Pomoc</locale_1045>
|
||||
<locale_1040>Aiuti</locale_1040>
|
||||
<locale_1029>Nápověda</locale_1029>
|
||||
<locale_2070>Ajuda</locale_2070>
|
||||
</name>
|
||||
<tool_bar guid="2337f242-b576-41a4-aace-4a74772bc72e" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="cb243957-ad21-4b74-901c-bb068e455e76">
|
||||
<placement dock_location="Floating" float_point="1221,15" float_size="200,200" />
|
||||
<tabs name="WERKZEUGE" selected_item="6d9f5040-7e1f-4f2b-c4d5-f6071829304a" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>WERKZEUGE</locale_1033>
|
||||
</name>
|
||||
<panel guid="6d9f5040-7e1f-4f2b-c4d5-f6071829304a" plug_in="814d908a-e25c-493d-97e9-ee3861957f49" name="WERKZEUGE" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="d1225ee0-cf16-4f05-b053-60aa46183ac0" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="42b36785-e767-4c66-8704-4d828bcb0225">
|
||||
<placement dock_location="Left" recent_dock_location="Left" float_point="-1431655808,0" float_size="276,300" />
|
||||
<tabs name="Main" selected_item="971fdb61-b9c6-4080-b38f-d5c72ce7a577" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Main</locale_1033>
|
||||
<locale_1029>Hlavní</locale_1029>
|
||||
<locale_1031>Haupt</locale_1031>
|
||||
<locale_1034>Principal</locale_1034>
|
||||
<locale_1036>Principale</locale_1036>
|
||||
<locale_1040>Principale</locale_1040>
|
||||
<locale_1041>メイン</locale_1041>
|
||||
<locale_1042>메인</locale_1042>
|
||||
<locale_1045>Główne</locale_1045>
|
||||
<locale_2070>Principal</locale_2070>
|
||||
<locale_2052>主要</locale_2052>
|
||||
<locale_1028>主要</locale_1028>
|
||||
<locale_1049>Главная</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="971fdb61-b9c6-4080-b38f-d5c72ce7a577" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="d3c4a392-88de-4c4f-88a4-ba5636ef7f38">
|
||||
<placement dock_location="Left" recent_dock_location="Left" dock_band_size="126,22" dock_band_item_size="1,0.5" docked_placement="0,1" float_point="628,1070" float_size="219,279" />
|
||||
<tabs name="OSnap" selected_item="d3c4a392-88de-4c4f-88a4-ba5636ef7f38" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>OSnap</locale_1033>
|
||||
<locale_1029>Uchop</locale_1029>
|
||||
<locale_1031>Ofang</locale_1031>
|
||||
<locale_1034>RefObj</locale_1034>
|
||||
<locale_1036>Accrochages</locale_1036>
|
||||
<locale_1040>Osnap</locale_1040>
|
||||
<locale_1041>OSnap</locale_1041>
|
||||
<locale_1042>개체스냅</locale_1042>
|
||||
<locale_1045>UchwytOb</locale_1045>
|
||||
<locale_2070>OSnap</locale_2070>
|
||||
<locale_2052>物件锁点</locale_2052>
|
||||
<locale_1028>物件鎖點</locale_1028>
|
||||
<locale_1049>Привязка</locale_1049>
|
||||
</name>
|
||||
<panel guid="d3c4a392-88de-4c4f-88a4-ba5636ef7f38" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Osnap" />
|
||||
<panel guid="918191ca-1105-43f9-a34a-dda4276883c1" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Selection Filters" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="d81b7680-00fd-4c5a-9c14-9738afa2738f">
|
||||
<placement dock_location="Floating" float_point="486,72" float_size="398,791" />
|
||||
<tabs name="Layers" selected_item="3610bf83-047d-4f7f-93fd-163ea305b493" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Layers</locale_1033>
|
||||
</name>
|
||||
<panel guid="3610bf83-047d-4f7f-93fd-163ea305b493" plug_in="a6f26df9-1ffd-4cf3-b1ec-a11a28a40892" name="Layers" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
<dock_bar guid="f8acd7e3-6464-4fe1-93ee-87c36d31880f" source_group_file="c7da84fc-2991-4824-832a-4f2509bd0ede" source_group="fa6d5bcc-8cd8-416b-8701-f89bd697e94d">
|
||||
<placement dock_location="Floating" recent_dock_location="Top" float_point="128,256" float_size="234,174" />
|
||||
<tabs name="Mesh Sidebar" selected_item="c3eab84e-9994-4c04-b2ef-aa4060f96168" display_style="BitmapAndText">
|
||||
<name>
|
||||
<locale_1033>Mesh Sidebar</locale_1033>
|
||||
<locale_1029>Postranní panel Síť</locale_1029>
|
||||
<locale_1031>Polygonnetz-Seitenleiste</locale_1031>
|
||||
<locale_1034>Malla (lateral)</locale_1034>
|
||||
<locale_1036>Volet Maillage</locale_1036>
|
||||
<locale_1040>Barra laterale Mesh</locale_1040>
|
||||
<locale_1041>メッシュサイドバー</locale_1041>
|
||||
<locale_1042>메쉬 사이드바</locale_1042>
|
||||
<locale_1045>Siatka - pasek boczny</locale_1045>
|
||||
<locale_2070>Barra lateral de Malha</locale_2070>
|
||||
<locale_2052>网格边栏</locale_2052>
|
||||
<locale_1028>網格邊欄</locale_1028>
|
||||
<locale_1049>Сети - боковая</locale_1049>
|
||||
</name>
|
||||
<tool_bar guid="c3eab84e-9994-4c04-b2ef-aa4060f96168" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="c4f7e3af-09ff-4844-b6dc-8f7a65e2f908" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="8f714f50-afd9-4e90-88a8-1432cdcfb431" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
<tool_bar guid="11b1e4f8-1e1d-4caa-9796-cee7fad3ee3b" file="c7da84fc-2991-4824-832a-4f2509bd0ede" />
|
||||
</tabs>
|
||||
</dock_bar>
|
||||
</dock_bars>
|
||||
<last_collection_panel_was_in>
|
||||
<item guid="0dfcac10-303b-48a3-b541-88316b2a719c" dock_bar="71a6e2aa-d426-4fcf-aac6-0b5761762f1b" />
|
||||
<item guid="0f8fb4f9-c213-4a6e-8e79-0bece02df82a" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="1012681e-d276-49d3-9cd9-7de92dc2404a" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="1d3d1785-2332-428b-a838-b2fe39ec50f4" dock_bar="a6e1bdd1-20c0-4768-8fbf-49f8ca435efd" />
|
||||
<item guid="1d55d702-028c-4aab-99cc-acfdd441fe5f" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="34ffb674-c504-49d9-9fcd-99cc811dcda2" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="3610bf83-047d-4f7f-93fd-163ea305b493" dock_bar="d81b7680-00fd-4c5a-9c14-9738afa2738f" />
|
||||
<item guid="3a7f2e1d-4b8c-4d9e-a1b2-c3d4e5f60718" dock_bar="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e" />
|
||||
<item guid="3d1dfae0-8786-46a3-94dc-130c6a6e78bf" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="4a985c3a-ad29-4f8d-927f-6629dd8d355a" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="4b8d3f2e-5c9d-4e0f-b2c3-d4e5f6071829" dock_bar="646dd24d-5637-49bf-a7d1-1610285ea402" />
|
||||
<item guid="52606b82-9bc4-493a-b2b4-d2073d995529" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="562bda2a-184f-4b22-9607-79d992f28557" dock_bar="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e" />
|
||||
<item guid="5c9e4f3f-6d0e-4f1f-b3c4-d5e6f7081a2b" dock_bar="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e" />
|
||||
<item guid="679af970-96d0-4c3a-831d-b4ff878e2884" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="6b6ffd64-c279-4b45-9959-e7e5a8eef806" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="6d9f5040-7e1f-4f2b-c4d5-f6071829304a" dock_bar="8b7142c1-c80b-4f2d-aa2a-b53548818d2b" />
|
||||
<item guid="6df2a957-f12d-42ea-9fa6-95d7920c1b76" dock_bar="39716459-9788-492d-adfd-8d89a7585363" />
|
||||
<item guid="6df55e69-e102-4a72-b181-11664046c93f" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="77d33034-194d-4cd5-957c-730d9a9eac50" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="7df2a957-f12d-42ea-9fa6-95d7920c1b76" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51" dock_bar="49d50abe-9f4d-4043-81f7-7ab1574681e8" />
|
||||
<item guid="86777b3d-3d68-4965-84f8-9e019c402433" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="8df2a957-f12d-42ea-9fa6-95d7920c1b76" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="8f23551a-a05b-4a03-a8d5-3e2fc55e4d8a" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="8f2a7b6c-9f3a-4f4d-e6f7-08192a3c4d62" dock_bar="663028ce-8797-466b-a833-9fd338f4bee2" />
|
||||
<item guid="8fa84eff-1da5-4788-a983-e1ec3785e6a8" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="91799cf0-059a-46f8-854c-cc1c1419e29f" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="918191ca-1105-43f9-a34a-dda4276883c1" dock_bar="a6e1bdd1-20c0-4768-8fbf-49f8ca435efd" />
|
||||
<item guid="987b1930-ecde-4e62-8282-97ab4ad325fe" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="9a0fa999-295d-4d77-b160-074fa2cd8e6d" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="a650e8dd-3896-43a8-9359-0e7ad8daf38e" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="b68e9e9f-c79c-473c-a7ef-846a11dc4e7b" dock_bar="5a5b89a0-830f-c90d-5f60-35c2e907e18c" />
|
||||
<item guid="b70a4973-99ca-40c0-b2b2-f03417a5ff1d" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
<item guid="d3c4a392-88de-4c4f-88a4-ba5636ef7f38" dock_bar="d3c4a392-88de-4c4f-88a4-ba5636ef7f38" />
|
||||
<item guid="d9ac0269-811b-47d1-aa33-777986b13715" dock_bar="39716459-9788-492d-adfd-8d89a7585363" />
|
||||
<item guid="de6ef821-9355-445f-a5d5-5e19748a3b7e" dock_bar="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e" />
|
||||
<item guid="f4424a46-8281-430a-b03d-911dc9b40294" dock_bar="8e0d2079-7bb7-4ba0-b6ed-f16b9a33e67c" />
|
||||
</last_collection_panel_was_in>
|
||||
<!--Visible items in each dock site-->
|
||||
<dock_sites major_ver="1" minor_ver="0">
|
||||
<dock_site location="Left" auto_hide="False">
|
||||
<band size="176">
|
||||
<dock_bar guid="303293c9-aad0-4419-994d-6765718a58ed" size="0.35093897581100464" />
|
||||
<dock_bar guid="646dd24d-5637-49bf-a7d1-1610285ea402" size="0.6490610241889954" />
|
||||
</band>
|
||||
</dock_site>
|
||||
<dock_site location="Right" auto_hide="False">
|
||||
<band size="314">
|
||||
<dock_bar guid="2d7ded60-c2e9-4ac1-8297-df58c7e8ac4e" />
|
||||
</band>
|
||||
</dock_site>
|
||||
<dock_site location="Top" auto_hide="False">
|
||||
<band size="38">
|
||||
<dock_bar guid="49d50abe-9f4d-4043-81f7-7ab1574681e8" />
|
||||
</band>
|
||||
</dock_site>
|
||||
<dock_site location="Bottom" auto_hide="False" />
|
||||
</dock_sites>
|
||||
<ui_settings HideSingleSidebarTab="True" IsSidebarVisible="False" TabIconSize="16" ToolBarImageSize="16" />
|
||||
<referenced_rui_files>
|
||||
<rui_file guid="c7da84fc-2991-4824-832a-4f2509bd0ede" source="Rhino.UI.Resources.rui.default.rui">
|
||||
<!--Diff files for this RUI file-->
|
||||
<modifications>
|
||||
<!--This file was generated by Rhinoceros and contains modified RUI file content-->
|
||||
<RhinoUI major_ver="1" minor_ver="0" guid="c7da84fc-2991-4824-832a-4f2509bd0ede">
|
||||
<extend_rhino_menus />
|
||||
<menus />
|
||||
<tool_bars>
|
||||
<tool_bar source_guid="31f7922f-85ce-4387-b923-c08dde67ccca" modified="True" LastTornOffSize="200,200">
|
||||
<tool_bar_items>
|
||||
<tool_bar_item source_guid="e9184546-a83a-4514-9336-fc134c34db14" />
|
||||
<tool_bar_item source_guid="41b9ebc0-f4ae-4b72-938e-6a66a1da1dbe" />
|
||||
<tool_bar_item source_guid="292e811f-0fba-47bf-af32-776b7cf125b5" />
|
||||
<tool_bar_item source_guid="e72cfefa-421a-4a42-8eb0-e265ae99b2c7" />
|
||||
<tool_bar_item source_guid="72399f31-536d-4956-8861-f4d65e61acd0" />
|
||||
</tool_bar_items>
|
||||
</tool_bar>
|
||||
<tool_bar guid="caa6efe7-4589-4095-9c57-ffd59f161e5c" modified="True" item_display_style="Bitmap">
|
||||
<text>
|
||||
<locale_1033>Toolbar</locale_1033>
|
||||
</text>
|
||||
<tool_bar_items />
|
||||
</tool_bar>
|
||||
<tool_bar source_guid="971fdb61-b9c6-4080-b38f-d5c72ce7a577" modified="True">
|
||||
<tool_bar_items>
|
||||
<tool_bar_item guid="9ab5f13a-ea7c-4315-a320-0f669e5aa7c8" source_guid="790ba6f5-a79c-4d7c-b42b-2cabb7bbd82c" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro guid="02a1a1f5-4edb-459c-8bec-70fa3afbf7c0" source_guid="be8dcb66-2e68-49c9-8994-13c16119e652" modified="True" />
|
||||
<right_macro source_guid="cc3ba388-866f-407e-a0b5-8a57867105b0" />
|
||||
<link link_style="Normal" source_guid="9887392d-6705-4199-a660-8284f7fe27cf" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item guid="fbc0dfb2-b001-4bca-b433-583377ca6f9e" source_guid="08f422b0-883d-407e-9b32-0c7c2abdc566" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro source_guid="f13a992c-48f9-4c56-8d7b-c79f34b35e74" />
|
||||
<right_macro source_guid="0a9e0109-9c39-4522-b31f-355eac091b1d" />
|
||||
<link link_style="Normal" source_guid="9efa5588-4e9f-48b8-831e-1a97df6bbbaa" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item guid="66145d10-7f51-4373-9974-ed774d7c09ca" source_guid="f6d7af12-0c34-4d5b-b325-7132167a85c8" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro source_guid="f0baa3c0-222e-4b55-89d9-20fce315f9e2" />
|
||||
<right_macro source_guid="862fa3f5-693b-4f23-bb27-cf44076fe53d" />
|
||||
<link link_style="Normal" source_guid="5d174df5-165b-497b-b49e-271ebe1f2786" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item guid="566bcf73-7b47-49f5-9251-fffdce47377a" source_guid="058f8e0d-2381-4ee0-bab4-329d142a3062" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro source_guid="9b339311-7ff9-4242-b49a-0992fc322f46" />
|
||||
<link link_style="Normal" source_guid="e05357bc-15fd-4a35-8ac9-8ca66130d209" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item guid="64bb2452-3cc5-40f3-a1b0-aedcc4171132" source_guid="7c86745a-853f-4bb7-81dd-8987d06cc643" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro source_guid="904d2302-ac30-4094-a236-45b213c026f7" />
|
||||
<link link_style="Normal" source_guid="2c9fc393-e1c4-4129-a57c-350b88505cd2" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item source_guid="593ef621-4288-4c5b-af19-f6cd726b446e" />
|
||||
<tool_bar_item source_guid="b7d32fef-c2b5-4e3c-be1a-1ba978a71713" />
|
||||
<tool_bar_item source_guid="8d497640-bab5-4e0b-b719-1834ed91adf4" />
|
||||
<tool_bar_item source_guid="0846d181-dd65-4014-9671-8e456a93de31" />
|
||||
<tool_bar_item source_guid="1144a093-7833-4beb-98ea-534920507d00" />
|
||||
<tool_bar_item source_guid="c8c687bd-77e8-4eef-8f6b-636b7be082bb" />
|
||||
<tool_bar_item source_guid="71eac7d7-2ec3-4d82-9ae3-72ec4687a661" />
|
||||
<tool_bar_item source_guid="d05e7fa5-a403-4864-afd5-7c3e72382c43" />
|
||||
<tool_bar_item source_guid="d2400f54-925c-4c3f-ae31-07dfeef7c65f" />
|
||||
<tool_bar_item guid="226d1ea0-6237-4ce0-abe6-7964eeecbf6a" source_guid="790ba6f5-a79c-4d7c-b42b-2cabb7bbd82c" modified="True" control_source="Copy">
|
||||
<left_macro source_guid="be8dcb66-2e68-49c9-8994-13c16119e652" />
|
||||
<right_macro source_guid="cc3ba388-866f-407e-a0b5-8a57867105b0" />
|
||||
<link link_style="Normal" source_guid="9887392d-6705-4199-a660-8284f7fe27cf" />
|
||||
</tool_bar_item>
|
||||
<tool_bar_item source_guid="f0c6d11f-7838-4902-9ddf-8449a818a1d1" />
|
||||
<tool_bar_item source_guid="d3c081db-0bf3-4af3-9c43-cff6680c7625" />
|
||||
<tool_bar_item source_guid="39b9923b-77c8-4ea8-a064-cb172fbc1f6d" />
|
||||
<tool_bar_item source_guid="4f944d97-a884-499e-8ed7-ad519da2e0f6" />
|
||||
<tool_bar_item source_guid="338f5655-a0a2-4839-9114-ce51dc176fa4" />
|
||||
<tool_bar_item source_guid="0f757392-62d1-4f0d-a711-0396692050cc" />
|
||||
<tool_bar_item source_guid="047b5cdd-f104-4f0b-a2a3-2d899c86554a" />
|
||||
<tool_bar_item source_guid="cf06780d-3826-4f0b-aa8d-475de07fd932" />
|
||||
<tool_bar_item source_guid="c9217c97-0202-4f90-a5a9-aefb1c721666" />
|
||||
<tool_bar_item source_guid="cdef77dc-3471-4144-ad41-e2a46f4cd4b1" />
|
||||
<tool_bar_item source_guid="9fb09f63-a067-4100-b80a-790e5e4fc742" />
|
||||
<tool_bar_item source_guid="99c7602e-1d21-4a7f-a369-df5c451abc71" />
|
||||
<tool_bar_item source_guid="b1c75c53-2f95-4224-bb8a-28cbc9e0c335" />
|
||||
<tool_bar_item source_guid="18080b6f-1a5c-49ec-89ed-14d9babc1463" />
|
||||
<tool_bar_item source_guid="160f1831-d7eb-454b-8b78-17b72bfaaf0e" />
|
||||
<tool_bar_item source_guid="a4292914-3f6e-4158-b4e5-30d167370945" />
|
||||
<tool_bar_item source_guid="d633222a-fb3a-4a7e-931e-065b8fd93b28" />
|
||||
<tool_bar_item source_guid="3502801c-8c08-4b40-a614-d07ceb6527d1" />
|
||||
<tool_bar_item source_guid="38a55115-9bb3-4b4a-83fc-35b457d90d0d" />
|
||||
<tool_bar_item source_guid="2d99e234-a524-4d69-9650-20df849520eb" />
|
||||
<tool_bar_item source_guid="21a38747-faf7-47f6-a893-e48de8f1cb57" />
|
||||
<tool_bar_item source_guid="cec8035e-929d-45e1-9601-83e5edf64cf9" />
|
||||
<tool_bar_item guid="255ffb63-5e06-40e1-bf37-4c55da4ec2f3" source_guid="31114066-0b74-4a4c-8d62-ea8b3659dc29" modified="True" display_style="BitmapAndText" display_style_from_parent="False">
|
||||
<left_macro source_guid="a3510d12-9b16-4fc2-a643-7b3df43f723b" />
|
||||
<right_macro source_guid="29dd9afe-f9f5-447a-bb11-88e6a5357be8" />
|
||||
</tool_bar_item>
|
||||
</tool_bar_items>
|
||||
</tool_bar>
|
||||
<tool_bar source_guid="2337f242-b576-41a4-aace-4a74772bc72e" modified="True" LastTornOffSize="92,116">
|
||||
<tool_bar_items>
|
||||
<tool_bar_item source_guid="a89658dc-863c-4a5e-918e-1a0777a72fc8" />
|
||||
<tool_bar_item source_guid="769164aa-ff16-4b5e-bc30-271e104fc522" />
|
||||
</tool_bar_items>
|
||||
</tool_bar>
|
||||
<tool_bar source_guid="00211289-60a5-460b-88dc-cc667b234dbd" modified="True">
|
||||
<tool_bar_items>
|
||||
<tool_bar_item source_guid="b7d32fef-c2b5-4e3c-be1a-1ba978a71713" />
|
||||
<tool_bar_item source_guid="b7d32fef-c2b5-4e3c-be1a-1ba978a71713" />
|
||||
<tool_bar_item source_guid="f6d7af12-0c34-4d5b-b325-7132167a85c8" />
|
||||
<tool_bar_item source_guid="790ba6f5-a79c-4d7c-b42b-2cabb7bbd82c" />
|
||||
<tool_bar_item source_guid="71eac7d7-2ec3-4d82-9ae3-72ec4687a661" />
|
||||
<tool_bar_item source_guid="08f422b0-883d-407e-9b32-0c7c2abdc566" />
|
||||
<tool_bar_item source_guid="338f5655-a0a2-4839-9114-ce51dc176fa4" />
|
||||
<tool_bar_item source_guid="7c86745a-853f-4bb7-81dd-8987d06cc643" />
|
||||
<tool_bar_item source_guid="31114066-0b74-4a4c-8d62-ea8b3659dc29" />
|
||||
<tool_bar_item source_guid="b4d68e9f-841b-4954-974d-d4b1f56c50b5" />
|
||||
</tool_bar_items>
|
||||
</tool_bar>
|
||||
</tool_bars>
|
||||
<icons>
|
||||
<icon guid="5be65a35-9b58-453a-b24d-e77f53543852" modified="True">
|
||||
<light_svg><svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path clip-rule="evenodd" d="m0 0h36v36h-36z"/></clipPath><g clip-path="url(#a)" fill-opacity=".996078" transform="matrix(1.3333333 0 0 -1.3333333 0 48)"><path d="m14.297 18.846c0 1.657 1.345 3.002 3.002 3.002s3.002-1.345 3.002-3.002-1.345-3.002-3.002-3.002-3.002 1.345-3.002 3.002z" fill="#fff" fill-rule="evenodd"/><path d="m13.552 18.846c0 2.068 1.678 3.746 3.747 3.746 2.068 0 3.746-1.678 3.746-3.746 0-2.069-1.678-3.747-3.746-3.747-2.069 0-3.747 1.678-3.747 3.747zm6.004 0c0 1.245-1.012 2.257-2.257 2.257-1.246 0-2.258-1.012-2.258-2.257 0-1.246 1.012-2.258 2.258-2.258 1.245 0 2.257 1.012 2.257 2.258z"/></g></svg></light_svg>
|
||||
<dark_svg><svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g clip-path="url(#a)" fill-opacity=".996078" transform="matrix(1.3333333 0 0 -1.3333333 0 48)">
|
||||
<path d="m14.297 18.846c0 1.657 1.345 3.002 3.002 3.002s3.002-1.345 3.002-3.002-1.345-3.002-3.002-3.002-3.002 1.345-3.002 3.002z" fill="#fff" fill-rule="evenodd" stroke-width="3.5px" x_rma_id="1" stroke="#666" stroke-linejoin="round" />
|
||||
<path d="m13.552 18.846c0 2.068 1.678 3.746 3.747 3.746 2.068 0 3.746-1.678 3.746-3.746 0-2.069-1.678-3.747-3.746-3.747-2.069 0-3.747 1.678-3.747 3.747zm6.004 0c0 1.245-1.012 2.257-2.257 2.257-1.246 0-2.258-1.012-2.258-2.257 0-1.246 1.012-2.258 2.258-2.258 1.245 0 2.257 1.012 2.257 2.258z" fill="" stroke-width="3.5px" x_rma_id="2" stroke="#666" stroke-linejoin="round" />
|
||||
</g>
|
||||
<clipPath id="a">
|
||||
<path clip-rule="evenodd" d="m0 0h36v36h-36z" fill="" stroke-width="" x_rma_id="0" />
|
||||
</clipPath>
|
||||
<g clip-path="url(#a)" fill-opacity=".996078" transform="matrix(1.3333333 0 0 -1.3333333 0 48)">
|
||||
<path d="m14.297 18.846c0 1.657 1.345 3.002 3.002 3.002s3.002-1.345 3.002-3.002-1.345-3.002-3.002-3.002-3.002 1.345-3.002 3.002z" fill="#fff" fill-rule="evenodd" stroke-width="" x_rma_id="1" />
|
||||
<path d="m13.552 18.846c0 2.068 1.678 3.746 3.747 3.746 2.068 0 3.746-1.678 3.746-3.746 0-2.069-1.678-3.747-3.746-3.747-2.069 0-3.747 1.678-3.747 3.747zm6.004 0c0 1.245-1.012 2.257-2.257 2.257-1.246 0-2.258-1.012-2.258-2.257 0-1.246 1.012-2.258 2.258-2.258 1.245 0 2.257 1.012 2.257 2.258z" fill="" stroke-width="" x_rma_id="2" />
|
||||
</g>
|
||||
</svg></dark_svg>
|
||||
</icon>
|
||||
</icons>
|
||||
<macros>
|
||||
<macro guid="02a1a1f5-4edb-459c-8bec-70fa3afbf7c0" source_guid="be8dcb66-2e68-49c9-8994-13c16119e652" modified="True" bitmap_guid="5be65a35-9b58-453a-b24d-e77f53543852">
|
||||
<text>
|
||||
<locale_1033>Single point 01</locale_1033>
|
||||
</text>
|
||||
<button_text>Single point</button_text>
|
||||
<menu_text>Single point</menu_text>
|
||||
<help_text>Single point</help_text>
|
||||
<tooltip>Line</tooltip>
|
||||
<script>! _Point</script>
|
||||
</macro>
|
||||
</macros>
|
||||
</RhinoUI>
|
||||
</modifications>
|
||||
</rui_file>
|
||||
</referenced_rui_files>
|
||||
</RhinoUI>
|
||||
@@ -0,0 +1,98 @@
|
||||
# RhinoPanel — Installation Rhino 8 (Mac)
|
||||
|
||||
## Voraussetzungen
|
||||
- Rhino 8
|
||||
- Node.js (nur fuer Dev-Modus)
|
||||
|
||||
---
|
||||
|
||||
## Dev-Modus
|
||||
|
||||
```bash
|
||||
cd rhino-panel
|
||||
npm run dev # startet auf http://localhost:5173
|
||||
```
|
||||
|
||||
In Rhino: `_RunPythonScript` → `rhino/rhinopanel.py`
|
||||
|
||||
## Prod-Modus
|
||||
|
||||
```bash
|
||||
npm run build # erstellt dist/
|
||||
```
|
||||
|
||||
In Rhino: `_RunPythonScript` → `rhinopanel.py`
|
||||
Das Script erkennt `dist/index.html` automatisch.
|
||||
|
||||
## Autostart
|
||||
|
||||
Rhino Optionen → Scripting → Startup Scripts → `rhinopanel.py` hinzufuegen
|
||||
|
||||
---
|
||||
|
||||
## Grasshopper-Anbindung
|
||||
|
||||
### Wie es funktioniert
|
||||
|
||||
Wenn "Anwenden" im Panel gedrueckt wird:
|
||||
1. Rhino-Layer werden erstellt/aktualisiert
|
||||
2. Ebenen-JSON wird in `doc.Strings["rhinopanel_ebenen"]` gespeichert
|
||||
3. Grasshopper-Neuberechnung wird automatisch ausgeloest
|
||||
|
||||
### GH Python-Component einrichten
|
||||
|
||||
1. GH oeffnen → `Params > Util > Python Script` Komponente platzieren
|
||||
2. Inhalt von `rhino/gh_ebenen.py` hineinkopieren
|
||||
3. Outputs der Komponente (Rechtsklick → "Manage Outputs") anlegen:
|
||||
|
||||
| Output | Typ | Inhalt |
|
||||
|--------|-----|--------|
|
||||
| `namen` | list | Grundriss-Namen (EG, 1OG, ...) |
|
||||
| `okff` | list | Bodenniveau je Geschoss in m |
|
||||
| `hoehen` | list | Geschosshoehe in m |
|
||||
| `schnitthoehen` | list | Schnitthoehe ueber Boden in m |
|
||||
| `grundriss_ebenen` | list | Planes auf Schnitthoehe (fuer Section) |
|
||||
| `boden_ebenen` | list | Planes auf OKFF (fuer Extrusion) |
|
||||
| `gebaeude_hoehe` | item | Gesamthoehe in m |
|
||||
| `schnitte` | list | Namen der Schnitt-Ebenen |
|
||||
| `ansichten` | list | Namen der Ansichts-Ebenen |
|
||||
|
||||
### Typische GH-Verknuepfungen
|
||||
|
||||
**Automatischer Grundrissschnitt:**
|
||||
```
|
||||
gh_ebenen.grundriss_ebenen → Brep Split / Section
|
||||
```
|
||||
|
||||
**Wandextrusion (2D → 3D):**
|
||||
```
|
||||
Curves auf Layer 01_WAND
|
||||
→ Extrude (Vektor: {0,0,hoehe})
|
||||
→ Cap Holes
|
||||
→ BooleanUnion
|
||||
```
|
||||
|
||||
**Stockwerke positionieren:**
|
||||
```
|
||||
gh_ebenen.boden_ebenen → Orient
|
||||
```
|
||||
|
||||
### Alternativ: Get Document String (ohne Python)
|
||||
|
||||
- `Params > Util > Get Document String`
|
||||
- Key: `rhinopanel_ebenen`
|
||||
- Output → `Deserialize JSON` oder `Evaluate Expression`
|
||||
|
||||
---
|
||||
|
||||
## Dateistruktur
|
||||
|
||||
```
|
||||
rhino-panel/
|
||||
├── src/ React-App (Quellcode)
|
||||
├── dist/ Gebaute App (nach npm run build)
|
||||
└── rhino/
|
||||
├── rhinopanel.py Panel starten (in Rhino ausfuehren)
|
||||
├── layer_builder.py Layer-Erstellung
|
||||
└── gh_ebenen.py GH Python-Component Code
|
||||
```
|
||||