diff --git a/rhino/elemente.py b/rhino/elemente.py index 35787b7..78c0231 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -3212,12 +3212,12 @@ def _make_wall_outline(axis_curve, dicke, referenz): def _regen_wall_lines(doc, wall_id, in_cluster=False): """Stale wand_centerline + wand_outline-Objekte loeschen + neue addieren. - Beide als LOCKED Curves auf der Referenzen-Sublayer. + Beide als Normal Curves auf der Referenzen-Sublayer, in Petrol-Gruen + (#5fa896). Outline IMMER (auch bei Cluster/Chain) — jede Wand zeigt ihr + eigenes Viereck als visuelles Feedback. Centerline nur bei ref != 'mid'. - - Centerline (dashed): nur wenn ref != 'mid' (Achse = Centerline sonst) - - Outline (solid): nur fuer SOLO Waende — Cluster/Chain-Member werden - ueber den merged Brep dargestellt; eigene Outlines wuerden visuell - ueberlappen und verwirren.""" + `in_cluster`-Flag wird aktuell nicht mehr unterschieden — Outlines + erscheinen pro Wand unabhaengig vom Cluster-Status.""" for obj in list(doc.Objects): try: t = obj.Attributes.GetUserString(_KEY_TYPE) or "" @@ -3241,7 +3241,17 @@ def _regen_wall_lines(doc, wall_id, in_cluster=False): def _build_attrs(type_str, dashed=False): attrs = Rhino.DocObjects.ObjectAttributes() attrs.LayerIndex = layer_idx - attrs.Mode = Rhino.DocObjects.ObjectMode.Locked + # NICHT Locked — sonst zeigt Rhino sie in Grau statt Petrol-Gruen, + # und Pure-Transform-Replace scheitert. Stattdessen: User kann sie + # theoretisch greifen, aber bei jedem Axis-Regen werden sie neu + # erstellt → ungewollte Edits korrigieren sich selbst. + # Petrol-Gruen #5fa896 — passt zum DOSSIER Design-System + try: + import System.Drawing as SD + attrs.ColorSource = ( + Rhino.DocObjects.ObjectColorSource.ColorFromObject) + attrs.ObjectColor = SD.Color.FromArgb(255, 95, 168, 150) + except Exception: pass if dashed: try: lt_idx = doc.Linetypes.Find("Dashed", True) @@ -3266,13 +3276,12 @@ def _regen_wall_lines(doc, wall_id, in_cluster=False): except Exception as ex: print("[ELEMENTE] AddCurve centerline:", ex) - if not in_cluster: - 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. @@ -15316,13 +15325,11 @@ _PAIRED_VOLUME_TYPES = ( "raum_fill", ) _PAIRED_SOURCE_TYPES = ( + "wand_axis", # → Centerline + Outline mitselektieren (NICHT Volume) "decke_outline", "dach_outline", "oeffnung_point", "treppe_axis", "stuetze_point", "traeger_axis", "raum_outline", - # wand_axis ABSICHTLICH NICHT hier: Klick auf Wand-Linie soll NUR die - # Linie selektieren (nicht das ganze Volume). Umgekehrt aber schon: Klick - # auf wand_volume sammelt Achsen+Centerlines+Outlines (siehe _collect_partners). ) @@ -15395,10 +15402,24 @@ def _collect_partners(doc, rhino_objects): _add_partner(lo) except Exception: pass elif t in _PAIRED_SOURCE_TYPES: - # Klick auf Source → ALLE Volumen (alle Schichten) mitsammeln. - for v in _find_all_volumes(doc, meta["id"]): - _add_partner(v) - _add_source(obj) + if t == "wand_axis": + # Wand-spezifisch: Achsen-Click sammelt NUR Hilfslinien + # (Outline + Centerline), NICHT das Volume — sonst leuchtet + # das ganze Brep mit auf. + for lo in doc.Objects: + try: + lt = lo.Attributes.GetUserString(_KEY_TYPE) or "" + lwid = lo.Attributes.GetUserString(_KEY_ID) or "" + if (lt in ("wand_centerline", "wand_outline") + and lwid == meta["id"]): + _add_partner(lo) + except Exception: pass + _add_source(obj) + else: + # Default: Klick auf Source → ALLE Volumen mitsammeln. + for v in _find_all_volumes(doc, meta["id"]): + _add_partner(v) + _add_source(obj) return partners, sources @@ -17017,6 +17038,13 @@ def _on_command_end(sender, e): if not m: continue t = m.get("type") if not _should_follow(m, str(obj.Id)): continue + # Wand-Hilfslinien (Outline + Centerline) folgen via Pure- + # Transform — sonst bleiben sie in alter Position haengen. + if t in ("wand_centerline", "wand_outline"): + new_geom = obj.Geometry.Duplicate() + new_geom.Transform(pure_transform) + doc.Objects.Replace(obj.Id, new_geom) + continue # Sources die nicht bewegt wurden (= identity transform) # transformen — nur via _should_follow erlaubt (Cascade). if t in SOURCE_TYPES: