fix: Wizard-Dropdowns auf Radiobuttons, Abbrechen-Bug, ES-Element-Ausgleichsbogen

- vfl-in-abstand/-in-selection pruefen jetzt *vfl-wizard-abbruch-grund*
  (bisher liefen beide an vfl-in-value/-value-p vorbei, ein Klick auf
  "Abbrechen" im Wizard-Dialog fiel dadurch auf einen rohen getpoint
  zurueck statt die Kette zu beenden)
- Kombiniertes ES-Element-Dialogfeld (Ja/Nein + Winkel 90/30 + Seite
  links/rechts in einem Bildschirm, analog AS-Element)
- Separator VOR/NACH (horizontales Stueck) und Ist-Kettenende-Frage von
  Dropdown auf Radiobuttons umgestellt, "Nein" als Vorgabe
- Neigungswinkel-Eingabe bei Gefaellestrecke: 3 Grad als Vorgabe statt
  "Gegebene Hoehe"
- Zweig-C-Unterfrage (Endpunkt/Zielhoehe) bei "Steigende GF" bekommt
  eigenen Radiobutton-Dialog statt generischem Dropdown-Fallback
- ES-Element-Anhaengung nach einer steigenden GF (Zweig C) baut jetzt
  vorher per vfl-bogen-uebergang zurueck auf die Standard-Fallend-Basis
  (ES-Element-Hardware gibt es nur fuer diese Anfahrt)
- Stufe-2-Diagnosetext klargestellt (Mindestlaenge vs. Fixwert ohne
  GF-Bogen)
- Horizontal-VF: 1000mm-Mindestlaenge entfernt, GF1-Ziel-Hoehe-Feature
  wiederhergestellt

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Yuelin Wang
2026-09-12 00:26:36 +02:00
co-authored by Claude Sonnet 5
parent 18ee46b361
commit 942012e44d
4 changed files with 205 additions and 44 deletions
+165 -36
View File
@@ -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) =================
+32
View File
@@ -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.
+4 -4
View File
@@ -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.",
+4 -4
View File
@@ -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 ...",