From 166c94f71562068062a4f276ee5940d9ef7b130d Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Wed, 14 Oct 2026 16:08:50 +0200 Subject: [PATCH] [FIX] Kreisel-Weichen: Ende-an-Ende-Raeder und Zeichentoleranz - Rad/Rad an beiden Flanken gilt nur bei gleich ausgerichteten Raedern als "Seite an Seite"; in Gegenrichtung (Kreisel seitlich versetzt Ende an Ende) ist es eine Weiche - toleranz_beruehrung von 1 auf 10 mm (Zeichenungenauigkeiten, Spalt und Ueberlappung) - Unit-Tests fuer Ende-an-Ende, Seite-an-Seite und den Fall aus test.dxf (E3/C7) Co-Authored-By: Claude Opus 5.5 --- Lisp/KreiselInsert.lsp | 16 ++++++++++++---- data/json/component_defaults.json | 2 +- tests/test_unit.lsp | 29 +++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index cbb378a..f2b369f 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -1545,7 +1545,11 @@ ;; BERUEHRUNG ("Kreis/Kreis" bzw. "Kreis/Tangente", Namen wie im Python- ;; Export export_neighbors.compute_kreisel_touch_switches). ;; - Beruehren sich nur Laufprofile (Kreisel liegen Seite an Seite) -> -;; KOLLISION "Tangente/Tangente". +;; KOLLISION "Tangente/Tangente". Rad/Rad an beiden Flanken zaehlt nur bei +;; GLEICH ausgerichteten Raedern als Seite an Seite; in Gegenrichtung +;; (Kreisel seitlich versetzt Ende an Ende) ist es eine Weiche. +;; - Toleranz (toleranz_beruehrung, Standard 10 mm) faengt Zeichenungenauig- +;; keiten ab - gilt fuer Spalt UND Ueberlappung. ;; Die reinen Kerne (kreisel-bp-element/-paar/-berechnen) laufen ohne ;; Zeichnung und sind in tests/test_unit.lsp getestet. @@ -1676,10 +1680,14 @@ (if (<= (abs (- d (+ r (kreisel-bp-get "r" eo)))) tol) (progn (setq pt (kreisel-bp-mitte (cadr rad) (cadr rad2))) - ;; Beide Kreiselraeder nur an der Flanke = Kreisel Seite an Seite + ;; Beide Kreiselraeder nur an der Flanke UND gleich ausgerichtet = + ;; Kreisel Seite an Seite. Zeigen die Raeder in Gegenrichtung, stossen + ;; die Kreisel seitlich versetzt Ende an Ende (Raeder liegen nebeneinander, + ;; die Laufprofile treffen sich nur in einem Punkt) - das ist eine Weiche. (if (and (kreisel-bp-frei-p rad pt tol) (kreisel-bp-frei-p rad2 pt tol) (not (and (kreisel-bp-flanke-p rad pt tol) - (kreisel-bp-flanke-p rad2 pt tol)))) + (kreisel-bp-flanke-p rad2 pt tol) + (> (kreisel-bp-dot (caddr rad) (caddr rad2)) 0.0)))) (setq res (cons (list pt "Kreis/Kreis" rad (strcat (car rad) "/" (car rad2))) res)))))) @@ -1766,7 +1774,7 @@ ) ;; Toleranzen aus data/json/component_defaults.json (Sektion kreisel) -(defun kreisel-bp-toleranz () (float (ssg-cfg-or "kreisel" "toleranz_beruehrung" 1.0))) +(defun kreisel-bp-toleranz () (float (ssg-cfg-or "kreisel" "toleranz_beruehrung" 10.0))) (defun kreisel-bp-toleranz-z () (float (ssg-cfg-or "kreisel" "toleranz_hoehe" 1.0))) ;; Alle KREISEL_n/ECKRAD_n im Modellbereich als Element-Records sammeln. diff --git a/data/json/component_defaults.json b/data/json/component_defaults.json index 6fb983a..a5473eb 100644 --- a/data/json/component_defaults.json +++ b/data/json/component_defaults.json @@ -13,7 +13,7 @@ "toleranz_kollinear": 0.01, "toleranz_winkel": 1.0, "toleranz_min_distanz": 0.001, - "toleranz_beruehrung": 1.0, + "toleranz_beruehrung": 10.0, "toleranz_hoehe": 1.0, "weiche_marker_radius": 50.0 }, diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index 48d2738..5ed48a4 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -935,6 +935,35 @@ (tu-bp-el "ECKRAD" 400.0 800.0 0.0 0.0 0.0 "B")) 1.0 1.0))) (tu-eq "kreisel-bp/flanke-eckrad" 1 (length _ber)) + ;; Kreisel seitlich versetzt Ende an Ende (Raeder Flanke an Flanke, aber in + ;; Gegenrichtung) -> Weiche, keine Seite-an-Seite-Kollision + (setq _erg (kreisel-bp-berechnen (list (tu-bp-el "KREISEL" 0.0 0.0 0.0 0.0 2000.0 "A") + (tu-bp-el "KREISEL" 2000.0 800.0 0.0 0.0 2000.0 "B")) + 1.0 1.0)) + (tu-eq "kreisel-bp/ende-an-ende-art" '("Kreis/Kreis") (tu-bp-arten (car _erg))) + (tu-eqf "kreisel-bp/ende-an-ende-punkt" '(2400.0 400.0) (cdr (assoc "p" (car (car _erg))))) + (tu-nil "kreisel-bp/ende-an-ende-keine-kollision" (cadr _erg)) + ;; Gleich ausgerichtete Raeder Flanke an Flanke (echtes Seite an Seite) -> keine Weiche + (setq _erg (kreisel-bp-berechnen (list (tu-bp-el "KREISEL" 0.0 0.0 0.0 0.0 2000.0 "A") + (tu-bp-el "KREISEL" 0.0 800.0 0.0 0.0 2000.0 "B")) + 1.0 1.0)) + (tu-nil "kreisel-bp/seite-an-seite-keine-weiche" (car _erg)) + ;; results/test.dxf (E3/C7): Kreisel 2/3/4 Ende an Ende (0.9 mm Ueberlappung bzw. + ;; 5.5 mm), Kreisel 8 vor dem Profil von Kreisel 9 (2.6 mm Spalt) - mit 10 mm + ;; Toleranz drei Weichen + (setq _erg (kreisel-bp-berechnen + (list (tu-bp-el "KREISEL" 4940.03 -7603.25 2000.0 90.0 4500.0 "2") + (tu-bp-el "KREISEL" 5739.13 -12898.65 2000.0 90.0 5296.0 "3") + (tu-bp-el "KREISEL" 6533.6 -7603.44 2000.0 90.0 7889.0 "4") + (tu-bp-el "KREISEL" -61.76 -974.08 2000.0 90.0 4000.0 "9") + (tu-bp-el "KREISEL" 340.85 505.79 2000.0 0.0 3400.0 "8")) + 10.0 1.0)) + (tu-eq "kreisel-bp/test-dxf-paare" + '(("2" "3") ("3" "4") ("9" "8")) + (mapcar '(lambda (tr) (list (cdr (assoc "id" (cdr (assoc "a" tr)))) + (cdr (assoc "id" (cdr (assoc "b" tr)))))) + (car _erg))) + (tu-nil "kreisel-bp/test-dxf-keine-kollision" (cadr _erg)) )