From cc3cb9f160127b299e556b94212f17ad8c127db9 Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Fri, 3 Jul 2026 12:59:24 +0200 Subject: [PATCH] =?UTF-8?q?=20horizontale=20Fahrrichtung=20(0=C2=B0/90?= =?UTF-8?q?=C2=B0/180=C2=B0/270=C2=B0)=20fuer=20Variofoederer=20manuelle?= =?UTF-8?q?=20Werteingabe=20erg=C3=A4nzen.=20die=20M=C3=B6glichkeit=20des?= =?UTF-8?q?=20Horizontal-Variof=C3=B6erderes=20wurde=20bei=20Ab-F=C3=B6rde?= =?UTF-8?q?rrichtung=20gepr=C3=BCft.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/Gefaellestrecke.lsp | 85 ++++++++----- Lisp/vf_core.lsp | 268 ++++++++++++++++++++++++++++----------- Lisp/vf_etage.lsp | 29 +++-- Lisp/vf_standard.lsp | 176 ++++++++++++++++++------- 4 files changed, 395 insertions(+), 163 deletions(-) diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 4659e57..e1faebd 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -238,8 +238,10 @@ ;; --- Block per KS_EIN/KS_AUS einfuegen --- (if (null (car (atoms-family 1 '("INSERT-BLOCK-BY-KS")))) - (defun insert-block-by-ks (blockname einfuegepunkt / - block-obj temp-obj ks-data ks-ein ks-aus offset ausgang) + (defun insert-block-by-ks (blockname einfuegepunkt hz / + block-obj temp-obj ks-data ks-ein ks-aus + rad-h chv shv ein-x ein-y ein-z dx-loc dy-loc dz-loc + offset ausgang) (ensure-block-loaded blockname) (if (not (tblsearch "BLOCK" blockname)) (progn @@ -247,6 +249,8 @@ (exit) ) ) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h)) ;; KS_EIN/KS_AUS ueber eigenes Temp-Objekt am Ursprung ermitteln (nicht ;; am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp. (setq temp-obj @@ -259,21 +263,30 @@ (setq ks-aus (cadr (assoc "KS_AUS" ks-data))) (setq block-obj (vla-InsertBlock modelspace - (vlax-3D-point einfuegepunkt) + (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + (vla-TransformBy block-obj (vlax-tmatrix + (list (list chv (- shv) 0 0) + (list shv chv 0 0) + (list 0 0 1 0) + (list 0 0 0 1)))) (if (and ks-ein ks-aus) (progn - (setq offset - (list (- (car (car ks-ein))) - (- (cadr (car ks-ein))) - (- (caddr (car ks-ein))))) + (setq ein-x (car (car ks-ein)) ein-y (cadr (car ks-ein)) ein-z (caddr (car ks-ein))) + (setq offset (list + (- (car einfuegepunkt) (- (* chv ein-x) (* shv ein-y))) + (- (cadr einfuegepunkt) (+ (* shv ein-x) (* chv ein-y))) + (- (caddr einfuegepunkt) ein-z))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point offset)) - (setq ausgang - (list (+ (car einfuegepunkt) (car (car ks-aus)) (car offset)) - (+ (cadr einfuegepunkt) (cadr (car ks-aus)) (cadr offset)) - (+ (caddr einfuegepunkt) (caddr (car ks-aus)) (caddr offset)))) + (setq dx-loc (- (car (car ks-aus)) ein-x)) + (setq dy-loc (- (cadr (car ks-aus)) ein-y)) + (setq dz-loc (- (caddr (car ks-aus)) ein-z)) + (setq ausgang (list + (+ (car einfuegepunkt) (- (* chv dx-loc) (* shv dy-loc))) + (+ (cadr einfuegepunkt) (+ (* shv dx-loc) (* chv dy-loc))) + (+ (caddr einfuegepunkt) dz-loc))) (princ (strcat "\n KS_AUS Z=" (rtos (caddr ausgang) 2 2))) ausgang ) @@ -287,30 +300,32 @@ ;; --- Skalierter geneigter Block (Staustrecke, Richtung X) --- (if (null (car (atoms-family 1 '("INSERT-INCLINED-SCALED-BLOCK")))) - (defun insert-inclined-scaled-block (blockname startpunkt laenge winkel / - rad scale block-obj endpunkt) + (defun insert-inclined-scaled-block (blockname startpunkt laenge winkel hz / + rad-v rad-h chv shv cvv svv scale block-obj endpunkt) (if (<= laenge 0.1) (progn (princ "\n (Laenge 0 - uebersprungen)") startpunkt) (progn (ensure-block-loaded blockname) (setq scale (/ (float laenge) 1000.0)) - (setq rad (* (float winkel) (/ pi 180.0))) + (setq rad-v (* (float winkel) (/ pi 180.0))) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v)) (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0)) (vla-TransformBy block-obj (vlax-tmatrix - (list (list (cos rad) 0 (sin rad) 0) - (list 0 1 0 0) - (list (- (sin rad)) 0 (cos rad) 0) + (list (list (* chv cvv) (- shv) (* chv svv) 0) + (list (* shv cvv) chv (* shv svv) 0) + (list (- svv) 0 cvv 0) (list 0 0 0 1)))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt)) (setq endpunkt - (list (+ (car startpunkt) (* laenge (cos rad))) - (cadr startpunkt) - (+ (caddr startpunkt) (* (- (sin rad)) laenge)))) + (list (+ (car startpunkt) (* laenge chv cvv)) + (+ (cadr startpunkt) (* laenge shv cvv)) + (+ (caddr startpunkt) (* laenge (- svv))))) (princ (strcat "\n " blockname " L=" (rtos laenge 2 1) " -> Z=" (rtos (caddr endpunkt) 2 1))) endpunkt @@ -319,20 +334,22 @@ ) ) -;; --- Rotierter Block mit manuellem dx/dz (Richtung X) --- +;; --- Rotierter Block mit manuellem dx/dz --- ;; KS_EIN (nicht der Block-Ursprung) wird auf startpunkt ausgerichtet, siehe ;; Kommentar an der kanonischen Definition in vf_core.lsp. (if (null (car (atoms-family 1 '("INSERT-ROTATED-BLOCK-WITH-KS")))) ;; block-dx/block-dz: Fallback, nur falls KS_AUS nicht extrahierbar. ;; Ist KS_AUS vorhanden, wird der echte Versatz KS_AUS-KS_EIN verwendet ;; (schuetzt vor veralteten Config-Zahlen), siehe vf_core.lsp. - (defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz / - rad block-obj temp-obj ks-data + (defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz / + rad-v rad-h chv shv cvv svv block-obj temp-obj ks-data ks-ein-raw ks-aus-raw ein-x ein-y ein-z aus-x aus-y aus-z dx dz ins-pt) (ensure-block-loaded blockname) - (setq rad (* (float winkel) (/ pi 180.0))) + (setq rad-v (* (float winkel) (/ pi 180.0))) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v)) ;; Lokale KS_EIN/KS_AUS-Position ueber EIGENES Temp-Objekt ermitteln ;; (nicht am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp. (setq temp-obj @@ -363,23 +380,21 @@ (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) (vla-TransformBy block-obj (vlax-tmatrix - (list (list (cos rad) 0 (sin rad) 0) - (list 0 1 0 0) - (list (- (sin rad)) 0 (cos rad) 0) + (list (list (* chv cvv) (- shv) (* chv svv) 0) + (list (* shv cvv) chv (* shv svv) 0) + (list (- svv) 0 cvv 0) (list 0 0 0 1)))) (setq ins-pt (list - (- (car startpunkt) (+ (* ein-x (cos rad)) (* ein-z (sin rad)))) - (- (cadr startpunkt) ein-y) - (- (caddr startpunkt) (+ (* (- (sin rad)) ein-x) (* (cos rad) ein-z))))) + (- (car startpunkt) (+ (* ein-x chv cvv) (* ein-y (- shv)) (* ein-z chv svv))) + (- (cadr startpunkt) (+ (* ein-x shv cvv) (* ein-y chv) (* ein-z shv svv))) + (- (caddr startpunkt) (+ (* ein-x (- svv)) (* ein-z cvv))))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point ins-pt)) (list - (+ (car startpunkt) - (+ (* dx (cos rad)) (* dz (sin rad)))) - (cadr startpunkt) - (+ (caddr startpunkt) - (+ (* (- (sin rad)) dx) (* (cos rad) dz)))) + (+ (car startpunkt) (+ (* dx chv cvv) (* dz chv svv))) + (+ (cadr startpunkt) (+ (* dx shv cvv) (* dz shv svv))) + (+ (caddr startpunkt) (+ (* dx (- svv)) (* dz cvv)))) ) ) diff --git a/Lisp/vf_core.lsp b/Lisp/vf_core.lsp index 7581eba..9e26a8e 100644 --- a/Lisp/vf_core.lsp +++ b/Lisp/vf_core.lsp @@ -427,7 +427,10 @@ ;; ============================================================ ;; TEIL 8: BLOCK-EINFUEGEFUNKTIONEN (gemeinsam fuer alle Typen) ;; ============================================================ -(defun insert-block-by-ks (blockname einfuegepunkt / block-obj temp-obj ks-data ks-ein ks-aus offset ausgang) +;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...). Block +;; hat sonst keine Neigung, daher nur Rz-Rotation (keine Ry-Komponente). +(defun insert-block-by-ks (blockname einfuegepunkt hz / block-obj temp-obj ks-data ks-ein ks-aus + rad-h chv shv ein-x ein-y ein-z dx-loc dy-loc dz-loc offset ausgang) (if (or (null einfuegepunkt) (not (listp einfuegepunkt))) (progn (princ (strcat "\n FEHLER: Ungueltiger Einfuegepunkt fuer '" blockname "'")) @@ -441,7 +444,9 @@ (exit) ) ) - (princ (strcat "\n Fuege Block '" blockname "' ein...")) + (princ (strcat "\n Fuege Block '" blockname "' ein... (hz=" (rtos (float hz) 2 1) (chr 176) ")")) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h)) ;; KS_EIN/KS_AUS ueber eigenes Temp-Objekt am Ursprung ermitteln (nicht am ;; spaeter tatsaechlich platzierten block-obj - extract-ks-from-block ;; exploded das uebergebene Objekt intern), siehe insert-block-ks-to-ks. @@ -452,23 +457,40 @@ (if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj)) (setq ks-ein (cadr (assoc "KS_EIN" ks-data))) (setq ks-aus (cadr (assoc "KS_AUS" ks-data))) + ;; Block am Ursprung einfuegen (nicht direkt am einfuegepunkt), damit die + ;; Rz-Rotation um den Block-Ursprung dreht, nicht um die Weltachse. (setq block-obj (vla-InsertBlock modelspace - (vlax-3D-point einfuegepunkt) + (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + (if (> (abs hz) 0.0001) + (vla-TransformBy block-obj (vlax-tmatrix + (list (list chv (- shv) 0 0) + (list shv chv 0 0) + (list 0 0 1 0) + (list 0 0 0 1)))) + ) (if (and ks-ein ks-aus) (progn - ;; offset verschiebt block-obj so, dass KS_EIN (aktuell bei - ;; einfuegepunkt+lokalerVersatz) exakt auf einfuegepunkt zu liegen kommt. - (setq offset (list (- (car (car ks-ein))) - (- (cadr (car ks-ein))) - (- (caddr (car ks-ein))))) + (setq ein-x (car (car ks-ein)) ein-y (cadr (car ks-ein)) ein-z (caddr (car ks-ein))) + ;; Block-Ursprung so verschieben, dass das ROTIERTE KS_EIN exakt auf + ;; einfuegepunkt zu liegen kommt: Ursprung = einfuegepunkt - Rz(hz)*ks_ein_lokal + (setq offset (list + (- (car einfuegepunkt) (- (* chv ein-x) (* shv ein-y))) + (- (cadr einfuegepunkt) (+ (* shv ein-x) (* chv ein-y))) + (- (caddr einfuegepunkt) ein-z))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point offset)) - (setq ausgang (list (+ (car einfuegepunkt) (car (car ks-aus)) (car offset)) - (+ (cadr einfuegepunkt) (cadr (car ks-aus)) (cadr offset)) - (+ (caddr einfuegepunkt) (caddr (car ks-aus)) (caddr offset)))) + ;; KS_AUS = einfuegepunkt + Rz(hz)*(ks_aus_lokal - ks_ein_lokal) + (setq dx-loc (- (car (car ks-aus)) ein-x)) + (setq dy-loc (- (cadr (car ks-aus)) ein-y)) + (setq dz-loc (- (caddr (car ks-aus)) ein-z)) + (setq ausgang (list + (+ (car einfuegepunkt) (- (* chv dx-loc) (* shv dy-loc))) + (+ (cadr einfuegepunkt) (+ (* shv dx-loc) (* chv dy-loc))) + (+ (caddr einfuegepunkt) dz-loc))) (princ (strcat "\n KS_AUS: X=" (rtos (car ausgang) 2 2) + " Y=" (rtos (cadr ausgang) 2 2) " Z=" (rtos (caddr ausgang) 2 2))) ausgang ) @@ -656,8 +678,10 @@ " Z=" (rtos (caddr P-out) 2 2))) (list P-out xu-out yu-out zu-out)) -(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel / - rad matrix block-obj endpunkt scale) +;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...), +;; winkel: vertikale Neigung in Grad. Rotation = Rz(hz)*Ry(winkel). +(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel hz / + rad-v rad-h chv shv cvv svv matrix block-obj endpunkt scale) (if (<= laenge 0.1) (progn (princ (strcat "\n Laenge=" (rtos laenge 2 2) " mm -> uebersprungen")) @@ -672,26 +696,32 @@ ) ) (princ (strcat "\n Fuege '" blockname "' ein" - " (L=" (rtos laenge 2 2) " mm, W=" (itoa winkel) (chr 176) ")")) + " (L=" (rtos laenge 2 2) " mm, W=" (itoa winkel) (chr 176) + " hz=" (rtos (float hz) 2 1) (chr 176) ")")) (setq scale (/ laenge (ssg-cfg-or "vario" "skalierung_basis" 1000.0))) - (setq rad (* winkel (/ pi 180.0))) + (setq rad-v (* (float winkel) (/ pi 180.0))) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v)) (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0)) (setq matrix (list - (list (cos rad) 0 (sin rad) 0) - (list 0 1 0 0) - (list (- (sin rad)) 0 (cos rad) 0) + (list (* chv cvv) (- shv) (* chv svv) 0) + (list (* shv cvv) chv (* shv svv) 0) + (list (- svv) 0 cvv 0) (list 0 0 0 1) )) (vla-TransformBy block-obj (vlax-tmatrix matrix)) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt)) - (setq endpunkt (list (+ (car startpunkt) (* laenge (cos rad))) - (cadr startpunkt) - (+ (caddr startpunkt) (* (- (sin rad)) laenge)))) - (princ (strcat "\n Endpunkt: Z=" (rtos (caddr endpunkt) 2 2))) + (setq endpunkt (list + (+ (car startpunkt) (* laenge chv cvv)) + (+ (cadr startpunkt) (* laenge shv cvv)) + (+ (caddr startpunkt) (* laenge (- svv))))) + (princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2) + " Y=" (rtos (cadr endpunkt) 2 2) + " Z=" (rtos (caddr endpunkt) 2 2))) endpunkt ) ) @@ -710,8 +740,10 @@ ;; vorhanden, wird der ECHTE gemessene Versatz KS_AUS-KS_EIN verwendet - ;; das schuetzt vor veralteten Config-Zahlen, die nicht mehr zur ;; tatsaechlichen Blockgeometrie passen (z.B. nach einer DWG-Bereinigung). -(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz / - rad matrix block-obj temp-obj ks-data +;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...), +;; winkel: vertikale Neigung in Grad. Rotation = Rz(hz)*Ry(winkel). +(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz / + rad-v rad-h chv shv cvv svv matrix block-obj temp-obj ks-data ks-ein-raw ks-aus-raw ein-x ein-y ein-z aus-x aus-y aus-z dx dz ins-pt endpunkt) @@ -729,8 +761,11 @@ ) ) (princ (strcat "\n Fuege Block '" blockname "' ein" - " (Rotation " (itoa winkel) (chr 176) ")")) - (setq rad (* winkel (/ pi 180.0))) + " (Rotation " (itoa winkel) (chr 176) + " hz=" (rtos (float hz) 2 1) (chr 176) ")")) + (setq rad-v (* winkel (/ pi 180.0))) + (setq rad-h (* (float hz) (/ pi 180.0))) + (setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v)) ;; Lokale KS_EIN/KS_AUS-Position ueber EIGENES Temp-Objekt ermitteln ;; (nicht am spaeter tatsaechlich platzierten block-obj - ;; extract-ks-from-block exploded das uebergebene Objekt intern; das @@ -764,26 +799,27 @@ (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) (setq matrix (list - (list (cos rad) 0 (sin rad) 0) - (list 0 1 0 0) - (list (- (sin rad)) 0 (cos rad) 0) + (list (* chv cvv) (- shv) (* chv svv) 0) + (list (* shv cvv) chv (* shv svv) 0) + (list (- svv) 0 cvv 0) (list 0 0 0 1) )) (vla-TransformBy block-obj (vlax-tmatrix matrix)) ;; Block-Ursprung so verschieben, dass das ROTIERTE KS_EIN exakt auf - ;; startpunkt liegt: Ursprung = startpunkt - Rot(ks_ein_lokal) + ;; startpunkt liegt: Ursprung = startpunkt - Rz(hz)*Ry(winkel)*ks_ein_lokal (setq ins-pt (list - (- (car startpunkt) (+ (* ein-x (cos rad)) (* ein-z (sin rad)))) - (- (cadr startpunkt) ein-y) - (- (caddr startpunkt) (+ (* (- (sin rad)) ein-x) (* (cos rad) ein-z))))) + (- (car startpunkt) (+ (* ein-x chv cvv) (* ein-y (- shv)) (* ein-z chv svv))) + (- (cadr startpunkt) (+ (* ein-x shv cvv) (* ein-y chv) (* ein-z shv svv))) + (- (caddr startpunkt) (+ (* ein-x (- svv)) (* ein-z cvv))))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point ins-pt)) (setq endpunkt (list - (+ (car startpunkt) (+ (* dx (cos rad)) (* dz (sin rad)))) - (cadr startpunkt) - (+ (caddr startpunkt) (+ (* (- (sin rad)) dx) (* (cos rad) dz))))) + (+ (car startpunkt) (+ (* dx chv cvv) (* dz chv svv))) + (+ (cadr startpunkt) (+ (* dx shv cvv) (* dz shv svv))) + (+ (caddr startpunkt) (+ (* dx (- svv)) (* dz cvv))))) (princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2) + " Y=" (rtos (cadr endpunkt) 2 2) " Z=" (rtos (caddr endpunkt) 2 2) " (dx=" (rtos dx 2 1) " dz=" (rtos dz 2 1) ")")) endpunkt @@ -795,7 +831,7 @@ ;; TEIL 9: GEMEINSAME EINGABE-ABFRAGE ;; ============================================================ (defun vf-eingabe-abfragen ( / eingabe-modus line-points startpunkt endpunkt differenz - deltaL deltaH deltaX deltaY richtung antwort) + deltaL deltaH deltaX deltaY richtung antwort hz-winkel) (princ "\n\nEingabemodus waehlen:") (princ "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)") (princ "\n 2 - Werte manuell eingeben") @@ -822,8 +858,12 @@ deltaY (abs (cadr differenz)) deltaH (caddr differenz)) (setq deltaL (max deltaX deltaY)) + ;; Fahrtrichtung aus der Linie ableiten (0=Ost, 90=Nord, ...) + (setq hz-winkel + (* (angle '(0.0 0.0) (list (car differenz) (cadr differenz))) (/ 180.0 pi))) (princ (strcat "\n △L=" (rtos deltaL 2 2) " mm" - " △H=" (rtos deltaH 2 2) " mm")) + " △H=" (rtos deltaH 2 2) " mm" + " Fahrtrichtung=" (rtos hz-winkel 2 1) grad-zeichen)) (if (>= deltaH 0) (progn (setq richtung "Auf") (princ "\n Foerderrichtung: AUF")) (progn (setq richtung "Ab") (setq deltaH (abs deltaH)) @@ -836,25 +876,56 @@ (if (null deltaL) (setq deltaL 15000)) (setq deltaH (getreal "\n△H - Hoehenunterschied (mm): ")) (if (null deltaH) (setq deltaH 3000)) + ;; Foerderrichtung bleibt eine einfache Auf/Ab-Frage - die horizontale + ;; Zwischenstrecke ist geometrisch NUR bei "Ab" ueberhaupt erreichbar + ;; (die festen 3-Grad-Elemente wirken immer absenkend) und wird daher + ;; erst SPAETER, nach Bibliotheks-Init, als Zusatzoption in der + ;; Winkel-Auswahl angeboten (siehe c:VarioFoerderer) - einheitlich fuer + ;; Werteingabe UND 3D-Linie. (princ "\nFoerderrichtung:\n 1 - AUF\n 2 - AB") (setq antwort (getstring "\nIhre Wahl (1/2): ")) (if (= antwort "2") (setq richtung "Ab") (setq richtung "Auf")) (setq startpunkt (getpoint "\nStartpunkt fuer AUS_Element waehlen: ")) (if (null startpunkt) (setq startpunkt '(0 0 0))) + ;; Horizontale Fahrtrichtung waehlen (analog Gefaellestrecke Modus 1) + (princ "\n\nFahrtrichtung waehlen:") + (princ "\n 1 - 0° (X-Achse +, Ost)") + (princ "\n 2 - 90° (Y-Achse +, Nord)") + (princ "\n 3 - 180° (X-Achse -, West)") + (princ "\n 4 - 270° (Y-Achse -, Sued)") + (setq antwort (getstring "\nIhre Wahl (1/2/3/4) [1]: ")) + (cond + ((= antwort "2") (setq hz-winkel 90.0)) + ((= antwort "3") (setq hz-winkel 180.0)) + ((= antwort "4") (setq hz-winkel 270.0)) + (t (setq hz-winkel 0.0)) + ) + (princ (strcat "\n>>> Fahrtrichtung: " (rtos hz-winkel 2 1) grad-zeichen)) ) ) - (list deltaL deltaH richtung startpunkt) + (list deltaL deltaH richtung startpunkt hz-winkel eingabe-modus) ) ;; ============================================================ ;; TEIL 10: VF_*-BLOCK-SYSTEM (gemeinsam fuer alle Typen) ;; ============================================================ -(defun vf-make-label (vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF - richtung best-winkel n-separator n-scanner startpunkt / - label-txt label-pt L_VF_str L_GF_str delta-sym) +;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...) - siehe +;; variofoerderer-einfuegen. Beschriftungsposition wird ENTLANG dieser +;; Richtung (halbe deltaL) und SENKRECHT dazu (200mm) versetzt, statt fest +;; von +X auszugehen. Der Textwinkel rastet wie bei Gefaellestrecke immer +;; auf 0 Grad (X-Achse) oder 90 Grad (Y-Achse) ein, damit er nie auf dem +;; Kopf steht - unabhaengig von der tatsaechlichen Fahrtrichtung. +;; L_GF1/L_GF2: die beiden Gefaellestrecken-Segmente (vorne/hinten) - werden +;; als kommagetrennte Meter-Werte dargestellt (Punkt=Dezimaltrennzeichen, +;; Komma=Segment-Trenner, analog L-gf-str in Gefaellestrecke.lsp), damit +;; beide Werte eindeutig unterscheidbar bleiben. +(defun vf-make-label (vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 + richtung best-winkel n-separator n-scanner startpunkt hz / + label-txt label-pt L_VF_str L_GF_str delta-sym + chz-l shz-l halb basis-winkel) (setq delta-sym (chr 916)) (setq L_VF_str (vl-string-subst "," "." (rtos (/ L_VF 1000.0) 2 3))) - (setq L_GF_str (vl-string-subst "," "." (rtos (/ L_GF 1000.0) 2 3))) + (setq L_GF_str (strcat (rtos (/ L_GF1 1000.0) 2 3) "," (rtos (/ L_GF2 1000.0) 2 3))) (setq label-txt (strcat "VF" (itoa vf-nummer) ": von " (itoa (fix hoehe-von)) "mm bis " (itoa (fix hoehe-bis)) "mm, " @@ -863,10 +934,19 @@ "VF:" L_VF_str "m; GF:" L_GF_str "m; " richtung ": " (itoa best-winkel) grad-zeichen "; " "Sep: " (itoa n-separator) "; Scan: " (itoa n-scanner))) + (setq chz-l (cos (* (float hz) (/ pi 180.0)))) + (setq shz-l (sin (* (float hz) (/ pi 180.0)))) + (setq halb (/ (float deltaL) 2.0)) (setq label-pt (list - (+ (car startpunkt) (/ deltaL 2.0)) - (- (cadr startpunkt) 200.0) + (+ (car startpunkt) (* halb chz-l) (* 200.0 shz-l)) + (+ (cadr startpunkt) (* halb shz-l) (* -200.0 chz-l)) (caddr startpunkt))) + ;; Textwinkel auf 0/90 Grad einrasten (nie kopfueber, unabhaengig von hz) + (setq basis-winkel (float hz)) + (while (< basis-winkel 0.0) (setq basis-winkel (+ basis-winkel 360.0))) + (while (>= basis-winkel 360.0) (setq basis-winkel (- basis-winkel 360.0))) + (if (>= basis-winkel 180.0) (setq basis-winkel (- basis-winkel 180.0))) + (setq basis-winkel (if (or (< basis-winkel 45.0) (>= basis-winkel 135.0)) 0.0 90.0)) (entmake (list '(0 . "TEXT") (cons 8 "VF_Beschriftung") @@ -874,7 +954,7 @@ (cons 10 label-pt) (cons 40 100.0) (cons 1 label-txt) - (cons 50 0.0) + (cons 50 (* basis-winkel (/ pi 180.0))) '(72 . 1) '(73 . 2) (cons 11 label-pt) @@ -904,12 +984,13 @@ ;; Erstellt VF_N-Block aus allen seit lastEnt erzeugten Entities. ;; Setzt Attributwerte entsprechend Typ, Seite und Geometrieparametern. (defun vf-block-erstellen (anlage-typ seite vf-nummer n-scanner - hoehe-von hoehe-bis deltaH deltaL L_VF L_GF - richtung best-winkel startpunkt lastEnt - / vf-bname vf-ss vf-e vf-insert montagehoehe-m attdef-ypos) + hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 + richtung best-winkel startpunkt lastEnt hz + / vf-bname vf-ss vf-e vf-insert montagehoehe-m attdef-ypos L_GF_m-str) + (if (null hz) (setq hz 0.0)) ;; Beschriftungstext erzeugen - (vf-make-label vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF - richtung best-winkel 2 n-scanner startpunkt) + (vf-make-label vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 + richtung best-winkel 2 n-scanner startpunkt hz) ;; Unsichtbare ATTDEFs am Startpunkt erzeugen (setq attdef-ypos (cadr startpunkt)) @@ -950,6 +1031,9 @@ (setvar "ATTREQ" 1) (setq vf-insert (entlast)) (setq montagehoehe-m (/ (+ hoehe-von hoehe-bis) 2000.0)) + ;; L_GF_m: kommagetrennte Segmentlaengen in Metern (vorne,hinten), + ;; analog L_GF_m in Gefaellestrecke.lsp. + (setq L_GF_m-str (strcat (rtos (/ L_GF1 1000.0) 2 3) "," (rtos (/ L_GF2 1000.0) 2 3))) (ssg-attrib-set-on vf-insert (list (cons "NUMMER" (itoa vf-nummer)) @@ -959,7 +1043,7 @@ (cons "DELTA_H" (itoa (fix deltaH))) (cons "DELTA_L" (itoa (fix deltaL))) (cons "L_VF_m" (rtos (/ L_VF 1000.0) 2 3)) - (cons "L_GF_m" (rtos (/ L_GF 1000.0) 2 3)) + (cons "L_GF_m" L_GF_m-str) (cons "ANTRIEBFAHRTRICHTUNG" richtung) (cons "WINKEL" (itoa best-winkel)) (cons "ANZAHL_SEPARATOR" "2") @@ -1013,8 +1097,9 @@ ;; TEIL 12: DISPATCHER c:VarioFoerderer ;; ============================================================ (defun c:VarioFoerderer ( / typ-eintr anlage-typ berechne-fn einfuege-fn - eingabe deltaL deltaH richtung startpunkt seite - ergebnis ergebnis-liste gueltige-winkel + eingabe deltaL deltaH richtung startpunkt seite hz + eingabe-modus ergebnis ergebnis-liste gueltige-winkel + horizontal-info best-winkel L_GF L_GF1 L_GF2 L_VF idx eintrag wahl antwort verteilung-modus n-scanner vf-nummer hoehe-von hoehe-bis lastEnt @@ -1062,12 +1147,15 @@ (setq vf-nummer (vf-next-number)) (princ (strcat "\n>>> Naechste VF-Nummer: VF" (itoa vf-nummer))) - ;; 3. Gemeinsame Eingabe (deltaL, deltaH, richtung, startpunkt) + ;; 3. Gemeinsame Eingabe (deltaL, deltaH, richtung, startpunkt) - richtung + ;; steht bei beiden Eingabemodi (Werteingabe UND 3D-Linie) bereits fest. (setq eingabe (vf-eingabe-abfragen)) - (setq deltaL (nth 0 eingabe) - deltaH (nth 1 eingabe) - richtung (nth 2 eingabe) - startpunkt (nth 3 eingabe)) + (setq deltaL (nth 0 eingabe) + deltaH (nth 1 eingabe) + richtung (nth 2 eingabe) + startpunkt (nth 3 eingabe) + hz (nth 4 eingabe) + eingabe-modus (nth 5 eingabe)) ;; 4. Seite-Auswahl (vor Berechnung, weil Etage-Typ sie fuer Geometrie braucht) (princ "\n\nSeite waehlen:") @@ -1077,11 +1165,31 @@ (if (= antwort "2") (setq seite "links") (setq seite "rechts")) (princ (strcat "\n>>> Seite: " seite)) - ;; 5. Typ-spezifische Berechnung (init + berechne) + ;; 5. Typ-spezifische Berechnung (init + Winkelsuche) (setq ergebnis (apply berechne-fn (list deltaL deltaH richtung seite))) (setq ergebnis-liste (cadddr ergebnis)) - ;; 6. Konfiguration (nach ssg_core-Init verfuegbar) + ;; 5b. Horizontale Zwischenstrecke als Zusatzoption: geometrisch NUR bei + ;; "Ab" ueberhaupt erreichbar (die festen 3-Grad-Elemente wirken immer + ;; absenkend) - "Auf" wird deshalb gar nicht erst geprueft. Gilt einheitlich + ;; fuer Werteingabe UND 3D-Linie, da richtung hier in jedem Fall feststeht. + ;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert. + (if (and (= anlage-typ "standard") (= richtung "Ab")) + (progn + (setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab")) + (if (and horizontal-info (caddr horizontal-info)) + (progn + (setq ergebnis-liste + (append ergebnis-liste + (list (list 0 (car horizontal-info) (cadr horizontal-info) T)))) + (princ "\n\n>>> Hinweis: Ein horizontale Variofoerderer ( 0°) ist bei diesem △L/△H zusaetzlich moeglich!") + ) + (setq horizontal-info nil) + ) + ) + ) + + ;; Konfiguration (nach ssg_core-Init verfuegbar). (setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000)) ;; 7. Gueltige Winkel ermitteln @@ -1102,22 +1210,33 @@ ) ;; 8. Winkelauswahl (automatisch oder interaktiv) + ;; Sentinel-Winkel 0 = horizontale Zwischenstrecke (Schritt 6/11 bei 0 + ;; Grad, Boegen fest auf_3/ab_3) - siehe berechne-horizontale-mitte. (if (= (length gueltige-winkel) 1) (progn (setq best-winkel (car gueltige-winkel)) (setq eintrag (assoc best-winkel ergebnis-liste)) (setq L_GF (nth 1 eintrag) L_VF (nth 2 eintrag)) - (princ (strcat "\n\n>>> Einziger gueltiger Winkel: " - (itoa best-winkel) (chr 176))) + (if (= best-winkel 0) + (princ "\n\n>>> Einzige gueltige Variante: Horizontale Variofoerderer") + (princ (strcat "\n\n>>> Einziger gueltiger Winkel: " + (itoa best-winkel) (chr 176))) + ) ) (progn (princ "\n\nMehrere gueltige Winkel verfuegbar. Bitte waehlen:") (setq idx 1) (foreach w gueltige-winkel (setq eintrag (assoc w ergebnis-liste)) - (princ (strcat "\n " (itoa idx) " - " (itoa w) (chr 176) - " (L_GF=" (rtos (nth 1 eintrag) 2 1) - " mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)")) + (if (= w 0) + (princ (strcat "\n " (itoa idx) " - Horizontale Variofoerderer (0" + (chr 176) ")" + " (L_GF=" (rtos (nth 1 eintrag) 2 1) + " mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)")) + (princ (strcat "\n " (itoa idx) " - " (itoa w) (chr 176) + " (L_GF=" (rtos (nth 1 eintrag) 2 1) + " mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)")) + ) (setq idx (1+ idx)) ) (setq wahl (getint (strcat "Winkel waehlen (1-" @@ -1130,9 +1249,14 @@ ) ) (princ "\n\n=========================================") - (princ (strcat "\n>>> Winkel: " (itoa best-winkel) (chr 176) - " L_GF: " (rtos L_GF 2 2) " mm" - " L_VF: " (rtos L_VF 2 2) " mm")) + (if (= best-winkel 0) + (princ (strcat "\n>>> Horizontale Variofoerderer" + " L_GF: " (rtos L_GF 2 2) " mm" + " L_VF: " (rtos L_VF 2 2) " mm")) + (princ (strcat "\n>>> Winkel: " (itoa best-winkel) (chr 176) + " L_GF: " (rtos L_GF 2 2) " mm" + " L_VF: " (rtos L_VF 2 2) " mm")) + ) (princ "\n=========================================") ;; 9. L_GF Verteilung @@ -1186,12 +1310,12 @@ ;; Typ-spezifische Einfuegung (apply einfuege-fn - (list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite)) + (list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)) ;; Gemeinsame VF_*-Block-Erstellung (vf-block-erstellen anlage-typ seite vf-nummer n-scanner - hoehe-von hoehe-bis deltaH deltaL L_VF L_GF - richtung best-winkel startpunkt lastEnt) + hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 + richtung best-winkel startpunkt lastEnt hz) (princ "\n=========================================") ) diff --git a/Lisp/vf_etage.lsp b/Lisp/vf_etage.lsp index d9782b1..6cc58f3 100644 --- a/Lisp/vf_etage.lsp +++ b/Lisp/vf_etage.lsp @@ -602,9 +602,14 @@ ;; ============================================================ ;; Gibt endpunkt zurueck. ;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp). +;; hz: Parameter fuer Registry-Kompatibilitaet mit variofoerderer-einfuegen +;; (siehe c:VarioFoerderer) - wird hier NICHT verwendet: die Etage-Anlage hat +;; bereits eine eigene, fest verdrahtete horizontale Geometrie (hz-anfang/ +;; hz-ende fuer den 60-Grad-Uebereinander-Versatz) und unterstuetzt aktuell +;; keine zusaetzliche globale Fahrtrichtung. (defun etage-foerderanlage-einfuegen (deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF - startpunkt seite + startpunkt seite hz / aktueller-punkt bogen-name endpunkt bogen-mass bogen-dx bogen-dz as-block es-block gefaelle-blockname @@ -630,7 +635,7 @@ ;; 1. AS_30 (princ (strcat "\n\n1/15: " as-block " (0 Grad)")) - (setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt)) + (setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt 0.0)) ;; 2. Staustrecke 400mm (hz-anfang, 3 Grad vert, KS_EIN) (princ (strcat "\n\n2/15: Staustrecke 400mm (" @@ -657,7 +662,7 @@ (progn (princ (strcat "\n\n5/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)")) (setq aktueller-punkt - (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3)) + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 0.0)) ) (princ "\n\n5/15: L_GF1 (uebersprungen)") ) @@ -665,7 +670,7 @@ ;; 6. Umlenkstation (3 Grad geneigt) (princ "\n\n6/15: Umlenkstation (500mm, 3 Grad geneigt)") (setq aktueller-punkt - (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0)) + (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0 0.0)) ;; 7. 1. Vertikalbogen (3 Grad geneigt) (if (= richtung "Auf") @@ -681,7 +686,7 @@ (setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass)) (princ (strcat "\n\n7/15: " bogen-name " (3 Grad geneigt)")) (setq aktueller-punkt - (insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz)) + (insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz 0.0)) ;; 8. Variable Strecke L_VF (if (> L_VF 0.1) @@ -692,14 +697,14 @@ (itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)")) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (- (- best-winkel 3)))) + L_VF (- (- best-winkel 3)) 0.0)) ) (progn (princ (strcat "\n\n8/15: Gefaellestrecke (" (itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)")) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (+ best-winkel 3))) + L_VF (+ best-winkel 3) 0.0)) ) ) ) @@ -724,35 +729,35 @@ " (" (itoa (- 3 best-winkel)) " Grad geneigt)")) (setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt - (- 3 best-winkel) bogen-dx bogen-dz)) + (- 3 best-winkel) bogen-dx bogen-dz 0.0)) ) (progn (princ (strcat "\n\n9/15: " bogen-name " (" (itoa (+ best-winkel 3)) " Grad geneigt)")) (setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt - (+ best-winkel 3) bogen-dx bogen-dz)) + (+ best-winkel 3) bogen-dx bogen-dz 0.0)) ) ) ;; 10. Motorstation (3 Grad geneigt) (princ "\n\n10/15: Motorstation (500mm, 3 Grad geneigt)") (setq aktueller-punkt - (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0)) + (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0 0.0)) ;; 11. L_GF2 (3 Grad geneigt) (if (> L_GF2 0.1) (progn (princ (strcat "\n\n11/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)")) (setq aktueller-punkt - (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3)) + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3 0.0)) ) (princ "\n\n11/15: L_GF2 (uebersprungen)") ) ;; 12. Gefaellebogen Ende (via KS_EIN, 0 Grad vert) (princ (strcat "\n\n12/15: " gefaelle-blockname " (Ende, KS_EIN)")) - (setq aktueller-punkt (insert-block-by-ks gefaelle-blockname aktueller-punkt)) + (setq aktueller-punkt (insert-block-by-ks gefaelle-blockname aktueller-punkt 0.0)) ;; 13. Separator Ende (hz-ende, 3 Grad vert) (princ (strcat "\n\n13/15: Separator (300mm, " diff --git a/Lisp/vf_standard.lsp b/Lisp/vf_standard.lsp index d49274e..5f70396 100644 --- a/Lisp/vf_standard.lsp +++ b/Lisp/vf_standard.lsp @@ -383,11 +383,61 @@ (list best-winkel best-L_GF best-L_VF ergebnis-liste) ) +;; Prueft/berechnet die Variante mit HORIZONTALER Zwischenstrecke (Schritt +;; 6/11 bei 0 Grad statt geneigt). Die beiden Vertikalboegen sind dabei +;; IMMER auf 3 Grad fixiert (Vario_Bogen_auf_3 / Vario_Bogen_ab_3), weil sie +;; nur zwischen der festen 3-Grad-Neigung von Umlenk-/Motorstation und der +;; horizontalen Mitte vermitteln muessen - unabhaengig von Auf/Ab. +;; WICHTIG (geometrische Konsequenz): GF1+GF2 (an AS/ES-Seite, ebenfalls +;; fest bei 3 Grad geneigt) sind die einzige nennenswerte Quelle fuer +;; Hoehenaenderung, da sich die beiden Boegen gegenseitig fast vollstaendig +;; kompensieren. Die feste 3-Grad-Neigung wirkt IMMER absenkend: +;; - "Ab": passt zur gewuenschten Absenkung -> deltaH praktisch beliebig +;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger. +;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR +;; KLEINE deltaH ueberhaupt gueltig (wenige cm). +;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar. +(defun berechne-horizontale-mitte (deltaL deltaH richtung / + mass1 mass2 rad3 bogen-x1 bogen-z1 + bogen-x2 bogen-z2 deltaH-signiert + A-hz B-hz GF_total L_VF-hz gueltig) + (setq mass1 (get-bogen-mass bogen-auf 3)) + (setq mass2 (get-bogen-mass bogen-ab 3)) + (if (or (null mass1) (null mass2)) + nil + (progn + (setq rad3 (* 3.0 (/ pi 180.0))) + ;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad + (setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3)))) + (setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3)))) + ;; Bogen2 (immer ab_3): Eintritt bei 0 Grad (von der horizontalen Mitte), biegt auf 3 Grad + (setq bogen-x2 (car mass2)) + (setq bogen-z2 (caddr mass2)) + ;; Signierte Ziel-Hoehenaenderung: Auf=+deltaH, Ab=-deltaH + (setq deltaH-signiert (if (= richtung "Auf") deltaH (- deltaH))) + ;; Horizontal-Budget: deltaL minus AS/ES minus beide Boegen minus feste Stationen (bei 3 Grad) + (setq A-hz (- deltaL aus-dx ein-dx bogen-x1 bogen-x2 + (* FESTE_HORIZONTAL (cos rad3)))) + ;; Hoehen-Budget: was GF1+GF2 (bei 3 Grad) noch beitragen muessen + (setq B-hz (- (+ aus-dz ein-dz (- (* FESTE_HORIZONTAL (sin rad3))) + bogen-z1 bogen-z2) + deltaH-signiert)) + (setq GF_total (/ B-hz (sin rad3))) + (setq L_VF-hz (- A-hz (* GF_total (cos rad3)))) + (setq gueltig (and (>= GF_total 0) (>= L_VF-hz 0))) + (list GF_total L_VF-hz gueltig) + ) + ) +) + ;; ============================================================ ;; TEIL 5: BERECHNE-WRAPPER (Schnittstelle fuer Registry) ;; ============================================================ ;; Initialisiert Standard-Bibliothek und berechnet Winkel. ;; seite-Parameter wird fuer Standard-Typ nicht benoetigt (keine Vorab-Geometrie). +;; Die Machbarkeitspruefung fuer die horizontale Zwischenstrecke passiert +;; separat und VORAB in c:VarioFoerderer (vor der Foerderrichtung-Abfrage), +;; deshalb liefert diese Funktion nur noch die normale Winkelsuche zurueck. (defun berechne-standard (deltaL deltaH richtung seite) (setq FESTE_HORIZONTAL (ssg-cfg-or "vario" "feste_horizontal" 1600)) (setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000)) @@ -400,19 +450,24 @@ ;; ============================================================ ;; Gibt endpunkt zurueck (letzter KS_AUS nach ES_90). ;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp). +;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, 180=West/-X, +;; 270=Sued/-Y). Default 0, falls vom Aufrufer nicht mitgegeben (Etage- +;; Registry-Kompatibilitaet - siehe c:VarioFoerderer). (defun variofoerderer-einfuegen (deltaL deltaH richtung best-winkel - L_GF1 L_GF2 L_VF startpunkt seite + L_GF1 L_GF2 L_VF startpunkt seite hz / aktueller-punkt bogen-name endpunkt bogen-mass bogen-dx bogen-dz as-block es-block) + (if (null hz) (setq hz 0.0)) + (setq hz (float hz)) (setq aktueller-punkt startpunkt) (setq as-block (strcat "AS_Element_90_" seite)) (setq es-block (strcat "ES_Element_90_" seite)) (if (not *lib-initialized*) (init-bibliothek)) ;; 1. AUS_Element - (princ (strcat "\n\n1/11: " as-block " (0 Grad)")) - (setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt)) + (princ (strcat "\n\n1/11: " as-block " (hz=" (rtos hz 2 1) grad-zeichen ")")) + (setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt hz)) ;; 2. 1. Gefaellestrecke (if (> L_GF1 0.1) @@ -420,7 +475,7 @@ (princ (strcat "\n\n2/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)")) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3))) + L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz)) ) (princ "\n\n2/11: (uebersprungen)") ) @@ -431,7 +486,7 @@ (insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "separator_block_dx" 300) - (ssg-cfg-or "vario" "separator_block_dz" 0))) + (ssg-cfg-or "vario" "separator_block_dz" 0) hz)) ;; 4. Umlenkstation (princ "\n\n4/11: Umlenkstation (500 mm, 3 Grad geneigt)") @@ -439,42 +494,61 @@ (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "station_block_dx" 500) - (ssg-cfg-or "vario" "station_block_dz" 0))) + (ssg-cfg-or "vario" "station_block_dz" 0) hz)) ;; 5. 1. Vertikalbogen - (if (= richtung "Auf") + ;; Sonderfall best-winkel=0 (horizontale Zwischenstrecke, siehe + ;; berechne-horizontale-mitte): Boegen IMMER auf_3/ab_3, unabhaengig von + ;; Auf/Ab, da sie nur zwischen der festen 3-Grad-Neigung und der + ;; horizontalen Mitte vermitteln muessen. + (if (= best-winkel 0) (progn - (setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel))) - (setq bogen-mass (get-bogen-mass bogen-auf best-winkel)) + (setq bogen-name "Vario_Bogen_auf_3") + (setq bogen-mass (get-bogen-mass bogen-auf 3)) ) - (progn - (setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel))) - (setq bogen-mass (get-bogen-mass bogen-ab best-winkel)) + (if (= richtung "Auf") + (progn + (setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel))) + (setq bogen-mass (get-bogen-mass bogen-auf best-winkel)) + ) + (progn + (setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel))) + (setq bogen-mass (get-bogen-mass bogen-ab best-winkel)) + ) ) ) (setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass)) (princ (strcat "\n\n5/11: " bogen-name " (3 Grad geneigt)")) (setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt - (ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz)) + (ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz hz)) ;; 6. Variable Strecke L_VF (if (> L_VF 0.1) (progn - (if (= richtung "Auf") + (if (= best-winkel 0) (progn - (princ (strcat "\n\n6/11: Steigungsstrecke (" - (itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)")) + (princ (strcat "\n\n6/11: Horizontale Zwischenstrecke (0 Grad, L=" + (rtos L_VF 2 2) " mm)")) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (- (- best-winkel 3)))) + L_VF 0 hz)) ) - (progn - (princ (strcat "\n\n6/11: Gefaellestrecke (" - (itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)")) - (setq aktueller-punkt - (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (+ best-winkel 3))) + (if (= richtung "Auf") + (progn + (princ (strcat "\n\n6/11: Steigungsstrecke (" + (itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)")) + (setq aktueller-punkt + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt + L_VF (- (- best-winkel 3)) hz)) + ) + (progn + (princ (strcat "\n\n6/11: Gefaellestrecke (" + (itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)")) + (setq aktueller-punkt + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt + L_VF (+ best-winkel 3) hz)) + ) ) ) ) @@ -482,31 +556,45 @@ ) ;; 7. 2. Vertikalbogen - (if (= richtung "Auf") + (if (= best-winkel 0) (progn - (setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel))) - (setq bogen-mass (get-bogen-mass bogen-ab best-winkel)) + (setq bogen-name "Vario_Bogen_ab_3") + (setq bogen-mass (get-bogen-mass bogen-ab 3)) ) - (progn - (setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel))) - (setq bogen-mass (get-bogen-mass bogen-auf best-winkel)) + (if (= richtung "Auf") + (progn + (setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel))) + (setq bogen-mass (get-bogen-mass bogen-ab best-winkel)) + ) + (progn + (setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel))) + (setq bogen-mass (get-bogen-mass bogen-auf best-winkel)) + ) ) ) (setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass)) - (if (= richtung "Auf") + (if (= best-winkel 0) (progn - (princ (strcat "\n\n7/11: " bogen-name - " (" (itoa (- 3 best-winkel)) " Grad geneigt)")) + (princ (strcat "\n\n7/11: " bogen-name " (3 Grad geneigt)")) (setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt - (- 3 best-winkel) bogen-dx bogen-dz)) + 0 bogen-dx bogen-dz hz)) ) - (progn - (princ (strcat "\n\n7/11: " bogen-name - " (" (itoa (+ best-winkel 3)) " Grad geneigt)")) - (setq aktueller-punkt - (insert-rotated-block-with-ks bogen-name aktueller-punkt - (+ best-winkel 3) bogen-dx bogen-dz)) + (if (= richtung "Auf") + (progn + (princ (strcat "\n\n7/11: " bogen-name + " (" (itoa (- 3 best-winkel)) " Grad geneigt)")) + (setq aktueller-punkt + (insert-rotated-block-with-ks bogen-name aktueller-punkt + (- 3 best-winkel) bogen-dx bogen-dz hz)) + ) + (progn + (princ (strcat "\n\n7/11: " bogen-name + " (" (itoa (+ best-winkel 3)) " Grad geneigt)")) + (setq aktueller-punkt + (insert-rotated-block-with-ks bogen-name aktueller-punkt + (+ best-winkel 3) bogen-dx bogen-dz hz)) + ) ) ) @@ -516,7 +604,7 @@ (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "station_block_dx" 500) - (ssg-cfg-or "vario" "station_block_dz" 0))) + (ssg-cfg-or "vario" "station_block_dz" 0) hz)) ;; 9. 2. Gefaellestrecke (if (> L_GF2 0.1) @@ -524,7 +612,7 @@ (princ (strcat "\n\n9/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)")) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3))) + L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz)) ) (princ "\n\n9/11: (uebersprungen)") ) @@ -535,11 +623,11 @@ (insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "separator_block_dx" 300) - (ssg-cfg-or "vario" "separator_block_dz" 0))) + (ssg-cfg-or "vario" "separator_block_dz" 0) hz)) ;; 11. EIN_Element - (princ (strcat "\n\n11/11: " es-block " (0 Grad)")) - (setq endpunkt (insert-block-by-ks es-block aktueller-punkt)) + (princ (strcat "\n\n11/11: " es-block " (hz=" (rtos hz 2 1) grad-zeichen ")")) + (setq endpunkt (insert-block-by-ks es-block aktueller-punkt hz)) (princ "\n\n=========================================") (princ "\n>>> Standard VarioFoerderer eingefuegt!")