diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 6a2c53b..3915427 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -862,24 +862,34 @@ ;; berechnet wird. Konventionswahl dieses Projekts (siehe vf-linienzug-modus, ;; wahl="Linie-GF"): Option "1" = Hoehe, Option "2" = Winkel - Hoehe ist ;; daher hier Default, nicht der DCL-eigene value="1" bei modus_winkel. -(defun vflw-gruppe-gefaelle-impl (hoehe-default nur-winkel / dat dcl-pfad ergebnis gmodus gwert winkel-default) +;; winkel-als-default: T, wenn (bei nicht gesperrter Hoehe-Option) trotzdem +;; der Neigungswinkel statt der Zielhoehe vorausgewaehlt sein soll - genutzt +;; von der Aufrufstelle "Zielhoehe zuerst" (die dortige Nachfrage ist zwar +;; textlich "Hoehe zuerst", die pragmatische Standard-Antwort ist aber meist +;; der direkt vorgegebene Neigungswinkel). +(defun vflw-gruppe-gefaelle-impl (hoehe-default nur-winkel winkel-als-default / + dat dcl-pfad ergebnis gmodus gwert winkel-default) (setq winkel-default (ssg-cfg-or "vario" "gefaelle_winkel" 3)) (setq dat (load_dialog (vflw-dcl-pfad))) (if (not (new_dialog "vflw_gefaelle" dat)) (if (and dat (>= dat 0)) (unload_dialog dat)) (progn (set_tile "kopf" (vflw-clean (ssg-text "vfl-gefaelle-festlegen-header"))) - (if nur-winkel - (progn - (set_tile "modus_winkel" "1") - (set_tile "wlabel" "Neigungswinkel (Grad):") - (set_tile "wert" (rtos (float winkel-default) 2 1)) - (mode_tile "modus_hoehe" 1) - (set_tile "hinweis" (ssg-text "vfl-gf-hinweis-laenge-berechnet"))) - (progn - (set_tile "modus_hoehe" "1") - (set_tile "wlabel" "Zielhoehe (Z, mm):") - (set_tile "wert" (rtos hoehe-default 2 1)))) + (cond + (nur-winkel + (set_tile "modus_winkel" "1") + (set_tile "wlabel" "Neigungswinkel (Grad):") + (set_tile "wert" (rtos (float winkel-default) 2 1)) + (mode_tile "modus_hoehe" 1) + (set_tile "hinweis" (ssg-text "vfl-gf-hinweis-laenge-berechnet"))) + (winkel-als-default + (set_tile "modus_winkel" "1") + (set_tile "wlabel" "Neigungswinkel (Grad):") + (set_tile "wert" (rtos (float winkel-default) 2 1))) + (t + (set_tile "modus_hoehe" "1") + (set_tile "wlabel" "Zielhoehe (Z, mm):") + (set_tile "wert" (rtos hoehe-default 2 1)))) ;; Wertfeld MUSS beim Moduswechsel mit umschalten - sonst steht dort ;; nach dem Wechsel noch der Wert des vorherigen Modus (Hoehe/Winkel ;; sind nicht dieselbe Groesse, ein stehengebliebener Hoehenwert waere @@ -911,9 +921,10 @@ ;; "Neue Linie: GF" - Vorfrage "Wie soll die Laenge bestimmt werden?" ;; (Endpunkt/Zielhoehe/Steigende GF). Die verschachtelte Unterfrage bei -;; Zweig C (Endpunkt vs. Zielhoehe, nur 2 Optionen) zeigt bewusst KEINEN -;; eigenen Wizard-Dialog - der 3-Optionen-Dialog hier waere dort irrefuehrend -;; (dritte Kachel "Steigend" existiert in diesem Kontext gar nicht mehr). +;; Zweig C (Endpunkt vs. Zielhoehe, nur 2 Optionen) hat einen EIGENEN, +;; separaten Dialog (vflw-gruppe-gf-steigend-untermodus-impl, weiter unten) - +;; der 3-Optionen-Dialog hier waere dort irrefuehrend (dritte Kachel +;; "Steigend" existiert in diesem Kontext gar nicht mehr). (defun vflw-gruppe-gf-laenge-modus-impl ( / dat ergebnis gwahl) (setq dat (load_dialog (vflw-dcl-pfad))) (if (not (new_dialog "vflw_gf_laenge_modus" dat)) @@ -938,6 +949,33 @@ ) (princ)) +;; Zweig C ("Steigende GF") Unterfrage Endpunkt/Zielhoehe - dieselben 2 +;; Optionen wie vflw-gruppe-gf-laenge-modus-impl, aber ohne die 3. Kachel +;; "Steigend" (siehe dcl/vf_linienzug_wizard.dcl, vflw_gf_steigend_untermodus). +;; Lief bisher mangels eigenem Dialog auf den generischen Dropdown-Fallback +;; (vflw-wahl) hinaus. +(defun vflw-gruppe-gf-steigend-untermodus-impl ( / dat ergebnis gwahl) + (setq dat (load_dialog (vflw-dcl-pfad))) + (if (not (new_dialog "vflw_gf_steigend_untermodus" dat)) + (if (and dat (>= dat 0)) (unload_dialog dat)) + (progn + (set_tile "kopf" (vflw-clean (ssg-text "vfl-gf-laenge-modus-header"))) + (action_tile "accept" + "(setq gwahl (if (= (get_tile \"modus_hoehe\") \"1\") \"2\" \"1\")) + (done_dialog 1)") + (action_tile "cancel" "(done_dialog 0)") + (action_tile "back" "(done_dialog 2)") + (setq ergebnis (start_dialog)) + (unload_dialog dat) + (cond + ((= ergebnis 1) (vflw-pending-push-all (list gwahl))) + ((= ergebnis 2) (setq *vfl-wizard-abbruch-grund* "zurueck")) + (t (setq *vfl-wizard-abbruch-grund* "abbrechen")) + ) + ) + ) + (princ)) + ;; "Neue Linie: GF" - Separator VOR/NACH (2 Ja/Nein-Toggles in einem ;; Bildschirm). Siehe dcl/vf_linienzug_wizard.dcl (vflw_sep_gf). (defun vflw-gruppe-sep-gf-impl ( / dat ergebnis gsepvor gsepnach) @@ -1075,7 +1113,10 @@ (set_tile (strcat "kopf" (itoa i)) zeile) (setq i (1+ i))) (while (<= i max-zeilen) (set_tile (strcat "kopf" (itoa i)) "") (setq i (1+ i))) - (set_tile "wahl_ja" "1") + ;; Default "Nein" (nicht der DCL-eigene "Ja"-Default): alle bisherigen + ;; Aufrufstellen (Separator-Zusatzfragen) haben auch im Konsolen-Pfad + ;; "Nein" als Vorgabe (vfl-menu default-idx=2). + (set_tile "wahl_nein" "1") (action_tile "accept" "(setq gwahl (get_tile \"wahl_nein\")) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (action_tile "back" "(done_dialog 2)") @@ -1665,6 +1706,15 @@ ;; geloescht hat), wird das klar gemeldet statt eine unvollstaendige Auswahl ;; stillschweigend weiterzureichen. (defun vfl-in-selection (filter / popped v handles h en k ss fehlt) + ;; Zentraler Abbruch-Trigger (siehe Kommentar in vfl-in-value): auch + ;; vfl-in-selection hat eine eigenstaendige Replay-/Journal-Logik und laeuft + ;; NICHT ueber vfl-in-value - ohne diesen Check bliebe ein von einem + ;; VORHERGEHENDEN Gruppen-Dialog gesetztes *vfl-wizard-abbruch-grund* + ;; unbemerkt liegen, statt hier zuverlaessig zu terminieren. + (if *vfl-wizard-abbruch-grund* + (progn + (dbgmsg (strcat "ABBRUCH-TRIGGER: *vfl-wizard-abbruch-grund*=" *vfl-wizard-abbruch-grund* " -> (exit)")) + (exit))) (setq popped (if *vfl-replay-queue* (vfl-replay-pop) nil)) (if popped (progn @@ -2455,6 +2505,8 @@ (setq labels (append labels (list (ssg-textf "vfl-winkel-option" (list idx (car e) (rtos (cadr e) 2 1) (rtos (caddr e) 2 1)))))) (setq idx (1+ idx))) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-winkel-wahl-impl (list ergebnis-liste gueltige))) (setq antwort (vfl-menu-int (ssg-textf "vfl-prompt-wahl-bis-n" (list (length gueltige))) labels 1 "vfl-mehrere-winkel-header")) (vfl-winkel-nach-index gueltige antwort)))) @@ -2847,6 +2899,17 @@ ;; ohnehin immer die des Vorgaengers, ein Journal-Eintrag dafuer waere ;; redundant. Rueckgabe: (deltaL . hz) oder nil bei Abbruch/leerer Eingabe. (defun vfl-in-abstand (p-akt hz-vorgabe prompt / p2 rad ux uy deltaL hz-aktuell popped) + ;; Zentraler Abbruch-Trigger (siehe Kommentar in vfl-in-value): vfl-in-abstand + ;; hat eine EIGENE Pending-/Replay-Logik und laeuft NICHT ueber vfl-in-value/ + ;; -value-p - ohne diesen Check wuerde ein per Wizard-Dialog gesetztes + ;; *vfl-wizard-abbruch-grund* hier NICHT erkannt: die Pending-Queue ist nach + ;; einem Dialog-Abbruch leer, der Code faellt dann auf einen rohen + ;; (vfl-getpoint ...)-Aufruf zurueck statt zu terminieren - genau das + ;; Fehlerbild "Abbrechen springt zurueck in die Abfrage" statt zu beenden. + (if *vfl-wizard-abbruch-grund* + (progn + (dbgmsg (strcat "ABBRUCH-TRIGGER: *vfl-wizard-abbruch-grund*=" *vfl-wizard-abbruch-grund* " -> (exit)")) + (exit))) ;; Eigene Replay-Logik (zwei Eintraege pro Aufruf), darum ein eigener ;; Headless-Riegel: leere Queue = Desync, nicht "Nutzer soll picken". (if (and (null *vfl-replay-queue*) (vfl-headless-p)) @@ -3278,6 +3341,8 @@ (princ (ssg-text "vfl-sep-vor-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ja-nein-impl (list (ssg-text "vfl-sep-vor-frage")))) (setq sep-vor (= (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 "vfl-sep-vor-frage") "1")) ;; Separator NACH abfragen (noch nicht bauen) - im Ziel-Modus muss der @@ -3285,6 +3350,8 @@ (princ (ssg-text "vfl-sep-nach-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ja-nein-impl (list (ssg-text "vfl-sep-nach-frage")))) (setq sep-nach (= (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 "vfl-sep-nach-frage") "1")) (if ziel-modus @@ -3757,7 +3824,7 @@ letzt-hz fertig ziel-ende ziel-gf2 res3 gf2-eff entry-start res-h vor-antwort es-gewuenscht es-antwort save-eindx save-eindz hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback - schon-flach winkel-hoehen-erg) + schon-flach winkel-hoehen-erg es-seite) ;; Vorbelegung: ES gewuenscht (Default) - nur bei "3 - Kettenende definieren" ;; wird explizit gefragt und ggf. auf nil gesetzt (siehe dort). (setq es-gewuenscht t) @@ -3839,18 +3906,30 @@ (if (= antwort "3") ;; --- Option 3: Kettenende exakt am Zielpunkt (nur EIN Motor) --- (progn - ;; ES-Element hier gewuenscht? Falls nein, ein-dx/ein-dz waehrend der - ;; Zerlegung (vfl-body-abschluss -> vfl-body-zerlegung -> berechne- - ;; alle-winkel) temporaer nullen, damit KEIN ES-Fussabdruck reserviert - ;; wird - die Kette endet dann direkt am Zielpunkt ohne Separator+ES. + ;; ES-Element hier gewuenscht (+ falls ja: Winkel/Seite) - kombinierter + ;; Dialog wie AS-Element (vflw-gruppe-as-impl). Winkel/Seite werden + ;; JETZT (nicht erst spaeter in vfl-vf-einheit-abschluss) erfragt, weil + ;; sie den tatsaechlichen ES-Fussabdruck (ein-dx/ein-dz, per + ;; vfl-es-masse-setzen INNERHALB von vfl-frage-es-seite gesetzt) + ;; bestimmen - der muss VOR vfl-body-abschluss feststehen, sonst + ;; rechnet die Streckenzerlegung mit dem falschen (alten) Fussabdruck + ;; und die Kette trifft den Zielpunkt nicht exakt. Falls nein: ein-dx/ + ;; ein-dz waehrend der Zerlegung temporaer nullen, damit KEIN + ;; ES-Fussabdruck reserviert wird - die Kette endet dann direkt am + ;; Zielpunkt ohne Separator+ES. (princ (ssg-text "vfl-es-setzen-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-es-nein-zielpunkt")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-as-impl (list "vfl-es-setzen-frage"))) (setq es-antwort (vfl-menu (ssg-text "prompt-wahl-1-2") (list (ssg-text "vfl-ja") (ssg-text "vfl-es-nein-zielpunkt")) 1 "vfl-es-setzen-frage")) (setq es-gewuenscht (/= es-antwort "2")) - (if (not es-gewuenscht) + (if es-gewuenscht + ;; dialog-schon-gezeigt=T: Winkel+Seite kamen bereits aus dem + ;; kombinierten vflw-gruppe-as-impl-Dialog oben mit. + (setq es-seite (vfl-frage-es-seite t)) (progn (setq save-eindx ein-dx save-eindz ein-dz) (setq ein-dx 0.0 ein-dz 0.0))) (setq res3 (vfl-body-abschluss frame letzt-hz p-umlenk)) @@ -3868,6 +3947,8 @@ (princ (ssg-text "vfl-opt-horizontaler-foerderer")) (princ (ssg-text "vfl-opt-vario-kurve")) (princ (ssg-text "vfl-opt-auf-ab-foerderer")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-naechstes-im-vf-impl nil)) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3") (list (ssg-text "vfl-opt-horizontaler-foerderer") (ssg-text "vfl-opt-vario-kurve") @@ -4011,7 +4092,7 @@ ;; still die falsche GF2 hinter dem Motor entsteht. (setq gf2-eff (if ziel-ende ziel-gf2 L_GF2-bau)) (setq frame (vfl-vf-ausgang-bauen frame letzt-hz gf2-eff)) - (list frame vf-count ziel-ende es-gewuenscht) + (list frame vf-count ziel-ende es-gewuenscht es-seite) ) ;; Rundet einen Winkel (Grad) auf das naechste 30-Grad-Vielfache DES WELT- @@ -4457,9 +4538,15 @@ (vf-set-es-masse winkel seite) seite) -(defun vfl-frage-es-seite ( / antwort es-seite) +;; dialog-schon-gezeigt: T, wenn Winkel+Seite BEREITS ueber einen vorherigen +;; kombinierten Dialog (vflw-gruppe-as-impl, "ES-Element setzen?" + Winkel + +;; Seite in einem Bildschirm) abgefragt und in die Pending-Queue gelegt +;; wurden - dann NICHT nochmal den eigenen Winkel+Seite-Dialog zeigen (sonst +;; doppelter Dialog), nur die bereits wartenden Werte konsumieren. Sonst +;; (normaler Fall) nil - eigener Dialog wie bisher. +(defun vfl-frage-es-seite (dialog-schon-gezeigt / antwort es-seite) (vfl-journal-mark "ES") - (if (vfl-wizard-aktiv) + (if (and (vfl-wizard-aktiv) (not dialog-schon-gezeigt)) (vl-catch-all-apply 'vflw-gruppe-winkel-seite-impl (list "vf-winkel-ein-header" (list (ssg-text "vf-winkel-90") (ssg-text "vf-winkel-30")) @@ -4650,7 +4737,7 @@ (princ)) (defun vfl-vf-einheit-abschluss (frame hz richtung winkel L_GF L_VF auto-ende gf-verteilung-fest eingang-modus / - antwort res es-s ende es-gewuenscht) + antwort res es-s ende es-gewuenscht es-seite-vorab) ;; GF-Verteilung: halbe Staustrecke am Ausgang (GF2) oder alles am Einlauf. ;; gf-verteilung-fest: Aufrufer erzwingt die Antwort (z.B. "2", wenn L_GF ;; wegen eingang-modus ohnehin 0.0 ist - die Frage waere dann sinnlos). @@ -4667,7 +4754,7 @@ (ssg-text "vfl-gf-verteilung-ganz-einlauf")) 2 "vfl-gf-verteilung-header")))) (setq res (vfl-vf-einheit frame hz richtung winkel L_GF L_VF (= antwort "1") eingang-modus)) - (setq frame (nth 0 res) es-gewuenscht (nth 3 res)) + (setq frame (nth 0 res) es-gewuenscht (nth 3 res) es-seite-vorab (nth 4 res)) ;; Kettenende? Bei auto-ende (Kettenende-Modus) ohne Frage direkt ES setzen. ;; ziel-ende (Option 3 IN der VF-Einheit) OHNE ES-Wunsch (dort abgefragt, ;; siehe vfl-vf-einheit): Kette endet direkt hier, kein Separator+ES, keine @@ -4682,6 +4769,8 @@ (princ (ssg-text "vfl-ist-kettenende-frage")) (princ (ssg-text "vfl-ja-separator-es")) (princ (ssg-text "vfl-nein-weiterbauen")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ist-kettenende-2opt-impl nil)) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-ja-separator-es") (ssg-text "vfl-nein-weiterbauen")) 2 @@ -4697,7 +4786,11 @@ (vfl-ziel-report frame) ) ((= antwort "1") - (setq es-s (vfl-frage-es-seite)) + ;; War die ES-Seite (+Winkel) schon in vfl-vf-einheit erfragt (Option 3, + ;; ziel-ende - dort VOR vfl-body-abschluss noetig, siehe dortiger + ;; Kommentar), hier NICHT erneut fragen (waere doppelt journalisiert und + ;; ein-dx/ein-dz wurden dort schon fuer die Zerlegung genutzt). + (setq es-s (if es-seite-vorab es-seite-vorab (vfl-frage-es-seite nil))) (setq frame (vfl-insert-es-element "VF" frame (car (frame->hz-winkel frame)) 0.0 (caddr (car frame)) es-s)) @@ -4709,6 +4802,8 @@ (princ (ssg-text "vfl-sep-an-stelle-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ja-nein-impl (list (ssg-text "vfl-sep-an-stelle-frage")))) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 "vfl-sep-an-stelle-frage")) @@ -4733,6 +4828,14 @@ sep-anzahl erg-bogen vf-eingang-lgf vf-eingang-modus eingang-laenge winkel-hoehen-erg bogen-mass fest-drop fest-laenge eingang-fertig) + ;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen (auch schon vor + ;; der ersten Praeambel-Frage) - sonst wuerde ein von einem VORHERIGEN Lauf + ;; noch gesetztes Flag (z.B. nach "Abbrechen") den allerersten vfl-in-*- + ;; Aufruf dieses NEUEN Laufs sofort wieder abbrechen (siehe zentraler Check + ;; in vfl-in-value/-value-p). Wird ausserdem in vfl-acc-reset erneut + ;; zurueckgesetzt (spaeter im Ablauf) sowie unmittelbar vor jedem "Zurueck"- + ;; Neuaufruf in vfl-modus-abbruch-sichern. + (setq *vfl-wizard-abbruch-grund* nil) (princ "\n\n=========================================") (princ (ssg-text "vfl-modus1-header")) (princ "\n=========================================") @@ -5005,9 +5108,15 @@ (setq frame (nth 0 erg) deltaL (nth 1 erg) p-aktuell (car frame)) ) ) - (if (< deltaL *vfk-vf-mindestlaenge*) + ;; KEINE pauschale "Umlenk+Motor"-Mindestlaenge mehr hier: der noetige + ;; Fussabdruck haengt davon ab, ob gleich eine Motorstation folgt oder + ;; weitergebaut wird - genau das fragt vfl-baue-horizontal-koerper + ;; ("Ist der Endpunkt der Foerderer?") und rechnet mit dem REAL + ;; gemessenen Fussabdruck (siehe vfl-vf-einheit). Hier bleibt nur der + ;; Degenerationsschutz wie bei "Neue Linie: GF". + (if (< deltaL 1.0) (progn - (princ (ssg-text "vfl-fehler-horizontal-vf-kurz")) + (princ (ssg-text "vfl-fehler-linie-zu-kurz")) (if dbg-an (dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Horizontal-VF zu kurz (deltaL=" (rtos deltaL 2 0) ")")))) @@ -5110,6 +5219,7 @@ ;; gezeigt. gf-laenge-modus="2" => Zielhoehe zuerst (Zweig B), "3" => ;; steigende GF (Sonderfall, Zweig C, KEIN Separator), sonst (Default ;; "1") Endpunkt waehlen (Zweig A, heutiges Verhalten + Separator). + (setq gf-laenge-modus "1") (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-gf-laenge-modus-impl nil)) (princ (ssg-text "vfl-gf-laenge-modus-header")) (princ (ssg-text "vfl-gf-laenge-modus-opt-endpunkt")) @@ -5132,6 +5242,7 @@ (princ (ssg-text "vfl-gf-laenge-modus-header")) (princ (ssg-text "vfl-gf-laenge-modus-opt-endpunkt")) (princ (ssg-text "vfl-gf-laenge-modus-opt-hoehe")) + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-gf-steigend-untermodus-impl nil)) (setq gf-steigend-modus (vfl-menu (ssg-text "prompt-wahl-1-2") (list (ssg-text "vfl-gf-laenge-modus-opt-endpunkt") (ssg-text "vfl-gf-laenge-modus-opt-hoehe")) 1 @@ -5265,6 +5376,10 @@ (progn (if (> sep-anzahl 0) (setq deltaH (max 0.0 (- deltaH (* sep-anzahl *vfk-separator-laenge* (sin rad3)))))) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl + (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) t nil))) + (princ (ssg-text "vfl-gefaelle-festlegen-header")) (setq winkel (vfl-in-real (ssg-textf "vfl-prompt-neigungswinkel-laenge-berechnet" (list (rtos gf-max-winkel 2 1))))) (if (null winkel) (setq winkel gf-max-winkel)) @@ -5346,13 +5461,13 @@ (progn (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl - (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) nil))) + (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) nil t))) (princ (ssg-text "vfl-gefaelle-festlegen-header")) (princ (ssg-text "vfl-gefaelle-opt-hoehe")) (princ (ssg-text "vfl-gefaelle-opt-winkel")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") (list (ssg-text "vfl-gefaelle-opt-hoehe") - (ssg-text "vfl-gefaelle-opt-winkel")) 1 + (ssg-text "vfl-gefaelle-opt-winkel")) 2 "vfl-gefaelle-festlegen-header")) (if (= antwort "2") (progn @@ -5477,7 +5592,21 @@ (setq antwort (vfl-frage-ist-kettenende)) (cond ((= antwort "1") - (setq es-seite (vfl-frage-es-seite)) + ;; ES-Element-Hardware gibt es nur fuer die Anfahrt auf der + ;; STANDARD Fallend-Basis (+gefaelle-winkel) - kommt die + ;; Kette hier steigend an (Zweig C, winkel < 0), fehlt sonst + ;; der Rueckweg-Bogen und das ES-Element wuerde in einer + ;; physisch nicht existierenden "steigend"-Orientierung + ;; angehaengt. vfl-bogen-uebergang ist bei einer bereits + ;; fallenden Ankunft ein No-Op. + (if (< winkel 0.0) + (progn + (setq erg-bogen (vfl-bogen-uebergang frame *vfk-gefaelle-winkel*)) + (setq frame (car erg-bogen)) + (setq winkel *vfk-gefaelle-winkel*) + ) + ) + (setq es-seite (vfl-frage-es-seite nil)) (setq frame (vfl-insert-es-element "GF" frame hz-neu winkel (caddr (car frame)) es-seite)) (setq fertig t)) @@ -5780,7 +5909,7 @@ ) (cond ((= antwort "1") - (setq es-seite (vfl-frage-es-seite)) + (setq es-seite (vfl-frage-es-seite nil)) (setq frame (vfl-insert-es-element "GF" frame hz-neu winkel (caddr (car frame)) es-seite)) (setq fertig t)) @@ -6990,7 +7119,7 @@ (if (null frame) (progn (princ (ssg-text "vfl-m3-nichts-gebaut")) (exit))) ;; vfl-frage-es-seite nutzt intern bereits vfl-in-value/vfl-menu - wird also ;; automatisch mitgeloggt, kein manueller dbgmsg noetig. - (setq es-seite (vfl-frage-es-seite)) + (setq es-seite (vfl-frage-es-seite nil)) (if (= run-typ "VF") (progn (setq frame (vfl2-vf-close frame (car (frame->hz-winkel frame)))) @@ -7606,7 +7735,7 @@ (princ (ssg-text "vfl-m3-lauf-abschluss-offen-hinweis"))) ((= m2-lauf-antwort "3") (setq es-vorhanden t) - (if (null es-seite) (setq es-seite (vfl-frage-es-seite)))) + (if (null es-seite) (setq es-seite (vfl-frage-es-seite nil)))) (t (setq es-vorhanden nil))))) ;; ================= PHASE B: BAUEN (messen statt schaetzen) ================= diff --git a/dcl/vf_linienzug_wizard.dcl b/dcl/vf_linienzug_wizard.dcl index c7bac0b..c30a310 100644 --- a/dcl/vf_linienzug_wizard.dcl +++ b/dcl/vf_linienzug_wizard.dcl @@ -343,6 +343,38 @@ vflw_gf_laenge_modus : dialog { } } +// Zweig C ("Steigende GF") Unterfrage: dieselben 2 Optionen wie oben +// (Endpunkt/Zielhoehe), aber OHNE die 3. Kachel "Steigend" - die existiert in +// diesem Kontext nicht mehr (wir sind ja schon im Steigend-Zweig). Bisher lief +// diese Frage mangels eigenem Dialog auf den generischen Dropdown-Fallback +// (vflw_wahl) hinaus - siehe vflw-gruppe-gf-steigend-untermodus-impl. +vflw_gf_steigend_untermodus : dialog { + label = "VarioFoerderer Assistent"; + + : column { + : text { + key = "kopf"; + label = ""; + width = 60; + } + : boxed_radio_column { + key = "modus"; + label = ""; + : radio_button { key = "modus_endpunkt"; label = "Endpunkt waehlen (Laenge ergibt sich)"; value = "1"; } + : radio_button { key = "modus_hoehe"; label = "Zielhoehe festlegen (Laenge wird berechnet)"; } + } + } + + : row { + alignment = centered; + : button { key = "back"; label = "Zurueck"; fixed_width = true; width = 12; } + spacer; + : button { key = "accept"; label = "Ok Weiter"; is_default = true; fixed_width = true; width = 12; } + spacer; + : button { key = "cancel"; label = "Abbrechen"; is_cancel = true; fixed_width = true; width = 12; } + } +} + // Separator VOR/NACH bei "Neue Linie: GF": beide Ja/Nein-Fragen in einem // Bildschirm (Toggles, da echte Ja/Nein-Fragen - kein Radio-Cluster noetig). // Siehe vflw-gruppe-sep-gf-impl in vf_linienzug.lsp. diff --git a/lang/de_DE.json b/lang/de_DE.json index 846e6e6..3975d03 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -355,10 +355,10 @@ "vfl-stufe2-diagnose-details": "\n [Details] schon-flach=%1 | aus-dx=%2 mm (Einlauf, sollte 0 sein) | ein-dx=%3 mm ein-dz=%4 mm (ES-Element) | bogen-x1=%5 mm bogen-z1=%6 mm (Eintrittsbogen 3->0 Grad, nur falls nicht schon-flach) | bogen-x2=%7 mm bogen-z2=%8 mm (Austrittsbogen 0->3 Grad, immer) | FESTE_HORIZONTAL=%9 mm (Separator+Motorstation)", "vfl-stufe2-fest-kettenende": "\n Motorstation+Separator+ES benoetigen: Laenge=%1 mm, Hoehenabsenkung=%2 mm (fest, unabhaengig vom Winkel)", "vfl-stufe2-fest-eingang": "\n Umlenkstation+Separator+Motorstation+ES benoetigen: Laenge=%1 mm, Hoehenabsenkung=%2 mm (fest, unabhaengig vom Winkel)", - "vfl-stufe2-minl": "\n [Mindestwert 1] Ohne geraden VF-Anteil (GF nach Zielhoehe dimensioniert): mindestens %1 mm Streckenlaenge noetig (vorhanden: %2 mm)", - "vfl-stufe2-minl-unmoeglich": "\n [Mindestwert 1] Nicht per Streckenlaenge loesbar: schon ohne GF-Bogen aendert sich die Hoehe um %1 mm - die Zielhoehe verlangt aber nur %2 mm (zu wenig Hoehenunterschied fuer die feste Neigung)", - "vfl-stufe2-minh": "\n [Mindestwert 2] Ohne GF-Bogen (Rest als gerader VF-Anteil, der die Hoehe nicht aendert): mindestens %1 mm Hoehenaenderung noetig (vorhanden: %2 mm)", - "vfl-stufe2-minh-unmoeglich": "\n [Mindestwert 2] Nicht per Zielhoehe loesbar: schon ohne geraden VF-Anteil und ohne GF-Bogen betraegt der feste Fussabdruck %1 mm - die Strecke bietet aber nur %2 mm", + "vfl-stufe2-minl": "\n [Mindestlaenge] Ohne geraden VF-Anteil (GF nach Zielhoehe dimensioniert): mindestens %1 mm Streckenlaenge noetig (vorhanden: %2 mm)", + "vfl-stufe2-minl-unmoeglich": "\n [Mindestlaenge] Nicht per Streckenlaenge loesbar: schon ohne GF-Bogen aendert sich die Hoehe um %1 mm - die Zielhoehe verlangt aber nur %2 mm (zu wenig Hoehenunterschied fuer die feste Neigung)", + "vfl-stufe2-minh": "\n [Fixwert ohne GF-Bogen] Rest als gerader VF-Anteil (hoehenneutral): diese Aufteilung ergibt IMMER genau %1 mm Hoehenaenderung, unabhaengig von der Laenge - Zielhoehe verlangt aber %2 mm, passt also nur bei exakter Uebereinstimmung", + "vfl-stufe2-minh-unmoeglich": "\n [Fixwert ohne GF-Bogen] Nicht per Zielhoehe loesbar: schon ohne geraden VF-Anteil und ohne GF-Bogen betraegt der feste Fussabdruck %1 mm - die Strecke bietet aber nur %2 mm", "vfl-stufe2-ungueltig": "\n Stufe 2 (horizontal+GF) war ungueltig - es wurde stattdessen Stufe 1 (VF-Winkel-Suche) versucht (siehe Tabelle oben).", "vfl-frage-gf2-minimum": "\n Berechnetes GF2=%1 mm liegt unter der ueblichen Mindestlaenge (%2 mm).\n Ja = mit den exakt berechneten %1 mm bauen (Zielpunkt wird exakt getroffen).\n Nein = auf %2 mm auffuellen (Zielpunkt verschiebt sich entsprechend weiter).", "vfl-fehler-rest-nicht-baubar": "\n FEHLER: Rest nicht baubar (zu steil/zu kurz fuer Schwanz Motor+GF2+Separator+ES). Bitte weiter zeichnen oder flacher planen.", diff --git a/lang/en_GB.json b/lang/en_GB.json index ba56e33..46cc827 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -356,10 +356,10 @@ "vfl-stufe2-diagnose-details": "\n [Details] already-flat=%1 | aus-dx=%2 mm (entry, should be 0) | ein-dx=%3 mm ein-dz=%4 mm (ES element) | bogen-x1=%5 mm bogen-z1=%6 mm (entry bend 3->0 deg, only if not already-flat) | bogen-x2=%7 mm bogen-z2=%8 mm (exit bend 0->3 deg, always) | FESTE_HORIZONTAL=%9 mm (separator+motor station)", "vfl-stufe2-fest-kettenende": "\n Motor station+separator+ES require: length=%1 mm, height drop=%2 mm (fixed, independent of angle)", "vfl-stufe2-fest-eingang": "\n Reversing station+separator+motor station+ES require: length=%1 mm, height drop=%2 mm (fixed, independent of angle)", - "vfl-stufe2-minl": "\n [Minimum 1] Without a straight VF section (GF sized to the target height): at least %1 mm of distance needed (available: %2 mm)", - "vfl-stufe2-minl-unmoeglich": "\n [Minimum 1] Not solvable via distance: even without a GF bend the height already changes by %1 mm - the target only calls for %2 mm (not enough height difference for the fixed incline)", - "vfl-stufe2-minh": "\n [Minimum 2] Without a GF bend (remainder as a straight VF section, which does not change height): at least %1 mm of height change needed (available: %2 mm)", - "vfl-stufe2-minh-unmoeglich": "\n [Minimum 2] Not solvable via target height: even without a straight VF section and without a GF bend, the fixed footprint is already %1 mm - the distance only offers %2 mm", + "vfl-stufe2-minl": "\n [Minimum distance] Without a straight VF section (GF sized to the target height): at least %1 mm of distance needed (available: %2 mm)", + "vfl-stufe2-minl-unmoeglich": "\n [Minimum distance] Not solvable via distance: even without a GF bend the height already changes by %1 mm - the target only calls for %2 mm (not enough height difference for the fixed incline)", + "vfl-stufe2-minh": "\n [Fixed value without GF bend] Remainder as a straight VF section (height-neutral): this split ALWAYS results in exactly %1 mm of height change, regardless of length - but the target height calls for %2 mm, so this only fits on an exact match", + "vfl-stufe2-minh-unmoeglich": "\n [Fixed value without GF bend] Not solvable via target height: even without a straight VF section and without a GF bend, the fixed footprint is already %1 mm - the distance only offers %2 mm", "vfl-stufe2-ungueltig": "\n Stage 2 (horizontal+GF) was invalid - stage 1 (VF angle search) was tried instead (see table above).", "vfl-frage-gf2-minimum": "\n Calculated GF2=%1 mm is below the usual minimum length (%2 mm).\n Yes = build with the exact calculated %1 mm (hits the target point exactly).\n No = pad up to %2 mm (target point shifts further accordingly).", "vfl-fuege-block-ein": "\n Inserting %1 ...",