#! python 3 # -*- coding: utf-8 -*- """ masse_settings.py Satellite-Fenster fuer das Bearbeiten der Masse-Presets (rhino/mass_style.py). Vom Oberleiste-Zahnrad geoeffnet. """ import os import sys import Rhino import scriptcontext as sc _HERE = os.path.dirname(os.path.abspath(__file__)) if _HERE not in sys.path: sys.path.insert(0, _HERE) import panel_base import mass_style def _payload(): doc = Rhino.RhinoDoc.ActiveDoc return { "presets": mass_style.list_presets(doc), "activeId": mass_style.get_active_id(doc), } def _notify_oberleiste(): """Topbar nach Aenderung refreshen — die zeigt den aktiven Preset im Dropdown an.""" try: b = sc.sticky.get("oberleiste_bridge") if b is not None: b._send_state(force=True) except Exception as ex: print("[MASSE_SETTINGS] notify oberleiste:", ex) class MasseSettingsBridge(panel_base.BaseBridge): def __init__(self): panel_base.BaseBridge.__init__(self, "masse_settings") def _on_ready(self): self._send_state() def _send_state(self): self.send("STATE", _payload()) def handle(self, data): if not isinstance(data, dict): return t = data.get("type", "") p = data.get("payload") or {} if not isinstance(p, dict): p = {} doc = Rhino.RhinoDoc.ActiveDoc if t == "READY" or t == "REQUEST_STATE": self._on_ready() elif t == "SET_ACTIVE": mass_style.set_active_id(doc, p.get("id")) mass_style.regen_all_rooms(doc) self._send_state() _notify_oberleiste() elif t == "SAVE": mass_style.save_preset(doc, p.get("preset") or {}) mass_style.regen_all_rooms(doc) self._send_state() _notify_oberleiste() elif t == "DELETE": mass_style.delete_preset(doc, p.get("id")) mass_style.regen_all_rooms(doc) self._send_state() _notify_oberleiste() def open_as_window(): """Oeffnet das Masse-Settings-Fenster (Eto.Form + WebView). Vom Oberleiste-Zahnrad bei OPEN_MASSE_SETTINGS aufgerufen.""" b = MasseSettingsBridge() sc.sticky["masse_settings_bridge"] = b panel_base.open_satellite_window( "masse_settings", title="Masse", size=(440, 520), bridge=b)