[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 <noreply@anthropic.com>
This commit is contained in:
+12
-4
@@ -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.
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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))
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user