From 3dc6e31374f78c39af2232f1c96bdc33d8873238 Mon Sep 17 00:00:00 2001 From: karim Date: Fri, 22 May 2026 13:33:53 +0200 Subject: [PATCH] Tueren-Schwung: sweep_sign-Swap + perp am Tuerblatt bei standard/detail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- rhino/elemente.py | 50 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/rhino/elemente.py b/rhino/elemente.py index 456e5ab..573a239 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -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