feat: VF-Linienzug Modus 1 - steigende Gefaellestrecke (Sonderfall, bis 3 Grad) mit automatischen Uebergangsboegen

Neue dritte Option "Steigend" im Dialog "Wie soll die Laenge dieser
Gefaellestrecke bestimmt werden?": erlaubt eine GF, die statt zu fallen bis
zu 3 Grad steigt (Neigungswinkel 0..3 statt bisher nur 0..3 fallend). Neuer
Helfer vfl-bogen-uebergang erkennt anhand der tatsaechlichen Frame-Neigung,
ob 0/1/2 Uebergangsboegen (Vario_Bogen_auf_3/ab_3) noetig sind, und baut sie
automatisch - fuer den Normalfall (fallend->fallend) bleibt das ein No-Op.

Ausserdem in dieser Sitzung:
- Modus 2: Separator VOR/NACH bei GF-Segmenten, Wahlfreiheit am
  Lauf-Anfang/-Ende (Umlenkstation/Motorstation optional), Stufe-1/2-
  Vereinheitlichung wie in Modus 1.
- Stufe-1/Stufe-2-Entscheidungslogik (vfl-winkel-stufe-entscheidung):
  fehlenden Stufe-2-Fallback fuer "Auf" und "Ab, steiler als 3 Grad"
  ergaenzt; ungenauen "~3 Grad reine GF"-Kurzschluss in zwei Funktionen
  durch praezise Berechnung ersetzt (behebt reale Hoehenfehler).
- Wizard-Dialoge: DCL-Text-Umbruch fuer lange Hinweise (vflw-umbruch-zeilen,
  3 Groessenvarianten statt fester Zeilenzahl), Konsolen-Echo der
  Wizard-Antworten fuer Debug-Logs.
- Neuer Regressionstest TEST_LINIENZUG_STUFE2 (linienzug_tests_stufe2.json)
  reproduziert den behobenen Stufe-2-Kettenende-Bug; bestehender
  LZ_Standard-Test an aktuelle Menue-Nummerierung angepasst (Kettenanfang-
  Menue ist inzwischen 6 statt 4 Optionen gross).
- Neue Anleitung doc/vf_linienzug_modus1_anleitung.md: Modus 1 anhand des
  obigen Testfalls erklaert (Fragen-Bedeutung, Stufe-1/2-Logik, typische
  Stolperfallen: GF laengenhungrig bei 3 Grad, fester Motor+Separator+ES-
  Fussabdruck, 90-Grad-Element-Versatz).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 09:59:27 +02:00
