118bc51cc5
Phase-2-Fixes: - Backbone-Ext berechnet bis MATCHING-Layer (Stahl) far-face, nicht bis Body-far-face. Beton drillt durch Stahl-Band, nicht durch Daemm/Putz. - Case A/B detection via dot(out_dir, RhinoPerp). Rhino Curve.Offset benutzt (tan × +z) = (b_tan.Y, -b_tan.X), nicht (-b_tan.Y, b_tan.X). - Backbone-axis-ext separat von _my_axis_ext: nur Backbone-Column extended, non-backbone columns stoppen am Snap. - Through-only Mats (z.B. Daemm wo T-stem keinen hat) werden auch durchlaufen damit hoehere-prio backbone diese carven kann. - Post-Carve Union: gleiche-Material-Pieces mergen (Backbone-Beton-Col + Through-Stahl-Band → T-Shape). - BBox-overlap strict-Filter vor BoolDiff: touching coplanar faces ueberspringen, vermeidet Rhino BoolDiff "punch-through" Artefakte. - _has_my_cols guard: KeyError beim consume von T-stem-Layern fuer through-only mats verhindert. Layer-Smart-Join (smart_join.py): - Neue _layer_join_attempt: 2 selektierte wand_volume Breps gleicher Material via BoolUnion mergen. Manueller Override fuer Edge-Cases wo auto Phase 2 nicht reicht. Cluster-Volume Select-Handler (elemente.py): - Alt-Click bypassed Cluster-Swap → User kann einzelne Layer-Breps direkt anwaehlen (= fuer Layer-Smart-Join).