Wand-Hilfslinien: Outline + Centerline auf allen Waenden, Petrol-Farbe, Pairing-Verfeinerung

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
This commit is contained in:
2026-05-30 16:37:18 +02:00
parent 250853d7d0
commit 080659ab95
+48 -20
View File
@@ -3212,12 +3212,12 @@ def _make_wall_outline(axis_curve, dicke, referenz):
def _regen_wall_lines(doc, wall_id, in_cluster=False): def _regen_wall_lines(doc, wall_id, in_cluster=False):
"""Stale wand_centerline + wand_outline-Objekte loeschen + neue addieren. """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) `in_cluster`-Flag wird aktuell nicht mehr unterschieden Outlines
- Outline (solid): nur fuer SOLO Waende Cluster/Chain-Member werden erscheinen pro Wand unabhaengig vom Cluster-Status."""
ueber den merged Brep dargestellt; eigene Outlines wuerden visuell
ueberlappen und verwirren."""
for obj in list(doc.Objects): for obj in list(doc.Objects):
try: try:
t = obj.Attributes.GetUserString(_KEY_TYPE) or "" 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): def _build_attrs(type_str, dashed=False):
attrs = Rhino.DocObjects.ObjectAttributes() attrs = Rhino.DocObjects.ObjectAttributes()
attrs.LayerIndex = layer_idx 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: if dashed:
try: try:
lt_idx = doc.Linetypes.Find("Dashed", True) 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: except Exception as ex:
print("[ELEMENTE] AddCurve centerline:", ex) print("[ELEMENTE] AddCurve centerline:", ex)
if not in_cluster: outline = _make_wall_outline(axis_curve, dicke, referenz)
outline = _make_wall_outline(axis_curve, dicke, referenz) if outline is not None:
if outline is not None: try: doc.Objects.AddCurve(outline, _build_attrs("wand_outline",
try: doc.Objects.AddCurve(outline, _build_attrs("wand_outline", dashed=False))
dashed=False)) except Exception as ex:
except Exception as ex: print("[ELEMENTE] AddCurve outline:", ex)
print("[ELEMENTE] AddCurve outline:", ex)
# Alias fuer Backwards-Compat — alte Callsites benutzen den alten Namen. # Alias fuer Backwards-Compat — alte Callsites benutzen den alten Namen.
@@ -15316,13 +15325,11 @@ _PAIRED_VOLUME_TYPES = (
"raum_fill", "raum_fill",
) )
_PAIRED_SOURCE_TYPES = ( _PAIRED_SOURCE_TYPES = (
"wand_axis", # → Centerline + Outline mitselektieren (NICHT Volume)
"decke_outline", "dach_outline", "decke_outline", "dach_outline",
"oeffnung_point", "treppe_axis", "oeffnung_point", "treppe_axis",
"stuetze_point", "traeger_axis", "stuetze_point", "traeger_axis",
"raum_outline", "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) _add_partner(lo)
except Exception: pass except Exception: pass
elif t in _PAIRED_SOURCE_TYPES: elif t in _PAIRED_SOURCE_TYPES:
# Klick auf Source → ALLE Volumen (alle Schichten) mitsammeln. if t == "wand_axis":
for v in _find_all_volumes(doc, meta["id"]): # Wand-spezifisch: Achsen-Click sammelt NUR Hilfslinien
_add_partner(v) # (Outline + Centerline), NICHT das Volume — sonst leuchtet
_add_source(obj) # 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 return partners, sources
@@ -17017,6 +17038,13 @@ def _on_command_end(sender, e):
if not m: continue if not m: continue
t = m.get("type") t = m.get("type")
if not _should_follow(m, str(obj.Id)): continue 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) # Sources die nicht bewegt wurden (= identity transform)
# transformen — nur via _should_follow erlaubt (Cascade). # transformen — nur via _should_follow erlaubt (Cascade).
if t in SOURCE_TYPES: if t in SOURCE_TYPES: