From ad7a7243ba9915774b9f6817173b203adb699757 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Tue, 28 Jul 2026 11:03:15 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20der=20Gef=C3=A4llestrecke:=20Nimmt=20auch?= =?UTF-8?q?=20Fliesskommazahlen=20f=C3=BCr=20den=20Winkel=20an.=20An=20Mub?= =?UTF-8?q?ea=20Layout=20gemerkt.=20Funktionen=20zur=20Einf=C3=BCgung=20vn?= =?UTF-8?q?o=20Geraden=20dazu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/Gefaellestrecke.lsp | 4 ++-- Lisp/OmniModulInsert.lsp | 21 +++++++++++++++++---- tests/test_mubea.lsp | 18 +++++++++++------- tests/testdata/mubea.json | 3 ++- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 00cba50..8d17aa3 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -1873,7 +1873,7 @@ ;; Bestaetigung - entfaellt, wenn bereits per Dialog-OK bestaetigt (Modus 1) (setq antwort (if dialog-bestaetigt "1" (getstring (ssg-text "gf-prompt-einfuegen")))) (if (not (= antwort "2")) - (gefaellestrecke-einfuegen L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel + (gefaellestrecke-einfuegen L_stau winkel startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel geruest-einzelmodul geruest-typ) (princ (ssg-text "gf-status-abgebrochen")) ) @@ -1899,7 +1899,7 @@ nil ) (gefaellestrecke-einfuegen - L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel + L_stau winkel startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel geruest-einzelmodul geruest-typ) ) ) diff --git a/Lisp/OmniModulInsert.lsp b/Lisp/OmniModulInsert.lsp index 8f1e64a..5fa6d62 100644 --- a/Lisp/OmniModulInsert.lsp +++ b/Lisp/OmniModulInsert.lsp @@ -499,12 +499,25 @@ ;; laengemax = Maximale Fahrstreckenlaenge in mm ;; --- Quell-Attribute einer Aluprofil-.dwg lesen (mit ID-Feld) --- ;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110") +;; +;; Seit dem ILS-Flach-Refactor tragen die Quell-Bloecke das Dimensionssuffix +;; _2D/_3D und liegen flach unter data/ils/ (z.B. AP60_3D.dwg). Die Aufloesung +;; laeuft daher ueber den zentralen Resolver ssg-ils-block-datei (mit +;; automatischem 3D-Fallback) statt ueber *block-path* + Name. Nur wenn der +;; Resolver nichts findet, wird als Rueckfall der alte Pfad (*block-path* + +;; Name ohne Suffix) versucht. ;; Rueckgabe: Attribut-Alist (mit angehaengtem leeren "ID"-Feld) oder nil, -;; wenn *block-path* fehlt oder die Quell-.dwg keine Attribute hat. -(defun omni:read-src-attribs (blockname / srcAttribs) - (if (and (boundp '*block-path*) *block-path*) +;; wenn keine Quell-.dwg gefunden wird bzw. sie keine Attribute hat. +(defun omni:read-src-attribs (blockname / datei srcAttribs) + (if (car (atoms-family 1 '("SSG-ILS-BLOCK-DATEI"))) + (setq datei (ssg-ils-block-datei blockname)) + ) + (if (and (null datei) (boundp '*block-path*) *block-path*) + (setq datei (strcat *block-path* blockname ".dwg")) + ) + (if datei (progn - (setq srcAttribs (ssg-attrib-read-dwg (strcat *block-path* blockname ".dwg"))) + (setq srcAttribs (ssg-attrib-read-dwg datei)) (if (and srcAttribs (not (assoc "ID" srcAttribs))) (setq srcAttribs (append srcAttribs (list (cons "ID" "")))) ) diff --git a/tests/test_mubea.lsp b/tests/test_mubea.lsp index aa9691b..f11cf46 100644 --- a/tests/test_mubea.lsp +++ b/tests/test_mubea.lsp @@ -196,17 +196,17 @@ ;; Modus 1, siehe object_data.md 2.1). L_stau wird aus deltaL abgeleitet ;; (identische Formel wie test_gefaellestrecke.lsp): ;; L_stau = (deltaL - aus-dx - ein-dx - sep_x) / cos(v) -;; sep_x = 300 * cos(v), v = fester Element-Winkel 3 Grad +;; sep_x = 300 * cos(v), v = Element-Winkel (winkel_grad, Default 3 Grad) ;; Die Zielhoehe ergibt sich aus L_stau/Winkel (kein Ziel-Hoehen-Parameter). ;; Rueckgabe: Ergebnis-JSON-String. -(defun mubea:build-gf-one (tid start-mm deltaL hz as-seite es-seite as-winkel es-winkel / +(defun mubea:build-gf-one (tid start-mm deltaL hz as-seite es-seite as-winkel es-winkel winkel / rad sep-x test-L_stau ent) (mubea:ensure-gf-init) ;; Element-Masse fuer die gewaehlte AS/ES-Variante setzen, damit aus-dx/ein-dx ;; zur Variante (90/30 Grad) passen. Danach wieder auf 90 zuruecksetzen. (vf-set-as-masse as-winkel as-seite) (vf-set-es-masse es-winkel es-seite) - (setq rad (* 3.0 (/ pi 180.0))) + (setq rad (* winkel (/ pi 180.0))) (setq sep-x (* 300.0 (cos rad))) (setq test-L_stau (/ (- deltaL (float aus-dx) (float ein-dx) sep-x) (cos rad))) @@ -214,9 +214,10 @@ (princ (strcat "\n [GF] " tid " -> Start=(" (rtos (car start-mm) 2 0) "," (rtos (cadr start-mm) 2 0) "," (rtos (caddr start-mm) 2 0) ") hz=" (rtos hz 2 0) " deltaL=" (rtos deltaL 2 0) + " winkel=" (rtos winkel 2 2) " L_stau=" (rtos test-L_stau 2 1))) (setq ent (car (gefaellestrecke-einfuegen - test-L_stau 3.0 start-mm as-seite es-seite hz + test-L_stau winkel start-mm as-seite es-seite hz deltaL as-winkel es-winkel "0" "Schoenenberger Geruest"))) (vf-set-as-masse "90" as-seite) (vf-set-es-masse "90" es-seite) @@ -229,10 +230,11 @@ ;; (1..anzahl) wird um (i-1)*delta in Y bzw. X versetzt (nur start_mm - es gibt ;; keinen Endpunkt). Fehlen anzahl/delta -> genau eine Strecke am angegebenen Ort. ;; Aus JSON: start_mm, deltaL_mm, hz_grad, as_seite, es_seite, as_winkel, -;; es_winkel, anzahl (Default 1), delta_y (Default 0), delta_x (Default 0). +;; es_winkel, winkel_grad (Default 3.0), anzahl (Default 1), delta_y +;; (Default 0), delta_x (Default 0). ;; Rueckgabe: LISTE von Ergebnis-JSON-Strings (eine je Kopie). (defun mubea:build-gf (e / tid0 start0 deltaL hz as-seite es-seite as-winkel es-winkel - anzahl dy dx i off nr tid s-mm ergebnisse) + winkel anzahl dy dx i off nr tid s-mm ergebnisse) (setq tid0 (ssg-val e "test_id") start0 (mapcar 'float (ssg-val e "start_mm")) deltaL (float (ssg-val e "deltaL_mm")) @@ -241,6 +243,7 @@ es-seite (ssg-val e "es_seite") as-winkel(ssg-val e "as_winkel") es-winkel(ssg-val e "es_winkel") + winkel (ssg-val e "winkel_grad") anzahl (ssg-val e "anzahl") dy (ssg-val e "delta_y") dx (ssg-val e "delta_x")) @@ -248,6 +251,7 @@ (if (or (null es-seite) (= es-seite "")) (setq es-seite "links")) (if (or (null as-winkel) (= as-winkel "")) (setq as-winkel "90")) (if (or (null es-winkel) (= es-winkel "")) (setq es-winkel "90")) + (setq winkel (if winkel (float winkel) 3.0)) (if (or (null anzahl) (< anzahl 1)) (setq anzahl 1)) (setq dy (if dy (float dy) 0.0)) (setq dx (if dx (float dx) 0.0)) @@ -264,7 +268,7 @@ tid0)) (setq s-mm (list (+ (car start0) (* dx off)) (+ (cadr start0) (* dy off)) (caddr start0))) (setq ergebnisse - (cons (mubea:build-gf-one tid s-mm deltaL hz as-seite es-seite as-winkel es-winkel) + (cons (mubea:build-gf-one tid s-mm deltaL hz as-seite es-seite as-winkel es-winkel winkel) ergebnisse)) (setq i (1+ i)) ) diff --git a/tests/testdata/mubea.json b/tests/testdata/mubea.json index 5b228b0..ad21e7b 100644 --- a/tests/testdata/mubea.json +++ b/tests/testdata/mubea.json @@ -101,6 +101,7 @@ "modus": 1, "deltaL_mm": 9110, "hz_grad": 180.0, + "winkel_grad": 2.27, "start_mm": [9510, 11526, 1941], "as_seite": "links", "es_seite": "links", @@ -108,7 +109,7 @@ "es_winkel": "90", "anzahl": 20, "delta_y": -800, - "comment": "Template fuer alle Gefaellestrecken (Modus 1): 'anzahl' identische Kopien, je um 'delta_y' (mm) in Y versetzt (nur start_mm). Erzeugt GF_Mubea_01..GF_Mubea_anzahl. Aufbau ausschliesslich aus Anfangspunkt start_mm und der horizontalen Gesamtlaenge deltaL_mm - KEIN Endpunkt (wie Produktion/gefaellestrecke.dcl Modus 1). Winkel fest 3 Grad, Zielhoehe ergibt sich daraus. start_mm.x/z aus DXF (EE-R Start hoch z=1941); deltaL_mm ~ reale XY-Distanz Start->AE-DS im DXF." + "comment": "Template fuer alle Gefaellestrecken (Modus 1): 'anzahl' identische Kopien, je um 'delta_y' (mm) in Y versetzt (nur start_mm). Erzeugt GF_Mubea_01..GF_Mubea_anzahl. Aufbau ausschliesslich aus Anfangspunkt start_mm und der horizontalen Gesamtlaenge deltaL_mm - KEIN Endpunkt (wie Produktion/gefaellestrecke.dcl Modus 1). winkel_grad steuert den Gefaellewinkel (Default 3.0, falls Feld fehlt), Zielhoehe ergibt sich daraus. start_mm.x/z aus DXF (EE-R Start hoch z=1941); deltaL_mm ~ reale XY-Distanz Start->AE-DS im DXF." }, { "comment": "Separator S-LP #1 Y-Abgleich mit Gefaellestrecken (Sep-Y=14158, GF_Mubea_01-Y=11526, diff=2632mm, naechstgelegene Reihe, kein enger Treffer)",