Fix der Gefällestrecke: Nimmt auch Fliesskommazahlen für den Winkel an. An Mubea Layout gemerkt. Funktionen zur Einfügung vno Geraden dazu

This commit is contained in:
2026-07-28 11:03:15 +02:00
parent b27744009f
commit ad7a7243ba
4 changed files with 32 additions and 14 deletions
+2 -2
View File
@@ -1873,7 +1873,7 @@
;; Bestaetigung - entfaellt, wenn bereits per Dialog-OK bestaetigt (Modus 1) ;; Bestaetigung - entfaellt, wenn bereits per Dialog-OK bestaetigt (Modus 1)
(setq antwort (if dialog-bestaetigt "1" (getstring (ssg-text "gf-prompt-einfuegen")))) (setq antwort (if dialog-bestaetigt "1" (getstring (ssg-text "gf-prompt-einfuegen"))))
(if (not (= antwort "2")) (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) geruest-einzelmodul geruest-typ)
(princ (ssg-text "gf-status-abgebrochen")) (princ (ssg-text "gf-status-abgebrochen"))
) )
@@ -1899,7 +1899,7 @@
nil nil
) )
(gefaellestrecke-einfuegen (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) geruest-einzelmodul geruest-typ)
) )
) )
+17 -4
View File
@@ -499,12 +499,25 @@
;; laengemax = Maximale Fahrstreckenlaenge in mm ;; laengemax = Maximale Fahrstreckenlaenge in mm
;; --- Quell-Attribute einer Aluprofil-.dwg lesen (mit ID-Feld) --- ;; --- Quell-Attribute einer Aluprofil-.dwg lesen (mit ID-Feld) ---
;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110") ;; 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, ;; Rueckgabe: Attribut-Alist (mit angehaengtem leeren "ID"-Feld) oder nil,
;; wenn *block-path* fehlt oder die Quell-.dwg keine Attribute hat. ;; wenn keine Quell-.dwg gefunden wird bzw. sie keine Attribute hat.
(defun omni:read-src-attribs (blockname / srcAttribs) (defun omni:read-src-attribs (blockname / datei srcAttribs)
(if (and (boundp '*block-path*) *block-path*) (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 (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))) (if (and srcAttribs (not (assoc "ID" srcAttribs)))
(setq srcAttribs (append srcAttribs (list (cons "ID" "")))) (setq srcAttribs (append srcAttribs (list (cons "ID" ""))))
) )
+11 -7
View File
@@ -196,17 +196,17 @@
;; Modus 1, siehe object_data.md 2.1). L_stau wird aus deltaL abgeleitet ;; Modus 1, siehe object_data.md 2.1). L_stau wird aus deltaL abgeleitet
;; (identische Formel wie test_gefaellestrecke.lsp): ;; (identische Formel wie test_gefaellestrecke.lsp):
;; L_stau = (deltaL - aus-dx - ein-dx - sep_x) / cos(v) ;; 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). ;; Die Zielhoehe ergibt sich aus L_stau/Winkel (kein Ziel-Hoehen-Parameter).
;; Rueckgabe: Ergebnis-JSON-String. ;; 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) rad sep-x test-L_stau ent)
(mubea:ensure-gf-init) (mubea:ensure-gf-init)
;; Element-Masse fuer die gewaehlte AS/ES-Variante setzen, damit aus-dx/ein-dx ;; 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. ;; zur Variante (90/30 Grad) passen. Danach wieder auf 90 zuruecksetzen.
(vf-set-as-masse as-winkel as-seite) (vf-set-as-masse as-winkel as-seite)
(vf-set-es-masse es-winkel es-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 sep-x (* 300.0 (cos rad)))
(setq test-L_stau (setq test-L_stau
(/ (- deltaL (float aus-dx) (float ein-dx) sep-x) (cos rad))) (/ (- 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) (princ (strcat "\n [GF] " tid " -> Start=(" (rtos (car start-mm) 2 0)
"," (rtos (cadr start-mm) 2 0) "," (rtos (caddr 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) ") hz=" (rtos hz 2 0) " deltaL=" (rtos deltaL 2 0)
" winkel=" (rtos winkel 2 2)
" L_stau=" (rtos test-L_stau 2 1))) " L_stau=" (rtos test-L_stau 2 1)))
(setq ent (car (gefaellestrecke-einfuegen (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"))) deltaL as-winkel es-winkel "0" "Schoenenberger Geruest")))
(vf-set-as-masse "90" as-seite) (vf-set-as-masse "90" as-seite)
(vf-set-es-masse "90" es-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 ;; (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. ;; 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, ;; 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). ;; 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 (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") (setq tid0 (ssg-val e "test_id")
start0 (mapcar 'float (ssg-val e "start_mm")) start0 (mapcar 'float (ssg-val e "start_mm"))
deltaL (float (ssg-val e "deltaL_mm")) deltaL (float (ssg-val e "deltaL_mm"))
@@ -241,6 +243,7 @@
es-seite (ssg-val e "es_seite") es-seite (ssg-val e "es_seite")
as-winkel(ssg-val e "as_winkel") as-winkel(ssg-val e "as_winkel")
es-winkel(ssg-val e "es_winkel") es-winkel(ssg-val e "es_winkel")
winkel (ssg-val e "winkel_grad")
anzahl (ssg-val e "anzahl") anzahl (ssg-val e "anzahl")
dy (ssg-val e "delta_y") dy (ssg-val e "delta_y")
dx (ssg-val e "delta_x")) dx (ssg-val e "delta_x"))
@@ -248,6 +251,7 @@
(if (or (null es-seite) (= es-seite "")) (setq es-seite "links")) (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 as-winkel) (= as-winkel "")) (setq as-winkel "90"))
(if (or (null es-winkel) (= es-winkel "")) (setq es-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)) (if (or (null anzahl) (< anzahl 1)) (setq anzahl 1))
(setq dy (if dy (float dy) 0.0)) (setq dy (if dy (float dy) 0.0))
(setq dx (if dx (float dx) 0.0)) (setq dx (if dx (float dx) 0.0))
@@ -264,7 +268,7 @@
tid0)) tid0))
(setq s-mm (list (+ (car start0) (* dx off)) (+ (cadr start0) (* dy off)) (caddr start0))) (setq s-mm (list (+ (car start0) (* dx off)) (+ (cadr start0) (* dy off)) (caddr start0)))
(setq ergebnisse (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)) ergebnisse))
(setq i (1+ i)) (setq i (1+ i))
) )
+2 -1
View File
@@ -101,6 +101,7 @@
"modus": 1, "modus": 1,
"deltaL_mm": 9110, "deltaL_mm": 9110,
"hz_grad": 180.0, "hz_grad": 180.0,
"winkel_grad": 2.27,
"start_mm": [9510, 11526, 1941], "start_mm": [9510, 11526, 1941],
"as_seite": "links", "as_seite": "links",
"es_seite": "links", "es_seite": "links",
@@ -108,7 +109,7 @@
"es_winkel": "90", "es_winkel": "90",
"anzahl": 20, "anzahl": 20,
"delta_y": -800, "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)", "comment": "Separator S-LP #1 Y-Abgleich mit Gefaellestrecken (Sep-Y=14158, GF_Mubea_01-Y=11526, diff=2632mm, naechstgelegene Reihe, kein enger Treffer)",