L-Aussen-Polygon: Z-Konsistenz fix + try/except defensive

_line_intersect_xy lieferte Z=0 was nicht zum Polygon-Z (=OKFF) passte,
PolylineCurve mit gemischten Z konnte fehlschlagen → 2D-Generierung
broken fuer L-Treppen. Fix: _at_z(p, fallback) Helper setzt Z explicit.
Plus try/except um die ganze Polygon-Konstruktion — Fallback auf
2-Rechteck-Variante bei Fehler.
This commit is contained in:
2026-05-28 02:40:09 +02:00
parent bb64e4d41e
commit e406e8d9b2
+12 -10
View File
@@ -6421,9 +6421,10 @@ def _lauflinie_l(axis_polyline, n_stufen, z, arrow_style="klassisch", doc=None,
def _aussen_l_polygon(axis_polyline, breite, referenz, z):
"""Sauberes L-Polygon: 6-Punkt-Outline, die beiden Laeufe schliessen
sich an der Ecke an (Outer/Inner via Linien-Schnitt). Returnt eine
Polyline ODER None bei Singularitaet (parallele Schenkel)."""
"""Sauberes L-Polygon: 6-Punkt-Outline mit Outer/Inner-Ecken via
Linien-Schnitt. Returnt PolylineCurve oder None bei Singularitaet/
Fehler Caller faellt dann auf 2-Rechteck-Variante zurueck."""
try:
ok, poly = axis_polyline.TryGetPolyline()
if not ok or poly is None or poly.Count != 3: return None
p0 = rg.Point3d(poly[0].X, poly[0].Y, z)
@@ -6434,23 +6435,24 @@ def _aussen_l_polygon(axis_polyline, breite, referenz, z):
if L1 < 1e-6 or L2 < 1e-6: return None
u1 = rg.Vector3d((pc.X - p0.X) / L1, (pc.Y - p0.Y) / L1, 0)
u2 = rg.Vector3d((p1.X - pc.X) / L2, (p1.Y - pc.Y) / L2, 0)
# perp 90° CCW
pp1 = (-u1.Y, u1.X)
pp2 = (-u2.Y, u2.X)
off_l, off_r = _treppe_2d_side_offsets(breite, referenz)
def _off(pt, perp, d):
return rg.Point3d(pt.X + perp[0] * d, pt.Y + perp[1] * d, z)
# Lauf1 Seiten (start + corner)
p0_l = _off(p0, pp1, off_l); p0_r = _off(p0, pp1, off_r)
pc_l1 = _off(pc, pp1, off_l); pc_r1 = _off(pc, pp1, off_r)
# Lauf2 Seiten (corner + end)
pc_l2 = _off(pc, pp2, off_l); pc_r2 = _off(pc, pp2, off_r)
p1_l = _off(p1, pp2, off_l); p1_r = _off(p1, pp2, off_r)
# Ecken-Schnitte: linker Schenkel intersect, rechter Schenkel intersect
corner_l = _line_intersect_xy(p0_l, u1, p1_l, u2) or pc_l1
corner_r = _line_intersect_xy(p0_r, u1, p1_r, u2) or pc_r1
# Ecken-Schnitte — Z auf z setzen (Helper liefert Z=0)
def _at_z(p, fallback):
return rg.Point3d(p.X, p.Y, z) if p is not None else fallback
corner_l = _at_z(_line_intersect_xy(p0_l, u1, p1_l, u2), pc_l1)
corner_r = _at_z(_line_intersect_xy(p0_r, u1, p1_r, u2), pc_r1)
pts = [p0_l, p0_r, corner_r, p1_r, p1_l, corner_l, p0_l]
return rg.PolylineCurve(rg.Polyline(pts))
except Exception as ex:
print("[ELEMENTE] _aussen_l_polygon:", ex)
return None
def _aussen_l(axis_polyline, breite, referenz, z,