From c0f06b68cda73ccc943d8676f0a7d83dabf3b1bb Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Wed, 22 Jul 2026 12:42:18 +0200 Subject: [PATCH] =?UTF-8?q?=20Fehler=20f=C3=BCr=20Etage-VF=20korrigiert.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/vf_etage.lsp | 164 ++++++++++++++++++++++++++++++---------------- 1 file changed, 107 insertions(+), 57 deletions(-) diff --git a/Lisp/vf_etage.lsp b/Lisp/vf_etage.lsp index aac4444..be9b798 100644 --- a/Lisp/vf_etage.lsp +++ b/Lisp/vf_etage.lsp @@ -40,7 +40,11 @@ (setq FESTE_ETAGE_MITTE 1000) (setq ETAGE_SCHRAEG_LAENGE 700) -(setq ETAGE_HZ_WINKEL 60) +;; Schwenkwinkel der Ein-/Auslauf-Schraegsektionen: 30 Grad (AS_30/ES_30 + +;; 30-Grad-Gefaellebogen). War frueher 60. Nur noch im Laengen-/Hoehen-Budget +;; berechne-winkel-etage (schraeg-cos) verwendet; die fruehere absolute +;; hz-Platzierung wurde durch Frame-Verkettung (cur-hz) ersetzt. +(setq ETAGE_HZ_WINKEL 30) ;; ============================================================ ;; TEIL 2: BIBLIOTHEK INITIALISIEREN (ETAGE-SPEZIFISCH) @@ -127,8 +131,8 @@ ) ) - ;; Gefaellebogen_links_60 Masse extrahieren - (setq gefaelle-blockname "Gefaellebogen_links_60_R500") + ;; Gefaellebogen_links_30 Masse extrahieren + (setq gefaelle-blockname "Gefaellebogen_links_30_R500") (princ (ssg-textf "vfe-extrahiere-block-mass" (list gefaelle-blockname))) (ensure-block-loaded gefaelle-blockname) (if (tblsearch "BLOCK" gefaelle-blockname) @@ -160,8 +164,8 @@ ) (princ (ssg-textf "vfe-gefaellebogen-links-mass" (list (rtos etage-gef-dx-links 2 2) (rtos etage-gef-dz-links 2 2)))) - ;; Gefaellebogen_rechts_60 Masse extrahieren - (setq gefaelle-blockname "Gefaellebogen_rechts_60_R500") + ;; Gefaellebogen_rechts_30 Masse extrahieren + (setq gefaelle-blockname "Gefaellebogen_rechts_30_R500") (princ (ssg-textf "vfe-extrahiere-block-mass" (list gefaelle-blockname))) (ensure-block-loaded gefaelle-blockname) (if (tblsearch "BLOCK" gefaelle-blockname) @@ -597,64 +601,83 @@ ;; ============================================================ ;; 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. +;; hz: Richtung der Hauptlinie (Default 0 = horizontal/X). AS-KS_EIN und +;; ES-KS_AUS liegen koaxial auf dieser Linie; die Kette wird frame-verkettet +;; aufgebaut (cur-hz laeuft durch, Boegen drehen um ihren gemessenen Schwenk). (defun etage-foerderanlage-einfuegen (deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz / aktueller-punkt bogen-name endpunkt bogen-mass bogen-dx bogen-dz as-block es-block gefaelle-blockname - hz-vorzeichen hz-anfang hz-ende) + as-hz as-ksinfo + cur-hz bogen-info es-info + perp-sin perp-cos p2b-perp es-place-rad + es-wx es-wy es-perp perp-rate L-exit) (setq aktueller-punkt startpunkt) - ;; Horizontalwinkel-Vorzeichen je nach Seite: - ;; rechts: Anfang +60 Grad (links), Ende -60 Grad (rechts) - ;; links: Anfang -60 Grad, Ende +60 Grad - (setq hz-vorzeichen (if (= seite "rechts") 1 -1)) - (setq hz-anfang (* hz-vorzeichen ETAGE_HZ_WINKEL)) - (setq hz-ende (* (- hz-vorzeichen) ETAGE_HZ_WINKEL)) + ;; hz = Richtung der Hauptlinie (AS-KS_EIN / ES-KS_AUS liegen darauf). + ;; Default 0 (horizontal), falls der Aufrufer nichts uebergibt. + (if (null hz) (setq hz 0.0)) + (setq hz (float hz)) (setq as-block (strcat "AS_Element_30_" seite)) (setq es-block (strcat "ES_Element_30_" seite)) + ;; Gefaellebogen auf der GEGENSEITE des AS-Elements (Nutzer-Vorgabe + ;; 2026-07-21): AS links -> Boegen rechts, AS rechts -> Boegen links. + ;; Beide Etage-Boegen nutzen dieselbe (Gegen-)Seite. (setq gefaelle-blockname (if (= seite "rechts") - "Gefaellebogen_rechts_60_R500" - "Gefaellebogen_links_60_R500" + "Gefaellebogen_links_30_R500" + "Gefaellebogen_rechts_30_R500" )) ;; Sentinel: Bibliothek neu initialisieren wenn Bloecke fehlen (if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "AS_Element_30_rechts"))) (setq *etage-lib-initialized* nil)) (if (not *etage-lib-initialized*) (init-bibliothek-etage)) - ;; 1. AS_30 + ;; 1. AS_30 - KS_EIN koaxial zur Hauptlinie (hz) ausrichten. + ;; vf-element-ks-info liefert (ein-ang aus-ang vx vy): ein-ang/aus-ang sind die + ;; Ebenen-Winkel der KS_EIN- bzw. KS_AUS-Achse IM BLOCK (bei Einbau-Rotation 0). + ;; Platzierungs-hz = (hz - ein-ang) dreht die KS_EIN-Achse von ein-ang auf hz + ;; -> KS_EIN liegt koaxial auf der Hauptlinie (Abnahmekriterium). (princ (ssg-textf "vfe-step1-as30" (list as-block))) - (setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt 0.0)) + (setq as-ksinfo (vf-element-ks-info as-block)) + (setq aktueller-punkt + (insert-block-by-ks as-block aktueller-punkt (- hz (car as-ksinfo)))) + ;; KS_AUS-Richtung (absolut) = hz + Schwenk (aus-ang - ein-ang); die folgende + ;; GF laeuft in dieser Richtung weiter (Frame-Verkettung wie im Linienzug). + (setq as-hz (+ hz (- (cadr as-ksinfo) (car as-ksinfo)))) - ;; 2. Staustrecke 400mm (hz-anfang, 3 Grad vert, KS_EIN) - (princ (ssg-textf "vfe-step2" (list (itoa hz-anfang)))) + ;; 2. Staustrecke 400mm (folgt der AS-Richtung as-hz, 3 Grad vert, KS_EIN) + (princ (ssg-textf "vfe-step2" (list (rtos as-hz 2 1)))) (setq aktueller-punkt (insert-hz-scaled-block-by-ks "Staustrecke_SP_1000_mm" aktueller-punkt - 400 hz-anfang 3)) + 400 as-hz 3)) - ;; 3. Separator (hz-anfang, 3 Grad vert) - (princ (ssg-textf "vfe-step3" (list (itoa hz-anfang)))) + ;; 3. Separator (folgt der AS-Richtung as-hz, 3 Grad vert) + (princ (ssg-textf "vfe-step3" (list (rtos as-hz 2 1)))) (setq aktueller-punkt (insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt - hz-anfang 3 300 0)) + as-hz 3 300 0)) - ;; 4. Gefaellebogen Anfang (hz-anfang, 0 Grad vert, KS_EIN) - (princ (ssg-textf "vfe-step4" (list gefaelle-blockname (itoa hz-anfang)))) + ;; Ab hier laufende Richtung cur-hz mitfuehren (frame-verkettet). Start = + ;; KS_AUS-Richtung des AS (as-hz). Jeder Gefaellebogen dreht cur-hz um seinen + ;; gemessenen Schwenk (Vorzeichen/Seite kommen aus dem Block). + (setq cur-hz as-hz) + + ;; 4. Gefaellebogen Anfang (verkettet: KS_EIN auf cur-hz, dann cur-hz drehen) + (setq bogen-info (vf-element-ks-info gefaelle-blockname)) + (princ (ssg-textf "vfe-step4" (list gefaelle-blockname (rtos cur-hz 2 1)))) (setq aktueller-punkt - (insert-hz-rotated-block-by-ks gefaelle-blockname aktueller-punkt hz-anfang 0)) + (insert-hz-rotated-block-by-ks gefaelle-blockname aktueller-punkt + (- cur-hz (car bogen-info)) 0)) + (setq cur-hz (+ cur-hz (- (cadr bogen-info) (car bogen-info)))) ;; 5. L_GF1 (3 Grad geneigt) (if (> L_GF1 0.1) (progn (princ (ssg-textf "vfe-step5-strecke" (list (rtos L_GF1 2 2)))) (setq aktueller-punkt - (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 0.0)) + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 cur-hz)) ) (princ (ssg-text "vfe-step5-skip")) ) @@ -662,7 +685,7 @@ ;; 6. Umlenkstation (3 Grad geneigt) (princ (ssg-text "vfe-step6")) (setq aktueller-punkt - (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0 0.0)) + (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0 cur-hz)) ;; 7. 1. Vertikalbogen (3 Grad geneigt) (if (= richtung "Auf") @@ -678,7 +701,7 @@ (setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass)) (princ (ssg-textf "vfe-step7" (list bogen-name))) (setq aktueller-punkt - (insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz 0.0)) + (insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz cur-hz)) ;; 8. Variable Strecke L_VF (if (> L_VF 0.1) @@ -688,13 +711,13 @@ (princ (ssg-textf "vfe-step8-auf" (list (itoa (- (- best-winkel 3))) (rtos L_VF 2 2)))) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (- (- best-winkel 3)) 0.0)) + L_VF (- (- best-winkel 3)) cur-hz)) ) (progn (princ (ssg-textf "vfe-step8-ab" (list (itoa (+ best-winkel 3)) (rtos L_VF 2 2)))) (setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt - L_VF (+ best-winkel 3) 0.0)) + L_VF (+ best-winkel 3) cur-hz)) ) ) ) @@ -719,56 +742,83 @@ " (" (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 0.0)) + (- 3 best-winkel) bogen-dx bogen-dz cur-hz)) ) (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 0.0)) + (+ best-winkel 3) bogen-dx bogen-dz cur-hz)) ) ) ;; 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 0.0)) + (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0 cur-hz)) ;; 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 0.0)) + (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3 cur-hz)) ) (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 0.0)) - - ;; 13. Separator Ende (hz-ende, 3 Grad vert) - (princ (strcat "\n\n13/15: Separator (300mm, " - (itoa hz-ende) " Grad hz, 3 Grad vert)")) + ;; 12. Gefaellebogen Ende (verkettet: KS_EIN auf cur-hz, dann cur-hz drehen) + (setq bogen-info (vf-element-ks-info gefaelle-blockname)) + (princ (strcat "\n\n12/15: " gefaelle-blockname + " (Ende, verkettet cur-hz=" (rtos cur-hz 2 1) ")")) (setq aktueller-punkt - (insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt - hz-ende 3 300 0)) + (insert-block-by-ks gefaelle-blockname aktueller-punkt (- cur-hz (car bogen-info)))) + (setq cur-hz (+ cur-hz (- (cadr bogen-info) (car bogen-info)))) - ;; 14. Staustrecke 400mm Ende (hz-ende, 3 Grad vert, KS_EIN) - (princ (strcat "\n\n14/15: Staustrecke 400mm (" - (itoa hz-ende) " Grad hz, 3 Grad vert, KS_EIN)")) + ;; --- Auslauf RUECKWAERTS vom ES gerechnet (analog Linienzug Modus 2): + ;; die Auslauf-Staustrecke wird variabel, sodass das ES-KS_AUS OHNE + ;; seitlichen Versatz auf der Hauptachse landet. Reihenfolge (Nutzer-Vorgabe): + ;; Staustrecke -> Separator -> ES. + (setq es-info (vf-element-ks-info es-block)) + ;; perp = Einheitsvektor senkrecht zur Hauptlinie hz: (-sin hz, cos hz) + (setq perp-sin (sin (* hz (/ pi 180.0))) + perp-cos (cos (* hz (/ pi 180.0)))) + ;; seitliche Lage nach Bogen2 (perp-Abstand des aktuellen Punkts zu startpunkt) + (setq p2b-perp (+ (* (- (car aktueller-punkt) (car startpunkt)) (- perp-sin)) + (* (- (cadr aktueller-punkt) (cadr startpunkt)) perp-cos))) + ;; ES-Eigenversatz KS_EIN->KS_AUS (Block vx/vy) in Auslaufrichtung gedreht -> perp + (setq es-place-rad (* (- cur-hz (car es-info)) (/ pi 180.0))) + (setq es-wx (- (* (caddr es-info) (cos es-place-rad)) (* (cadddr es-info) (sin es-place-rad)))) + (setq es-wy (+ (* (caddr es-info) (sin es-place-rad)) (* (cadddr es-info) (cos es-place-rad)))) + (setq es-perp (+ (* es-wx (- perp-sin)) (* es-wy perp-cos))) + ;; perp-Auslenkung pro Laengeneinheit bei cur-hz (Neigung 3 Grad) + (setq perp-rate (* (cos (* 3.0 (/ pi 180.0))) + (sin (* (- cur-hz hz) (/ pi 180.0))))) + ;; Loesen: p2b-perp + (L_exit + 300)*perp-rate + es-perp = 0 + (setq L-exit + (if (> (abs perp-rate) 1e-6) + (- (/ (- (+ p2b-perp es-perp)) perp-rate) 300.0) + 400.0)) + (if (< L-exit 50.0) (setq L-exit 50.0)) ; Schutz gegen negative/zu kurze GF + + ;; 13. Auslauf-Staustrecke (variabel, folgt cur-hz, 3 Grad vert, KS_EIN) + (princ (strcat "\n\n13/15: Staustrecke (variabel L=" (rtos L-exit 2 1) + ", cur-hz=" (rtos cur-hz 2 1) ")")) (setq aktueller-punkt (insert-hz-scaled-block-by-ks "Staustrecke_SP_1000_mm" aktueller-punkt - 400 hz-ende 3)) + L-exit cur-hz 3)) - ;; 15. ES_30 (hz-ende, 0 Grad vert) - (princ (strcat "\n\n15/15: " es-block - " (Ende, " (itoa hz-ende) " Grad hz, 0 Grad vert)")) + ;; 14. Separator (verkettet, folgt cur-hz, 3 Grad vert) + (princ (strcat "\n\n14/15: Separator (300mm, cur-hz=" (rtos cur-hz 2 1) ")")) + (setq aktueller-punkt + (insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt + cur-hz 3 300 0)) + + ;; 15. ES_30 (verkettet: KS_EIN auf cur-hz; KS_AUS auf der Hauptlinie) + (princ (strcat "\n\n15/15: " es-block " (Ende, verkettet cur-hz=" (rtos cur-hz 2 1) ")")) (setq endpunkt - (insert-hz-rotated-block-with-ks es-block aktueller-punkt - hz-ende 0 etage-ein-dx etage-ein-dz)) + (insert-block-by-ks es-block aktueller-punkt (- cur-hz (car es-info)))) (princ "\n\n=========================================") (princ "\n>>> Etage-VarioFoerderer eingefuegt! <<<")