Projekt-Settings-Dialog + Library Phase A + Material-Merger

- Project-Settings-Dialog (Voreinstellungen Geschoss/Schnitt + Material-Editor)
  ueber Zahnrad-Icon in Oberleiste; Defaults werden in schnitte.pick_schnitt
  + GeschossManager als Vorgabe genommen, pro-Element-Werte unangetastet
- Dossier-Library Phase A (lokal, read-only): rhino/library.py + LibraryBrowser
  Satellite; Seed-Manifest unter ~/Library/Application Support/Dossier/library/
- Material-Merger: _get_all_materials(doc) merged builtin _MATERIAL_LIBRARY
  mit Projekt-Settings-Materialien (inkl. Library-Imports); Wand-Erstellung,
  Sub-Layer-Anlage + Elemente-Material-Dropdown ziehen jetzt aus dem Merge

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 02:19:09 +02:00
parent ee01c7ebdc
commit a308ba62d2
13 changed files with 1087 additions and 56 deletions
+17 -4
View File
@@ -589,12 +589,25 @@ def pick_schnitt_interactive(doc, defaults=None):
"""Interaktiver Pick: 2 Punkte + Dir-Pfeil + Defaults aus settings.
Liefert die neue Schnitt-Id oder None bei Abbruch.
defaults: {depthBack, heightMin, heightMax, cutAtLine, namePrefix}"""
defaults: {depthBack, heightMin, heightMax, cutAtLine, namePrefix}
Wenn ein Feld fehlt, wird aus dossier_project_settings nachgeschaut
(zentrale Project-Voreinstellung), sonst Hardcoded-Default."""
defaults = defaults or {}
# Project-Defaults als 2-stufiges Fallback (defaults > project > hardcoded)
proj_d = {}
try:
import rhinopanel
ps = rhinopanel.load_project_settings(doc) or {}
proj_d = ps.get("defaults", {}) or {}
except Exception: pass
def _resolve(key, proj_key, fallback):
if key in defaults: return defaults[key]
if proj_key in proj_d: return proj_d[proj_key]
return fallback
name_prefix = defaults.get("namePrefix", "S")
depth_back = float(defaults.get("depthBack", 8.0))
h_min = float(defaults.get("heightMin", -1.0))
h_max = float(defaults.get("heightMax", 12.0))
depth_back = float(_resolve("depthBack", "schnittDepthBack", 8.0))
h_min = float(_resolve("heightMin", "schnittHeightMin", -1.0))
h_max = float(_resolve("heightMax", "schnittHeightMax", 12.0))
cut_at_line = bool(defaults.get("cutAtLine", True))
# Pick Punkt 1