diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 79f3117..2b7fd6f 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -1175,9 +1175,9 @@ (setq ein-hz-as-k (- entry-hz (vf-element-plan-turn (strcat "AS_Element_" gf-as-winkel "_" as-seite)))) (setq rad-h-as-k (* (float ein-hz-as-k) (/ pi 180.0))) - (setq xu-as-meas (list (* (cos rad-h-as-k)(cos rad-v-korr)) - (* (sin rad-h-as-k)(cos rad-v-korr)) - (- (sin rad-v-korr)))) + ;; AS flach (KS_EIN horizontal, keine Neigung) - konsistent zur flachen + ;; Platzierung; der dz kommt allein aus der Blockgeometrie. + (setq xu-as-meas (list (cos rad-h-as-k) (sin rad-h-as-k) 0.0)) ;; ES-Element: KS_EIN zeigt in Fahrtrichtung (exit-hz) (setq rad-h-es-k (* (float exit-hz) (/ pi 180.0))) (setq xu-es-meas (list (* (cos rad-h-es-k)(cos rad-v-korr)) @@ -1238,10 +1238,9 @@ (setq ein-hz-as (- entry-hz (vf-element-plan-turn (strcat "AS_Element_" gf-as-winkel "_" as-seite)))) (setq rad-h-as (* (float ein-hz-as) (/ pi 180.0))) - (setq rad-v-as (* (float grade) (/ pi 180.0))) - (setq xu-entry (list (* (cos rad-h-as)(cos rad-v-as)) - (* (sin rad-h-as)(cos rad-v-as)) - (- (sin rad-v-as)))) + ;; AS-Element FLACH platzieren (KS_EIN horizontal, keine Neigung) - + ;; Nutzer-Vorgabe: alle AS_Elemente flach. Nur die Fahrtrichtung dreht. + (setq xu-entry (list (cos rad-h-as) (sin rad-h-as) 0.0)) (princ (ssg-textf "gf-status-aus-element-detail" (list as-block (rtos entry-hz 2 1) grad-zeichen (rtos ein-hz-as 2 1) grad-zeichen (rtos (caddr startpunkt) 2 1)))) @@ -1577,11 +1576,12 @@ ;; KS_EIN-Richtung fuer AS-Element: gemessener Ebenen-Schwenk des Blocks, so ;; dass KS_AUS in Fahrtrichtung hz zeigt (ein-hz = hz - plan-turn). + ;; AS-Element FLACH platzieren (Nutzer-Vorgabe 2026-07-22): KS_EIN horizontal, + ;; KEINE 3-Grad-Neigung (Z-Komponente 0). Das Gefaelle beginnt erst mit der + ;; Staustrecke danach. Nur die Fahrtrichtung dreht KS_EIN. (setq ein-hz (- hz (vf-element-plan-turn (strcat "AS_Element_" as-winkel "_" as-seite)))) (setq rad-ein (* (float ein-hz) (/ pi 180.0))) - (setq xu-ein (list (* (cos rad-ein)(cos rad-v)) - (* (sin rad-ein)(cos rad-v)) - (- (sin rad-v)))) + (setq xu-ein (list (cos rad-ein) (sin rad-ein) 0.0)) ;; 1/4: AUS-Element (KS_EIN an xu-ein ausrichten, damit KS_AUS in hz zeigt) ;; Block-Ursprung (nicht KS_EIN!) in X/Y auf startpunkt setzen, damit die @@ -2066,7 +2066,8 @@ ;; ============================================================ (defun gf-baue-parallel-vf (gf-start hz deltaL as-seite hoehe-bis / abstand rad hz-vf deltaH gf-end-x gf-end-y - perp-x perp-y vf-start vf-seite) + perp-x perp-y vf-start vf-seite + ziel-es vf-erg vf-insert vf-endpunkt korr os-alt) (if (null (car (atoms-family 1 '("VFS-STANDARD-DIALOG-BERECHNEN-EINFUEGEN")))) (alert (ssg-text "gf-vf-modul-fehlt")) (progn @@ -2089,12 +2090,29 @@ hoehe-bis)) (setq hz-vf (rem (+ hz 180.0) 360.0)) (setq vf-seite as-seite) ; VF-AS/ES-Seite: Default = GF-AS-Seite - (princ (strcat "\n[DEBUG-VFPAR] GF-hz=" (rtos hz 2 1) " -> VF-hz=" (rtos hz-vf 2 1) - " | as-seite=" as-seite - " | gf-start=" (vl-princ-to-string gf-start) - " | vf-start=" (vl-princ-to-string vf-start))) - (vfs-standard-dialog-berechnen-einfuegen - (vf-next-number) deltaL deltaH "Auf" vf-start hz-vf vf-seite nil) + ;; Zielpunkt: VF-ES-KS_AUS soll auf GF-AS-KS_EIN liegen, nur um 'abstand' + ;; quer versetzt, gleiche Hoehe. + (setq ziel-es (list (+ (car gf-start) (* abstand perp-x)) + (+ (cadr gf-start) (* abstand perp-y)) + (caddr gf-start))) + ;; VF bauen; Rueckgabe (vf-insert vf-endpunkt), vf-endpunkt = tatsaechl. + ;; ES-KS_AUS als Weltpunkt (aus vfs-es-teil/insert-block-by-ks). + (setq vf-erg (vfs-standard-dialog-berechnen-einfuegen + (vf-next-number) deltaL deltaH "Auf" vf-start hz-vf vf-seite nil)) + (setq vf-insert (car vf-erg) vf-endpunkt (cadr vf-erg)) + ;; Selbstkorrektur: fertigen VF-Block so verschieben, dass sein + ;; tatsaechliches ES-KS_AUS exakt auf ziel-es faellt (analog GF_n-Move; + ;; OSMODE=0, damit der Zielpunkt nicht umgefangen wird). Damit ist der + ;; seitliche Versatz UND die Hoehe unabhaengig von der VF-Innengeometrie 0. + (if (and vf-insert vf-endpunkt) + (progn + (setq korr (mapcar '- ziel-es vf-endpunkt)) + (setq os-alt (getvar "OSMODE")) + (setvar "OSMODE" 0) + (if (> (distance '(0.0 0.0 0.0) korr) 1e-6) + (command "_.MOVE" vf-insert "" '(0.0 0.0 0.0) korr)) + (setvar "OSMODE" os-alt)) + ) (princ (ssg-text "gf-vf-gebaut")) ) )