T-Junction Phase 2 mit 3D Brep Union + Material-Prio-Carve

Asymmetric L-merge fuer Schichtdurchdringung:
- Backbone (= hoechste Material-Prio in beiden Waenden) bildet T-form
- Non-backbone Layer werden gecarved mit backbone-Column + through-Bands
  hoeherer Prio
- ext=0 fuer T-Stem-Axis (= column endet am snap, kein "drueber")
- 3D Brep Union via Brep.CreateBooleanUnion mit cross-junction safety
  (= aktueller through-Brep statt von Meta neu zu bauen)
- Cleanup: MergeCoplanarFaces

Plus:
- Innenwand Beton 20cm Style (Putz + Beton + Putz, ref-mid)
- curve_vertex_dots.py: gruene Vertex-Punkte fuer Polylinen/Curves
- Cluster-Volume Select Handler: Shift-Modifier fuer Multi-Select
- startup.py: Top-View maximieren on Doc-Open

Known limitation: Putz-Schicht kann in bestimmten Konfigurationen visuell
suedlich des Daemm-Band-Top weiter sichtbar sein (= edge case fuer
asymmetric layers). Naechster Schritt: manuelle 2D-Polygon-Konstruktion
statt 3D Boolean.
This commit is contained in:
2026-06-01 14:32:55 +02:00
parent 9cce8199c3
commit df56a54b66
4 changed files with 756 additions and 51 deletions
+45
View File
@@ -151,6 +151,45 @@ def _assign_default_display_modes(doc):
print("[STARTUP] view-modes: {} Viewport(s) gesetzt".format(n_set))
_DOC_FLAG_VIEW_MAXIMIZED = "dossier_top_view_maximized"
def _maximize_top_view(doc):
"""Maximiert den Top-Viewport (= einzige aktive View statt 4-Viewport-
Default). Persistiert Flag in doc.Strings → laeuft nur EINMAL pro Doc.
User-Overrides (manuelles Wechseln zu 4-View etc) bleiben erhalten."""
if doc is None: return
try:
if doc.Strings.GetValue(_DOC_FLAG_VIEW_MAXIMIZED) == "1":
return # schon initialisiert
except Exception: pass
try:
top_view = None
for view in doc.Views:
try:
vp = view.ActiveViewport
if vp is None: continue
if vp.Name == "Top":
top_view = view
break
except Exception: pass
if top_view is None:
print("[STARTUP] view-max: kein Top-Viewport gefunden")
return
try:
top_view.Maximized = True
doc.Views.ActiveView = top_view
doc.Views.Redraw()
print("[STARTUP] view-max: Top-Viewport maximiert")
except Exception as ex:
print("[STARTUP] view-max set:", ex); return
try:
doc.Strings.SetString(_DOC_FLAG_VIEW_MAXIMIZED, "1")
except Exception: pass
except Exception as ex:
print("[STARTUP] view-max:", ex)
_DOC_FLAG_UNIT_CHECKED = "dossier_unit_checked"
@@ -227,6 +266,7 @@ def _on_doc_opened(sender, e):
import panel_base
panel_base.migrate_to_dossier(doc)
_assign_default_display_modes(doc)
_maximize_top_view(doc)
_check_doc_unit(doc)
except Exception as ex:
print("[STARTUP] _on_doc_opened:", ex)
@@ -301,6 +341,11 @@ def _load_all(sender, e):
_pb._t_mark("post_init", "view_modes", _t_vm)
except Exception as ex:
print("[STARTUP] view-modes assign:", ex)
# Top-View maximieren (= einzige aktive View statt 4-View Default)
try:
_maximize_top_view(Rhino.RhinoDoc.ActiveDoc)
except Exception as ex:
print("[STARTUP] view-max:", ex)
# Unit-Check fuer das beim Start aktive Doc — fragt einmal pro Doc
# wenn doc.ModelUnitSystem != Project-Setting
_t_uc = _t.time()