From 53fea10cba34b9558efe1f4ff78434b66b163e29 Mon Sep 17 00:00:00 2001 From: karim Date: Mon, 18 May 2026 23:26:23 +0200 Subject: [PATCH] Clipping: Geschoss-Wechsel loescht Plane nicht mehr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: React's SET_ACTIVE-Message schickt nur Minimal-Payload `{id, name, isGeschoss, okff}` — ohne hasClipping/schnitthoehe. `_update_clipping` las `enabled = active_z.get("hasClipping")` aus diesem Minimal-Payload → False → Plane geloescht. Beim Zurueck- wechseln auf EG mit aktiviertem Clipping war die Plane weg obwohl der Toggle im Panel weiter „aktiv" zeigte. Fix: `_update_clipping` nimmt nur die `id` aus dem uebergebenen Hint (oder aus `dossier_active_id`) und holt sich den vollen Geschoss-Record aus `dossier_zeichnungsebenen` doc.String. Damit sind hasClipping, schnitthoehe, hoehe, visible immer verfuegbar. Co-Authored-By: Claude Opus 4.7 --- rhino/rhinopanel.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/rhino/rhinopanel.py b/rhino/rhinopanel.py index f893c81..cc9b3b2 100644 --- a/rhino/rhinopanel.py +++ b/rhino/rhinopanel.py @@ -396,20 +396,30 @@ class EbenenBridge(panel_base.BaseBridge): except Exception: pass def _update_clipping(self, active_z=None): - """Clipping-Plane folgt aktivem Geschoss — nur wenn dessen hasClipping=True.""" + """Clipping-Plane folgt aktivem Geschoss — nur wenn dessen hasClipping=True. + + IMMER aus doc.Strings lesen statt das uebergebene `active_z` direkt zu + verwenden — der SET_ACTIVE-Pfad schickt ein Minimal-Payload (nur + id/name/isGeschoss/okff) ohne hasClipping/schnitthoehe. Wenn wir uns + darauf verließen, wuerde der Geschoss-Wechsel jede Clipping-Plane + loeschen weil enabled=False auswertet. Der persistierte Record in + doc.Strings hat die vollen Daten.""" doc = Rhino.RhinoDoc.ActiveDoc - if active_z is None: - z_raw = doc.Strings.GetValue("dossier_zeichnungsebenen") + # ID aus Hint oder aus dem persistierten active_id + active_id = None + if isinstance(active_z, dict): + active_id = active_z.get("id") + if not active_id: active_id = doc.Strings.GetValue("dossier_active_id") - if z_raw and active_id: - try: - z_list = json.loads(z_raw) - active_z = next((z for z in z_list if z.get("id") == active_id), None) - except Exception: - active_z = None - # Volles Dump des Active-Geschosses fuer Diagnose. Wenn hier - # hasClipping fehlt aber im UI gesetzt wurde, hat React's Dialog die - # Daten nicht weitergereicht (haeufig: WebView-Cache zeigt alte JS). + # Vollen Record aus doc.Strings holen + z_raw = doc.Strings.GetValue("dossier_zeichnungsebenen") + if z_raw and active_id: + try: + z_list = json.loads(z_raw) + active_z = next((z for z in z_list if z.get("id") == active_id), None) + except Exception: + pass + # Volles Dump des Active-Geschosses fuer Diagnose. try: print("[CLIP] active_z keys: {}".format( sorted(active_z.keys()) if active_z else None))