From 3e54fa46a6bf6ff0e2004522e4cc2ce0f96b8d96 Mon Sep 17 00:00:00 2001 From: karim Date: Sun, 31 May 2026 12:49:42 +0200 Subject: [PATCH] smart_join: UserString-Key war FALSCH ("dossier_type" statt "dossier_element_type") MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: in _walls_and_curves_from_sel + safety check + diagnostic wurde "dossier_type" als UserString-Key gelesen, aber der echte Key (definiert in elemente.py via _KEY_TYPE) ist "dossier_element_type". Effekt: kein einziges Objekt wurde als wand_axis/wand_volume erkannt. ALLES landete im "elif t == '':" Branch (= generic curves). Solid L-Join funktionierte per ZUFALL: bei Solid-Wand (axis + outline + volume) sind nur 1 Curve open (axis); outline ist closed rectangle. Bei 2 Solid-Waenden waren also 2 offene Curves in generic → L-Join fand die 2 vermeintlich generic Curves (= eigentlich Achsen). Bei Layered scheiterte es: 2 Achsen + 2 Centerlines = 4 offene Curves im generic. L-Join Bedingung "len(generic) == 2" nicht erfuellt → silent return → Fallthrough zu _Join. Fix: alle 4 Vorkommen auf "dossier_element_type" gefixt. Jetzt erkennt smart_join Waende richtig, dedupliziert per wall_id, und T-Join/L-Join/ Safety-Check funktionieren wie geplant. --- rhino/aliases/cmd/smart_join.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/rhino/aliases/cmd/smart_join.py b/rhino/aliases/cmd/smart_join.py index 67c9ff1..0c7aac3 100644 --- a/rhino/aliases/cmd/smart_join.py +++ b/rhino/aliases/cmd/smart_join.py @@ -94,11 +94,11 @@ def _walls_and_curves_from_sel(doc, sel): # Pre-Index wand_axis by wall_id fuer schnelles Lookup axis_by_id = {} for o in doc.Objects: - if o.Attributes.GetUserString("dossier_type") == "wand_axis": + if o.Attributes.GetUserString("dossier_element_type") == "wand_axis": wid = o.Attributes.GetUserString("dossier_element_id") or "" if wid: axis_by_id[wid] = o for obj in sel: - t = obj.Attributes.GetUserString("dossier_type") or "" + t = obj.Attributes.GetUserString("dossier_element_type") or "" wid = obj.Attributes.GetUserString("dossier_element_id") or "" if t == "wand_axis" and wid and wid not in seen_walls: axes.append(obj); seen_walls.add(wid) @@ -243,11 +243,30 @@ def _run(): # L-Join: beide Endpunkte werden zum Schnittpunkt der verlaengerten Linien # gezogen. T zuerst probieren (= spezifischer), dann L als Fallback. if len(sel) >= 2: + # Diagnostic: was sieht smart_join in der Selection? + axes_dbg, generic_dbg = _walls_and_curves_from_sel(doc, sel) + type_counts = {} + for o in sel: + try: + t = o.Attributes.GetUserString("dossier_element_type") or "" + wid_raw = o.Attributes.GetUserString("dossier_element_id") or "" + geom_kind = type(o.Geometry).__name__ + key = "{}|{}|wid={}".format(t, geom_kind, + "yes" if wid_raw else "no") + type_counts[key] = type_counts.get(key, 0) + 1 + except Exception: pass + print("[SMART-JOIN] sel-detect: {} Wand-Achsen, {} generische Curves " + "(sel total: {})".format(len(axes_dbg), len(generic_dbg), len(sel))) + for k, n in type_counts.items(): + print("[SMART-JOIN] {} × {}".format(n, k)) try: if _t_join_attempt(doc, sel): doc.Views.Redraw() print("[SMART-JOIN] T-Join: Endpunkt auf Achse gesnappt") return + else: + print("[SMART-JOIN] T-Join: kein passender Kandidat (zu weit " + "weg oder am Endpunkt → L-Join Territory)") except Exception as ex: print("[SMART-JOIN] T-Join error:", ex) try: @@ -255,6 +274,9 @@ def _run(): doc.Views.Redraw() print("[SMART-JOIN] L-Join: 2 Curves zu L verbunden") return + else: + print("[SMART-JOIN] L-Join: konnte nicht ausfuehren (parallel, " + "schon verbunden, oder Geometrie ungueltig)") except Exception as ex: print("[SMART-JOIN] L-Join error:", ex) @@ -262,7 +284,7 @@ def _run(): # — das wuerde mehrere Achsen zu einer Curve zusammenkleben und die Wand- # Verknuepfung zerstoeren (Source-Duplikat-Listener kapert die alte ID). has_wand_axis = any( - obj.Attributes.GetUserString("dossier_type") == "wand_axis" + obj.Attributes.GetUserString("dossier_element_type") == "wand_axis" for obj in sel) if has_wand_axis: print("[SMART-JOIN] Wand-Achsen selektiert: T-Join/L-Join hat nicht "