Elemente: BIM Project Browser + Properties-Satellite-Window

Zwei neue Satellite-Windows (analog Kamera/Text-Editor):

1) Projekt-Übersicht (elemente_uebersicht.py + ElementeUebersichtApp.jsx)
   - Tree Geschoss → Kind → Element-Instanzen
   - Suche + Kind-Filter-Chips
   - Klick = selektieren in Rhino, Shift+Klick = zoomen
   - Erreichbar via account_tree-Button im Elemente-Panel-Header

2) Properties-Satellite (elemente_properties.py + ElementePropertiesApp.jsx)
   - Eigenes Fenster mit der PropertiesView (gemeinsame Komponente)
   - Live-Updates: elemente._send_state forwarded zu satellite-bridge via sticky
   - Erreichbar via open_in_new-Icon oben rechts in der Properties-Karte
   - Inline-Properties im Panel bleiben — Satellite ist für mehr Platz

Plus ElementeApp-Cleanup:
- ElementList (alle Elemente-Liste) raus — wird jetzt von Projekt-
  Übersicht abgedeckt.
- Properties springen bei Selektion nach oben, NeuesElement bleibt
  voll sichtbar darunter (kein Scrollen mehr).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 01:17:31 +02:00
parent d5bcee2157
commit 15fb0a6037
8 changed files with 782 additions and 241 deletions
+23 -2
View File
@@ -4684,6 +4684,20 @@ class ElementeBridge(panel_base.BaseBridge):
elif t == "DELETE_WALL": self._delete_wall(p.get("id"))
elif t == "DELETE_ELEMENT": self._delete_wall(p.get("id"))
elif t == "REGENERATE_ALL": self._regenerate_all()
elif t == "OPEN_ELEMENTE_UEBERSICHT":
try:
import elemente_uebersicht
elemente_uebersicht.open_as_window()
except Exception as ex:
print("[ELEMENTE] open uebersicht:", ex)
elif t == "OPEN_ELEMENTE_PROPERTIES":
try:
import elemente_properties
elemente_properties.open_as_window()
# Direkt mal pushen damit das Fenster sofort Daten hat
self._send_state()
except Exception as ex:
print("[ELEMENTE] open properties:", ex)
def _notify_active_geschoss(self):
"""Schlanker Partial-Push: nur activeGeschoss + activeGeschossName.
@@ -4884,7 +4898,7 @@ class ElementeBridge(panel_base.BaseBridge):
})
elements.append(base)
sel_id = next((e["id"] for e in elements if e["selected"]), None)
self.send("STATE", {
payload = {
"elements": elements,
"geschosse": [{"id": g.get("id"), "name": g.get("name")}
for g in geschosse if isinstance(g, dict)],
@@ -4897,7 +4911,14 @@ class ElementeBridge(panel_base.BaseBridge):
{"name": n, "color": m["color"],
"hatch": m.get("hatch", ""), "scale": m.get("scale", 1.0)}
for n, m in _MATERIAL_LIBRARY.items()],
})
}
self.send("STATE", payload)
# An Properties-Satellite-Window forwarden falls offen
try:
pb = sc.sticky.get("elemente_properties_bridge")
if pb is not None and pb is not self:
pb.send("STATE", payload)
except Exception: pass
# --- Wand-Befehle -------------------------------------------------------