fix: VF-Linienzug 100%-Wiederherstellung aus e76e24e abgeschlossen

Restauriert alles aus e76e24e, das nach dem Reset auf master fehlte oder nur
teilweise wiederhergestellt war, und mit dem Kollegen-Umbau abgeglichen:

- vf_core.lsp: Radio-Button-Dialoge fuer Anlagen-Typ/Linienzug-Modus
  (vfc-dialog-typ-waehlen/-linienzug-modus-waehlen) + Zurueck-Schleife im
  c:VarioFoerderer-Dispatcher
- Vario-Kurve/GF-Bogen-Erkennung am Kettenanfang: vfl-eingang-modus-bestimmen
  threaded durch vfl-vf-eingang-bauen/vfl-vf-einheit/vfl-vf-einheit-abschluss,
  inkl. Punkt-7-Winkel/Hoehen-Tabelle fuer reduzierten Eingang
- Modus 2: Lauf-Anfang/Lauf-Abschluss (offener Anfang/Ende, GF-Verteilung
  "alles Auslauf", Kletter-zu-kurz-Fallback) + Separator VOR/NACH bei
  GF-Geraden
- Systemischer Bug behoben: mehrere Wizard-Dialogfunktionen nutzten noch
  start_list/add_list (Dropdown) gegen laengst auf boxed_radio_column
  umgestellte DCL-Dialoge (vflw-gruppe-as/-gefaelle/-variokurve/
  -winkel-seite-impl, vflw-seg-linie-m2/-m3/-bogen-impl,
  vfl-glied-gf-bogen/-vario/-as-es-dialog)
- Zentraler Abbruch-Trigger in vfl-in-value/-value-p wiederhergestellt (ohne
  ihn wirkte der Zurueck/Abbrechen-Button in keinem Wizard-Dialog)
- vfl-frage-ist-endpunkt/-ist-kettenende als eigene Funktionen mit
  Wizard-Dialog extrahiert (vorher Konsolen-Duplikate ohne Dialog-Hookup)
- 3 vfs-vf-entry-Aufrufe mit falscher Argumentzahl gefixt (akute
  Absturz-Bugs in Modus 2/3)
- Tote Funktion vflw-gruppe-horizontal-impl entfernt (Tiles nicht mehr im
  DCL vorhanden)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Yuelin Wang
2026-09-11 18:26:48 +02:00
co-authored by Claude Sonnet 5
parent 4a444b4858
commit 0a1d21d8c5
13 changed files with 3106 additions and 654 deletions
+12
View File
@@ -776,6 +776,9 @@
;; AUS-Element: 30/90 (vor Seite), dann Seite (vor Winkelberechnung, da die
;; 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"))
(princ (ssg-text "gf-seite-aus-header"))
(princ (ssg-text "gf-seite-links"))
@@ -785,6 +788,9 @@
(vf-set-as-masse gf-as-winkel as-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"))
(princ (ssg-text "gf-seite-ein-header"))
(princ (ssg-text "gf-seite-links"))
@@ -1760,6 +1766,9 @@
(setq winkel (float winkel))
;; 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"))
(princ (ssg-text "gf-seite-aus-header"))
(princ (ssg-text "gf-seite-links"))
@@ -1768,6 +1777,9 @@
(setq as-seite (if (= antwort "2") "rechts" "links"))
;; 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"))
(princ (ssg-text "gf-seite-ein-header"))
(princ (ssg-text "gf-seite-links"))
+181 -64
View File
@@ -598,9 +598,14 @@
;; "vf-winkel-ein-header"). Rueckgabe: "30" oder "90" (Default 90).
;; Wizard: nutzt vflw-wahl (dcl/vf_linienzug_wizard.dcl, definiert in
;; vf_linienzug.lsp) falls dieses Modul geladen und *vfl-wizard-mode* aktiv
;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Fragen
;; (princ + getstring, de/en ueber ssg-text). Gemeinsam genutzt von
;; Gefaellestrecke.lsp UND vf_linienzug.lsp.
;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Frage
;; (getstring, de/en ueber ssg-text). Gemeinsam genutzt von Gefaellestrecke.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)
;; Wizard-Dialog nur, wenn Wizard-Modus aktiv, vflw-wahl geladen UND die GUI
;; global nicht abgeschaltet ist (Tests: (ssg-gui-aus)) - sonst Konsole/getstring.
@@ -615,12 +620,7 @@
(if (or (vl-catch-all-error-p antwort) (null antwort) (= antwort ""))
(setq antwort "1"))
)
(progn
(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")))
)
(setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
)
(if (= antwort "2") "30" "90"))
@@ -972,7 +972,7 @@
(setq horizontal-info nil)
(if (and horizontal-p (= richtung "Ab"))
(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))
(setq ergebnis-liste
(append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T))))
@@ -1078,6 +1078,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
;; ============================================================
@@ -1088,7 +1176,7 @@
best-winkel L_GF L_GF1 L_GF2 L_VF
idx eintrag wahl antwort verteilung-modus
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 (ssg-text "vfc-banner-titel"))
@@ -1102,61 +1190,90 @@
)
)
(if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(progn
(setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*)))
(setq *vf-vorauswahl-typ* nil)
)
(progn
(setq *vf-vorauswahl-typ* nil)
(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))
;; Aeussere Schleife nur wegen "Zurueck" bei der Linienzug-Modus-Frage
;; (springt zurueck zur Anlagen-Typ-Frage) - fuer Standard/Etage bleibt
;; zurueck-zu-typ immer nil, die Schleife laeuft dann genau einmal.
(setq zurueck-zu-typ t)
(while zurueck-zu-typ
(setq zurueck-zu-typ nil)
(if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(progn
(setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
(princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*)))
(setq *vf-vorauswahl-typ* nil)
)
(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 berechne-fn (nth 1 typ-eintr))
(setq einfuege-fn (nth 2 typ-eintr))
(princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
(setq anlage-typ (nth 0 typ-eintr))
(setq berechne-fn (nth 1 typ-eintr))
(setq einfuege-fn (nth 2 typ-eintr))
(princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
(if (= anlage-typ "linienzug")
(progn
(princ (ssg-text "vfc-linienzug-modus-header"))
(princ (ssg-text "vfc-linienzug-modus-1"))
(princ (ssg-text "vfc-linienzug-modus-2"))
(princ (ssg-text "vfc-linienzug-modus-3"))
(setq wahl (getint (ssg-text "prompt-wahl-1-2-3")))
;; 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. Ein abgebrochener Bau bleibt als
;; VF_n-Block stehen und wird per Doppelklick fortgesetzt/editiert
;; (vfl-edit-ent), kein separater Menuepunkt noetig.
;; Journal-Reset gilt fuer JEDEN frischen Bau, nicht nur Modus 1: Modus 2
;; schreibt sein Journal ebenfalls als XDATA (Marker "linienzug2"), erbte
;; ohne Reset aber die Eintraege des Vorlaufs als Praefix - ein spaeterer
;; Doppelklick spielte dann fremde Eingaben vor. Die Edit-/Konvertier-Pfade
;; laufen nie hier durch (sie setzen ihre Queue selbst), darum ist das
;; Hochziehen ein reiner Bugfix. Setzt zugleich *vfl-seg-glied-letzte*
;; zurueck, das sonst vom Vorlauf stehenbleibt.
(vfl-journal-reset)
(cond ((= wahl 2) (vf-linienzug-modus2))
((= wahl 3) (vf-linienzug-modus3))
(t (vf-linienzug-modus)))
(exit)
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
(if (= anlage-typ "linienzug")
(progn
(setq dlg-modus (vfc-dialog-linienzug-modus-waehlen))
(cond
((eq dlg-modus 'ABBRUCH) (exit))
((eq dlg-modus 'ZURUECK) (setq zurueck-zu-typ t))
(dlg-modus (setq wahl dlg-modus))
(t
;; Dialog nicht verfuegbar/nicht erlaubt - alte Konsolen-Liste.
(princ (ssg-text "vfc-linienzug-modus-header"))
(princ (ssg-text "vfc-linienzug-modus-1"))
(princ (ssg-text "vfc-linienzug-modus-2"))
(princ (ssg-text "vfc-linienzug-modus-3"))
(setq wahl (getint (ssg-text "prompt-wahl-1-2-3")))
)
)
(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.
;; Journal-Reset gilt fuer JEDEN frischen Bau, nicht nur Modus 1: Modus 2
;; schreibt sein Journal ebenfalls als XDATA (Marker "linienzug2"), erbte
;; ohne Reset aber die Eintraege des Vorlaufs als Praefix - ein spaeterer
;; Doppelklick spielte dann fremde Eingaben vor. Die Edit-/Konvertier-Pfade
;; laufen nie hier durch (sie setzen ihre Queue selbst), darum ist das
;; Hochziehen ein reiner Bugfix. Setzt zugleich *vfl-seg-glied-letzte*
;; zurueck, das sonst vom Vorlauf stehenbleibt.
(vfl-journal-reset)
(cond ((= wahl 2) (vf-linienzug-modus2))
((= wahl 3) (vf-linienzug-modus3))
(t (vf-linienzug-modus)))
(exit)
)
)
)
)
)
@@ -1223,7 +1340,7 @@
;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert.
(if (and (= anlage-typ "standard") (= richtung "Ab"))
(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))
(progn
(setq ergebnis-liste
+5
View File
@@ -271,6 +271,11 @@
;; Wert geometrisch herleiten laesst statt empirisch fixiert zu bleiben.
(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)
(princ "\nvf_konstanten geladen.")
(princ)
+1897 -492
View File
File diff suppressed because it is too large Load Diff
+11 -2
View File
@@ -202,6 +202,15 @@
" erlaubt - jedes weitere erbt die Fahrtrichtung"
" vom Vorgaenger und hat keinen Journal-Eintrag")))))
;; Reine Richtungswahl OHNE Laenge (vfl-in-richtung: journalisiert NUR REAL,
;; kein DL-Token) - fuer den Kettenanfang-Fall der Zielhoehe-zuerst-Zweige
;; ("Linie-GF" modus="hoehe"/"steigend"+"hoehe"), wo noch keine Laenge
;; bekannt ist. Nur beim allerersten Segment der Kette relevant (sonst gar
;; kein Aufruf, siehe Aufrufer) - toggelt *vsp-erster-dl* wie vsp-linie.
(defun vsp-richtung (quelle)
(vsp-zahl "REAL" (ssg-val quelle "hz") "hz (Richtungswahl, kein DL noetig)")
(setq *vsp-erster-dl* nil))
;; Winkelwahl (vfl-waehle-winkel) steht nur im Journal, wenn mehrere
;; Kandidatenwinkel gueltig waren - das haengt an der real gemessenen
;; Restlaenge und ist vorab nicht immer bekannt. Fehlt das Feld und der Bau
@@ -275,12 +284,12 @@
(vsp-code-raus *vsp-tab-gf-laenge-modus* smodus "steigend_modus")
(if (= smodus "endpunkt")
(vsp-linie sek)
(if erster (vsp-linie sek)))
(if erster (vsp-richtung sek)))
(if (= smodus "hoehe")
(vsp-zahl "REAL" (ssg-val sek "hoehe") "hoehe"))
(vsp-zahl "REAL" (ssg-val sek "winkel") "winkel"))
((= modus "hoehe")
(if erster (vsp-linie sek))
(if erster (vsp-richtung sek))
(vsp-raus "STR" (vsp-ja-code (ssg-val sek "sep_vor")))
(vsp-raus "STR" (vsp-ja-code (ssg-val sek "sep_nach")))
(vsp-zahl "REAL" (ssg-val sek "hoehe") "hoehe")
+34 -14
View File
@@ -337,20 +337,32 @@
;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger.
;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR
;; 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.
(defun berechne-horizontale-mitte (deltaL deltaH richtung /
(defun berechne-horizontale-mitte (deltaL deltaH richtung schon-flach /
mass1 mass2 rad3 bogen-x1 bogen-z1
bogen-x2 bogen-z2 deltaH-signiert
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*)))
(if (or (null mass1) (null mass2))
nil
(progn
(setq rad3 (* *vfk-gefaelle-winkel* (/ pi 180.0)))
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3))))
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3))))
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt
;; auf 0 Grad - entfaellt bei schon-flach (kein Eintrittsbogen noetig).
(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
(setq bogen-x2 (car mass2))
(setq bogen-z2 (caddr mass2))
@@ -412,7 +424,11 @@
;; 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
;; 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))
(setq hz (float hz))
;; 1. Gefaellestrecke GF1 (verbindet AS-Neigung mit Umlenkstation)
@@ -425,13 +441,17 @@
)
(princ (ssg-text "vfs-vf-eingang-gf1-skip"))
)
;; 2. Separator (am GF1-Ende / vor Umlenkstation)
(princ (ssg-text "vfs-vf-eingang-separator"))
(setq aktueller-punkt
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
(ssg-cfg-or "vario" "separator_block_dx" 300)
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
;; 2. Separator (am GF1-Ende / vor Umlenkstation) - entfaellt bei ohne-separator
(if (not ohne-separator)
(progn
(princ (ssg-text "vfs-vf-eingang-separator"))
(setq aktueller-punkt
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
(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
(princ (ssg-text "vfs-vf-eingang-umlenk"))
(setq aktueller-punkt
@@ -604,7 +624,7 @@
(defun vfs-mitte-teil (aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz)
(if (null hz) (setq hz 0.0))
(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-exit aktueller-punkt L_GF2 hz t))
aktueller-punkt
+92 -10
View File
@@ -1,16 +1,98 @@
// ============================================================
// variofoerderer.dcl - Standard-VarioFoerderer Parameter-Eingabe
// Zwei Dialoge fuer den Standardfall (anlage-typ "standard") von
// c:VarioFoerderer, ersetzen die interaktive Werteingabe (Modus
// "Werteingabe") aus vf-eingabe-abfragen / vf_core.lsp:
// Dialog 1 (variofoerderer_basis): deltaL, deltaH, Foerderrichtung,
// Einfuegehoehe, Fahrtrichtung, Seite.
// Dialog 2 (variofoerderer_winkel): Winkel (dynamisch berechnete
// gueltige Varianten), Verteilung der Gefaellestrecken vorne/hinten.
// Die 3D-Linie-Eingabe (Modus "3D-Linie") und andere Anlagen-Typen
// (Etage, Linienzug) bleiben interaktiv (Kommandozeile).
// variofoerderer.dcl - VarioFoerderer Parameter-Eingabe
// Dialoge fuer c:VarioFoerderer (vf_core.lsp):
// vfc_typ: Anlagen-Typ waehlen (Standard/Etage/Linienzug) - ersetzt die
// Konsolen-Liste am Befehlsanfang. Radio-Buttons statt Dropdown, daher
// Labels FEST auf Deutsch (siehe Kommentar bei vfc_linienzug_modus).
// vfc_linienzug_modus: NUR bei Typ "Linienzug" - Modus 1/2/3 waehlen.
// variofoerderer_basis/variofoerderer_winkel: Werteingabe fuer den
// Standardfall (anlage-typ "standard"): deltaL, deltaH, Foerderrichtung,
// Einfuegehoehe, Fahrtrichtung, Seite, Winkel, GF-Verteilung.
// 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 {
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).
@@ -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
// in einem Bildschirm - "kopf" traegt die konkrete Frage (AS oder ES),
// "setzen" bleibt bewusst generisch beschriftet, damit derselbe Dialog fuer
// 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 {
label = "VarioFoerderer Assistent";
@@ -133,24 +157,34 @@ vflw_as : dialog {
key = "setzen";
label = "Ja, setzen";
}
: popup_list {
key = "winkel";
: boxed_radio_column {
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 {
key = "seite";
: boxed_radio_column {
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
// ES-Element am Kettenende (2 Winkel-Optionen) - die Optionsliste wird pro
// Aufruf zur Laufzeit befuellt, die Feld-Anzahl ist in beiden Faellen gleich.
// Winkel + Seite. Wiederverwendet fuer GF-Bogen (3 Winkel-Optionen: 30/60/90)
// UND ES-Element am Kettenende (2 Winkel-Optionen: 90/30 - dort wird
// "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 {
label = "VarioFoerderer Assistent";
@@ -160,22 +194,33 @@ vflw_winkel_seite : dialog {
label = "";
width = 60;
}
: popup_list {
key = "winkel";
: boxed_radio_column {
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 {
key = "seite";
: boxed_radio_column {
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.
// Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_variokurve : dialog {
label = "VarioFoerderer Assistent";
@@ -185,30 +230,41 @@ vflw_variokurve : dialog {
label = "";
width = 60;
}
: popup_list {
key = "winkel";
: boxed_radio_column {
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 {
key = "seite";
: boxed_radio_column {
label = "Seite:";
width = 20;
key = "seite";
: radio_button { key = "seite_links"; label = "Links"; value = "1"; }
: radio_button { key = "seite_rechts"; label = "Rechts"; }
}
: popup_list {
key = "variante";
: boxed_radio_column {
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
// Beschriftung sich je nach Modus umschaltet (Action-Tile auf "modus", 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 {
label = "VarioFoerderer Assistent";
@@ -218,10 +274,11 @@ vflw_gefaelle : dialog {
label = "";
width = 60;
}
: popup_list {
key = "modus";
: boxed_radio_column {
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 {
key = "wlabel";
@@ -232,15 +289,64 @@ vflw_gefaelle : dialog {
label = "";
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?"
// (3 Optionen) in einem Bildschirm. Kein Punkt-Feld - siehe Kopfkommentar
// oben.
vflw_horizontal : dialog {
// "Wie soll die Laenge dieser Gefaellestrecke bestimmt werden?" (Neue Linie:
// GF) - Endpunkt-Pick (heutiges Verhalten) ODER Zielhoehe zuerst festlegen
// (Laenge wird dann aus Zielhoehe+Winkel berechnet, siehe
// 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";
: column {
@@ -251,20 +357,502 @@ vflw_horizontal : dialog {
}
: toggle {
key = "sepvor";
label = "Separator VOR dem Stueck";
label = "Separator VOR dieser Gefaellestrecke";
}
: toggle {
key = "sepnach";
label = "Separator NACH dem Stueck";
}
: popup_list {
key = "istende";
label = "Foerderer-Ende:";
width = 45;
label = "Separator NACH dieser Gefaellestrecke";
}
}
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.
// Das Neigungsfeld wird per action_tile auf "typ" aktiviert/deaktiviert.
// Radio-Buttons statt Dropdown, Labels fest deutsch.
vflw_seg_linie_m2 : dialog {
label = "VarioFoerderer Assistent";
@@ -287,10 +876,11 @@ vflw_seg_linie_m2 : dialog {
label = "";
width = 60;
}
: popup_list {
key = "typ";
: boxed_radio_column {
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 {
key = "wlabel";
@@ -301,6 +891,11 @@ vflw_seg_linie_m2 : dialog {
label = "";
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;
@@ -309,7 +904,8 @@ vflw_seg_linie_m2 : dialog {
// Modus 3, Segment "Gerade": Typ (GF / VF-Ab / VF-Auf / VF-Horizontal) + EIN
// Wertfeld, dessen Beschriftung mit dem Typ umschaltet (GF -> Neigung,
// 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 {
label = "VarioFoerderer Assistent";
@@ -319,10 +915,13 @@ vflw_seg_linie_m3 : dialog {
label = "";
width = 60;
}
: popup_list {
key = "typ";
: boxed_radio_column {
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 {
key = "wlabel";
@@ -340,7 +939,9 @@ vflw_seg_linie_m3 : dialog {
// Segment "Eck/Bogen" (Modus 2 + Modus 3 identisch): Typ (GF-Bogen /
// 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 {
label = "VarioFoerderer Assistent";
@@ -350,15 +951,65 @@ vflw_seg_bogen : dialog {
label = "";
width = 60;
}
: popup_list {
key = "typ";
: boxed_radio_column {
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 {
key = "variante";
: boxed_radio_column {
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"; }
}
}
+57
View File
@@ -19,12 +19,20 @@
"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-prompt-wahl-1-4-def1": "\nIhre Wahl (1-4) [1]: ",
"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-vf-kurz": "\nFEHLER: Horizontaler VF braucht >= 1000 mm (Umlenk + Motor) - laenger zeichnen.",
"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-gefaelle-festlegen-header": "\nGefaelle festlegen:",
"vfl-gefaelle-opt-hoehe": "\n 1 - Gegebene Hoehe (Zielhoehe)",
"vfl-gefaelle-opt-winkel": "\n 2 - Neigungswinkel eingeben",
"vfl-gf-hinweis-laenge-berechnet": "(deltaL wird berechnet und eingefuegt)",
"vfl-prompt-neigungswinkel": "\nNeigungswinkel (Grad, 0 < Winkel <= %1) [%1]: ",
"vfl-alert-winkel-ungueltig": "Neigungswinkel ungueltig: %1 Grad. Erlaubt: 0 < Winkel <= %2 Grad.",
"vfl-prompt-hoehe-linienendpunkt": "\nHoehe (Z) des Linienendpunkts [%1]: ",
@@ -42,6 +50,7 @@
"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-sep-vor-gf-frage": "\n\nSeparator VOR dieser Gefaellestrecke einfuegen?",
"vfl-sep-nach-gf-frage": "\n\nSeparator NACH dieser Gefaellestrecke einfuegen?",
"vfl-sep-gf-header": "Separator an dieser Gefaellestrecke",
"vfl-ist-kettenende-header": "\nIst das das Kettenende?",
"vfl-kettenende-opt-ja-es": "\n 1 - Ja (ES-Element setzen)",
"vfl-kettenende-opt-ja-ohne-es": "\n 2 - Ja (ohne ES-Element setzen)",
@@ -106,6 +115,10 @@
"vfl-opt2-60grad": "\n 60 Grad",
"vfl-opt3-30grad": "\n 30 Grad",
"vfl-prompt-wahl-1-3-def1": "\nIhre Wahl (1/2/3) [1]: ",
"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-variokurve-seite-header": "\nVario-Kurve - Seite waehlen:",
"vfl-variokurve-variante-header": "\nVario-Kurve - Variante waehlen:",
"vfl-variante-aussen": "\n 1 - Aussen",
@@ -164,9 +177,26 @@
"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-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-alert-vf-zu-lang": "VF-Lauf ist %1 m lang (Grenze %2 m) - bitte neu planen (z.B. Zwischen-Motorstation einfuegen).",
"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-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-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-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-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-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",
@@ -303,6 +333,26 @@
"vfe-tabelle-zeile-fehler": "\n %1 --- --- FEHLER",
"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-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-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-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-frage-gf2-minimum": "\n Berechnetes GF2=%1 mm liegt unter der ueblichen Mindestlaenge (%2 mm).\n Ja = mit den exakt berechneten %1 mm bauen (Zielpunkt wird exakt getroffen).\n Nein = auf %2 mm auffuellen (Zielpunkt verschiebt sich entsprechend weiter).",
"vfl-fehler-rest-nicht-baubar": "\n FEHLER: Rest nicht baubar (zu steil/zu kurz fuer Schwanz Motor+GF2+Separator+ES). Bitte weiter zeichnen oder flacher planen.",
"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).",
@@ -313,6 +363,13 @@
"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-wahl-bis-n": "\nIhre Wahl (1-%1) [1]: ",
"vfl-frage-auf-ab-richtung": "\n\nKette kommt flach an - keine Zielhoehe verfuegbar. Richtung waehlen:",
"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-ungueltig": "\n %1 Grad - nicht baubar (Bogen passt nicht in die gewaehlte Strecke)",
"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)",
"vfs-as90-mass": "\n AS_90: dx=%1 dz=%2",
+57
View File
@@ -19,12 +19,20 @@
"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-prompt-wahl-1-4-def1": "\nYour choice (1-4) [1]: ",
"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-vf-kurz": "\nERROR: Horizontal VF needs >= 1000 mm (deflection + motor) - draw it longer.",
"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-gefaelle-festlegen-header": "\nDefine slope:",
"vfl-gefaelle-opt-hoehe": "\n 1 - Given height (target height)",
"vfl-gefaelle-opt-winkel": "\n 2 - Enter incline angle",
"vfl-gf-hinweis-laenge-berechnet": "(deltaL will be calculated and inserted)",
"vfl-prompt-neigungswinkel": "\nIncline angle (degrees, 0 < angle <= %1) [%1]: ",
"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]: ",
@@ -42,6 +50,7 @@
"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-sep-vor-gf-frage": "\n\nInsert separator BEFORE this gravity section?",
"vfl-sep-nach-gf-frage": "\n\nInsert separator AFTER this gravity section?",
"vfl-sep-gf-header": "Separator at this gravity section",
"vfl-ist-kettenende-header": "\nIs this the chain end?",
"vfl-kettenende-opt-ja-es": "\n 1 - Yes (place ES element)",
"vfl-kettenende-opt-ja-ohne-es": "\n 2 - Yes (without placing ES element)",
@@ -106,6 +115,10 @@
"vfl-opt2-60grad": "\n 60 deg",
"vfl-opt3-30grad": "\n 30 deg",
"vfl-prompt-wahl-1-3-def1": "\nYour choice (1/2/3) [1]: ",
"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-variokurve-seite-header": "\nVario curve - choose side:",
"vfl-variokurve-variante-header": "\nVario curve - choose variant:",
"vfl-variante-aussen": "\n 1 - Outer",
@@ -164,9 +177,26 @@
"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-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-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-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-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-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-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-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-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",
@@ -304,6 +334,26 @@
"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-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-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-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-frage-gf2-minimum": "\n Calculated GF2=%1 mm is below the usual minimum length (%2 mm).\n Yes = build with the exact calculated %1 mm (hits the target point exactly).\n No = pad up to %2 mm (target point shifts further accordingly).",
"vfl-fuege-block-ein": "\n Inserting %1 ...",
"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-horizontale-zwischenstrecke": "\n\nHorizontal intermediate section (0 deg, L=%1 mm)",
@@ -313,6 +363,13 @@
"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-wahl-bis-n": "\nYour choice (1-%1) [1]: ",
"vfl-frage-auf-ab-richtung": "\n\nChain arrives flat - no target height available. Choose direction:",
"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-ungueltig": "\n %1 deg - not buildable (bend does not fit into the chosen distance)",
"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)",
"vfs-as90-mass": "\n AS_90: dx=%1 dz=%2",
+12 -2
View File
@@ -430,6 +430,14 @@ class SpecSchreiber(object):
raise ValueError("%s: Feld %r fehlt" % (self.wo, name))
return None
def richtung(self, quelle):
# Reine Richtungswahl OHNE Laenge (vfl-in-richtung: nur REAL, kein
# DL-Token) - fuer den Kettenanfang-Fall von Linie-GF modus="hoehe"/
# "steigend"+"hoehe", wo die Laenge erst aus Hoehe/Winkel berechnet
# wird. Nur relevant, wenn dies das erste Segment der Kette ist.
self.zahl("REAL", self.feld(quelle, "hz"))
self.erster_dl = False
def linie(self, quelle):
self.zahl("DL", self.feld(quelle, "dl"))
if self.erster_dl:
@@ -516,14 +524,16 @@ class SpecSchreiber(object):
or "endpunkt")
self.raus("STR", _code(GF_LAENGE_MODUS, smodus,
"steigend_modus"))
if smodus == "endpunkt" or self.erster_dl:
if smodus == "endpunkt":
self.linie(sek)
elif self.erster_dl:
self.richtung(sek)
if smodus == "hoehe":
self.zahl("REAL", self.feld(sek, "hoehe"))
self.zahl("REAL", self.feld(sek, "winkel"))
elif modus == "hoehe":
if self.erster_dl:
self.linie(sek)
self.richtung(sek)
self.raus("STR", _ja_code(self.feld(sek, "sep_vor",
pflicht=False)))
self.raus("STR", _ja_code(self.feld(sek, "sep_nach",
+26 -5
View File
@@ -146,12 +146,14 @@
(vsp-journal spec))
;; --- Linie-GF, Zielhoehe zuerst (laenge_modus "hoehe") ---
;; Kein Separator-Paar VOR der Hoehen-/Winkel-Eingabe wie im Endpunkt-Zweig
;; - hier stehen sie NACH DL(+hz), aber vor Hoehe/Winkel (siehe
;; vf-linienzug-modus, Zweig B).
;; Kettenanfang braucht nur eine REINE Richtungswahl (vfl-in-richtung: nur
;; REAL, KEIN DL-Token - die Laenge ist hier ja noch unbekannt, sie ergibt
;; sich erst aus Hoehe/Winkel). Kein Separator-Paar VOR der Hoehen-/Winkel-
;; Eingabe wie im Endpunkt-Zweig - hier stehen sie NACH der Richtung, aber
;; vor Hoehe/Winkel (siehe vf-linienzug-modus, Zweig B).
(setq spec (tsp-spec T (list
(tsp-sek (list (cons "glied" "Linie-GF") (cons "laenge_modus" "hoehe")
(cons "dl" 100.0) (cons "hz" 0.0)
(cons "hz" 0.0)
(cons "sep_vor" 1) (cons "sep_nach" 0)
(cons "hoehe" 1800.0) (cons "winkel" 3.0)
(cons "ende" "nein")) nil))))
@@ -159,7 +161,7 @@
(append (tsp-pre-mit-as)
(list (cons "STEP" "Linie-GF") (cons "STR" "1")
(cons "STR" "2") ; laenge_modus: hoehe
(cons "DL" 100.0) (cons "REAL" 0.0)
(cons "REAL" 0.0) ; reine Richtungswahl, kein DL
(cons "STR" "1") (cons "STR" "2") ; Separator vor(ja)/nach(nein)
(cons "REAL" 1800.0) (cons "REAL" 3.0)
(cons "STR" "3")))
@@ -182,6 +184,25 @@
(cons "STR" "3")))
(vsp-journal spec))
;; --- Linie-GF, Sonderfall Steigend, Zielhoehe-Unterwahl ---
;; Wie "hoehe" oben: nur reine Richtungswahl (REAL, kein DL) am
;; Kettenanfang - KEIN Separator-Feld.
(setq spec (tsp-spec T (list
(tsp-sek (list (cons "glied" "Linie-GF") (cons "laenge_modus" "steigend")
(cons "steigend_modus" "hoehe")
(cons "hz" 0.0)
(cons "hoehe" 1810.0) (cons "winkel" 1.5)
(cons "ende" "nein")) nil))))
(tsp-journal-eq "Linie-GF, Steigend + Zielhoehe"
(append (tsp-pre-mit-as)
(list (cons "STEP" "Linie-GF") (cons "STR" "1")
(cons "STR" "3") ; laenge_modus: steigend
(cons "STR" "2") ; steigend_modus: hoehe
(cons "REAL" 0.0) ; reine Richtungswahl, kein DL
(cons "REAL" 1810.0) (cons "REAL" 1.5)
(cons "STR" "3")))
(vsp-journal spec))
;; --- Horizontal-VF: horizontaler Erstkoerper ---
;; Nur hier stehen Separator vor/nach VOR der Endpunkt-Antwort
;; (vfl-baue-horizontal-koerper im Ziel-Modus).
+9 -3
View File
@@ -342,7 +342,7 @@ LISP_FAELLE = {
"start": _start(),
"sektionen": [
{"glied": "Linie-GF", "laenge_modus": "hoehe",
"dl": 100.0, "hz": 0.0, "sep_vor": True, "sep_nach": False,
"hz": 0.0, "sep_vor": True, "sep_nach": False,
"hoehe": 1800.0, "winkel": 3.0, "ende": "nein"}]},
"Linie-GF, Steigend + Endpunkt": {
"start": _start(),
@@ -350,6 +350,12 @@ LISP_FAELLE = {
{"glied": "Linie-GF", "laenge_modus": "steigend",
"steigend_modus": "endpunkt",
"dl": 800.0, "hz": 0.0, "winkel": 2.0, "ende": "nein"}]},
"Linie-GF, Steigend + Zielhoehe": {
"start": _start(),
"sektionen": [
{"glied": "Linie-GF", "laenge_modus": "steigend",
"steigend_modus": "hoehe",
"hz": 0.0, "hoehe": 1810.0, "winkel": 1.5, "ende": "nein"}]},
"Horizontal-VF + Motorstation + ES": {
"start": _start(),
"sektionen": [
@@ -453,8 +459,8 @@ class TestLispErwartungen:
def test_alle_faelle_gefunden(self):
erwartungen = _lisp_erwartungen()
assert len(erwartungen) == 9, \
f"9 tsp-journal-eq-Faelle erwartet, {len(erwartungen)} gefunden: " \
assert len(erwartungen) == 10, \
f"10 tsp-journal-eq-Faelle erwartet, {len(erwartungen)} gefunden: " \
f"{sorted(erwartungen)}"
@pytest.mark.parametrize("praefix", sorted(LISP_FAELLE))