parent 5e944dd8c2
commit e76e24e1f3
13 changed files with 4604 additions and 895 deletions
+12
View File
@@ -767,6 +767,9 @@
;; AUS-Element: 30/90 (vor Seite), dann Seite (vor Winkelberechnung, da die ;; AUS-Element: 30/90 (vor Seite), dann Seite (vor Winkelberechnung, da die
;; Laengenanpassung von der AS/ES-Masse abhaengt). Masse fuer Variante setzen. ;; Laengenanpassung von der AS/ES-Masse abhaengt). Masse fuer Variante setzen.
(princ (ssg-text "vf-winkel-aus-header"))
(princ (ssg-text "vf-winkel-90"))
(princ (ssg-text "vf-winkel-30"))
(setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header")) (setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header"))
(princ (ssg-text "gf-seite-aus-header")) (princ (ssg-text "gf-seite-aus-header"))
(princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-links"))
@@ -776,6 +779,9 @@
(vf-set-as-masse gf-as-winkel as-seite) (vf-set-as-masse gf-as-winkel as-seite)
;; EIN-Element: 30/90 + Seite ;; EIN-Element: 30/90 + Seite
(princ (ssg-text "vf-winkel-ein-header"))
(princ (ssg-text "vf-winkel-90"))
(princ (ssg-text "vf-winkel-30"))
(setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header")) (setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header"))
(princ (ssg-text "gf-seite-ein-header")) (princ (ssg-text "gf-seite-ein-header"))
(princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-links"))
@@ -1735,6 +1741,9 @@
(setq winkel (float winkel)) (setq winkel (float winkel))
;; AUS-Element: 30/90 + Seite ;; AUS-Element: 30/90 + Seite
(princ (ssg-text "vf-winkel-aus-header"))
(princ (ssg-text "vf-winkel-90"))
(princ (ssg-text "vf-winkel-30"))
(setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header")) (setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header"))
(princ (ssg-text "gf-seite-aus-header")) (princ (ssg-text "gf-seite-aus-header"))
(princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-links"))
@@ -1743,6 +1752,9 @@
(setq as-seite (if (= antwort "2") "rechts" "links")) (setq as-seite (if (= antwort "2") "rechts" "links"))
;; EIN-Element: 30/90 + Seite ;; EIN-Element: 30/90 + Seite
(princ (ssg-text "vf-winkel-ein-header"))
(princ (ssg-text "vf-winkel-90"))
(princ (ssg-text "vf-winkel-30"))
(setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header")) (setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header"))
(princ (ssg-text "gf-seite-ein-header")) (princ (ssg-text "gf-seite-ein-header"))
(princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-links"))
+173 -56
View File
@@ -621,9 +621,14 @@
;; "vf-winkel-ein-header"). Rueckgabe: "30" oder "90" (Default 90). ;; "vf-winkel-ein-header"). Rueckgabe: "30" oder "90" (Default 90).
;; Wizard: nutzt vflw-wahl (dcl/vf_linienzug_wizard.dcl, definiert in ;; Wizard: nutzt vflw-wahl (dcl/vf_linienzug_wizard.dcl, definiert in
;; vf_linienzug.lsp) falls dieses Modul geladen und *vfl-wizard-mode* aktiv ;; vf_linienzug.lsp) falls dieses Modul geladen und *vfl-wizard-mode* aktiv
;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Fragen ;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Frage
;; (princ + getstring, de/en ueber ssg-text). Gemeinsam genutzt von ;; (getstring, de/en ueber ssg-text). Gemeinsam genutzt von Gefaellestrecke.lsp
;; Gefaellestrecke.lsp UND vf_linienzug.lsp. ;; UND vf_linienzug.lsp. Druckt selbst KEINE Kopfzeile/Optionstexte mehr (das
;; macht immer der AUFRUFER, unconditional, VOR diesem Aufruf) - sonst fehlt
;; die Kopfzeile in der Konsole genau dann, wenn ein vfl-in-value-Wrapper den
;; Wert bereits aus der Pending-Queue/dem Journal-Replay liest und diese
;; Funktion dadurch gar nicht erst aufgerufen wird (Inkonsistenz Dialog vs.
;; Konsole, siehe Aufrufer in vf_linienzug.lsp/Gefaellestrecke.lsp).
(defun vf-frage-element-winkel (headerkey / antwort) (defun vf-frage-element-winkel (headerkey / antwort)
;; Wizard-Dialog nur, wenn Wizard-Modus aktiv, vflw-wahl geladen UND die GUI ;; Wizard-Dialog nur, wenn Wizard-Modus aktiv, vflw-wahl geladen UND die GUI
;; global nicht abgeschaltet ist (Tests: (ssg-gui-aus)) - sonst Konsole/getstring. ;; global nicht abgeschaltet ist (Tests: (ssg-gui-aus)) - sonst Konsole/getstring.
@@ -638,12 +643,7 @@
(if (or (vl-catch-all-error-p antwort) (null antwort) (= antwort "")) (if (or (vl-catch-all-error-p antwort) (null antwort) (= antwort ""))
(setq antwort "1")) (setq antwort "1"))
) )
(progn (setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
(princ (ssg-text headerkey))
(princ (ssg-text "vf-winkel-90"))
(princ (ssg-text "vf-winkel-30"))
(setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
)
) )
(if (= antwort "2") "30" "90")) (if (= antwort "2") "30" "90"))
@@ -967,7 +967,7 @@
(setq horizontal-info nil) (setq horizontal-info nil)
(if (and horizontal-p (= richtung "Ab")) (if (and horizontal-p (= richtung "Ab"))
(progn (progn
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab")) (setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab" nil))
(if (and horizontal-info (caddr horizontal-info)) (if (and horizontal-info (caddr horizontal-info))
(setq ergebnis-liste (setq ergebnis-liste
(append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T)))) (append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T))))
@@ -1067,6 +1067,94 @@
) )
) )
;; ============================================================
;; TEIL 11b: DIALOG-AUSWAHL FUER TYP/LINIENZUG-MODUS (Radio-Buttons)
;; ============================================================
;; Ersetzen die beiden Konsolen-Listen am Anfang von c:VarioFoerderer durch
;; Radio-Button-Dialoge (dcl/variofoerderer.dcl, vfc_typ/vfc_linienzug_modus)
;; - alle Optionen sofort sichtbar statt Dropdown. WICHTIG: Radio-Button-
;; Labels sind im DCL fest auf Deutsch einprogrammiert (set_tile kann das
;; Label eines radio_button nicht setzen, nur den Zustand - siehe DCL-
;; Kommentar). Beide Funktionen geben deshalb nur dann etwas anderes als nil
;; zurueck, wenn GUI erlaubt ist (Tests: ssg-gui-aus) UND Deutsch aktiv ist -
;; sonst faellt der Aufrufer automatisch auf die alte, vollstaendig
;; uebersetzte Konsolen-Liste zurueck (unveraendert im Code stehen
;; geblieben). Rueckgabe jeweils: Ergebnis bei OK, 'ABBRUCH bei Cancel, nil
;; wenn der Dialog gar nicht erst gezeigt werden konnte/durfte.
;; "Zurueck" hat an dieser allerersten Frage der ganzen Anlage nichts, wohin es
;; zurueckspringen koennte - wird daher lokal aufgeloest: der Dialog wird
;; einfach erneut gezeigt (kein Sonderfall fuer den Aufrufer noetig).
(defun vfc-dialog-typ-waehlen ( / dcl-pfad dat gtyp ergebnis fertig)
(if (and (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p))
(= *ssg-lang* "de_DE")
(equal (mapcar 'car *vf-typ-registry*) '("standard" "etage" "linienzug")))
(progn
(setq fertig nil)
(while (not fertig)
(setq fertig t)
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/variofoerderer.dcl"))
(setq dat (load_dialog dcl-pfad))
(if (not (new_dialog "vfc_typ" dat))
(progn (if (and dat (>= dat 0)) (unload_dialog dat)) (setq ergebnis nil))
(progn
(set_tile "typ_standard" "1")
(action_tile "accept"
"(setq gtyp (cond ((= (get_tile \"typ_etage\") \"1\") \"etage\")
((= (get_tile \"typ_linienzug\") \"1\") \"linienzug\")
(t \"standard\")))
(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) (setq ergebnis gtyp))
((= ergebnis 2) (setq fertig nil)) ;; Zurueck: Dialog erneut zeigen
(t (setq ergebnis 'ABBRUCH))
)
)
)
)
ergebnis
)
nil
)
)
;; "Zurueck" springt zur Anlagen-Typ-Frage zurueck - Rueckgabe 'ZURUECK, vom
;; Aufrufer (c:VarioFoerderer) ausgewertet (dort erneuter Aufruf von
;; vfc-dialog-typ-waehlen statt hier lokal aufzuloesen).
(defun vfc-dialog-linienzug-modus-waehlen ( / dcl-pfad dat gmodus ergebnis)
(if (and (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p))
(= *ssg-lang* "de_DE"))
(progn
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/variofoerderer.dcl"))
(setq dat (load_dialog dcl-pfad))
(if (not (new_dialog "vfc_linienzug_modus" dat))
(progn (if (and dat (>= dat 0)) (unload_dialog dat)) nil)
(progn
(set_tile "modus_1" "1")
(action_tile "accept"
"(setq gmodus (cond ((= (get_tile \"modus_2\") \"1\") 2)
((= (get_tile \"modus_3\") \"1\") 3)
(t 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) gmodus)
((= ergebnis 2) 'ZURUECK)
(t 'ABBRUCH)
)
)
)
)
nil
)
)
;; ============================================================ ;; ============================================================
;; TEIL 12: DISPATCHER c:VarioFoerderer ;; TEIL 12: DISPATCHER c:VarioFoerderer
;; ============================================================ ;; ============================================================
@@ -1077,7 +1165,7 @@
best-winkel L_GF L_GF1 L_GF2 L_VF best-winkel L_GF L_GF1 L_GF2 L_VF
idx eintrag wahl antwort verteilung-modus idx eintrag wahl antwort verteilung-modus
n-scanner vf-nummer hoehe-von hoehe-bis lastEnt n-scanner vf-nummer hoehe-von hoehe-bis lastEnt
staustrecke-basis vf-insert) staustrecke-basis vf-insert dlg-typ dlg-modus zurueck-zu-typ)
(princ "\n=========================================") (princ "\n=========================================")
(princ (ssg-text "vfc-banner-titel")) (princ (ssg-text "vfc-banner-titel"))
@@ -1091,53 +1179,82 @@
) )
) )
(if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*)) ;; Aeussere Schleife nur wegen "Zurueck" bei der Linienzug-Modus-Frage
(progn ;; (springt zurueck zur Anlagen-Typ-Frage) - fuer Standard/Etage bleibt
(setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*)) ;; zurueck-zu-typ immer nil, die Schleife laeuft dann genau einmal.
(princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*))) (setq zurueck-zu-typ t)
(setq *vf-vorauswahl-typ* nil) (while zurueck-zu-typ
) (setq zurueck-zu-typ nil)
(progn (if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(setq *vf-vorauswahl-typ* nil) (progn
(princ (ssg-text "vfc-anlagen-typ-header")) (setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(setq idx 1) (princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*)))
(foreach eintr *vf-typ-registry* (setq *vf-vorauswahl-typ* nil)
(princ (ssg-textf "vfc-typ-option" (list idx (nth 3 eintr)))) )
(setq idx (1+ idx)) (progn
(setq *vf-vorauswahl-typ* nil)
(setq dlg-typ (vfc-dialog-typ-waehlen))
(cond
((eq dlg-typ 'ABBRUCH) (exit))
(dlg-typ (setq typ-eintr (assoc dlg-typ *vf-typ-registry*)))
(t
;; Dialog nicht verfuegbar/nicht erlaubt (GUI aus, andere Sprache,
;; abweichende Registry) - alte Konsolen-Liste unveraendert.
(princ (ssg-text "vfc-anlagen-typ-header"))
(setq idx 1)
(foreach eintr *vf-typ-registry*
(princ (ssg-textf "vfc-typ-option" (list idx (nth 3 eintr))))
(setq idx (1+ idx))
)
(setq wahl (getint (ssg-textf "vfc-prompt-wahl-1-n"
(list (length *vf-typ-registry*)))))
(if (or (null wahl) (< wahl 1) (> wahl (length *vf-typ-registry*)))
(setq wahl 1))
(setq typ-eintr (nth (1- wahl) *vf-typ-registry*))
)
)
) )
(setq wahl (getint (ssg-textf "vfc-prompt-wahl-1-n"
(list (length *vf-typ-registry*)))))
(if (or (null wahl) (< wahl 1) (> wahl (length *vf-typ-registry*)))
(setq wahl 1))
(setq typ-eintr (nth (1- wahl) *vf-typ-registry*))
) )
) (setq anlage-typ (nth 0 typ-eintr))
(setq anlage-typ (nth 0 typ-eintr)) (setq berechne-fn (nth 1 typ-eintr))
(setq berechne-fn (nth 1 typ-eintr)) (setq einfuege-fn (nth 2 typ-eintr))
(setq einfuege-fn (nth 2 typ-eintr)) (princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
(princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment- ;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/ ;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe ;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf. ;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
(if (= anlage-typ "linienzug") (if (= anlage-typ "linienzug")
(progn (progn
(princ (ssg-text "vfc-linienzug-modus-header")) (setq dlg-modus (vfc-dialog-linienzug-modus-waehlen))
(princ (ssg-text "vfc-linienzug-modus-1")) (cond
(princ (ssg-text "vfc-linienzug-modus-2")) ((eq dlg-modus 'ABBRUCH) (exit))
(princ (ssg-text "vfc-linienzug-modus-3")) ((eq dlg-modus 'ZURUECK) (setq zurueck-zu-typ t))
(setq wahl (getint (ssg-text "prompt-wahl-1-2-3"))) (dlg-modus (setq wahl dlg-modus))
;; Konsolen-Nummer -> interne Funktion: (t
;; 2 = fertiger Ziel-Hoehe-Modus (intern vf-linienzug-modus2) ;; Dialog nicht verfuegbar/nicht erlaubt - alte Konsolen-Liste.
;; 3 = alter Vorwaerts-Nachbau (intern vf-linienzug-modus3, wird umgebaut) (princ (ssg-text "vfc-linienzug-modus-header"))
;; 1/Default = frische manuelle Eingabe (Journal vorher zuruecksetzen). Ein (princ (ssg-text "vfc-linienzug-modus-1"))
;; abgebrochener Bau bleibt als VF_n-Block stehen und wird per Doppelklick (princ (ssg-text "vfc-linienzug-modus-2"))
;; fortgesetzt/editiert (vfl-edit-ent), kein separater Menuepunkt noetig. (princ (ssg-text "vfc-linienzug-modus-3"))
(cond ((= wahl 2) (vf-linienzug-modus2)) (setq wahl (getint (ssg-text "prompt-wahl-1-2-3")))
((= wahl 3) (vf-linienzug-modus3)) )
(t (vfl-journal-reset) (vf-linienzug-modus))) )
(exit) (if (not zurueck-zu-typ)
(progn
;; Konsolen-Nummer -> interne Funktion:
;; 2 = fertiger Ziel-Hoehe-Modus (intern vf-linienzug-modus2)
;; 3 = alter Vorwaerts-Nachbau (intern vf-linienzug-modus3, wird umgebaut)
;; 1/Default = frische manuelle Eingabe (Journal vorher zuruecksetzen). Ein
;; abgebrochener Bau bleibt als VF_n-Block stehen und wird per Doppelklick
;; fortgesetzt/editiert (vfl-edit-ent), kein separater Menuepunkt noetig.
(cond ((= wahl 2) (vf-linienzug-modus2))
((= wahl 3) (vf-linienzug-modus3))
(t (vfl-journal-reset) (vf-linienzug-modus)))
(exit)
)
)
)
) )
) )
@@ -1198,7 +1315,7 @@
;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert. ;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert.
(if (and (= anlage-typ "standard") (= richtung "Ab")) (if (and (= anlage-typ "standard") (= richtung "Ab"))
(progn (progn
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab")) (setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab" nil))
(if (and horizontal-info (caddr horizontal-info)) (if (and horizontal-info (caddr horizontal-info))
(progn (progn
(setq ergebnis-liste (setq ergebnis-liste
+5
View File
@@ -271,6 +271,11 @@
;; Wert geometrisch herleiten laesst statt empirisch fixiert zu bleiben. ;; Wert geometrisch herleiten laesst statt empirisch fixiert zu bleiben.
(if (null *vfk-bruecke-korrektur*) (setq *vfk-bruecke-korrektur* 10.48)) (if (null *vfk-bruecke-korrektur*) (setq *vfk-bruecke-korrektur* 10.48))
;; Konstruktions-Obergrenze (mm) fuer die Gesamtlaenge eines zusammen-
;; haengenden VF-Laufs (Modus 2, vf-linienzug-modus2) - reiner Hinweis beim
;; Ueberschreiten, kein Abbruch. Aktiv referenziert.
(if (null *vfk-vf-laenge-max*) (setq *vfk-vf-laenge-max* 25000.0))
(setq *vfk-konstanten-geladen* t) (setq *vfk-konstanten-geladen* t)
(princ "\nvf_konstanten geladen.") (princ "\nvf_konstanten geladen.")
(princ) (princ)
+2864 -711
View File
File diff suppressed because it is too large Load Diff
+34 -14
View File
@@ -337,20 +337,32 @@
;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger. ;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger.
;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR ;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR
;; KLEINE deltaH ueberhaupt gueltig (wenige cm). ;; KLEINE deltaH ueberhaupt gueltig (wenige cm).
;; schon-flach: T => KEIN Bogen1 (auf_3) am Eintritt - der Aufrufer ist
;; bereits flach (0 Grad) angekommen und wird KEINEN Uebergangsbogen bauen
;; (vermeidet ein ueberfluessiges auf_3/ab_3-Paar, wenn eine bereits flache
;; Kette ohnehin ein horizontales Mittelstueck braucht - siehe
;; vfl-body-abschluss). Default nil (unveraendertes Verhalten fuer alle
;; anderen Aufrufer, die immer von der 3-Grad-Basis starten).
;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar. ;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar.
(defun berechne-horizontale-mitte (deltaL deltaH richtung / (defun berechne-horizontale-mitte (deltaL deltaH richtung schon-flach /
mass1 mass2 rad3 bogen-x1 bogen-z1 mass1 mass2 rad3 bogen-x1 bogen-z1
bogen-x2 bogen-z2 deltaH-signiert bogen-x2 bogen-z2 deltaH-signiert
A-hz B-hz GF_total L_VF-hz gueltig) A-hz B-hz GF_total L_VF-hz gueltig)
(setq mass1 (get-bogen-mass bogen-auf (fix *vfk-gefaelle-winkel*))) (setq mass1 (if schon-flach t (get-bogen-mass bogen-auf (fix *vfk-gefaelle-winkel*))))
(setq mass2 (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*))) (setq mass2 (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*)))
(if (or (null mass1) (null mass2)) (if (or (null mass1) (null mass2))
nil nil
(progn (progn
(setq rad3 (* *vfk-gefaelle-winkel* (/ pi 180.0))) (setq rad3 (* *vfk-gefaelle-winkel* (/ pi 180.0)))
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad ;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3)))) ;; auf 0 Grad - entfaellt bei schon-flach (kein Eintrittsbogen noetig).
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3)))) (if schon-flach
(setq bogen-x1 0.0 bogen-z1 0.0)
(progn
(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 ;; Bogen2 (immer ab_3): Eintritt bei 0 Grad (von der horizontalen Mitte), biegt auf 3 Grad
(setq bogen-x2 (car mass2)) (setq bogen-x2 (car mass2))
(setq bogen-z2 (caddr mass2)) (setq bogen-z2 (caddr mass2))
@@ -412,7 +424,11 @@
;; Beginnt eine reine VF-Einheit: bringt die Kette von der (3-Grad-geneigten) ;; Beginnt eine reine VF-Einheit: bringt die Kette von der (3-Grad-geneigten)
;; AS-Seite ueber GF1 + Separator bis zur Umlenkstation. Wird pro VF-Einheit ;; AS-Seite ueber GF1 + Separator bis zur Umlenkstation. Wird pro VF-Einheit
;; GENAU EINMAL aufgerufen (auch wenn danach mehrere Sub-Segmente folgen). ;; GENAU EINMAL aufgerufen (auch wenn danach mehrere Sub-Segmente folgen).
(defun vfs-vf-entry (aktueller-punkt L_GF1 hz) ;; ohne-separator: T => der Separator entfaellt (das vorherige Kettenglied
;; IST bereits ein Separator, siehe letzter-typ in vf-linienzug-modus - eine
;; gueltige Trennstelle braucht nur einen Separator, nicht zwei hintereinander).
;; L_GF1 sollte in diesem Fall vom Aufrufer bereits auf 0 gesetzt sein.
(defun vfs-vf-entry (aktueller-punkt L_GF1 hz ohne-separator)
(if (null hz) (setq hz 0.0)) (if (null hz) (setq hz 0.0))
(setq hz (float hz)) (setq hz (float hz))
;; 1. Gefaellestrecke GF1 (verbindet AS-Neigung mit Umlenkstation) ;; 1. Gefaellestrecke GF1 (verbindet AS-Neigung mit Umlenkstation)
@@ -425,13 +441,17 @@
) )
(princ (ssg-text "vfs-vf-eingang-gf1-skip")) (princ (ssg-text "vfs-vf-eingang-gf1-skip"))
) )
;; 2. Separator (am GF1-Ende / vor Umlenkstation) ;; 2. Separator (am GF1-Ende / vor Umlenkstation) - entfaellt bei ohne-separator
(princ (ssg-text "vfs-vf-eingang-separator")) (if (not ohne-separator)
(setq aktueller-punkt (progn
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt (princ (ssg-text "vfs-vf-eingang-separator"))
(ssg-cfg-or "vario" "gefaelle_winkel" 3) (setq aktueller-punkt
(ssg-cfg-or "vario" "separator_block_dx" 300) (insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
(ssg-cfg-or "vario" "separator_block_dz" 0) hz)) (ssg-cfg-or "vario" "gefaelle_winkel" 3)
(ssg-cfg-or "vario" "separator_block_dx" 300)
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
)
)
;; 3. Umlenkstation ;; 3. Umlenkstation
(princ (ssg-text "vfs-vf-eingang-umlenk")) (princ (ssg-text "vfs-vf-eingang-umlenk"))
(setq aktueller-punkt (setq aktueller-punkt
@@ -604,7 +624,7 @@
(defun vfs-mitte-teil (aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz) (defun vfs-mitte-teil (aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz)
(if (null hz) (setq hz 0.0)) (if (null hz) (setq hz 0.0))
(setq hz (float hz)) (setq hz (float hz))
(setq aktueller-punkt (vfs-vf-entry aktueller-punkt L_GF1 hz)) (setq aktueller-punkt (vfs-vf-entry aktueller-punkt L_GF1 hz nil))
(setq aktueller-punkt (vfs-vf-koerper aktueller-punkt richtung best-winkel L_VF hz)) (setq aktueller-punkt (vfs-vf-koerper aktueller-punkt richtung best-winkel L_VF hz))
(setq aktueller-punkt (vfs-vf-exit aktueller-punkt L_GF2 hz t)) (setq aktueller-punkt (vfs-vf-exit aktueller-punkt L_GF2 hz t))
aktueller-punkt aktueller-punkt
+92 -10
View File
@@ -1,16 +1,98 @@
// ============================================================ // ============================================================
// variofoerderer.dcl - Standard-VarioFoerderer Parameter-Eingabe // variofoerderer.dcl - VarioFoerderer Parameter-Eingabe
// Zwei Dialoge fuer den Standardfall (anlage-typ "standard") von // Dialoge fuer c:VarioFoerderer (vf_core.lsp):
// c:VarioFoerderer, ersetzen die interaktive Werteingabe (Modus // vfc_typ: Anlagen-Typ waehlen (Standard/Etage/Linienzug) - ersetzt die
// "Werteingabe") aus vf-eingabe-abfragen / vf_core.lsp: // Konsolen-Liste am Befehlsanfang. Radio-Buttons statt Dropdown, daher
// Dialog 1 (variofoerderer_basis): deltaL, deltaH, Foerderrichtung, // Labels FEST auf Deutsch (siehe Kommentar bei vfc_linienzug_modus).
// Einfuegehoehe, Fahrtrichtung, Seite. // vfc_linienzug_modus: NUR bei Typ "Linienzug" - Modus 1/2/3 waehlen.
// Dialog 2 (variofoerderer_winkel): Winkel (dynamisch berechnete // variofoerderer_basis/variofoerderer_winkel: Werteingabe fuer den
// gueltige Varianten), Verteilung der Gefaellestrecken vorne/hinten. // Standardfall (anlage-typ "standard"): deltaL, deltaH, Foerderrichtung,
// Die 3D-Linie-Eingabe (Modus "3D-Linie") und andere Anlagen-Typen // Einfuegehoehe, Fahrtrichtung, Seite, Winkel, GF-Verteilung.
// (Etage, Linienzug) bleiben interaktiv (Kommandozeile). // Die 3D-Linie-Eingabe (Modus "3D-Linie"), der Etage-Typ und die
// Linienzug-Kette selbst (nach der Modus-Wahl) bleiben interaktiv
// (Kommandozeile bzw. eigener Wizard in vf_linienzug_wizard.dcl).
// ============================================================ // ============================================================
// Anlagen-Typ waehlen (Standard/Etage/Linienzug). Radio-Buttons statt
// Dropdown - alle Optionen sofort sichtbar. WICHTIG: Labels sind hier FEST
// einprogrammiert (Deutsch) und NICHT wie bei popup_list zur Laufzeit aus
// ssg-text befuellbar (set_tile kann das Label eines radio_button nicht
// setzen, nur den Zustand - siehe auch dcl/vfl_edit_modus.dcl). Bei
// aktivem Englisch (DXFM_LANG=en_GB) faellt vfc-dialog-typ-waehlen in
// vf_core.lsp automatisch auf die alte, vollstaendig uebersetzte
// Konsolen-Liste zurueck (siehe dortiger Kommentar).
vfc_typ : dialog {
label = "VarioFoerderer - Anlagen-Typ";
: boxed_radio_column {
label = "Anlagen-Typ waehlen:";
key = "typ";
: radio_button {
key = "typ_standard";
label = "Standard VarioFoerderer (AS/ES 90 Grad, horizontal versetzt)";
value = "1";
}
: radio_button {
key = "typ_etage";
label = "Etage VarioFoerderer (AS/ES 30 Grad, direkt uebereinander)";
}
: radio_button {
key = "typ_linienzug";
label = "3D-Linienzug (gemischte GF/VF-Kette)";
}
}
// 3-Button-Zeile wie im Linienzug-Wizard (dcl/vf_linienzug_wizard.dcl):
// Zurueck(2)/Ok Weiter(1)/Abbrechen(0). "Zurueck" hat hier nichts, wohin es
// zurueckspringen koennte (erste Frage der gesamten Anlage) - vf_core.lsp
// zeigt in diesem Fall einfach denselben Dialog erneut.
: 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; }
}
}
// Linienzug-Modus waehlen (nur wenn Anlagen-Typ = Linienzug). Radio-Buttons,
// gleicher Deutsch-fest-Grund wie bei vfc_typ oben.
vfc_linienzug_modus : dialog {
label = "VarioFoerderer - Linienzug Modus";
: boxed_radio_column {
label = "Linienzug-Modus waehlen:";
key = "modus";
: radio_button {
key = "modus_1";
label = "Manuelle Eingabe (Punkte klicken)";
value = "1";
}
: radio_button {
key = "modus_2";
label = "3D-Objekte + Ziel-Hoehe (Randwert-Solver, fertig)";
}
: radio_button {
key = "modus_3";
label = "3D-Objekte stueckweise (Vorwaerts-Nachbau, in Arbeit)";
}
}
// "Zurueck" springt hier sinnvoll zur Anlagen-Typ-Frage zurueck (siehe
// vfc-dialog-linienzug-modus-waehlen/c:VarioFoerderer).
: 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; }
}
}
variofoerderer_basis : dialog { variofoerderer_basis : dialog {
label = "VarioFoerderer (Standard) - Eingabe"; label = "VarioFoerderer (Standard) - Eingabe";
+713 -62
View File
@@ -31,7 +31,14 @@ vflw_zahl : dialog {
} }
} }
ok_cancel; : 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; }
}
} }
// Mehrfachauswahl (ersetzt eine princ-Menue-Liste + getstring/getint). // Mehrfachauswahl (ersetzt eine princ-Menue-Liste + getstring/getint).
@@ -55,7 +62,14 @@ vflw_wahl : dialog {
} }
} }
ok_cancel; : 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; }
}
} }
// ============================================================ // ============================================================
@@ -112,14 +126,24 @@ vflw_punkt_zahl : dialog {
} }
} }
ok_cancel; // "back" nutzt hier done_dialog 3 statt 2 - Code 2 ist bereits durch den
// "Punkt waehlen..."-Button oben belegt (siehe vflw-gruppe-punkt-hoehe-impl).
: 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; }
}
} }
// AS-/ES-Element (Kettenanfang bzw. -ende): Ja/Nein-Toggle + Winkel + Seite // AS-/ES-Element (Kettenanfang bzw. -ende): Ja/Nein-Toggle + Winkel + Seite
// in einem Bildschirm - "kopf" traegt die konkrete Frage (AS oder ES), // in einem Bildschirm - "kopf" traegt die konkrete Frage (AS oder ES),
// "setzen" bleibt bewusst generisch beschriftet, damit derselbe Dialog fuer // "setzen" bleibt bewusst generisch beschriftet, damit derselbe Dialog fuer
// beide Faelle passt. Winkel/Seite werden deaktiviert, solange der Toggle // beide Faelle passt. Winkel/Seite werden deaktiviert, solange der Toggle
// aus ist. // aus ist. Radio-Buttons statt Dropdown, Labels daher fest auf Deutsch
// (siehe Kommentar bei vfc_typ in variofoerderer.dcl).
vflw_as : dialog { vflw_as : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -133,24 +157,34 @@ vflw_as : dialog {
key = "setzen"; key = "setzen";
label = "Ja, setzen"; label = "Ja, setzen";
} }
: popup_list { : boxed_radio_column {
key = "winkel";
label = "Winkel:"; label = "Winkel:";
width = 20; key = "winkel";
: radio_button { key = "winkel_90"; label = "90 Grad"; value = "1"; }
: radio_button { key = "winkel_30"; label = "30 Grad"; }
} }
: popup_list { : boxed_radio_column {
key = "seite";
label = "Seite:"; label = "Seite:";
width = 20; key = "seite";
: radio_button { key = "seite_links"; label = "Links"; value = "1"; }
: radio_button { key = "seite_rechts"; label = "Rechts"; }
} }
} }
ok_cancel; : 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; }
}
} }
// Winkel + Seite. Wiederverwendet fuer GF-Bogen (3 Winkel-Optionen) UND // Winkel + Seite. Wiederverwendet fuer GF-Bogen (3 Winkel-Optionen: 30/60/90)
// ES-Element am Kettenende (2 Winkel-Optionen) - die Optionsliste wird pro // UND ES-Element am Kettenende (2 Winkel-Optionen: 90/30 - dort wird
// Aufruf zur Laufzeit befuellt, die Feld-Anzahl ist in beiden Faellen gleich. // "winkel_60" per mode_tile deaktiviert, siehe vflw-gruppe-winkel-seite-impl/
// vfl-glied-as-es-dialog). Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_winkel_seite : dialog { vflw_winkel_seite : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -160,22 +194,33 @@ vflw_winkel_seite : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "winkel";
label = "Winkel:"; label = "Winkel:";
width = 20; key = "winkel";
: radio_button { key = "winkel_30"; label = "30 Grad"; }
: radio_button { key = "winkel_60"; label = "60 Grad"; }
: radio_button { key = "winkel_90"; label = "90 Grad"; value = "1"; }
} }
: popup_list { : boxed_radio_column {
key = "seite";
label = "Seite:"; label = "Seite:";
width = 20; key = "seite";
: radio_button { key = "seite_links"; label = "Links"; value = "1"; }
: radio_button { key = "seite_rechts"; label = "Rechts"; }
} }
} }
ok_cancel; : 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; }
}
} }
// Vario-Kurve: Winkel + Seite + Variante (aussen/innen) in einem Bildschirm. // Vario-Kurve: Winkel + Seite + Variante (aussen/innen) in einem Bildschirm.
// Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_variokurve : dialog { vflw_variokurve : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -185,30 +230,41 @@ vflw_variokurve : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "winkel";
label = "Winkel:"; label = "Winkel:";
width = 20; key = "winkel";
: radio_button { key = "winkel_30"; label = "30 Grad"; }
: radio_button { key = "winkel_60"; label = "60 Grad"; }
: radio_button { key = "winkel_90"; label = "90 Grad"; value = "1"; }
} }
: popup_list { : boxed_radio_column {
key = "seite";
label = "Seite:"; label = "Seite:";
width = 20; key = "seite";
: radio_button { key = "seite_links"; label = "Links"; value = "1"; }
: radio_button { key = "seite_rechts"; label = "Rechts"; }
} }
: popup_list { : boxed_radio_column {
key = "variante";
label = "Variante:"; label = "Variante:";
width = 20; key = "variante";
: radio_button { key = "variante_aussen"; label = "Aussen"; value = "1"; }
: radio_button { key = "variante_innen"; label = "Innen"; }
} }
} }
ok_cancel; : 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; }
}
} }
// Gefaelle festlegen (Linie GF): Modus (Hoehe/Winkel) + EIN Wertfeld, dessen // Gefaelle festlegen (Linie GF): Modus (Hoehe/Winkel) + EIN Wertfeld, dessen
// Beschriftung sich je nach Modus umschaltet (Action-Tile auf "modus", siehe // Beschriftung sich je nach Modus umschaltet (Action-Tile auf "modus", siehe
// vflw-gruppe-gefaelle-impl in vf_linienzug.lsp). Kein Punkt-Feld - siehe // vflw-gruppe-gefaelle-impl in vf_linienzug.lsp). Kein Punkt-Feld - siehe
// Kopfkommentar oben. // Kopfkommentar oben. Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_gefaelle : dialog { vflw_gefaelle : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -218,10 +274,11 @@ vflw_gefaelle : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "modus";
label = "Eingabe als:"; label = "Eingabe als:";
width = 40; key = "modus";
: radio_button { key = "modus_winkel"; label = "Neigungswinkel eingeben"; value = "1"; }
: radio_button { key = "modus_hoehe"; label = "Gegebene Hoehe (Zielhoehe)"; }
} }
: text { : text {
key = "wlabel"; key = "wlabel";
@@ -232,15 +289,64 @@ vflw_gefaelle : dialog {
label = ""; label = "";
edit_width = 10; edit_width = 10;
} }
// Nur befuellt/sichtbar relevant, wenn vflw-gruppe-gefaelle-impl mit
// nur-winkel=T aufgerufen wird (Zweig "Zielhoehe zuerst festlegen" bei
// "Neue Linie: GF") - zeigt dann den Hinweis, dass deltaL daraus
// berechnet wird, statt der sonst hier stehenden Hoehe-Option.
: text {
key = "hinweis";
label = "";
}
} }
ok_cancel; : 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; }
}
} }
// Horizontales Stueck: Separator-vor + Separator-nach + "Foerderer-Ende?" // "Wie soll die Laenge dieser Gefaellestrecke bestimmt werden?" (Neue Linie:
// (3 Optionen) in einem Bildschirm. Kein Punkt-Feld - siehe Kopfkommentar // GF) - Endpunkt-Pick (heutiges Verhalten) ODER Zielhoehe zuerst festlegen
// oben. // (Laenge wird dann aus Zielhoehe+Winkel berechnet, siehe
vflw_horizontal : dialog { // vflw-gruppe-gf-laenge-modus-impl). Nur gezeigt, wenn bereits ein Frame
// existiert (Kettenanfang braucht weiterhin zwingend den Pick fuer die
// Richtung). Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_gf_laenge_modus : 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)"; }
: radio_button { key = "modus_steigend"; label = "Steigende GF (Sonderfall, bis 3 Grad)"; }
}
}
: 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.
vflw_sep_gf : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
: column { : column {
@@ -251,20 +357,502 @@ vflw_horizontal : dialog {
} }
: toggle { : toggle {
key = "sepvor"; key = "sepvor";
label = "Separator VOR dem Stueck"; label = "Separator VOR dieser Gefaellestrecke";
} }
: toggle { : toggle {
key = "sepnach"; key = "sepnach";
label = "Separator NACH dem Stueck"; label = "Separator NACH dieser Gefaellestrecke";
}
: popup_list {
key = "istende";
label = "Foerderer-Ende:";
width = 45;
} }
} }
ok_cancel; : 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; }
}
}
// Horizontales Stueck: nur noch "Foerderer-Ende?" (3 Optionen) - kein
// Separator mehr (siehe vfl-baue-horizontal-koerper). Kein Punkt-Feld -
// siehe Kopfkommentar oben. Radio-Buttons statt Dropdown, Labels daher fest
// auf Deutsch (siehe Kommentar bei vfc_typ in variofoerderer.dcl).
vflw_horizontal : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
label = "Foerderer-Ende:";
key = "istende";
: radio_button {
key = "istende_0";
label = "Ja (nur Motorstation setzen)";
value = "1";
}
: radio_button {
key = "istende_1";
label = "Nein (weiterbauen)";
}
: radio_button {
key = "istende_2";
label = "Ja (Motorstation setzen, Kettenende definieren)";
}
}
}
: 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; }
}
}
// "Naechstes Element waehlen" - Hauptmenue des Linienzug-Aufbaus (Modus 1).
// IMMER alle 6 Optionen im Dialog vorhanden (stabile Keys) - "Vario-Kurve"
// wird per mode_tile deaktiviert, wenn kein echter Kettenanfang vorliegt
// (siehe vflw-gruppe-naechstes-element-impl, das dort auch die Positions-
// Nummerierung passend umrechnet). Radio-Buttons statt Dropdown, Labels fest
// deutsch, OHNE Nummern-Prefix (anders als die Konsolen-Variante - hier
// braucht es keine Zifferneingabe).
vflw_naechstes_element : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_gfbogen"; label = "GF-Bogen (horizontale Kurve)"; }
: radio_button { key = "wahl_variokurve"; label = "Vario-Kurve (horizontale Kurve, 30/60/90 Grad)"; }
: radio_button { key = "wahl_liniegf"; label = "Neue Linie: GF (Gefaellestrecke)"; value = "1"; }
: radio_button { key = "wahl_linievf"; label = "Neue Linie: Ab/Auf VF (VarioFoerderer-Einheit)"; }
: radio_button { key = "wahl_horizontalvf"; label = "Neue VF mit horizontalem Anfang (Horizontal-Stueck)"; }
: radio_button { key = "wahl_linieende"; label = "Neue Linie BIS Kettenende (danach Separator + ES-Element)"; }
}
}
// PROTOTYP "Zurueck"-Button (siehe Plan curious-prancing-parasol.md): ersetzt
// ok_cancel durch eine eigene 3-Button-Zeile. done_dialog-Codes: 0=Abbrechen
// (unveraendert, is_cancel -> ESC/Leertaste wirkt weiterhin), 1=Weiter
// (unveraendert, is_default), NEU 2=Zurueck (verwirft das zuletzt gebaute
// Kettenglied und fragt es neu ab, siehe vflw-gruppe-naechstes-element-impl/
// vfl-modus-abbruch-sichern).
: 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; }
}
}
// "Ist das das Kettenende?" (Linie-GF-Segment-Schleife) - 3 feste Optionen.
// Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_kettenende : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_ja_es"; label = "Ja (ES-Element setzen)"; }
: radio_button { key = "wahl_ja_ohne_es"; label = "Ja (ohne ES-Element setzen)"; }
: radio_button { key = "wahl_nein"; label = "Nein (weiterbauen)"; value = "1"; }
}
}
: 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; }
}
}
// "Ist das Kettenende?" (2-Optionen-Variante - Ja/Nein statt der 3-Optionen-
// Variante vflw_kettenende oben). Radio-Buttons statt Dropdown, Labels fest
// deutsch.
vflw_ist_kettenende_2opt : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_ja"; label = "Ja (Separator + ES-Element setzen)"; }
: radio_button { key = "wahl_nein"; label = "Nein (weiterbauen)"; value = "1"; }
}
}
: 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; }
}
}
// GF-Verteilung (halbe Staustrecke am Ausgang GF2 oder alles am Einlauf
// GF1) - wiederverwendet fuer Modus 1 (vfl-vf-einheit-abschluss) UND Modus 3
// (Segment-Loop, br-gf-mode). Radio-Buttons statt Dropdown, Labels fest
// deutsch.
vflw_gf_verteilung : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_haelfte"; label = "Haelfte am Einlauf (GF1) + Haelfte am Ausgang (GF2)"; }
: radio_button { key = "wahl_einlauf"; label = "Alles am Einlauf (GF1), kein GF2"; value = "1"; }
}
}
: 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; }
}
}
// "Naechstes im VF" (innerhalb einer laufenden VF-Einheit weiterbauen):
// Horizontaler Foerderer / Vario-Kurve / Auf-Ab-Foerderer. Radio-Buttons
// statt Dropdown, Labels fest deutsch.
vflw_naechstes_im_vf : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_horizontal"; label = "Horizontaler Foerderer (Linie ohne Hoehendifferenz)"; }
: radio_button { key = "wahl_variokurve"; label = "Vario-Kurve (30/60/90 Grad)"; }
: radio_button { key = "wahl_aufab"; label = "Auf/Ab-Foerderer (Linie mit Hoehendifferenz)"; value = "1"; }
}
}
: 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; }
}
}
// Punkt-7-Winkel/Hoehen-Tabelle (vfl-waehle-winkel-hoehen-tabelle): 12 feste
// Radio-Slots (einer je Standard-Winkel 3-51 Grad), nicht baubare per
// mode_tile deaktiviert. WICHTIG: die radio_button-Tiles muessen DIREKTE
// Kinder eines radio_column/radio_row/boxed_radio_column-Clusters sein - eine
// Verschachtelung ueber : row {} INNERHALB des Clusters (fruehere Version)
// hebt die gegenseitige Ausschliesslichkeit auf (per Test bestaetigt: mehrere
// Radios gleichzeitig waehlbar, keins abwaehlbar)! Die Endhoehe steht daher
// NICHT im selben row-Tile, sondern in einer PARALLELEN Text-Spalte rechts
// daneben (eigene column AUSSERHALB des Radio-Clusters, per aeusserem : row
// nebeneinandergestellt, gleiche Zeilenreihenfolge) - dynamisch befuellt via
// vflw-gruppe-winkel-hoehen-impl (zeigt auch bei nicht baubaren Winkeln den
// Grund, siehe dortige Kommentare).
vflw_winkel_hoehen : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: text { label = "Winkel waehlen:"; }
: row {
: radio_column {
key = "wahl";
: radio_button { key = "w_3"; label = "3 Grad"; }
: radio_button { key = "w_6"; label = "6 Grad"; }
: radio_button { key = "w_9"; label = "9 Grad"; }
: radio_button { key = "w_12"; label = "12 Grad"; }
: radio_button { key = "w_15"; label = "15 Grad"; }
: radio_button { key = "w_18"; label = "18 Grad"; }
: radio_button { key = "w_21"; label = "21 Grad"; }
: radio_button { key = "w_27"; label = "27 Grad"; }
: radio_button { key = "w_33"; label = "33 Grad"; }
: radio_button { key = "w_39"; label = "39 Grad"; }
: radio_button { key = "w_45"; label = "45 Grad"; }
: radio_button { key = "w_51"; label = "51 Grad"; }
}
: column {
: text { key = "h_3"; label = ""; width = 48; }
: text { key = "h_6"; label = ""; width = 48; }
: text { key = "h_9"; label = ""; width = 48; }
: text { key = "h_12"; label = ""; width = 48; }
: text { key = "h_15"; label = ""; width = 48; }
: text { key = "h_18"; label = ""; width = 48; }
: text { key = "h_21"; label = ""; width = 48; }
: text { key = "h_27"; label = ""; width = 48; }
: text { key = "h_33"; label = ""; width = 48; }
: text { key = "h_39"; label = ""; width = 48; }
: text { key = "h_45"; label = ""; width = 48; }
: text { key = "h_51"; label = ""; width = 48; }
}
}
}
: 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; }
}
}
// Winkel-Wahl aus berechne-alle-winkel (Zielhoehe-basierter Solve, mehrere
// gueltige Winkel): wie vflw_winkel_hoehen (radio_column direkt, Text-Spalte
// parallel daneben), aber die Text-Spalte zeigt L_GF+L_VF statt Endhoehe
// (dynamisch befuellt, siehe vflw-gruppe-winkel-wahl-impl).
vflw_winkel_wahl : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: text { label = "Winkel waehlen:"; }
: row {
: radio_column {
key = "wahl";
: radio_button { key = "w_3"; label = "3 Grad"; }
: radio_button { key = "w_6"; label = "6 Grad"; }
: radio_button { key = "w_9"; label = "9 Grad"; }
: radio_button { key = "w_12"; label = "12 Grad"; }
: radio_button { key = "w_15"; label = "15 Grad"; }
: radio_button { key = "w_18"; label = "18 Grad"; }
: radio_button { key = "w_21"; label = "21 Grad"; }
: radio_button { key = "w_27"; label = "27 Grad"; }
: radio_button { key = "w_33"; label = "33 Grad"; }
: radio_button { key = "w_39"; label = "39 Grad"; }
: radio_button { key = "w_45"; label = "45 Grad"; }
: radio_button { key = "w_51"; label = "51 Grad"; }
}
: column {
: text { key = "h_3"; label = ""; width = 48; }
: text { key = "h_6"; label = ""; width = 48; }
: text { key = "h_9"; label = ""; width = 48; }
: text { key = "h_12"; label = ""; width = 48; }
: text { key = "h_15"; label = ""; width = 48; }
: text { key = "h_18"; label = ""; width = 48; }
: text { key = "h_21"; label = ""; width = 48; }
: text { key = "h_27"; label = ""; width = 48; }
: text { key = "h_33"; label = ""; width = 48; }
: text { key = "h_39"; label = ""; width = 48; }
: text { key = "h_45"; label = ""; width = 48; }
: text { key = "h_51"; label = ""; width = 48; }
}
}
}
: 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; }
}
}
// Generische Ja/Nein-Rueckfrage (2 Radio-Buttons, dynamischer Kopftext) -
// wiederverwendet z.B. fuer "trotzdem mit Mindestlaenge bauen?" (Zu-kurz-
// Nachfrage in vfl-baue-horizontal-koerper). Radio-Buttons statt Dropdown,
// Labels fest deutsch (nur "kopf" wird je Aufruf per set_tile befuellt).
// Drei Groessenvarianten (1/3/6 Kopf-Zeilen) statt EINER Variante mit immer 6
// Zeilen: DCL kann Tiles nicht dynamisch ausblenden/schrumpfen - ein leeres
// text-Tile belegt trotzdem seine volle Zeilenhoehe (grosse Luecke bei kurzen
// Hinweisen wie "Zusaetzlichen Separator einfuegen?"). vflw-gruppe-ja-nein-impl
// waehlt anhand der per vflw-umbruch-zeilen ermittelten Zeilenzahl die
// passende Variante (1/3/6). Alle drei teilen dieselben Tile-Keys "kopf1".."kopfN"
// plus "wahl"/"wahl_ja"/"wahl_nein"/"back"/"accept"/"cancel" - der Aufrufer
// muss dadurch NICHT zwischen ihnen unterscheiden, ausser bei new_dialog/
// set_tile fuer die (in der kleineren Variante gar nicht vorhandenen) hoeheren
// kopfN-Tiles.
vflw_ja_nein_1 : dialog {
label = "VarioFoerderer Assistent";
: column {
: text { key = "kopf1"; label = ""; width = 70; }
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_ja"; label = "Ja"; value = "1"; }
: radio_button { key = "wahl_nein"; label = "Nein"; }
}
}
: 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; }
}
}
vflw_ja_nein_3 : dialog {
label = "VarioFoerderer Assistent";
: column {
: text { key = "kopf1"; label = ""; width = 70; }
: text { key = "kopf2"; label = ""; width = 70; }
: text { key = "kopf3"; label = ""; width = 70; }
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_ja"; label = "Ja"; value = "1"; }
: radio_button { key = "wahl_nein"; label = "Nein"; }
}
}
: 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; }
}
}
vflw_ja_nein_6 : dialog {
label = "VarioFoerderer Assistent";
: column {
: text { key = "kopf1"; label = ""; width = 70; }
: text { key = "kopf2"; label = ""; width = 70; }
: text { key = "kopf3"; label = ""; width = 70; }
: text { key = "kopf4"; label = ""; width = 70; }
: text { key = "kopf5"; label = ""; width = 70; }
: text { key = "kopf6"; label = ""; width = 70; }
: boxed_radio_column {
key = "wahl";
label = "";
: radio_button { key = "wahl_ja"; label = "Ja"; value = "1"; }
: radio_button { key = "wahl_nein"; label = "Nein"; }
}
}
: 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; }
}
}
// Generische Auf/Ab-Richtungsfrage (2 Radio-Buttons, dynamischer Kopftext) -
// wiederverwendet fuer Punkt 7 (Kletter-Teilstrecke ohne Zielhoehe, sowohl
// "Naechstes im VF" als auch "Neue Linie: Ab/Auf VF" mit reduziertem
// Eingang). Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_richtung : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
key = "richtung";
label = "";
: radio_button { key = "richtung_auf"; label = "Auf"; value = "1"; }
: radio_button { key = "richtung_ab"; label = "Ab"; }
}
}
: 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; }
}
}
// Startpunkt-Typ (kein eindeutiger GF-/VF-Baustein per KS_AUS-Scan erkannt,
// siehe vfl-eingang-modus-bestimmen): EINE flache 3-Optionen-Frage statt
// verschachtelter Zwei-Schritt-Abfrage - ist der Vorgaenger unklar, sind alle
// drei Ergebnisse gleichwertig direkt waehlbar. Radio-Buttons statt Dropdown,
// Labels fest deutsch (GF-Stumpf-Laenge als Default-Wert 400mm statisch im
// Label, siehe *vfl-gf-min-laenge*).
vflw_startpunkt_typ : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
label = "Eingang:";
key = "eingang";
: radio_button { key = "eingang_direkt"; label = "Direkt Umlenkstation (kein GF-Stueck)"; value = "1"; }
: radio_button { key = "eingang_stumpf"; label = "GF-Stueck (min. 400mm) + Umlenkstation"; }
: radio_button { key = "eingang_ohne"; label = "Ohne Umlenkstation (VF-Fortsetzung)"; }
}
}
: 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; }
}
} }
// ============================================================ // ============================================================
@@ -278,6 +866,7 @@ vflw_horizontal : dialog {
// Modus 2, Segment "Gerade": Typ (GF/VF) + [nur bei GF aktiv] GF-Neigung. // Modus 2, Segment "Gerade": Typ (GF/VF) + [nur bei GF aktiv] GF-Neigung.
// Das Neigungsfeld wird per action_tile auf "typ" aktiviert/deaktiviert. // Das Neigungsfeld wird per action_tile auf "typ" aktiviert/deaktiviert.
// Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_seg_linie_m2 : dialog { vflw_seg_linie_m2 : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -287,10 +876,11 @@ vflw_seg_linie_m2 : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "typ";
label = "Typ:"; label = "Typ:";
width = 40; key = "typ";
: radio_button { key = "typ_gf"; label = "GF (Neigungswinkel)"; value = "1"; }
: radio_button { key = "typ_vf"; label = "VF (Bruecke)"; }
} }
: text { : text {
key = "wlabel"; key = "wlabel";
@@ -301,6 +891,11 @@ vflw_seg_linie_m2 : dialog {
label = ""; label = "";
edit_width = 10; edit_width = 10;
} }
: boxed_column {
label = "Separator (nur bei GF):";
: toggle { key = "sep_vor"; label = "Separator VOR diesem GF-Stueck"; }
: toggle { key = "sep_nach"; label = "Separator NACH diesem GF-Stueck"; }
}
} }
ok_cancel; ok_cancel;
@@ -309,7 +904,8 @@ vflw_seg_linie_m2 : dialog {
// Modus 3, Segment "Gerade": Typ (GF / VF-Ab / VF-Auf / VF-Horizontal) + EIN // Modus 3, Segment "Gerade": Typ (GF / VF-Ab / VF-Auf / VF-Horizontal) + EIN
// Wertfeld, dessen Beschriftung mit dem Typ umschaltet (GF -> Neigung, // Wertfeld, dessen Beschriftung mit dem Typ umschaltet (GF -> Neigung,
// VF-Ab/Auf -> Vario-Winkel, VF-Horizontal -> Feld deaktiviert). Umschaltung // VF-Ab/Auf -> Vario-Winkel, VF-Horizontal -> Feld deaktiviert). Umschaltung
// per action_tile auf "typ" (siehe vflw-seg-linie-m3-impl). // per action_tile auf "typ" (siehe vflw-seg-linie-m3-impl). Radio-Buttons
// statt Dropdown, Labels fest deutsch.
vflw_seg_linie_m3 : dialog { vflw_seg_linie_m3 : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -319,10 +915,13 @@ vflw_seg_linie_m3 : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "typ";
label = "Typ:"; label = "Typ:";
width = 45; key = "typ";
: radio_button { key = "typ_gf"; label = "GF (Neigungswinkel)"; value = "1"; }
: radio_button { key = "typ_vfab"; label = "VF-Ab"; }
: radio_button { key = "typ_vfauf"; label = "VF-Auf"; }
: radio_button { key = "typ_vfhor"; label = "VF-Horizontal"; }
} }
: text { : text {
key = "wlabel"; key = "wlabel";
@@ -340,7 +939,9 @@ vflw_seg_linie_m3 : dialog {
// Segment "Eck/Bogen" (Modus 2 + Modus 3 identisch): Typ (GF-Bogen / // Segment "Eck/Bogen" (Modus 2 + Modus 3 identisch): Typ (GF-Bogen /
// Vario-Kurve) + [nur bei Vario-Kurve aktiv] Variante (aussen/innen). Die // Vario-Kurve) + [nur bei Vario-Kurve aktiv] Variante (aussen/innen). Die
// Variante-Liste wird per action_tile auf "typ" aktiviert/deaktiviert. // Variante-Gruppe wird per action_tile auf "typ" aktiviert/deaktiviert, die
// Vario-Kurve-Option selbst ggf. ueber "vario-erlaubt" (mode_tile), siehe
// vflw-seg-bogen-impl. Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_seg_bogen : dialog { vflw_seg_bogen : dialog {
label = "VarioFoerderer Assistent"; label = "VarioFoerderer Assistent";
@@ -350,15 +951,65 @@ vflw_seg_bogen : dialog {
label = ""; label = "";
width = 60; width = 60;
} }
: popup_list { : boxed_radio_column {
key = "typ";
label = "Typ:"; label = "Typ:";
width = 40; key = "typ";
: radio_button { key = "typ_gfbogen"; label = "GF-Bogen"; value = "1"; }
: radio_button { key = "typ_vario"; label = "Vario-Kurve"; }
} }
: popup_list { : boxed_radio_column {
key = "variante";
label = "Variante:"; label = "Variante:";
width = 30; key = "variante";
: radio_button { key = "variante_aussen"; label = "Aussen"; value = "1"; }
: radio_button { key = "variante_innen"; label = "Innen"; }
}
}
ok_cancel;
}
// Modus 2: Lauf-Abschluss, NUR wenn der VF-Lauf das Ende des gewaehlten Pfads
// ist (kein Back-Lauf danach) - siehe vflw-m2-lauf-abschluss-impl. Radio-
// Buttons, Labels fest deutsch.
vflw_m2_lauf_abschluss : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
label = "Lauf beenden mit:";
key = "abschluss";
: radio_button { key = "abschluss_offen"; label = "Ohne Motorstation (offenes Ende, spaeter fortsetzen)"; }
: radio_button { key = "abschluss_motor"; label = "Motorstation setzen"; value = "1"; }
: radio_button { key = "abschluss_motor_es"; label = "Motorstation + ES-Element setzen (Kettenende)"; }
}
}
ok_cancel;
}
// Modus 2: Lauf-Anfang, NUR wenn der VF-Lauf der Anfang des gewaehlten Pfads
// ist (kein Front-Lauf davor) - siehe vflw-m2-lauf-anfang-impl. Radio-Buttons,
// Labels fest deutsch.
vflw_m2_lauf_anfang : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: boxed_radio_column {
label = "Lauf beginnen mit:";
key = "anfang";
: radio_button { key = "anfang_offen"; label = "Ohne Umlenkstation (offener Anfang, spaeter fortsetzen)"; }
: radio_button { key = "anfang_umlenk"; label = "Umlenkstation direkt (kein GF1/Separator)"; }
: radio_button { key = "anfang_umlenk_gf1"; label = "Umlenkstation mit GF1 + Separator"; value = "1"; }
} }
} }
+194
View File
@@ -0,0 +1,194 @@
# VF-Linienzug Modus 1 - Anleitung anhand eines realen Beispiels
Diese Anleitung erklaert Modus 1 des VF-Linienzugs ("Manuelle Eingabe",
`vf-linienzug-modus` in `Lisp/vf_linienzug.lsp`) nicht abstrakt, sondern
Schritt fuer Schritt anhand eines echten, in BricsCAD gebauten und
verifizierten Beispiels. Dasselbe Beispiel ist als automatisierter
Regressionstest hinterlegt: `tests/testdata/linienzug_tests_stufe2.json`,
aufrufbar in BricsCAD ueber `TEST_LINIENZUG_STUFE2` (siehe
`tests/test_linienzug.lsp`). Wer die Zahlen selbst nachvollziehen will, kann
diesen Testlauf jederzeit wiederholen.
Fuer die Architektur-Details (Frame-Kette, Journal/XDATA, Wizard-Dialoge)
siehe `doc/variofoerderer.md` und `doc/VarioFoerderer_Linienzug_Prinzipien.md`.
Diese Anleitung konzentriert sich auf die Bedienung und die typischen
Stolperfallen.
## 1. Was ist Modus 1?
Modus 1 baut eine VF-Linienzug-Kette **interaktiv, Element fuer Element**:
Sie klicken/geben nacheinander Punkte, Laengen, Winkel und Ja/Nein-
Entscheidungen ein, und jede Antwort erzeugt sofort ein Stueck Geometrie
(Umlenkstation, Gefaellestrecke, VF-Einheit, Vario-Kurve, ...). Das
unterscheidet Modus 1 von:
- **Modus 2** (Ziel-Hoehe-Modus): Sie zeichnen vorher einen Pfad (LINE/ARC-
Kette) und eine Zielhoehe, das Programm loest die Kette automatisch.
- **Modus 3** (Vorwaerts-Nachbau): rekonstruiert eine Kette aus einer
bestehenden Zeichnung (Legacy, wird umgebaut).
**Aufruf:** Befehl `FOERDERANLAGE` (bzw. `VarioFoerderer`) -> Anlagen-Typ
"Linienzug" waehlen -> Modus "1" (Manuelle Eingabe).
Jede Eingabe wird in einem Journal mitgeschrieben und als XDATA auf den
fertigen `VF_n`-Block geschrieben. Ein Abbruch (ESC) loescht dadurch nichts -
die bis dahin gebaute Teilkette bleibt als Block stehen und ist per
Doppelklick weiter bearbeitbar.
## 2. Das Beispiel im Ueberblick
Die Kette aus `linienzug_tests_stufe2.json` sieht so aus (Grundriss, von
oben betrachtet):
```
Start (Z=2154) --AS 90 links--> Horizontal-VF --Vario 90 rechts innen-->
--Horizontal-VF--> --Vario 90 rechts innen--> Linie-GF (3 Grad, Separator
vor+nach) --> Horizontal-VF --Vario 30 rechts innen--> Auf 27 Grad
--Vario 30 links aussen--> Kettenende (Motorstation + ES 90 links)
```
Kurz gesagt: die Kette startet auf Z=2154, macht zwei 90-Grad-Schwenks im
Grundriss, faellt ueber ein eigenstaendiges GF-Stueck (3 Grad) etwas ab,
steigt dann in einer zweiten VF-Einheit um 27 Grad wieder an, und muss am
Ende exakt auf die Starthoehe (2154mm) zurueckkommen. Genau dieser letzte
Schritt - der Rest-Hoehenausgleich passt zu keinem der Standard-Winkel mehr -
ist der interessante Teil (siehe Abschnitt 4, Stufe 1/Stufe 2).
## 3. Die Fragen der Reihe nach
Diese Tabelle zitiert die tatsaechlichen Konsolen-Fragen aus dem Testfall
(Kommentar-Spalte = `kommentar`-Feld im JSON) und erklaert, was jede Frage
bedeutet.
| # | Frage (sinngemaess) | Antwort im Beispiel | Bedeutung |
|---|---|---|---|
| 1 | Startpunkt der Kette | Klick (X/Y) | Beliebiger Punkt in der Zeichnung |
| 2 | Hoehe (Z) Startpunkt | 2154 | Absolute Einbauhoehe des Kettenanfangs |
| 3 | AS-Element setzen? | Ja | Umlenkstation am Anfang - "AS" = Ausgangs-/Anfangs-Element |
| 4 | AS-Element Winkel | 90 Grad | Baugroesse des Umlenkstations-Blocks (90 oder 30 Grad Kurvenradius) |
| 5 | AS-Seite | links | Auf welcher Seite die Umlenkstation seitlich ausschwenkt |
| 6 | Naechstes Element | Horizontal-VF | Kettenanfang-Menue hat 6 Optionen (GF-Bogen, Vario-Kurve, Linie-GF, Linie-VF, Horizontal-VF, Linienende) |
| 7 | Endpunkt Horizontal-VF | Klick | Laenge/Richtung der ersten VF-Einheit |
| 8 | Ziel-Hoehe Eingang GF1 | 1980 | Hoehe, auf die der Eingangs-GF-Anteil der VF-Einheit einregelt |
| 9 | Ist der Endpunkt der Foerderer? | Nein | Innerhalb der VF-Einheit: "geht die Kette hier zu Ende?" |
| 10-13 | Naechstes im VarioFoerderer -> Vario-Kurve 90 rechts innen | - | Grundriss-Schwenk INNERHALB der laufenden VF-Einheit |
| 14 | Ist der Endpunkt der Foerderer? | Nein | s.o. |
| 15-16 | Horizontaler Foerderer, Endpunkt | Klick | Weiteres gerades VF-Sub-Segment |
| 17 | Ist der Endpunkt der Foerderer? | Nein | s.o. |
| 18-21 | Vario-Kurve 90 rechts innen | - | Zweiter Grundriss-Schwenk |
| 22 | Ist der Endpunkt der Foerderer? | Ja, nur Motorstation | Schliesst die 1. VF-Einheit ab (Motorstation, kein ES) |
| 23 | Ist das Kettenende (ES-Element)? | Nein, weiterbauen | Nach der Motorstation: geht die Kette weiter? |
| 24 | Zusaetzlichen Separator hier? | Nein | Optionaler Separator direkt an der Motorstation |
| 25 | Naechstes Element | Neue Linie: GF | Jetzt folgt ein reines Gefaellestrecke-Element (kein VF) |
| 26 | Laenge bestimmen ueber | Endpunkt waehlen | Alternativ: Zielhoehe zuerst festlegen (siehe `vfl-gf-laenge-modus`) |
| 27 | Endpunkt Gefaellestrecke | Klick | Bestimmt deltaL der GF-Geraden |
| 28-29 | Separator VOR / NACH? | Ja / Ja | GF-Stuecke werden ueber Separatoren mechanisch begrenzt |
| 30-31 | Gefaelle festlegen -> Neigungswinkel | 3 Grad | Direkter Winkel (Alternative: Zielhoehe -> Winkel wird berechnet) |
| 32 | Ist das Kettenende? | Nein, weiterbauen | 3-Optionen-Menue: Ja+ES / Ja ohne ES / Nein |
| 33 | Naechstes Element | Horizontal-VF (2. Einheit) | Neue VF-Einheit beginnt direkt am GF-Ausgang (Separator als Eingang) |
| 34-49 | (wie oben: Vario-Kurven, Auf/Ab-Foerderer 27 Grad) | - | s.o. |
| 50 | Ist der Endpunkt der Foerderer? | Ja, Motorstation + Kettenende | Startet den automatischen Kettenende-Abschluss |
| 51-53 | ES-Element setzen? / Winkel / Seite | Ja / 90 / links | Ausgangs-Element, spiegelbildlich zum AS-Element |
| 54 | Endpunkt Kettenende | Klick | Letzter gewuenschter Punkt der Kette |
| 55 | Ziel-Hoehe Kettenende | 2154 | Muss wieder exakt die Starthoehe sein |
| 56 | (automatisch, keine Eingabe) | - | Stufe-1/Stufe-2-Loeser rechnet, siehe Abschnitt 4 |
| 57 | GF2=86mm unter Mindestlaenge - trotzdem bauen? | Ja | Sicherheitsfrage, siehe Abschnitt 4 |
**Wichtig zu Frage 9/14/17 ("Ist der Endpunkt der Foerderer?"):** Diese Frage
kommt IMMER, wenn Sie innerhalb einer laufenden VF-Einheit einen Punkt
gepickt haben. "Nein" heisst: der gepickte Punkt ist nur eine
Zwischen-Etappe, es geht in derselben VF-Einheit weiter (Vario-Kurve,
weiteres gerades Stueck, Auf/Ab). "Ja" beendet die VF-Einheit mit einer
Motorstation - optional zusaetzlich mit ES-Element (echtes Kettenende).
## 4. Stufe 1 / Stufe 2 - wie die letzte Strecke berechnet wird
Am Kettenende (Frage 55/56) ist die Aufgabe: von der aktuellen Position/
Hoehe zur gewuenschten Ziel-Hoehe kommen, UND dabei die feste Baugruppe
Motorstation + Separator (+ ES-Element, falls gewaehlt) unterbringen. Das
Programm versucht das in zwei Stufen (`vfl-winkel-stufe-entscheidung`,
`Lisp/vf_linienzug.lsp`):
- **Stufe 1 - Winkeltabelle:** Es probiert der Reihe nach die festen
Vario-Kurven-Winkel 3/6/9/12/15/18/21/27/33/39/45/51 Grad durch
(`berechne-alle-winkel`) und prueft, ob einer davon eine PASSENDE,
positive VF-Laenge ergibt. Das ist der Normalfall (siehe die Zeilen
"34-49" in der Tabelle: der Auf/Ab-Foerderer in der 2. VF-Einheit findet
so einen passenden Winkel, Auswahl-Index 8 = 27 Grad).
- **Stufe 2 - Horizontale Mitte + GF-Ausgleich:** Wenn KEIN Tabellenwinkel
passt (wie im Beispiel: alle 12 Kandidaten ergeben eine negative
VF-Laenge, die Reststrecke ist einfach zu kurz fuer einen echten
Vertikalbogen), rechnet `berechne-horizontale-mitte` eine andere Loesung:
ein HORIZONTALES VF-Stueck (winkel=0) plus eine kurze Gefaellestrecke
(GF2), die exakt den fehlenden Hoehenunterschied ausgleicht. Im Beispiel:
GF2=86mm, VF=286mm.
Die Formel dahinter ist simpel und lohnt sich zu verinnerlichen: bei einem
FESTEN Neigungswinkel von 3 Grad braucht ein Hoehenausgleich von `H`
Millimetern eine GF-Laenge von `H / tan(3 Grad) ~= H * 19`. Ein winziger
Hoehenrest von z.B. 49mm braucht demnach bereits ~935mm GF-Laenge - siehe
Abschnitt 5.a. GF2 im Beispiel (86mm) ist kuerzer als die uebliche
Mindestlaenge (400mm, `*vfl-gf-min-laenge*`) - deshalb die Rueckfrage in
Schritt 57 ("trotzdem mit 86mm bauen?"). "Ja" baut trotzdem exakt mit dem
berechneten Wert; "Nein" wuerde den bis dahin gebauten Teil verwerfen (siehe
`vfl-loesche-seit`/`vfl-modus-abbruch-sichern`).
**Merksatz:** Stufe 1 sucht einen "sauberen" Standard-Winkel; Stufe 2 ist
der Rettungsanker, wenn dafuer schlicht nicht genug Platz ist - er tauscht
einen Vertikalbogen gegen "flach + minimaler GF-Ausgleich".
## 5. Typische Stolperfallen
### a) Gefaellestrecke (GF) ist "laengenhungrig" bei 3 Grad
3 Grad ist ein SEHR flacher Winkel. `tan(3 Grad) ~= 0.0524`, also braucht
jeder Millimeter Hoehenunterschied ungefaehr **19mm** Laenge:
```
Laenge = Hoehendifferenz / tan(3 Grad) ~= Hoehendifferenz * 19
```
Wer nur wenige mm bis cm Hoehenunterschied ausgleichen will, bekommt damit
schnell GF-Laengen im halben bis ganzen Meterbereich. Das ist die haeufigste
Ursache fuer "die Reststrecke ist zu kurz"-Meldungen und fuer den
Stufe-2-Fallback aus Abschnitt 4. Falls eine GF partout nicht passt: entweder
mehr Grundriss-Laenge einplanen, oder pruefen, ob ein Vertikalbogen
(Vario-Kurve mit groesserem Winkel, siehe Stufe 1) die bessere Wahl ist.
### b) Motorstation + Separator + ES-Element haben einen FESTEN Fussabdruck
Am Kettenende ist nicht die ganze gepickte Reststrecke frei verfuegbar -
ein fester Anteil ist fuer Motorstation und Separator reserviert
(`*vfk-feste-horizontal-kettenende*` = 800mm = 500mm Motorstation + 300mm
Separator), und falls zusaetzlich ein ES-Element gewaehlt wird, kommt dessen
eigener Fussabdruck (abhaengig von 30/90 Grad Bauform) noch oben drauf. Wer
diese festen 800mm (+ ES) nicht einplant, landet schnell bei einer negativen
"freien" Reststrecke - genau der Fall, der in Abschnitt 4 den Stufe-2-
Fallback ausloest.
### c) Seitlicher Versatz bei 90-Grad-AS/ES-Elementen ist NORMAL
Ein AS- oder ES-Element mit 90 Grad Bauform dreht die Fahrtrichtung nicht
einfach "auf der Stelle" - sein Block hat eine reale Baugroesse mit einem
seitlichen (quer zur Fahrtrichtung liegenden) Versatz. Im Standard-Testfall
(`linienzug_tests.json`) betraegt dieser Versatz ca. 637mm (`dY`), im
Stufe-2-Testfall ca. 638mm (`dX`, da die Fahrtrichtung dort anders liegt).
**Das ist kein Baufehler** - es ist die tatsaechliche Geometrie des
90-Grad-ES/AS-Blocks. Ein "Ist-Ziel-Report" mit einer Restabweichung von
ca. 638mm quer zur letzten Fahrtrichtung, aber ~0mm in Laengs-/Hoehenrichtung,
ist ein KORREKTES Ergebnis, keine Abweichung, die weiter untersucht werden
muss.
## 6. Nachvollziehen / Nachbauen
- Live in BricsCAD: `FOERDERANLAGE` -> Linienzug -> Modus 1, und die
Eingaben aus der Tabelle in Abschnitt 3 der Reihe nach eintippen/klicken.
- Automatisiert (ohne Klicks): Befehl `TEST_LINIENZUG_STUFE2` (nach Laden
von `tests/test_linienzug.lsp`) spielt exakt dieselbe Sequenz aus
`tests/testdata/linienzug_tests_stufe2.json` ab und meldet das
Ist-Ziel-Ergebnis in der Konsole.
- Debug-Log: mit `dbgopen`/dem zentralen Debug-Schalter (siehe
`Lisp/ssg_dbg.lsp`) lassen sich alle `GEOMETRIE:`/`GEOMETRIE ERFOLG:`-
Zeilen in eine `.dbg`-Datei im Log-Verzeichnis mitschreiben - hilfreich,
um genau wie in diesem Beispiel eine reale Sitzung nachtraeglich in
einen Testfall zu verwandeln.
+88 -4
View File
@@ -2,6 +2,7 @@
"texts": { "texts": {
"vfl-alert-gf-modul-fehlt": "Gefaellestrecke-Modul nicht geladen!\nDer Linienzug-Typ benoetigt Gefaellestrecke.lsp\n(GF-Segmente und GF-Boegen). Bitte Menue laden.", "vfl-alert-gf-modul-fehlt": "Gefaellestrecke-Modul nicht geladen!\nDer Linienzug-Typ benoetigt Gefaellestrecke.lsp\n(GF-Segmente und GF-Boegen). Bitte Menue laden.",
"vfl-prompt-startpunkt-kette": "\n\nStartpunkt der Kette waehlen: ", "vfl-prompt-startpunkt-kette": "\n\nStartpunkt der Kette waehlen: ",
"vfl-prompt-richtung-waehlen": "\n\nFahrtrichtung waehlen (Punkt in gewuenschter Richtung klicken - der Abstand wird ignoriert): ",
"vfl-prompt-hoehe-startpunkt-kette": "\nHoehe (Z) des Startpunkts [%1]: ", "vfl-prompt-hoehe-startpunkt-kette": "\nHoehe (Z) des Startpunkts [%1]: ",
"vfl-abgebrochen": "\nAbgebrochen.", "vfl-abgebrochen": "\nAbgebrochen.",
"vfl-as-setzen-frage": "\n\nAS-Element setzen?", "vfl-as-setzen-frage": "\n\nAS-Element setzen?",
@@ -19,24 +20,53 @@
"vfl-menu-horizontal-vf-3": "\n 3 - Neue VF mit horizontalem Anfang (Horizontal-Stueck)", "vfl-menu-horizontal-vf-3": "\n 3 - Neue VF mit horizontalem Anfang (Horizontal-Stueck)",
"vfl-menu-linie-ende-4": "\n 4 - Neue Linie BIS Kettenende (danach Separator + ES-Element)", "vfl-menu-linie-ende-4": "\n 4 - Neue Linie BIS Kettenende (danach Separator + ES-Element)",
"vfl-prompt-wahl-1-4-def1": "\nIhre Wahl (1-4) [1]: ", "vfl-prompt-wahl-1-4-def1": "\nIhre Wahl (1-4) [1]: ",
"vfl-fehler-horizontal-vf-kurz": "\nFEHLER: Horizontaler VF braucht >= 1000 mm (Umlenk + Motor) - laenger zeichnen.", "vfl-menu-gf-bogen-ka-1": "\n 1 - GF-Bogen (horizontale Kurve)",
"vfl-menu-variokurve-ka-2": "\n 2 - Vario-Kurve (horizontale Kurve, 30/60/90 Grad)",
"vfl-menu-linie-gf-ka-3": "\n 3 - Neue Linie: GF (Gefaellestrecke)",
"vfl-menu-linie-vf-ka-4": "\n 4 - Neue Linie: Ab/Auf VF (VarioFoerderer-Einheit)",
"vfl-menu-horizontal-vf-ka-5": "\n 5 - Neue VF mit horizontalem Anfang (Horizontal-Stueck)",
"vfl-menu-linie-ende-ka-6": "\n 6 - Neue Linie BIS Kettenende (danach Separator + ES-Element)",
"vfl-prompt-wahl-1-6-def3": "\nIhre Wahl (1-6) [3]: ",
"vfl-fehler-horizontal-fussabdruck-zu-kurz": "\nFEHLER: Fussabdruck passt nicht in die gewaehlte Strecke (Rest waere nur %1 mm) - kuerzer/weniger Zusatzelemente waehlen oder laenger zeichnen.",
"vfl-hinweis-horizontal-fussabdruck-zu-kurz": "\n\nHinweis: gewaehlte Reststrecke war %1 mm, nach dem 3-Grad-Uebergangsbogen blieben nur %2 mm (Minimum: %3 mm). Trotzdem mit der Mindestlaenge weiterbauen (Kettenpunkt landet dann entsprechend weiter als angeklickt)?",
"vfl-fehler-linie-zu-kurz": "\nFEHLER: Linie zu kurz (oder entgegen der Fahrtrichtung) - bitte erneut waehlen.", "vfl-fehler-linie-zu-kurz": "\nFEHLER: Linie zu kurz (oder entgegen der Fahrtrichtung) - bitte erneut waehlen.",
"vfl-fehler-vf-kurz": "\nFEHLER: VarioFoerderer braucht >= 1000 mm (Umlenk + Motor) - laenger zeichnen oder \"GF\" waehlen.", "vfl-fehler-vf-kurz": "\nFEHLER: VarioFoerderer braucht >= 1000 mm (Umlenk + Motor) - laenger zeichnen oder \"GF\" waehlen.",
"vfl-gefaelle-festlegen-header": "\nGefaelle festlegen:", "vfl-gefaelle-festlegen-header": "\nGefaelle festlegen:",
"vfl-gefaelle-opt-hoehe": "\n 1 - Gegebene Hoehe (Zielhoehe)", "vfl-gefaelle-opt-hoehe": "\n 2 - Gegebene Hoehe (Zielhoehe)",
"vfl-gefaelle-opt-winkel": "\n 2 - Neigungswinkel eingeben", "vfl-gefaelle-opt-winkel": "\n 1 - Neigungswinkel eingeben",
"vfl-prompt-neigungswinkel": "\nNeigungswinkel (Grad, 0 < Winkel <= %1) [%1]: ", "vfl-prompt-neigungswinkel": "\nNeigungswinkel (Grad, 0 < Winkel <= %1) [%1]: ",
"vfl-prompt-neigungswinkel-laenge-berechnet": "\nNeigungswinkel (Grad, 0 < Winkel <= %1) [%1] (deltaL wird berechnet und eingefuegt): ",
"vfl-gf-hinweis-laenge-berechnet": "(deltaL wird berechnet und eingefuegt)",
"vfl-gf-laenge-modus-header": "\nWie soll die Laenge dieser Gefaellestrecke bestimmt werden?",
"vfl-gf-laenge-modus-opt-endpunkt": "\n 1 - Endpunkt waehlen (Laenge ergibt sich)",
"vfl-gf-laenge-modus-opt-hoehe": "\n 2 - Zielhoehe festlegen (Laenge wird berechnet)",
"vfl-gf-laenge-modus-opt-steigend": "\n 3 - Steigende GF (Sonderfall, bis 3 Grad)",
"vfl-prompt-neigungswinkel-steigend": "\nSteigungswinkel (Grad, 0 <= Winkel <= %1, 0 = flach) [%1]: ",
"vfl-alert-winkel-ungueltig-steigend": "Steigungswinkel ungueltig: %1 Grad. Erlaubt: 0 <= Winkel <= %2 Grad.",
"vfl-alert-gf-steigend-falsche-richtung": "Steigende Gefaellestrecke: die gewaehlte Zielhoehe liegt unter der aktuellen Hoehe - bitte hoehere Zielhoehe waehlen oder den normalen (fallenden) Modus benutzen.",
"vfl-alert-winkel-ungueltig": "Neigungswinkel ungueltig: %1 Grad. Erlaubt: 0 < Winkel <= %2 Grad.", "vfl-alert-winkel-ungueltig": "Neigungswinkel ungueltig: %1 Grad. Erlaubt: 0 < Winkel <= %2 Grad.",
"vfl-prompt-hoehe-linienendpunkt": "\nHoehe (Z) des Linienendpunkts [%1]: ", "vfl-prompt-hoehe-linienendpunkt": "\nHoehe (Z) des Linienendpunkts [%1]: ",
"vfl-prompt-hoehe-linienendpunkt-2": "\nHoehe (Z) des Linienendpunkts (Ab: %1 | Auf: %2) [%1]: ", "vfl-prompt-hoehe-linienendpunkt-2": "\nHoehe (Z) des Linienendpunkts (Ab: %1 | Auf: %2) [%1]: ",
"vfl-hinweis-hoehe-vorschlag-fehlt": "\n(Hinweis: In diese Richtung ist bei dieser Segmentlaenge kein baubarer Vorschlag gefunden - bitte Wert manuell pruefen.)", "vfl-hinweis-hoehe-vorschlag-fehlt": "\n(Hinweis: In diese Richtung ist bei dieser Segmentlaenge kein baubarer Vorschlag gefunden - bitte Wert manuell pruefen.)",
"vfl-alert-gf-kann-nicht-steigen": "Gefaellestrecke (GF) kann nicht steigen - bitte tiefere Zielhoehe waehlen oder Ab/Auf VF benutzen.", "vfl-alert-gf-kann-nicht-steigen": "Gefaellestrecke (GF) kann nicht steigen - bitte tiefere Zielhoehe waehlen oder Ab/Auf VF benutzen.",
"vfl-alert-gefaelle-zu-steil": "Gefaelle zu steil fuer GF: %1 Grad (erlaubt max %2 Grad).\nBitte kleinere Hoehendifferenz waehlen oder Ab/Auf VF benutzen.", "vfl-alert-gefaelle-zu-steil": "Gefaelle zu steil fuer GF: %1 Grad (erlaubt max %2 Grad).\nBitte kleinere Hoehendifferenz waehlen oder Ab/Auf VF benutzen.",
"vfl-prompt-hoehe-eingang-gf1": "\nZielhoehe (Z) am Uebergang zur horizontalen Strecke [%1]: ",
"vfl-alert-eingang-kann-nicht-steigen": "Diese VF-Einheit (horizontaler Anfang) kann nicht steigen - bitte 'Neue Linie: Ab/Auf VF' verwenden.",
"vfl-alert-eingang-hoehe-zu-klein": "Zielhoehe zu klein: mindestens %1 mm Hoehenabsenkung noetig (Separator+Umlenkstation+Uebergangsbogen allein erreichen schon so viel). Bitte tiefere Zielhoehe eingeben.",
"vfl-alert-eingang-hoehe-zu-gross": "Zielhoehe zu weit entfernt fuer diese Streckenlaenge - maximal erreichbare Zielhoehe waere ca. %1 mm. Bitte 'Neue Linie: Ab/Auf VF' verwenden.",
"vfl-ist-kettenende-header": "\nIst das das Kettenende?", "vfl-ist-kettenende-header": "\nIst das das Kettenende?",
"vfl-kettenende-opt-ja-es": "\n 1 - Ja (ES-Element setzen)", "vfl-kettenende-opt-ja-es": "\n 1 - Ja (ES-Element setzen)",
"vfl-kettenende-opt-ja-ohne-es": "\n 2 - Ja (ohne ES-Element setzen)", "vfl-kettenende-opt-ja-ohne-es": "\n 2 - Ja (ohne ES-Element setzen)",
"vfl-kettenende-opt-nein": "\n 3 - Nein (weiterbauen)", "vfl-kettenende-opt-nein": "\n 3 - Nein (weiterbauen)",
"vfl-alert-vf-nicht-baubar": "VF-Einheit geometrisch nicht baubar!\ndeltaL=%1 mm, deltaH=%2 mm, Richtung=%3\nBitte anderen Endpunkt/Hoehe waehlen.", "vfl-alert-vf-nicht-baubar": "VF-Einheit geometrisch nicht baubar!\ndeltaL=%1 mm, deltaH=%2 mm, Richtung=%3\nBitte anderen Endpunkt/Hoehe waehlen.",
"vfl-alert-kettenende-p1": "1. Ziel △L=%1 mm, △H=%2 mm (%3): Auf/Ab-Foerderer (Winkel-Tabelle) nicht baubar.",
"vfl-alert-kettenende-p2-beide": "\n\n2. Horizontal+GF nicht baubar - noetig waeren mindestens △L=%1 mm ODER mindestens △H=%2 mm.",
"vfl-alert-kettenende-p2-nur-minh": "\n\n2. Horizontal+GF nicht baubar - noetig waere mindestens △H=%1 mm Hoehenaenderung.",
"vfl-alert-kettenende-p2-nur-minl": "\n\n2. Horizontal+GF nicht baubar - noetig waere mindestens △L=%1 mm Streckenlaenge.",
"vfl-alert-vf-entscheidung-p1": "1. Ziel △L=%1 mm, △H=%2 mm (%3): Winkel-Tabelle nicht baubar.",
"vfl-alert-vf-entscheidung-p2-beide": "\n\n2. Mindestens noetig waeren: △L=%1 mm ODER △H=%2 mm.",
"vfl-alert-vf-entscheidung-p2-nur-minh": "\n\n2. Mindestens noetig waere: △H=%1 mm Hoehenaenderung.",
"vfl-alert-vf-entscheidung-p2-nur-minl": "\n\n2. Mindestens noetig waere: △L=%1 mm Streckenlaenge.",
"vfl-alert-segment-nicht-baubar": "Segment geometrisch nicht baubar!\ndeltaL=%1 mm, deltaH=%2 mm, Richtung=%3\nBitte anderen Endpunkt/Hoehe waehlen.", "vfl-alert-segment-nicht-baubar": "Segment geometrisch nicht baubar!\ndeltaL=%1 mm, deltaH=%2 mm, Richtung=%3\nBitte anderen Endpunkt/Hoehe waehlen.",
"vfl-info-kurzes-segment": "\n>>> Kurzes Segment (deltaL=%1 mm < 1000): automatisch 3-Grad-Gefaellestrecke (keine Hoehenabfrage, deltaH=%2 mm).", "vfl-info-kurzes-segment": "\n>>> Kurzes Segment (deltaL=%1 mm < 1000): automatisch 3-Grad-Gefaellestrecke (keine Hoehenabfrage, deltaH=%2 mm).",
"vfl-info-kettenende-footprint": "\n>>> Kettenende-Modus: Footprint fuer Separator + ES reserviert -> baubar deltaL=%1 mm, deltaH=%2 mm.", "vfl-info-kettenende-footprint": "\n>>> Kettenende-Modus: Footprint fuer Separator + ES reserviert -> baubar deltaL=%1 mm, deltaH=%2 mm.",
@@ -69,9 +99,14 @@
"vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' eingefuegt (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' eingefuegt (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6",
"vfl-ja": "\n 1 - Ja", "vfl-ja": "\n 1 - Ja",
"vfl-nein": "\n 2 - Nein", "vfl-nein": "\n 2 - Nein",
"vfl-antwort-ja": "Ja",
"vfl-antwort-nein": "Nein",
"vfl-wizard-antwort-echo": "\n -> Auswahl im Dialog: %1",
"vfl-sep-vor-frage": "\n\nZusaetzlichen Separator VOR dem horizontalen Stueck?", "vfl-sep-vor-frage": "\n\nZusaetzlichen Separator VOR dem horizontalen Stueck?",
"vfl-sep-nach-frage": "\n\nZusaetzlichen Separator NACH dem horizontalen Stueck?", "vfl-sep-nach-frage": "\n\nZusaetzlichen Separator NACH dem horizontalen Stueck?",
"vfl-sep-an-stelle-frage": "\n\nZusaetzlichen Separator an dieser Stelle einfuegen?", "vfl-sep-an-stelle-frage": "\n\nZusaetzlichen Separator an dieser Stelle einfuegen?",
"vfl-sep-vor-gf-frage": "\n\nSeparator VOR dieser Gefaellestrecke einfuegen?",
"vfl-sep-nach-gf-frage": "\n\nSeparator NACH dieser Gefaellestrecke einfuegen?",
"vf-winkel-aus-header": "\n\nAUS-Element (AS_Element) - Winkel waehlen:", "vf-winkel-aus-header": "\n\nAUS-Element (AS_Element) - Winkel waehlen:",
"vf-winkel-ein-header": "\n\nEIN-Element (ES_Element) - Winkel waehlen:", "vf-winkel-ein-header": "\n\nEIN-Element (ES_Element) - Winkel waehlen:",
"vf-winkel-90": "\n 1 - 90 Grad", "vf-winkel-90": "\n 1 - 90 Grad",
@@ -137,6 +172,17 @@
"vfl-m3-warnung-zu-steil": "\n WARNUNG: ~Neigung > 51 Grad -> zu steil fuer Vario (Magnitude infeasibel).", "vfl-m3-warnung-zu-steil": "\n WARNUNG: ~Neigung > 51 Grad -> zu steil fuer Vario (Magnitude infeasibel).",
"vfl-m3-vario-bereich-ok": "\n -> innerhalb Vario-Bereich (3..51 Grad), grobe Orientierung.", "vfl-m3-vario-bereich-ok": "\n -> innerhalb Vario-Bereich (3..51 Grad), grobe Orientierung.",
"vfl-m3-anker-hinweis": "\n (Anker oben = grobe Vorschau; exakte Werte werden beim Bau GEMESSEN)", "vfl-m3-anker-hinweis": "\n (Anker oben = grobe Vorschau; exakte Werte werden beim Bau GEMESSEN)",
"vfl-m3-lauf-abschluss-header": "\n\nDer VF-Lauf ist das Ende des gewaehlten Pfads. Lauf beenden mit:",
"vfl-m3-lauf-abschluss-opt-offen": "\n 1 - Ohne Motorstation (offenes Ende, spaeter fortsetzen/verschmelzen)",
"vfl-m3-lauf-abschluss-opt-motor": "\n 2 - Motorstation setzen (kein ES-Element)",
"vfl-m3-lauf-abschluss-opt-motor-es": "\n 3 - Motorstation + ES-Element setzen (Kettenende)",
"vfl-m3-lauf-abschluss-offen-hinweis": "\n Lauf bleibt bewusst offen - keine Motorstation/Separator/ES gebaut, spaeter fortsetzen oder per Vario_Kette_Merge verbinden.",
"vfl-m3-lauf-anfang-header": "\n\nDer VF-Lauf ist der Anfang des gewaehlten Pfads. Lauf beginnen mit:",
"vfl-m3-lauf-anfang-opt-offen": "\n 1 - Ohne Umlenkstation (offener Anfang, spaeter fortsetzen/verschmelzen)",
"vfl-m3-lauf-anfang-opt-umlenk": "\n 2 - Umlenkstation direkt (kein GF1/Separator)",
"vfl-m3-lauf-anfang-opt-umlenk-gf1": "\n 3 - Umlenkstation mit GF1 + Separator",
"vfl-m3-lauf-anfang-offen-hinweis": "\n Anfang bleibt bewusst offen - keine Umlenkstation/GF1/Separator gebaut, spaeter fortsetzen oder per Vario_Kette_Merge verbinden.",
"vfl-m3-alert-vf-zu-lang": "VF-Lauf ist %1 m lang (Grenze %2 m) - bitte neu planen (z.B. Zwischen-Motorstation einfuegen).",
"vfl-m3-phase-b1": "\n\n>>> Phase B1: Front-Lauf (AS + GF) bauen ...", "vfl-m3-phase-b1": "\n\n>>> Phase B1: Front-Lauf (AS + GF) bauen ...",
"vfl-m3-alert-beginnt-bogen": "Kette beginnt mit einem Bogen - bitte erst eine Gerade.", "vfl-m3-alert-beginnt-bogen": "Kette beginnt mit einem Bogen - bitte erst eine Gerade.",
"vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario-Kurve im Front-Lauf - uebersprungen.", "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario-Kurve im Front-Lauf - uebersprungen.",
@@ -145,9 +191,15 @@
"vfl-m3-junction-exakt": "\n Junction (exakt): %1 mm", "vfl-m3-junction-exakt": "\n Junction (exakt): %1 mm",
"vfl-m3-kletter-info": "\n Kletterhoehe %1 mm | Kletterer %2 | Kurven %3 | kurze VF %4", "vfl-m3-kletter-info": "\n Kletterhoehe %1 mm | Kletterer %2 | Kurven %3 | kurze VF %4",
"vfl-m3-kein-winkel": "\n KEIN passender Vario-Winkel -> infeasibel (Front bereits gebaut).", "vfl-m3-kein-winkel": "\n KEIN passender Vario-Winkel -> infeasibel (Front bereits gebaut).",
"vfl-m3-kletter-zu-kurz-flach": "\n Kein Kletter-Winkel passt (Segment zu kurz) -> Lauf wird komplett flach gebaut, Hoehe wandert in GF1.",
"vfl-m3-kletter-flach-gf": "\n Flache Zone: GF-Kompensation (GF1) = %1 mm",
"vfl-m3-warnung-fueller-eingang-zu-kurz": "\n WARNUNG: Fueller direkt nach der Umlenkstation zu kurz (%1 mm < Minimum %2 mm) - nur Minimalabstand gebaut, Zielposition nicht exakt erreicht.",
"vfl-m3-warnung-fueller-ausgang-zu-kurz": "\n WARNUNG: Fueller direkt vor der Motorstation zu kurz (%1 mm < Minimum %2 mm) - nur Minimalabstand gebaut, Zielposition nicht exakt erreicht.",
"vfl-m3-gf-verteilung": "\n\n GF-Verteilung: 1 - alles am Einlauf (GF1) 2 - 1/2 GF1 + 1/2 GF2", "vfl-m3-gf-verteilung": "\n\n GF-Verteilung: 1 - alles am Einlauf (GF1) 2 - 1/2 GF1 + 1/2 GF2",
"vfl-m3-gf-verteilung-alles-auslauf": "\n Kein GF1-Platz am Einlauf gewaehlt - komplette Kompensation wandert nach GF2 (Auslauf).",
"vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2",
"vfl-m3-vert-ganz": "alles GF1", "vfl-m3-vert-ganz": "alles GF1",
"vfl-m3-vert-auslauf": "alles GF2 (Auslauf)",
"vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF gesamt %4 mm, Verteilung %5 (GF2-Rest = Mess-Feinkorrektur)", "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF gesamt %4 mm, Verteilung %5 (GF2-Rest = Mess-Feinkorrektur)",
"vfl-m3-warnung-gf2-negativ": "\n WARNUNG: Koerper klettert zu wenig - GF2<0 (fehlen %1 mm). Winkel zu flach; dZ nicht exakt.", "vfl-m3-warnung-gf2-negativ": "\n WARNUNG: Koerper klettert zu wenig - GF2<0 (fehlen %1 mm). Winkel zu flach; dZ nicht exakt.",
"vfl-m3-gf2-ausgleich": "\n GF2 (gemessener Ausgleich): L=%1 mm", "vfl-m3-gf2-ausgleich": "\n GF2 (gemessener Ausgleich): L=%1 mm",
@@ -285,15 +337,46 @@
"vfl-20m-hinweis": "\n >>> HINWEIS: Foerderer laenger als 20 m (%1 m) - Motorstation empfohlen!", "vfl-20m-hinweis": "\n >>> HINWEIS: Foerderer laenger als 20 m (%1 m) - Motorstation empfohlen!",
"vfl-block-erstellt": "\n>>> Block '%1' (%2) erstellt und eingefuegt.", "vfl-block-erstellt": "\n>>> Block '%1' (%2) erstellt und eingefuegt.",
"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.", "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.",
"vfl-fehler-rest-nicht-baubar-mit-vorschlag": "\n FEHLER: Bei Zielhoehe %1 mm (Strecke dL=%2 mm, Hoehendifferenz dH=%3 mm, %4) nicht baubar (zu steil/zu kurz fuer Schwanz Motor+GF2+Separator+ES). Baubare Zielhoehe waere ungefaehr:%5",
"vfl-fehler-rest-nicht-baubar-ohne-vorschlag": "\n FEHLER: Bei Zielhoehe %1 mm (Strecke dL=%2 mm, Hoehendifferenz dH=%3 mm, %4) nicht baubar - bei dieser Streckenlaenge wurde auch keine alternative Zielhoehe gefunden. Bitte laenger zeichnen oder flacher planen.",
"vfl-vorschlag-ab-auf": " Ab %1 mm oder Auf %2 mm",
"vfl-vorschlag-nur-ab": " Ab %1 mm (Auf ist bei dieser Streckenlaenge nicht baubar)",
"vfl-vorschlag-nur-auf": " Auf %1 mm (Ab ist bei dieser Streckenlaenge nicht baubar)",
"vfl-stufe1-start": "\n\n[Diagnose Stufe 1 - VF-Winkel-Suche]",
"vfl-stufe2-diagnose": "\n\n[Diagnose Stufe 2 - horizontal+GF] deltaL=%1 mm deltaH=%2 mm -> GF_total=%3 mm L_VF=%4 mm (%5)",
"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-ungueltig": "\n Stufe 2 (horizontal+GF) war ungueltig - es wurde stattdessen Stufe 1 (VF-Winkel-Suche) versucht (siehe Tabelle oben).",
"vfl-fuege-block-ein": "\n Fuege %1 ein ...", "vfl-fuege-block-ein": "\n Fuege %1 ein ...",
"vfl-hinweis-gf2-minimum": "\n HINWEIS: berechnetes GF2=%1 mm < Minimum %2 mm -> auf Minimum angehoben (ES endet dadurch etwas weiter; siehe Ist-Ziel-Report).", "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-horizontale-zwischenstrecke": "\n\nHorizontale Zwischenstrecke (0 Grad, L=%1 mm)", "vfl-horizontale-zwischenstrecke": "\n\nHorizontale Zwischenstrecke (0 Grad, L=%1 mm)",
"vfl-kettenende-modus-ziel": "\n>>> Kettenende-Modus: Ziel dL=%1 mm, dH=%2 mm (%3). GF2 variiert mit dem Winkel.", "vfl-kettenende-modus-ziel": "\n>>> Kettenende-Modus: Ziel dL=%1 mm, dH=%2 mm (%3). GF2 variiert mit dem Winkel.",
"vfl-prompt-hoehe-endpunkt": "\nHoehe (Z) des Endpunkts [%1]: ", "vfl-prompt-hoehe-endpunkt": "\nHoehe (Z) des Endpunkts [%1]: ",
"vfl-prompt-hoehe-endpunkt-2": "\nHoehe (Z) des Endpunkts (Ab: %1 | Auf: %2) [%1]: ", "vfl-prompt-hoehe-endpunkt-2": "\nHoehe (Z) des Endpunkts (Ab: %1 | Auf: %2) [%1]: ",
"vfl-prompt-hoehe-kettenende": "\nHoehe (Z) des Kettenendes (ES-Element) [%1]: ", "vfl-prompt-hoehe-kettenende": "\nHoehe (Z) des Kettenendes (ES-Element) [%1]: ",
"vfl-prompt-hoehe-kettenende-2": "\nHoehe (Z) des Kettenendes (ES-Element) (Ab: %1 | Auf: %2) [%1]: ", "vfl-prompt-hoehe-kettenende-2": "\nHoehe (Z) des Kettenendes (ES-Element) (Ab: %1 | Auf: %2) [%1]: ",
"vfl-prompt-wahl-1-2": "\nIhre Wahl (1-2) [1]: ",
"vfl-prompt-wahl-bis-n": "\nIhre Wahl (1-%1) [1]: ", "vfl-prompt-wahl-bis-n": "\nIhre Wahl (1-%1) [1]: ",
"vfl-frage-auf-ab-richtung": "\n\nKette kommt flach an - keine Zielhoehe verfuegbar. Richtung waehlen:",
"vfl-frage-startpunkt-typ": "\n\nAm Startpunkt konnte kein eindeutiger GF-/VF-Baustein erkannt werden (GF-Stueck und VF-Horizontalstueck sehen baulich identisch aus). Wie soll der Eingang gebaut werden?",
"vfl-opt-eingang-direkt": "\n 1 - Direkt Umlenkstation bauen (kein GF-Stueck)",
"vfl-opt-eingang-mit-stumpf": "\n 2 - GF (%1 mm) + Umlenkstation",
"vfl-opt-eingang-ohne-umlenk": "\n 3 - Ohne Umlenkstation (VF-Fortsetzung)",
"vfl-opt-richtung-auf": "\n 1 - Auf",
"vfl-opt-richtung-ab": "\n 2 - Ab",
"vfl-winkel-hoehen-header": "\n\nVerfuegbare Winkel und die damit erreichte Endhoehe - bitte waehlen:",
"vfl-winkel-hoehen-option": "\n %1 - %2 Grad (Endhoehe: %3 mm)",
"vfl-winkel-hoehen-zeile": "\n %1 Grad - Endhoehe: %2 mm",
"vfl-winkel-hoehen-zeile-tile": "Endhoehe: %1 mm",
"vfl-winkel-wahl-zeile-tile": "L_GF=%1 mm L_VF=%2 mm",
"vfl-winkel-zeile-tile-ungueltig": "nicht baubar (Bogen passt nicht in die gewaehlte Strecke)",
"vfl-winkel-hoehen-zeile-ungueltig": "\n %1 Grad - nicht baubar (Bogen passt nicht in die gewaehlte Strecke)",
"vfl-winkel-hoehen-abweichung": "\n [Hinweis] Ist-Ziel-Vergleich: vorhergesagte Endhoehe %1 mm, tatsaechlich erreicht %2 mm.",
"vfl-segment-gf-nicht-erlaubt": "\n Segment waere GF (zu steil) oder nicht baubar - innerhalb einer VF-Einheit nicht erlaubt.\n Bitte flacher/steigend zeichnen oder Foerderer beenden.", "vfl-segment-gf-nicht-erlaubt": "\n Segment waere GF (zu steil) oder nicht baubar - innerhalb einer VF-Einheit nicht erlaubt.\n Bitte flacher/steigend zeichnen oder Foerderer beenden.",
"vfl-winkel-option": "\n %1 - %2 Grad (L_GF=%3 mm L_VF=%4 mm)", "vfl-winkel-option": "\n %1 - %2 Grad (L_GF=%3 mm L_VF=%4 mm)",
"vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2",
@@ -767,6 +850,7 @@
"vfl-abbruch-gesichert": "\n>>> Linienzug abgebrochen: %1 Objekt(e) als Block gesichert (per Doppelklick editierbar/fortsetzbar).", "vfl-abbruch-gesichert": "\n>>> Linienzug abgebrochen: %1 Objekt(e) als Block gesichert (per Doppelklick editierbar/fortsetzbar).",
"vfl-abbruch-nichts-gebaut": "\n>>> Abgebrochen - es wurde noch keine Geometrie erzeugt.", "vfl-abbruch-nichts-gebaut": "\n>>> Abgebrochen - es wurde noch keine Geometrie erzeugt.",
"vfl-abbruch-wickeln-fehler": "\n>>> FEHLER beim Sichern der Teil-Geometrie als Block: %1", "vfl-abbruch-wickeln-fehler": "\n>>> FEHLER beim Sichern der Teil-Geometrie als Block: %1",
"vfl-zurueck-glied-verworfen": "\n>>> Zurueck: letztes Kettenglied wird verworfen - bitte neu beantworten.",
"vfl-edit-dialog-fehlt": "Dialog nicht gefunden: %1", "vfl-edit-dialog-fehlt": "Dialog nicht gefunden: %1",
"vfl-edit-abgebrochen": "\nEditieren abgebrochen - keine Aenderung.", "vfl-edit-abgebrochen": "\nEditieren abgebrochen - keine Aenderung.",
"vfl-dlg-kopf-sektionen": "Sektionen: %1", "vfl-dlg-kopf-sektionen": "Sektionen: %1",
+88 -4
View File
@@ -2,6 +2,7 @@
"texts": { "texts": {
"vfl-alert-gf-modul-fehlt": "Slope-section module not loaded!\nThe chain type requires Gefaellestrecke.lsp\n(GF segments and GF arcs). Please load the menu.", "vfl-alert-gf-modul-fehlt": "Slope-section module not loaded!\nThe chain type requires Gefaellestrecke.lsp\n(GF segments and GF arcs). Please load the menu.",
"vfl-prompt-startpunkt-kette": "\n\nSelect chain start point: ", "vfl-prompt-startpunkt-kette": "\n\nSelect chain start point: ",
"vfl-prompt-richtung-waehlen": "\n\nChoose direction (click a point in the desired direction - the distance is ignored): ",
"vfl-prompt-hoehe-startpunkt-kette": "\nHeight (Z) of the start point [%1]: ", "vfl-prompt-hoehe-startpunkt-kette": "\nHeight (Z) of the start point [%1]: ",
"vfl-abgebrochen": "\nCancelled.", "vfl-abgebrochen": "\nCancelled.",
"vfl-as-setzen-frage": "\n\nPlace AS element?", "vfl-as-setzen-frage": "\n\nPlace AS element?",
@@ -19,24 +20,53 @@
"vfl-menu-horizontal-vf-3": "\n 3 - New VF with horizontal start (horizontal piece)", "vfl-menu-horizontal-vf-3": "\n 3 - New VF with horizontal start (horizontal piece)",
"vfl-menu-linie-ende-4": "\n 4 - New line TO chain end (then separator + ES element)", "vfl-menu-linie-ende-4": "\n 4 - New line TO chain end (then separator + ES element)",
"vfl-prompt-wahl-1-4-def1": "\nYour choice (1-4) [1]: ", "vfl-prompt-wahl-1-4-def1": "\nYour choice (1-4) [1]: ",
"vfl-fehler-horizontal-vf-kurz": "\nERROR: Horizontal VF needs >= 1000 mm (deflection + motor) - draw it longer.", "vfl-menu-gf-bogen-ka-1": "\n 1 - GF arc (horizontal curve)",
"vfl-menu-variokurve-ka-2": "\n 2 - Vario curve (horizontal curve, 30/60/90 degrees)",
"vfl-menu-linie-gf-ka-3": "\n 3 - New line: GF (gravity section)",
"vfl-menu-linie-vf-ka-4": "\n 4 - New line: down/up VF (VarioFoerderer unit)",
"vfl-menu-horizontal-vf-ka-5": "\n 5 - New VF with horizontal start (horizontal piece)",
"vfl-menu-linie-ende-ka-6": "\n 6 - New line TO chain end (then separator + ES element)",
"vfl-prompt-wahl-1-6-def3": "\nYour choice (1-6) [3]: ",
"vfl-fehler-horizontal-fussabdruck-zu-kurz": "\nERROR: Footprint does not fit into the chosen distance (remainder would be only %1 mm) - choose fewer/shorter extras or draw it longer.",
"vfl-hinweis-horizontal-fussabdruck-zu-kurz": "\n\nNote: the chosen remaining length was %1 mm, after the 3-degree transition bend only %2 mm remained (minimum: %3 mm). Continue building with the minimum length anyway (the chain point will then end up further along than clicked)?",
"vfl-fehler-linie-zu-kurz": "\nERROR: Line too short (or against travel direction) - please pick again.", "vfl-fehler-linie-zu-kurz": "\nERROR: Line too short (or against travel direction) - please pick again.",
"vfl-fehler-vf-kurz": "\nERROR: VarioFoerderer needs >= 1000 mm (deflection + motor) - draw it longer or choose \"GF\".", "vfl-fehler-vf-kurz": "\nERROR: VarioFoerderer needs >= 1000 mm (deflection + motor) - draw it longer or choose \"GF\".",
"vfl-gefaelle-festlegen-header": "\nDefine slope:", "vfl-gefaelle-festlegen-header": "\nDefine slope:",
"vfl-gefaelle-opt-hoehe": "\n 1 - Given height (target height)", "vfl-gefaelle-opt-hoehe": "\n 2 - Given height (target height)",
"vfl-gefaelle-opt-winkel": "\n 2 - Enter incline angle", "vfl-gefaelle-opt-winkel": "\n 1 - Enter incline angle",
"vfl-prompt-neigungswinkel": "\nIncline angle (degrees, 0 < angle <= %1) [%1]: ", "vfl-prompt-neigungswinkel": "\nIncline angle (degrees, 0 < angle <= %1) [%1]: ",
"vfl-prompt-neigungswinkel-laenge-berechnet": "\nIncline angle (degrees, 0 < angle <= %1) [%1] (deltaL will be calculated and inserted): ",
"vfl-gf-hinweis-laenge-berechnet": "(deltaL will be calculated and inserted)",
"vfl-gf-laenge-modus-header": "\nHow should the length of this gravity section be determined?",
"vfl-gf-laenge-modus-opt-endpunkt": "\n 1 - Pick end point (length results from it)",
"vfl-gf-laenge-modus-opt-hoehe": "\n 2 - Set target height (length will be calculated)",
"vfl-gf-laenge-modus-opt-steigend": "\n 3 - Rising GF (special case, up to 3 degrees)",
"vfl-prompt-neigungswinkel-steigend": "\nRising angle (degrees, 0 <= angle <= %1, 0 = level) [%1]: ",
"vfl-alert-winkel-ungueltig-steigend": "Rising angle invalid: %1 degrees. Allowed: 0 <= angle <= %2 degrees.",
"vfl-alert-gf-steigend-falsche-richtung": "Rising gravity conveyor: the chosen target height is below the current height - please choose a higher target height or use the normal (falling) mode.",
"vfl-alert-winkel-ungueltig": "Incline angle invalid: %1 degrees. Allowed: 0 < angle <= %2 degrees.", "vfl-alert-winkel-ungueltig": "Incline angle invalid: %1 degrees. Allowed: 0 < angle <= %2 degrees.",
"vfl-prompt-hoehe-linienendpunkt": "\nHeight (Z) of the line end point [%1]: ", "vfl-prompt-hoehe-linienendpunkt": "\nHeight (Z) of the line end point [%1]: ",
"vfl-prompt-hoehe-linienendpunkt-2": "\nHeight (Z) of the line end point (down: %1 | up: %2) [%1]: ", "vfl-prompt-hoehe-linienendpunkt-2": "\nHeight (Z) of the line end point (down: %1 | up: %2) [%1]: ",
"vfl-hinweis-hoehe-vorschlag-fehlt": "\n(Note: no buildable suggestion found for that direction at this segment length - please check the value manually.)", "vfl-hinweis-hoehe-vorschlag-fehlt": "\n(Note: no buildable suggestion found for that direction at this segment length - please check the value manually.)",
"vfl-alert-gf-kann-nicht-steigen": "Gravity section (GF) cannot rise - please pick a lower target height or use down/up VF.", "vfl-alert-gf-kann-nicht-steigen": "Gravity section (GF) cannot rise - please pick a lower target height or use down/up VF.",
"vfl-alert-gefaelle-zu-steil": "Slope too steep for GF: %1 degrees (max allowed %2 degrees).\nPlease pick a smaller height difference or use down/up VF.", "vfl-alert-gefaelle-zu-steil": "Slope too steep for GF: %1 degrees (max allowed %2 degrees).\nPlease pick a smaller height difference or use down/up VF.",
"vfl-prompt-hoehe-eingang-gf1": "\nTarget height (Z) at the transition to the horizontal section [%1]: ",
"vfl-alert-eingang-kann-nicht-steigen": "This VF unit (horizontal start) cannot rise - please use 'New line: up/down VF' instead.",
"vfl-alert-eingang-hoehe-zu-klein": "Target height too small: at least %1 mm of drop is needed (separator+deflection station+transition bend alone already reach that much). Please enter a lower target height.",
"vfl-alert-eingang-hoehe-zu-gross": "Target height too far away for this distance - the maximum reachable target height would be about %1 mm. Please use 'New line: up/down VF' instead.",
"vfl-ist-kettenende-header": "\nIs this the chain end?", "vfl-ist-kettenende-header": "\nIs this the chain end?",
"vfl-kettenende-opt-ja-es": "\n 1 - Yes (place ES element)", "vfl-kettenende-opt-ja-es": "\n 1 - Yes (place ES element)",
"vfl-kettenende-opt-ja-ohne-es": "\n 2 - Yes (without placing ES element)", "vfl-kettenende-opt-ja-ohne-es": "\n 2 - Yes (without placing ES element)",
"vfl-kettenende-opt-nein": "\n 3 - No (keep building)", "vfl-kettenende-opt-nein": "\n 3 - No (keep building)",
"vfl-alert-vf-nicht-baubar": "VF unit geometrically not buildable!\ndeltaL=%1 mm, deltaH=%2 mm, direction=%3\nPlease pick another end point/height.", "vfl-alert-vf-nicht-baubar": "VF unit geometrically not buildable!\ndeltaL=%1 mm, deltaH=%2 mm, direction=%3\nPlease pick another end point/height.",
"vfl-alert-kettenende-p1": "1. Target ΔL=%1 mm, ΔH=%2 mm (%3): angled Vario (angle table) not buildable.",
"vfl-alert-kettenende-p2-beide": "\n\n2. Horizontal+GF not buildable - would need at least ΔL=%1 mm OR at least ΔH=%2 mm.",
"vfl-alert-kettenende-p2-nur-minh": "\n\n2. Horizontal+GF not buildable - would need at least ΔH=%1 mm of height change.",
"vfl-alert-kettenende-p2-nur-minl": "\n\n2. Horizontal+GF not buildable - would need at least ΔL=%1 mm of distance.",
"vfl-alert-vf-entscheidung-p1": "1. Target ΔL=%1 mm, ΔH=%2 mm (%3): angle table not buildable.",
"vfl-alert-vf-entscheidung-p2-beide": "\n\n2. At least needed: ΔL=%1 mm OR ΔH=%2 mm.",
"vfl-alert-vf-entscheidung-p2-nur-minh": "\n\n2. At least needed: ΔH=%1 mm of height change.",
"vfl-alert-vf-entscheidung-p2-nur-minl": "\n\n2. At least needed: ΔL=%1 mm of distance.",
"vfl-alert-segment-nicht-baubar": "Segment geometrically not buildable!\ndeltaL=%1 mm, deltaH=%2 mm, direction=%3\nPlease pick another end point/height.", "vfl-alert-segment-nicht-baubar": "Segment geometrically not buildable!\ndeltaL=%1 mm, deltaH=%2 mm, direction=%3\nPlease pick another end point/height.",
"vfl-info-kurzes-segment": "\n>>> Short segment (deltaL=%1 mm < 1000): automatic 3-degree gravity section (no height query, deltaH=%2 mm).", "vfl-info-kurzes-segment": "\n>>> Short segment (deltaL=%1 mm < 1000): automatic 3-degree gravity section (no height query, deltaH=%2 mm).",
"vfl-info-kettenende-footprint": "\n>>> Chain-end mode: footprint for separator + ES reserved -> buildable deltaL=%1 mm, deltaH=%2 mm.", "vfl-info-kettenende-footprint": "\n>>> Chain-end mode: footprint for separator + ES reserved -> buildable deltaL=%1 mm, deltaH=%2 mm.",
@@ -69,9 +99,14 @@
"vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' inserted (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6", "vfc-block-eingefuegt-xyzref-ksaus": "\n '%1' inserted (XY:%2 Z:%3)\n KS_AUS: X=%4 Y=%5 Z=%6",
"vfl-ja": "\n 1 - Yes", "vfl-ja": "\n 1 - Yes",
"vfl-nein": "\n 2 - No", "vfl-nein": "\n 2 - No",
"vfl-antwort-ja": "Yes",
"vfl-antwort-nein": "No",
"vfl-wizard-antwort-echo": "\n -> Dialog selection: %1",
"vfl-sep-vor-frage": "\n\nInsert additional separator BEFORE the horizontal section?", "vfl-sep-vor-frage": "\n\nInsert additional separator BEFORE the horizontal section?",
"vfl-sep-nach-frage": "\n\nInsert additional separator AFTER the horizontal section?", "vfl-sep-nach-frage": "\n\nInsert additional separator AFTER the horizontal section?",
"vfl-sep-an-stelle-frage": "\n\nInsert additional separator at this point?", "vfl-sep-an-stelle-frage": "\n\nInsert additional separator at this point?",
"vfl-sep-vor-gf-frage": "\n\nInsert separator BEFORE this slope section (GF)?",
"vfl-sep-nach-gf-frage": "\n\nInsert separator AFTER this slope section (GF)?",
"vf-winkel-aus-header": "\n\nOutput element (AS_Element) - choose angle:", "vf-winkel-aus-header": "\n\nOutput element (AS_Element) - choose angle:",
"vf-winkel-ein-header": "\n\nInput element (ES_Element) - choose angle:", "vf-winkel-ein-header": "\n\nInput element (ES_Element) - choose angle:",
"vf-winkel-90": "\n 1 - 90 deg", "vf-winkel-90": "\n 1 - 90 deg",
@@ -137,6 +172,17 @@
"vfl-m3-warnung-zu-steil": "\n WARNING: ~slope > 51 deg -> too steep for Vario (magnitude infeasible).", "vfl-m3-warnung-zu-steil": "\n WARNING: ~slope > 51 deg -> too steep for Vario (magnitude infeasible).",
"vfl-m3-vario-bereich-ok": "\n -> within Vario range (3..51 deg), rough orientation.", "vfl-m3-vario-bereich-ok": "\n -> within Vario range (3..51 deg), rough orientation.",
"vfl-m3-anker-hinweis": "\n (anchors above = rough preview; exact values are MEASURED during build)", "vfl-m3-anker-hinweis": "\n (anchors above = rough preview; exact values are MEASURED during build)",
"vfl-m3-lauf-abschluss-header": "\n\nThe VF run is the end of the selected path. End the run with:",
"vfl-m3-lauf-abschluss-opt-offen": "\n 1 - No motor station (open end, continue/merge later)",
"vfl-m3-lauf-abschluss-opt-motor": "\n 2 - Set motor station (no ES element)",
"vfl-m3-lauf-abschluss-opt-motor-es": "\n 3 - Motor station + ES element (chain end)",
"vfl-m3-lauf-abschluss-offen-hinweis": "\n Run deliberately left open - no motor station/separator/ES built; continue later or join with Vario_Kette_Merge.",
"vfl-m3-lauf-anfang-header": "\n\nThe VF run is the start of the selected path. Start the run with:",
"vfl-m3-lauf-anfang-opt-offen": "\n 1 - No reversing station (open start, continue/merge later)",
"vfl-m3-lauf-anfang-opt-umlenk": "\n 2 - Reversing station directly (no GF1/separator)",
"vfl-m3-lauf-anfang-opt-umlenk-gf1": "\n 3 - Reversing station with GF1 + separator",
"vfl-m3-lauf-anfang-offen-hinweis": "\n Start deliberately left open - no reversing station/GF1/separator built; continue later or join with Vario_Kette_Merge.",
"vfl-m3-alert-vf-zu-lang": "VF run is %1 m long (limit %2 m) - please re-plan (e.g. insert an intermediate motor station).",
"vfl-m3-phase-b1": "\n\n>>> Phase B1: building front run (AS + GF) ...", "vfl-m3-phase-b1": "\n\n>>> Phase B1: building front run (AS + GF) ...",
"vfl-m3-alert-beginnt-bogen": "Chain starts with an arc - please begin with a straight.", "vfl-m3-alert-beginnt-bogen": "Chain starts with an arc - please begin with a straight.",
"vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario curve in front run - skipped.", "vfl-m3-kurve-front-uebersprungen": "\n >>> [M3a] Vario curve in front run - skipped.",
@@ -145,9 +191,15 @@
"vfl-m3-junction-exakt": "\n Junction (exact): %1 mm", "vfl-m3-junction-exakt": "\n Junction (exact): %1 mm",
"vfl-m3-kletter-info": "\n Climb height %1 mm | climbers %2 | curves %3 | short VF %4", "vfl-m3-kletter-info": "\n Climb height %1 mm | climbers %2 | curves %3 | short VF %4",
"vfl-m3-kein-winkel": "\n NO matching Vario angle -> infeasible (front already built).", "vfl-m3-kein-winkel": "\n NO matching Vario angle -> infeasible (front already built).",
"vfl-m3-kletter-zu-kurz-flach": "\n No climb angle fits (segment too short) -> run is built entirely flat, height is absorbed by GF1.",
"vfl-m3-kletter-flach-gf": "\n Flat zone: GF compensation (GF1) = %1 mm",
"vfl-m3-warnung-fueller-eingang-zu-kurz": "\n WARNING: filler right after the reversing station is too short (%1 mm < minimum %2 mm) - only the minimum clearance was built, target position not reached exactly.",
"vfl-m3-warnung-fueller-ausgang-zu-kurz": "\n WARNING: filler right before the motor station is too short (%1 mm < minimum %2 mm) - only the minimum clearance was built, target position not reached exactly.",
"vfl-m3-gf-verteilung": "\n\n GF distribution: 1 - all at inlet (GF1) 2 - 1/2 GF1 + 1/2 GF2", "vfl-m3-gf-verteilung": "\n\n GF distribution: 1 - all at inlet (GF1) 2 - 1/2 GF1 + 1/2 GF2",
"vfl-m3-gf-verteilung-alles-auslauf": "\n No GF1 room at the inlet chosen - full compensation moves to GF2 (outlet).",
"vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2", "vfl-m3-vert-halb": "1/2 GF1 + 1/2 GF2",
"vfl-m3-vert-ganz": "all GF1", "vfl-m3-vert-ganz": "all GF1",
"vfl-m3-vert-auslauf": "all GF2 (outlet)",
"vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF total %4 mm, distribution %5 (GF2 remainder = measured fine correction)", "vfl-m3-vario-ergebnis": "\n -> Vario %1 (%2), L_VF %3 mm, GF total %4 mm, distribution %5 (GF2 remainder = measured fine correction)",
"vfl-m3-warnung-gf2-negativ": "\n WARNING: body climbs too little - GF2<0 (missing %1 mm). Angle too shallow; dZ not exact.", "vfl-m3-warnung-gf2-negativ": "\n WARNING: body climbs too little - GF2<0 (missing %1 mm). Angle too shallow; dZ not exact.",
"vfl-m3-gf2-ausgleich": "\n GF2 (measured compensation): L=%1 mm", "vfl-m3-gf2-ausgleich": "\n GF2 (measured compensation): L=%1 mm",
@@ -285,15 +337,46 @@
"vfl-20m-hinweis": "\n >>> NOTE: conveyor longer than 20 m (%1 m) - motor station recommended!", "vfl-20m-hinweis": "\n >>> NOTE: conveyor longer than 20 m (%1 m) - motor station recommended!",
"vfl-block-erstellt": "\n>>> Block '%1' (%2) created and inserted.", "vfl-block-erstellt": "\n>>> Block '%1' (%2) created and inserted.",
"vfl-fehler-rest-nicht-baubar": "\n ERROR: remainder cannot be built (too steep/too short for tail motor+GF2+separator+ES). Please continue drawing or plan flatter.", "vfl-fehler-rest-nicht-baubar": "\n ERROR: remainder cannot be built (too steep/too short for tail motor+GF2+separator+ES). Please continue drawing or plan flatter.",
"vfl-fehler-rest-nicht-baubar-mit-vorschlag": "\n ERROR: not buildable at target height %1 mm (distance dL=%2 mm, height difference dH=%3 mm, %4) - too steep/too short for tail motor+GF2+separator+ES. An approximately buildable target height would be:%5",
"vfl-fehler-rest-nicht-baubar-ohne-vorschlag": "\n ERROR: not buildable at target height %1 mm (distance dL=%2 mm, height difference dH=%3 mm, %4) - no alternative target height was found for this distance either. Please draw a longer distance or plan flatter.",
"vfl-vorschlag-ab-auf": " down to %1 mm or up to %2 mm",
"vfl-vorschlag-nur-ab": " down to %1 mm (up is not buildable at this distance)",
"vfl-vorschlag-nur-auf": " up to %1 mm (down is not buildable at this distance)",
"vfl-stufe1-start": "\n\n[Diagnosis stage 1 - VF angle search]",
"vfl-stufe2-diagnose": "\n\n[Diagnosis stage 2 - horizontal+GF] deltaL=%1 mm deltaH=%2 mm -> GF_total=%3 mm L_VF=%4 mm (%5)",
"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-ungueltig": "\n Stage 2 (horizontal+GF) was invalid - stage 1 (VF angle search) was tried instead (see table above).",
"vfl-fuege-block-ein": "\n Inserting %1 ...", "vfl-fuege-block-ein": "\n Inserting %1 ...",
"vfl-hinweis-gf2-minimum": "\n NOTE: calculated GF2=%1 mm < minimum %2 mm -> raised to minimum (ES therefore ends a bit further on; see actual-vs-target report).", "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-horizontale-zwischenstrecke": "\n\nHorizontal intermediate section (0 deg, L=%1 mm)", "vfl-horizontale-zwischenstrecke": "\n\nHorizontal intermediate section (0 deg, L=%1 mm)",
"vfl-kettenende-modus-ziel": "\n>>> Chain-end mode: target dL=%1 mm, dH=%2 mm (%3). GF2 varies with the angle.", "vfl-kettenende-modus-ziel": "\n>>> Chain-end mode: target dL=%1 mm, dH=%2 mm (%3). GF2 varies with the angle.",
"vfl-prompt-hoehe-endpunkt": "\nHeight (Z) of the end point [%1]: ", "vfl-prompt-hoehe-endpunkt": "\nHeight (Z) of the end point [%1]: ",
"vfl-prompt-hoehe-endpunkt-2": "\nHeight (Z) of the end point (down: %1 | up: %2) [%1]: ", "vfl-prompt-hoehe-endpunkt-2": "\nHeight (Z) of the end point (down: %1 | up: %2) [%1]: ",
"vfl-prompt-hoehe-kettenende": "\nHeight (Z) of the chain end (ES element) [%1]: ", "vfl-prompt-hoehe-kettenende": "\nHeight (Z) of the chain end (ES element) [%1]: ",
"vfl-prompt-hoehe-kettenende-2": "\nHeight (Z) of the chain end (ES element) (down: %1 | up: %2) [%1]: ", "vfl-prompt-hoehe-kettenende-2": "\nHeight (Z) of the chain end (ES element) (down: %1 | up: %2) [%1]: ",
"vfl-prompt-wahl-1-2": "\nYour choice (1-2) [1]: ",
"vfl-prompt-wahl-bis-n": "\nYour choice (1-%1) [1]: ", "vfl-prompt-wahl-bis-n": "\nYour choice (1-%1) [1]: ",
"vfl-frage-auf-ab-richtung": "\n\nChain arrives flat - no target height available. Choose direction:",
"vfl-frage-startpunkt-typ": "\n\nNo clear GF/VF component was recognized at the starting point (a GF stretch and a VF horizontal stretch look structurally identical). How should the entry be built?",
"vfl-opt-eingang-direkt": "\n 1 - Build idler station directly (no GF stretch)",
"vfl-opt-eingang-mit-stumpf": "\n 2 - GF (%1 mm) + idler station",
"vfl-opt-eingang-ohne-umlenk": "\n 3 - No idler station (VF continuation)",
"vfl-opt-richtung-auf": "\n 1 - Up",
"vfl-opt-richtung-ab": "\n 2 - Down",
"vfl-winkel-hoehen-header": "\n\nAvailable angles and the resulting end height - please choose:",
"vfl-winkel-hoehen-option": "\n %1 - %2 deg (end height: %3 mm)",
"vfl-winkel-hoehen-zeile": "\n %1 deg - end height: %2 mm",
"vfl-winkel-hoehen-zeile-tile": "end height: %1 mm",
"vfl-winkel-wahl-zeile-tile": "L_GF=%1 mm L_VF=%2 mm",
"vfl-winkel-zeile-tile-ungueltig": "not buildable (bend does not fit into the chosen distance)",
"vfl-winkel-hoehen-zeile-ungueltig": "\n %1 deg - not buildable (bend does not fit into the chosen distance)",
"vfl-winkel-hoehen-abweichung": "\n [Note] Target-vs-actual check: predicted end height %1 mm, actually reached %2 mm.",
"vfl-segment-gf-nicht-erlaubt": "\n Segment would be GF (too steep) or not buildable - not allowed within a VF unit.\n Please draw flatter/rising or end the conveyor.", "vfl-segment-gf-nicht-erlaubt": "\n Segment would be GF (too steep) or not buildable - not allowed within a VF unit.\n Please draw flatter/rising or end the conveyor.",
"vfl-winkel-option": "\n %1 - %2 deg (L_GF=%3 mm L_VF=%4 mm)", "vfl-winkel-option": "\n %1 - %2 deg (L_GF=%3 mm L_VF=%4 mm)",
"vfs-as90-mass": "\n AS_90: dx=%1 dz=%2", "vfs-as90-mass": "\n AS_90: dx=%1 dz=%2",
@@ -767,6 +850,7 @@
"vfl-abbruch-gesichert": "\n>>> Chain cancelled: %1 object(s) saved as a block (editable/resumable via double-click).", "vfl-abbruch-gesichert": "\n>>> Chain cancelled: %1 object(s) saved as a block (editable/resumable via double-click).",
"vfl-abbruch-nichts-gebaut": "\n>>> Cancelled - no geometry was created yet.", "vfl-abbruch-nichts-gebaut": "\n>>> Cancelled - no geometry was created yet.",
"vfl-abbruch-wickeln-fehler": "\n>>> ERROR saving the partial geometry as a block: %1", "vfl-abbruch-wickeln-fehler": "\n>>> ERROR saving the partial geometry as a block: %1",
"vfl-zurueck-glied-verworfen": "\n>>> Back: discarding the last chain element - please answer it again.",
"vfl-edit-dialog-fehlt": "Dialog not found: %1", "vfl-edit-dialog-fehlt": "Dialog not found: %1",
"vfl-edit-abgebrochen": "\nEdit cancelled - no change.", "vfl-edit-abgebrochen": "\nEdit cancelled - no change.",
"vfl-dlg-kopf-sektionen": "Sections: %1", "vfl-dlg-kopf-sektionen": "Sections: %1",
+42 -10
View File
@@ -33,7 +33,10 @@
;; ;;
;; Aufruf in BricsCAD: ;; Aufruf in BricsCAD:
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp")) ;; (load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp"))
;; TEST_LINIENZUG ;; TEST_LINIENZUG (Standard-Szenario, linienzug_tests.json, in
;; alltests.json/SSG_RUN_ALL_TESTS registriert)
;; TEST_LINIENZUG_STUFE2 (Stufe-2-Fallback-Regressionstest Kettenende,
;; linienzug_tests_stufe2.json, manueller Aufruf)
;; ============================================================ ;; ============================================================
;; Naechste Skript-Antwort liefern (FIFO). Bei leerer Queue Warnung + "". ;; Naechste Skript-Antwort liefern (FIFO). Bei leerer Queue Warnung + "".
@@ -126,8 +129,17 @@
) )
) )
(defun c:TEST_LINIENZUG ( / json-datei daten meta schritte-anz rest-anz status ;; --- Gemeinsamer Replay-Kern, von allen c:TEST_LINIENZUG*-Befehlen genutzt ---
old-vgp old-gs old-gi old-gr err) ;; befehl-anzeige: nur fuer die Konsolen-Ueberschrift/ssg-start (String).
;; test-id: Bezeichner fuer das *linienzug-test-results*-JSON (run-all-
;; Konvention, siehe linienzug:export-results).
;; Rueckgabe: (status schritte-anz rest-anz) - status ist "OK"/"ABWEICHUNG"/
;; "FEHLER". Setzt zusaetzlich *linienzug-test-results* (letzter Aufruf
;; gewinnt - identisch zum bisherigen Verhalten von c:TEST_LINIENZUG, das
;; ebenfalls nur einen einzigen Testfall pro Lauf kennt).
(defun tlz-run-datei (json-datei test-id befehl-anzeige /
daten meta schritte-anz rest-anz status
old-vgp old-gs old-gi old-gr err)
(if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek)) (if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek))
(if (null (car (atoms-family 1 '("VF-LINIENZUG-MODUS")))) (if (null (car (atoms-family 1 '("VF-LINIENZUG-MODUS"))))
(progn (progn
@@ -138,12 +150,10 @@
) )
(princ "\n================================================================") (princ "\n================================================================")
(princ "\n TEST_LINIENZUG - VF-Linienzug Replay-Test") (princ (strcat "\n " befehl-anzeige " - VF-Linienzug Replay-Test"))
(princ "\n================================================================") (princ "\n================================================================")
;; --- Eingabe-Skript aus JSON laden --- ;; --- Eingabe-Skript aus JSON laden ---
(setq json-datei
(strcat (getenv "DXFMAKRO") "\\tests\\testdata\\linienzug_tests.json"))
(setq daten (ssg-load-json json-datei)) (setq daten (ssg-load-json json-datei))
(if (null daten) (if (null daten)
(progn (progn
@@ -158,7 +168,7 @@
(princ (strcat "\n Eingabe-Schritte: " (itoa schritte-anz))) (princ (strcat "\n Eingabe-Schritte: " (itoa schritte-anz)))
(if meta (princ (strcat "\n Szenario: " (ssg-val meta "beschreibung")))) (if meta (princ (strcat "\n Szenario: " (ssg-val meta "beschreibung"))))
(ssg-start "TEST_LINIENZUG" '(("OSMODE") ("ATTREQ") ("ATTDIA"))) (ssg-start befehl-anzeige '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "OSMODE" 0)
(setvar "ATTREQ" 0) (setvar "ATTREQ" 0)
(setvar "ATTDIA" 0) (setvar "ATTDIA" 0)
@@ -192,11 +202,11 @@
(if (vl-catch-all-error-p err) (if (vl-catch-all-error-p err)
(progn (progn
(setq status "FEHLER") (setq status "FEHLER")
(princ (strcat "\n TEST_LINIENZUG: FEHLER -> " (princ (strcat "\n " befehl-anzeige ": FEHLER -> "
(vl-catch-all-error-message err)))) (vl-catch-all-error-message err))))
(progn (progn
(setq status (if (= rest-anz 0) "OK" "ABWEICHUNG")) (setq status (if (= rest-anz 0) "OK" "ABWEICHUNG"))
(princ "\n TEST_LINIENZUG: Kette gebaut.") (princ (strcat "\n " befehl-anzeige ": Kette gebaut."))
(if (> rest-anz 0) (if (> rest-anz 0)
(princ (strcat "\n WARNUNG: " (itoa rest-anz) (princ (strcat "\n WARNUNG: " (itoa rest-anz)
" Skript-Eintraege NICHT verbraucht (Ablauf weicht ab).")) " Skript-Eintraege NICHT verbraucht (Ablauf weicht ab)."))
@@ -214,12 +224,34 @@
;; --- Ergebnis fuer run-all als JSON-String ablegen --- ;; --- Ergebnis fuer run-all als JSON-String ablegen ---
(setq *linienzug-test-results* (setq *linienzug-test-results*
(strcat " {\n" (strcat " {\n"
" \"test_id\": \"LZ_Standard\",\n" " \"test_id\": \"" test-id "\",\n"
" \"status\": \"" status "\",\n" " \"status\": \"" status "\",\n"
" \"schritte_gesamt\": " (itoa schritte-anz) ",\n" " \"schritte_gesamt\": " (itoa schritte-anz) ",\n"
" \"schritte_offen\": " (itoa rest-anz) "\n" " \"schritte_offen\": " (itoa rest-anz) "\n"
" }")) " }"))
(ssg-end) (ssg-end)
(list status schritte-anz rest-anz)
)
(defun c:TEST_LINIENZUG ( / json-datei)
(setq json-datei
(strcat (getenv "DXFMAKRO") "\\tests\\testdata\\linienzug_tests.json"))
(tlz-run-datei json-datei "LZ_Standard" "TEST_LINIENZUG")
(princ)
)
;; Zweiter Testfall (Regressionstest, in dieser Session neu aufgenommen):
;; Stufe-2-Fallback beim Kettenende (typ=VF winkel=0, horizontales VF + GF-
;; Ausgleich), siehe Beschreibung/Kommentare in linienzug_tests_stufe2.json.
;; Eigenstaendiger Befehl statt zweitem Array-Eintrag in linienzug_tests.json,
;; damit LZ_Standard unangetastet bleibt (jede JSON-Datei bleibt ein
;; einzelnes Szenario, wie von tlz-daten->queue/-meta erwartet). NICHT in
;; tests/alltests.json registriert - manueller Einzelaufruf, bei Bedarf
;; spaeter dort ergaenzen.
(defun c:TEST_LINIENZUG_STUFE2 ( / json-datei)
(setq json-datei
(strcat (getenv "DXFMAKRO") "\\tests\\testdata\\linienzug_tests_stufe2.json"))
(tlz-run-datei json-datei "LZ_Stufe2_Kettenende" "TEST_LINIENZUG_STUFE2")
(princ) (princ)
) )
+4 -24
View File
@@ -1,6 +1,6 @@
[ [
{ {
"beschreibung": "Standard-Linienzug (Modus 1): Start Z4500 AS rechts -> Neue Linie Ab Z1800 45deg (GF am Einlauf) -> Horizontal 900 mit Separator VOR+NACH -> Vario-Kurve 90 links aussen -> Horizontal 250 -> Vario-Kurve 90 links aussen -> Kettenende (Option 3) Z4500 45deg ES rechts", "beschreibung": "Standard-Linienzug (Modus 1): Start Z4500 AS rechts -> Neue Linie Ab Z1800 45deg (GF am Einlauf) -> Horizontal 900 -> Vario-Kurve 90 links aussen -> Horizontal 250 -> Vario-Kurve 90 links aussen -> Kettenende (Option 3) Z4500 45deg ES rechts",
"erwartung_dx_mm": 0, "erwartung_dx_mm": 0,
"erwartung_dy_mm": 637, "erwartung_dy_mm": 637,
"erwartung_dz_mm": 0, "erwartung_dz_mm": 0,
@@ -33,8 +33,8 @@
}, },
{ {
"typ": "string", "typ": "string",
"wert": "2", "wert": "4",
"kommentar": "getstring Naechstes Element (2 = Neue Linie: Ab/Auf VF - Gefaelle hier 26 Grad > GF-Maximalwinkel, daher NICHT Option 1/GF)" "kommentar": "getstring Naechstes Element (4 = Neue Linie: Ab/Auf VF - Kettenanfang-Menue hat seit GF-Bogen/Vario-Kurve-Erweiterung 6 statt 4 Optionen, Linie-VF ist jetzt Option 4 statt 2; Gefaelle hier 26 Grad > GF-Maximalwinkel, daher NICHT Option 3/GF)"
}, },
{ {
"typ": "point_rel", "typ": "point_rel",
@@ -73,20 +73,10 @@
"hz": 0, "hz": 0,
"kommentar": "getpoint Horizontal-Endpunkt (dL=900, hz=0)" "kommentar": "getpoint Horizontal-Endpunkt (dL=900, hz=0)"
}, },
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Separator VOR? (Ja)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Separator NACH? (Ja)"
},
{ {
"typ": "string", "typ": "string",
"wert": "2", "wert": "2",
"kommentar": "getstring Ist Endpunkt? (Nein)" "kommentar": "getstring Ist Endpunkt? (Nein) - kein Separator mehr innerhalb der VF-Einheit (5-Punkte-Umbau)"
}, },
{ {
"typ": "string", "typ": "string",
@@ -124,16 +114,6 @@
"hz": 90, "hz": 90,
"kommentar": "getpoint Horizontal-Endpunkt (dL=250, hz=90)" "kommentar": "getpoint Horizontal-Endpunkt (dL=250, hz=90)"
}, },
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Separator VOR? (Nein)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Separator NACH? (Nein)"
},
{ {
"typ": "string", "typ": "string",
"wert": "2", "wert": "2",
+295
View File
@@ -0,0 +1,295 @@
[
{
"beschreibung": "Stufe-2-Fallback-Regressionstest (Kettenende): Start Z2154 AS 90 Grad links -> Horizontal-VF (2x Vario-Kurve 90 rechts innen) -> Linie-GF 3 Grad (Sep vor+nach) -> Horizontal-VF (Vario-Kurve 30 rechts innen -> Auf 27 Grad -> Vario-Kurve 30 links aussen) -> Kettenende ueber 'Ist der Endpunkt der Foerderer?'-Option 3 mit ES 90 Grad links; GF2 (86mm) liegt unter der Mindestlaenge (400mm), Stufe 1 (Winkeltabelle) scheitert komplett (alle Kandidaten negative Laenge) -> Stufe 2 (vfl-winkel-stufe-entscheidung) liefert typ=VF winkel=0 (horizontales VF + GF-Ausgleich). Reproduziert den in dieser Session gefixten Bug (Stufe-2-Fallback griff im Kettenende-Zweig 'Ab, steiler als 3 Grad' bisher nicht, wenn Stufe 1 scheiterte) - erster erfolgreicher Stufe-2-Bau der Session, live in BricsCAD verifiziert.",
"erwartung_dx_mm": 638,
"erwartung_dy_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_hinweis": "dX~638 = seitlicher Fussabdruck ES_Element_90 quer zur letzten Fahrtrichtung (Bauform des 90-Grad-ES-Elements, kein Baufehler). Kernzweck des Testfalls: Stufe-2-Fallback beim Kettenende (typ=VF winkel=0 im Kettenende-Abschluss, GF2=86mm unter Mindestlaenge -> 'trotzdem mit 86mm bauen?'=Ja)."
},
{
"typ": "point_abs",
"wert": [24377.817458, -10300, 2067],
"kommentar": "getpoint Startpunkt der Kette (Rohwert aus dem realen BricsCAD-Testlauf)"
},
{
"typ": "real",
"wert": 2154.0,
"kommentar": "getreal Hoehe (Z) Startpunkt"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring AS-Element setzen? (Ja)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring AS-Element Winkel - Menu-Index 1=90 Grad/2=30 Grad (vf-frage-element-winkel mappt den rohen Index auf den Winkel-STRING '90'/'30'; im Debug-Journal erscheint bereits der gemappte Wert '90', die Konsolen-/Mock-Eingabe selbst bleibt der Index)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring AS-Seite (links)"
},
{
"typ": "string",
"wert": "5",
"kommentar": "getstring Naechstes Element (Kettenanfang-Menue, 6 Optionen: 5 = Horizontal-VF)"
},
{
"typ": "point_rel",
"dL": 6082.461,
"hz": 90,
"kommentar": "getpoint Endpunkt Horizontal-VF (freie Richtung am Kettenanfang, hz-vorgabe=nil - hz=90 ist die vom Code gesnappte Richtung, direkt aus dem Debug-Journal (REAL-Eintrag unmittelbar nach dem DL-Eintrag) uebernommen; dieser REAL-Eintrag ist ein reiner Journal-Nebeneffekt von vfl-in-abstand und KEIN eigener Eingabe-Schritt, siehe Lisp/vf_linienzug.lsp vfl-in-abstand"
},
{
"typ": "real",
"wert": 1980.0,
"kommentar": "getreal Ziel-Hoehe Eingang GF1 (eingang-modus=voll/nil, vollstaendiger Neuaufbau des VF-Eingangs)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein) - erste Frage innerhalb vfl-baue-horizontal-koerper (ziel-modus)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Naechstes im VarioFoerderer (Vario-Kurve)"
},
{
"typ": "int",
"wert": 90,
"kommentar": "getint Vario-Kurve Winkel (90 Grad, roher Winkelwert - KEIN Auswahl-Index, siehe vfl-menu-winkel)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Seite (rechts)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Variante (innen)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Naechstes im VarioFoerderer (Horizontaler Foerderer)"
},
{
"typ": "point_rel",
"dL": 1300,
"hz": 0,
"kommentar": "getpoint Horizontal-Endpunkt innerhalb der VF-Einheit. hz=0 ANNAHME (NICHT direkt im Debug-/Konsolen-Auszug als 'hz=' ausgewiesen, sondern aus der Turn-Arithmetik hergeleitet: Start-hz=90, davor bereits eine 90-Grad-rechts-Vario-Kurve (-90) -> 90-90=0; dieselbe Turn-Konvention [rechts=-Winkel/links=+Winkel] ist an ZWEI anderen Stellen dieses Testfalls unabhaengig durch explizite 'hz='-Werte im Konsolen-Auszug bestaetigt, siehe die Vario_Bogen_ab_3/ab_27-Eintraege). BITTE in BricsCAD live gegenpruefen (einzige nicht direkt beleg-bestaetigte hz-Rekonstruktion dieses Testfalls)."
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein) - innerhalb vfl-baue-horizontal-koerper (ziel-modus)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Naechstes im VarioFoerderer (Vario-Kurve)"
},
{
"typ": "int",
"wert": 90,
"kommentar": "getint Vario-Kurve Winkel (90 Grad)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Seite (rechts)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Variante (innen)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Ja, nur Motorstation) - schliesst die 1. Horizontal-VF-Einheit ab"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist das Kettenende (ES-Element)? (Nein, weiterbauen) - vfl-vf-einheit-abschluss"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Zusaetzlichen Separator an dieser Stelle einfuegen? (Nein)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Naechstes Element (Hauptmenue, 5 Optionen, Frame vorhanden: 2 = Neue Linie: GF)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Wie soll die Laenge dieser Gefaellestrecke bestimmt werden? (1 = Endpunkt waehlen)"
},
{
"typ": "point_rel",
"dL": 978.394396,
"hz": -90,
"kommentar": "getpoint Endpunkt Gefaellestrecke. hz=-90 DIREKT aus dem Debug-Journal bestaetigt (GEOMETRIE-Zeile 'vfl-insert-gf-segment (deltaL=379 hz=-90 winkel=3)')"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Separator VOR dieser Gefaellestrecke einfuegen? (Ja)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Separator NACH dieser Gefaellestrecke einfuegen? (Ja)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Gefaelle festlegen (1 = Neigungswinkel eingeben)"
},
{
"typ": "real",
"wert": 3.0,
"kommentar": "getreal Neigungswinkel (3 Grad)"
},
{
"typ": "string",
"wert": "3",
"kommentar": "getstring Ist das Kettenende? (3 = Nein, weiterbauen - 3-Optionen-Menue: 1=Ja+ES, 2=Ja ohne ES, 3=Nein)"
},
{
"typ": "string",
"wert": "4",
"kommentar": "getstring Naechstes Element (5 Optionen: 4 = Neue VF mit horizontalem Anfang/Horizontal-VF)"
},
{
"typ": "point_rel",
"dL": 888.101488,
"hz": -90,
"kommentar": "getpoint Endpunkt Horizontal-VF (2. Einheit). hz=-90 unveraendert gegenueber dem vorigen GF-Segment (keine Richtungsaenderung dazwischen); eingang-modus=separator (letztes Glied war der Separator NACH der Gefaellestrecke) -> KEINE Ziel-Hoehe-Frage fuer GF1 (im Unterschied zur 1. Horizontal-VF-Einheit)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein) - innerhalb vfl-baue-horizontal-koerper (ziel-modus)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Naechstes im VarioFoerderer (Vario-Kurve)"
},
{
"typ": "int",
"wert": 30,
"kommentar": "getint Vario-Kurve Winkel (30 Grad)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Seite (rechts)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Vario-Kurve Variante (innen)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein)"
},
{
"typ": "string",
"wert": "3",
"kommentar": "getstring Naechstes im VarioFoerderer (Auf/Ab-Foerderer)"
},
{
"typ": "point_rel",
"dL": 1614.972606,
"hz": -120,
"kommentar": "getpoint Endpunkt Auf/Ab-Foerderer. hz=-120 DIREKT bestaetigt (Konsolen-Auszug zeigt fuer den anschliessenden Vario_Bogen_ab_3_TEF_rechts explizit 'hz=-120 Grad' bei derselben Fahrtrichtung)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Kette kommt flach an - Richtung waehlen (1 = Auf)"
},
{
"typ": "int",
"wert": 8,
"kommentar": "getint Winkel-/Hoehen-Tabelle: Auswahl-Index (NICHT der Winkel selbst) unter den GUELTIGEN Kandidaten - gueltig sind hier 3/6/9/12/15/18/21/27 Grad (8 Werte), Index 8 = letzter gueltiger Kandidat = 27 Grad (siehe Konsolen-Auszug '5/11: Vario_Bogen_auf_27_TEF_rechts')"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (Nein)"
},
{
"typ": "string",
"wert": "2",
"kommentar": "getstring Naechstes im VarioFoerderer (Vario-Kurve)"
},
{
"typ": "int",
"wert": 30,
"kommentar": "getint Vario-Kurve Winkel (30 Grad)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Vario-Kurve Seite (links)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Vario-Kurve Variante (aussen) - Konsolen-Auszug bestaetigt 'Vario_Kurve_links_30_TEF_aussen'"
},
{
"typ": "string",
"wert": "3",
"kommentar": "getstring Ist der Endpunkt der Foerderer? (3 = Ja, Motorstation setzen + Kettenende definieren) - startet den Stufe-1/Stufe-2-Kettenende-Zweig (vfl-body-abschluss/vfl-body-zerlegung)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring ES-Element setzen? (Ja)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring ES-Element Winkel - Menu-Index 1=90 Grad/2=30 Grad (wie AS-Winkel oben, gleiches Mapping ueber vf-frage-element-winkel)"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring ES-Seite (links)"
},
{
"typ": "point_rel",
"dL": 1802.808856,
"hz": -90,
"kommentar": "getpoint Endpunkt Kettenende (vfl-body-abschluss). hz=-90 DIREKT bestaetigt: die im Debug-Log erreichte Position (25544.710135 -8783.275914 2270.287821) hat exakt dieselbe X- und Z-Koordinate wie die KS_AUS-Position der vorigen Vario-Kurve (25544.71 / 2270.29 lt. Konsolen-Auszug) - nur Y aendert sich, das ist ausschliesslich mit hz=-90 (reine Y-Richtung) vereinbar"
},
{
"typ": "real",
"wert": 2154.0,
"kommentar": "getreal Ziel-Hoehe Kettenende. Ab hier laeuft vfl-body-zerlegung AUTOMATISCH: Stufe 1 (Winkeltabelle 3/6/9/.../51 Grad) scheitert komplett (alle Kandidaten ergeben negative L_VF), Stufe 2 (vfl-winkel-stufe-entscheidung/berechne-horizontale-mitte) liefert typ=VF winkel=0 L_GF=86 L_VF=286 - KEINE weitere Eingabe fuer diese Entscheidung noetig"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Berechnetes GF2=86mm liegt unter der ueblichen Mindestlaenge (400mm) - trotzdem mit den exakt berechneten 86mm bauen? (Ja) - schliesst die Kette ab (VF_n mit GF=1 VF=5)"
}
]