Tueren-Schwung: sweep_sign-Swap + perp am Tuerblatt bei standard/detail

- sweep_sign war vertauscht — closed_pt landete am falschen Ende des
  Blattes. hinge=links → +1 (extends in +tan), rechts → -1.
- Schwung-Perp-Position:
  - einfach (1:100) → Wand-Innenkante (unchanged)
  - standard/detail (1:50/1:20) → Mitte des Rahmens (= wo das Tuer-
    blatt-Brep sitzt). Damit liegt der Bogen direkt am sichtbaren
    Blatt statt am Wand-Innenrand.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 13:33:53 +02:00
parent 655d368c92
commit 3dc6e31374
+34 -16
View File
@@ -2561,33 +2561,51 @@ def _make_tuer_swing_curves(axis_curve, point_on_axis, wall_dicke,
leaf_len = leaf_t_hi - leaf_t_lo leaf_len = leaf_t_hi - leaf_t_lo
if leaf_len <= 1e-6: return [] if leaf_len <= 1e-6: return []
# Scharnier-Tangentenkoordinate (along axis) # Scharnier-Tangentenkoordinate (along axis). sweep_sign zeigt von
# hinge zum anderen Ende des Blattes:
# - hinge=links (leaf_t_lo) → blatt erstreckt sich in +tan-Richtung
# - hinge=rechts (leaf_t_hi) → blatt erstreckt sich in -tan-Richtung
if hinge_side == "links": if hinge_side == "links":
hinge_t = leaf_t_lo hinge_t = leaf_t_lo
# Schwung-Richtung: vom Scharnier nach aussen → Aussenseite-Vorzeichen sweep_sign = +1
# Linke Bandseite: Tuer schwingt entlang +tan-Richtung im geschlossenen
# Zustand, perpendikulaer ins Innere (= -aus_sign perp) im offenen.
sweep_sign = -1 # gegen Uhrzeigersinn um Scharnier wenn aus +Z gesehen
else: else:
hinge_t = leaf_t_hi hinge_t = leaf_t_hi
sweep_sign = +1 sweep_sign = -1
# Hinge-Punkt: sitzt auf der WAND-INNENKANTE (nicht auf der Achse). # Perp-Position des Schwung-Bogens.
# Innen-Richtung: aussenseite='rechts' (aus_sign=+1) bedeutet aussen # - einfach (1:100): an der Wand-INNENKANTE (= -half_d in box-perp
# liegt in box-perp-Richtung (tan.Y, -tan.X). Innen ist dann das # wenn aus_sign=+1).
# Gegenstueck (-tan.Y, +tan.X). aus_sign=-1 flippt das. # - standard/detail: AM TUERBLATT (= Mitte des Rahmens in box-perp),
# damit Schwung visuell direkt am sichtbaren Tuerblatt sitzt.
half_d = float(wall_dicke) * 0.5 half_d = float(wall_dicke) * 0.5
inside_x = aus_sign * (-tan.Y) if darstellung == "einfach":
inside_y = aus_sign * tan.X perp_in_box = -aus_sign * half_d # wall-inner-edge
else:
# Frame-perp-Range analog _make_oeffnung_pieces berechnen
try: rahmen_t = float(oeff_meta.get("oeff_rahmen_tiefe", 0.08))
except Exception: rahmen_t = 0.08
try: rahmen_offset = max(0.0, float(oeff_meta.get("oeff_rahmen_offset", 0.05)))
except Exception: rahmen_offset = 0.05
rt = max(0.01, min(rahmen_t, 2.0 * half_d - 0.002))
eff_offset = min(rahmen_offset, max(0.0, 2.0 * half_d - rt - 0.001))
if aus_sign > 0:
fp_lo = -half_d + eff_offset; fp_hi = fp_lo + rt
else:
fp_hi = +half_d - eff_offset; fp_lo = fp_hi - rt
perp_in_box = (fp_lo + fp_hi) * 0.5
# box-perp-Richtung in Welt-XY: (tan.Y, -tan.X)
perp_x = perp_in_box * tan.Y
perp_y = perp_in_box * (-tan.X)
z0 = float(base_z) z0 = float(base_z)
hinge_pt = rg.Point3d( hinge_pt = rg.Point3d(
pt.X + hinge_t * tan.X + half_d * inside_x, pt.X + hinge_t * tan.X + perp_x,
pt.Y + hinge_t * tan.Y + half_d * inside_y, pt.Y + hinge_t * tan.Y + perp_y,
z0) z0)
# Geschlossener Endpunkt (Tuer-Blatt in Wand-Flucht, parallel zur Achse): # Geschlossener Endpunkt (Tuer-Blatt in Wand-Flucht, parallel zur Achse):
closed_pt = rg.Point3d( closed_pt = rg.Point3d(
pt.X + (hinge_t + sweep_sign * leaf_len) * tan.X + half_d * inside_x, pt.X + (hinge_t + sweep_sign * leaf_len) * tan.X + perp_x,
pt.Y + (hinge_t + sweep_sign * leaf_len) * tan.Y + half_d * inside_y, pt.Y + (hinge_t + sweep_sign * leaf_len) * tan.Y + perp_y,
z0) z0)
# Offener Endpunkt: hinge + leaf_len * direction(sweep_angle) # Offener Endpunkt: hinge + leaf_len * direction(sweep_angle)
# Direction startet bei +sweep_sign * tan (geschlossen) und rotiert # Direction startet bei +sweep_sign * tan (geschlossen) und rotiert