From 080659ab9528139e7601ef6cf32dc0b4aeebf498 Mon Sep 17 00:00:00 2001 From: karim Date: Sat, 30 May 2026 16:37:18 +0200 Subject: [PATCH] Wand-Hilfslinien: Outline + Centerline auf allen Waenden, Petrol-Farbe, Pairing-Verfeinerung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Outline + Centerline - Outline-Curves (geschlossenes Viereck) jetzt fuer ALLE Waende (auch Cluster/Chain-Member) — in_cluster-Flag suppressed Outline nicht mehr - Mode = Normal (statt Locked) damit ObjectColor (Petrol #5fa896) durchschlaegt und doc.Objects.Replace bei Pure-Transform funktioniert - Trade-off: User kann Hilfslinien greifen, aber jeder Axis-Regen schreibt sie neu (selbst-korrigierend) Pure-Transform Sync - wand_centerline + wand_outline werden im Pure-Transform-Pfad explizit mit-transformed (vorher nur SOURCE_TYPES + VOLUME_TYPES → Linien blieben in alter Position haengen) Selection Pairing - wand_axis zurueck in _PAIRED_SOURCE_TYPES → Achsen-Klick selektiert Outline + Centerline mit (alle "Referenzlinien" leuchten zusammen auf) - _collect_partners special-case fuer wand_axis: NUR Hilfslinien als Partner, NICHT das Volume (sonst wuerde das ganze Brep mit-aufleuchten) - wand_volume Pairing wie bisher: Volume-Klick → Achsen + Centerlines + Outlines aller Cluster-Members --- rhino/elemente.py | 68 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 20 deletions(-) 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: