From 5c7611ad4079d572f3f18b32bea79a2f74f18e12 Mon Sep 17 00:00:00 2001 From: karim Date: Sat, 30 May 2026 23:16:09 +0200 Subject: [PATCH] Tech-Drawing-Fallback fix: batch-flag im sync Post-Cmd Regen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: Beim Verbinden/Trennen zweier Waende via Move (= synchroner Replace- Event-Pfad) lief jeder _regenerate_element-Call ohne den _dossier_regen_batch_active Flag → jeder Regen invalidierte den Joint-Cache neu (O(N²) Rebuilds) → Rhinos Technical-Drawing-Analyse choked → "Switching all technical views to wireframe display". Fix: Im post-Command Regen-Loop (line ~17285) den Flag setzen + Cache einmal invalidieren bevor die affected_walls durchlaufen. Pattern analog zur Idle-Batch-Logik die das schon hatte. Outline + Centerline wieder aktiviert — waren nicht der Schuldige. --- rhino/elemente.py | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/rhino/elemente.py b/rhino/elemente.py index d1fa771..408e447 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -3276,16 +3276,12 @@ def _regen_wall_lines(doc, wall_id, in_cluster=False): except Exception as ex: print("[ELEMENTE] AddCurve centerline:", ex) - # Outline-Curve TEMPORAER deaktiviert: lag exakt auf z=0 wie die unteren - # Brep-Edges → Technical-Drawing Hidden-Line-Analyse choked nach jedem - # Regen. Wenn der User die outline-Visualisierung braucht, muessen wir - # auf Display-Conduit umstellen (nicht Tech-Drawing analysiert). - # outline = _make_wall_outline(axis_curve, dicke, referenz) - # if outline is not None: - # try: doc.Objects.AddCurve(outline, _build_attrs("wand_outline", - # dashed=False)) - # except Exception as ex: - # print("[ELEMENTE] AddCurve outline:", ex) + outline = _make_wall_outline(axis_curve, dicke, referenz) + if outline is not None: + try: doc.Objects.AddCurve(outline, _build_attrs("wand_outline", + dashed=False)) + except Exception as ex: + print("[ELEMENTE] AddCurve outline:", ex) # Alias fuer Backwards-Compat — alte Callsites benutzen den alten Namen. @@ -15639,26 +15635,27 @@ def _migrate_plangrafik_60_to_80_once(doc): def _migrate_strip_wand_outlines_once(doc): - """One-shot: alle bestehenden wand_outline Curves loeschen (Feature - temporaer deaktiviert wegen Technical-Drawing Hidden-Line-Konflikt). + """One-shot: alle bestehenden wand_outline + wand_centerline Curves + loeschen (Feature temporaer deaktiviert wegen Technical-Drawing Konflikt). Bei spaeterer Re-Aktivierung als Display-Conduit hinfaellig.""" if doc is None: return - try: key = "_dossier_wand_outlines_strip_" + str(doc.RuntimeSerialNumber) - except Exception: key = "_dossier_wand_outlines_strip_default" + try: key = "_dossier_wand_lines_strip_v2_" + str(doc.RuntimeSerialNumber) + except Exception: key = "_dossier_wand_lines_strip_v2_default" if sc.sticky.get(key): return sc.sticky[key] = True n = 0 try: for obj in list(doc.Objects): try: - if obj.Attributes.GetUserString(_KEY_TYPE) == "wand_outline": + t = obj.Attributes.GetUserString(_KEY_TYPE) or "" + if t in ("wand_outline", "wand_centerline"): doc.Objects.Delete(obj.Id, True) n += 1 except Exception: pass except Exception as ex: - print("[ELEMENTE] strip wand_outlines migration:", ex) + print("[ELEMENTE] strip wand-lines migration:", ex) if n > 0: - print("[ELEMENTE] Strip-Wand-Outlines Migration: {} entfernt".format(n)) + print("[ELEMENTE] Strip-Wand-Lines Migration: {} entfernt".format(n)) def _migrate_strip_wall_auto_groups_once(doc): @@ -17286,10 +17283,18 @@ def _on_command_end(sender, e): # Sync-Regen aller betroffenen Wände — Move ist sauber abgeschlossen, # kein Konflikt mehr moeglich. EIN Regen pro Wand (nicht pro Oeffnung). # Display bleibt suppressed bis ALLE Wände durch sind → kein „Aufbauen". - for wid in affected_walls: - try: _regenerate_element(doc, wid) - except Exception as ex: - print("[ELEMENTE] post-cmd regen:", ex) + # Joint-Cache EINMAL fuer das Batch invalidieren (statt pro Regen). + # Sonst O(N²) Cache-Rebuilds → Technical-Drawing-Timeout/Wireframe- + # Fallback beim Chain-Bilden oder -Trennen. + sc.sticky["_dossier_regen_batch_active"] = True + _invalidate_joints_cache(None) + try: + for wid in affected_walls: + try: _regenerate_element(doc, wid) + except Exception as ex: + print("[ELEMENTE] post-cmd regen:", ex) + finally: + sc.sticky["_dossier_regen_batch_active"] = False doc.Views.RedrawEnabled = prev_redraw_enabled try: doc.Views.Redraw() except Exception: pass