Panels poliert: Ebenenkombi in Oberleiste, Satelliten-Dialoge, Caps weg, Perf

- Ebenenkombination raus aus Ebenen-Panel, in Oberleiste-Topbar +
  Editor-Satellite (AusschnittLayerDialog embedded). doc.Strings
  haelt active_comb_name, auto-clear bei manueller Eye/Lock-Aenderung.
- EbenenSettingsDialog jetzt Satellite mit Ebene-Picker-Dropdown
  (auto-save on switch via SAVE_KEEP).
- Per-Ausschnitt Einstellungen-Satellite (Massstab, Display, Overrides,
  Ebenenkombi). Alte 'Sichtbarkeit bearbeiten'-Option entfernt.
- Layouts/Ausschnitte: Top-Header weg, Sticky-Footer mit Anzahl +
  Aktionen. LayoutDialog ist jetzt Satellite mit Format-Live-Preview.
- Panel-Captions + Default-Ebenen-Namen auf Mixed-Case (Ausschnitte,
  Ebenen, Waende ...). Nur DOSSIER bleibt caps.
- DimensionenApp: Card-Optik raus, REF-Wuerfel mit Kreisen statt
  Quadraten + Hover-Scale.
- GeschossManager angeglichen an EbenenManager: Rechtsklick-Menue,
  Lock-Button, Delete-X, Duplizieren. layer_builder honoriert z.locked.
- Active Sublayer folgt jetzt dem Geschoss-Wechsel (gleicher Code
  unter neuem Parent).

Performance Geschoss-Wechsel:
- elemente._send_state() ersetzt durch _notify_active_geschoss()
  (Partial-Push statt 200+ Elements re-enumerieren).
- _apply_visibility dedupe via sticky last-applied-signature
  (STATE_SYNC-Echo loopt nicht mehr durch alle Layer).
- _update_clipping nur wenn alt oder neu hasClipping=True.
- Redundante doc.Views.Redraw() im CPlane-Pfad entfernt — die folgende
  apply_visibility-Roundtrip redrawt 30ms spaeter ohnehin.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 03:58:28 +02:00
parent e3918cb155
commit 95031ee2c0
29 changed files with 1708 additions and 713 deletions
+44 -1
View File
@@ -20,6 +20,7 @@ if _HERE not in sys.path:
import panel_base
import massstab
import overrides
import rhinopanel
PANEL_GUID_STR = "7e1f6a5b-8e2f-4f3c-d5e6-f70819203b51"
OVERRIDES_PANEL_GUID_STR = "8f2a7b6c-9f3a-4f4d-e6f7-08192a3c4d62"
@@ -770,6 +771,7 @@ class OberleisteBridge(panel_base.BaseBridge):
self._last_prompt = ""
self._last_state_sig = None # Fingerprint des letzten Push — dedupe
self._cached_overrides = None # (enabled, count) — invalidiert bei Toggle/Update
self._cached_combinations = None # (names, active) — invalidiert bei jeder Comb-Aenderung
# Command-Liste einmalig laden (kann teuer sein -> cachen)
try:
self._all_commands = _list_all_command_names()
@@ -920,6 +922,34 @@ class OberleisteBridge(panel_base.BaseBridge):
except Exception as ex:
print("[OBERLEISTE] open_as_window Overrides:", ex)
# --- Ebenenkombinationen ----------------------------------------
elif t == "PICK_LAYER_COMBINATION":
doc = Rhino.RhinoDoc.ActiveDoc
name = (p.get("name") or "").strip()
if name:
rhinopanel.apply_layer_preset_by_name(doc, name)
else:
# "Eigene" — kein Apply, nur active_comb_name clearen
rhinopanel.set_active_comb_name(doc, None)
self._cached_combinations = None
self._send_state(force=True)
elif t == "SAVE_LAYER_COMBINATION":
doc = Rhino.RhinoDoc.ActiveDoc
name = (p.get("name") or "").strip()
if name:
rhinopanel.save_current_as_layer_preset(doc, name)
self._cached_combinations = None
self._send_state(force=True)
elif t == "DELETE_LAYER_COMBINATION":
doc = Rhino.RhinoDoc.ActiveDoc
rhinopanel.delete_layer_preset(doc, p.get("name") or "")
self._cached_combinations = None
self._send_state(force=True)
elif t == "OPEN_LAYER_COMBINATIONS_DIALOG":
try: rhinopanel.open_layer_combinations_window()
except Exception as ex:
print("[OBERLEISTE] open layer-combinations:", ex)
# --- Command-Line Integration -----------------------------------
elif t == "RUN_COMMAND":
cmd = (p.get("cmd") or "").strip()
@@ -1035,6 +1065,18 @@ class OberleisteBridge(panel_base.BaseBridge):
info["overridesActivePreset"],
_presets_tuple) = self._cached_overrides
info["overridesPresets"] = list(_presets_tuple)
# Ebenenkombinationen — cached (Liste + active). Invalidiert bei
# PICK/SAVE/DELETE und durch Cross-Bridge-Notify aus rhinopanel.py.
if self._cached_combinations is None:
try:
names = tuple(rhinopanel.list_layer_preset_names(doc))
active = rhinopanel.get_active_comb_name(doc)
self._cached_combinations = (names, active)
except Exception:
self._cached_combinations = ((), None)
_names_tuple, _active_comb = self._cached_combinations
info["layerCombinations"] = list(_names_tuple)
info["layerCombinationActive"] = _active_comb
# Command-Line State
prompt = _get_command_prompt()
info["cmdPrompt"] = prompt
@@ -1057,6 +1099,7 @@ class OberleisteBridge(panel_base.BaseBridge):
info["overridesEnabled"], info["overridesCount"],
info.get("overridesActivePreset"),
tuple(info.get("overridesPresets") or ()),
_names_tuple, _active_comb,
prompt,
)
if not force and sig == self._last_state_sig:
@@ -1197,5 +1240,5 @@ def _bridge_factory():
return b
panel_base.register_and_open("oberleiste", "OBERLEISTE", PANEL_GUID_STR, _bridge_factory,
panel_base.register_and_open("oberleiste", "Oberleiste", PANEL_GUID_STR, _bridge_factory,
icon_spec=("menu", "#2f5d54"))