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:
+34
-16
@@ -2561,33 +2561,51 @@ def _make_tuer_swing_curves(axis_curve, point_on_axis, wall_dicke,
|
||||
leaf_len = leaf_t_hi - leaf_t_lo
|
||||
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":
|
||||
hinge_t = leaf_t_lo
|
||||
# Schwung-Richtung: vom Scharnier nach aussen → Aussenseite-Vorzeichen
|
||||
# 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
|
||||
sweep_sign = +1
|
||||
else:
|
||||
hinge_t = leaf_t_hi
|
||||
sweep_sign = +1
|
||||
sweep_sign = -1
|
||||
|
||||
# Hinge-Punkt: sitzt auf der WAND-INNENKANTE (nicht auf der Achse).
|
||||
# Innen-Richtung: aussenseite='rechts' (aus_sign=+1) bedeutet aussen
|
||||
# liegt in box-perp-Richtung (tan.Y, -tan.X). Innen ist dann das
|
||||
# Gegenstueck (-tan.Y, +tan.X). aus_sign=-1 flippt das.
|
||||
# Perp-Position des Schwung-Bogens.
|
||||
# - einfach (1:100): an der Wand-INNENKANTE (= -half_d in box-perp
|
||||
# wenn aus_sign=+1).
|
||||
# - 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
|
||||
inside_x = aus_sign * (-tan.Y)
|
||||
inside_y = aus_sign * tan.X
|
||||
if darstellung == "einfach":
|
||||
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)
|
||||
hinge_pt = rg.Point3d(
|
||||
pt.X + hinge_t * tan.X + half_d * inside_x,
|
||||
pt.Y + hinge_t * tan.Y + half_d * inside_y,
|
||||
pt.X + hinge_t * tan.X + perp_x,
|
||||
pt.Y + hinge_t * tan.Y + perp_y,
|
||||
z0)
|
||||
# Geschlossener Endpunkt (Tuer-Blatt in Wand-Flucht, parallel zur Achse):
|
||||
closed_pt = rg.Point3d(
|
||||
pt.X + (hinge_t + sweep_sign * leaf_len) * tan.X + half_d * inside_x,
|
||||
pt.Y + (hinge_t + sweep_sign * leaf_len) * tan.Y + half_d * inside_y,
|
||||
pt.X + (hinge_t + sweep_sign * leaf_len) * tan.X + perp_x,
|
||||
pt.Y + (hinge_t + sweep_sign * leaf_len) * tan.Y + perp_y,
|
||||
z0)
|
||||
# Offener Endpunkt: hinge + leaf_len * direction(sweep_angle)
|
||||
# Direction startet bei +sweep_sign * tan (geschlossen) und rotiert
|
||||
|
||||
Reference in New Issue
Block a user