From 18ee46b36174cf1dbfef49aebc96a9d668c51628 Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Fri, 11 Sep 2026 22:02:39 +0200 Subject: [PATCH] fix: verbleibende e76e24e-Luecken aus vollstaendigem Gap-Vergleich geschlossen Bei der abschliessenden Datei-fuer-Datei-Gap-Analyse gegen e76e24e (Funktions- inventar + Lang-Key-Diff) zusaetzlich gefunden und behoben: - vfl-modus-abbruch-sichern: "Zurueck"-Behandlung fehlte komplett - verwarf bisher wie "Abbrechen" den kompletten Stand statt nur das letzte angefangene Kettenglied zu verwerfen und automatisch neu zu fragen (vfl-journal-truncate/-replay-start) - vfl-vf-einheit (Punkt 7, Auf/Ab-Foerderer-Fortsetzung): Fall "Kette kommt bereits flach an" (z.B. nach Horizontal-VF/Vario-Kurve) fehlte - fragte bisher immer nach einer Zielhoehe, obwohl dort keine sinnvolle Zielhoehe existiert; nutzt jetzt vfl-waehle-winkel-hoehen-tabelle - Horizontal-VF: GF1-Stumpf wird bei vollem Eingang jetzt aus einer abgefragten Zielhoehe berechnet statt pauschal auf *vfl-gf-min-laenge* gesetzt - Linie-VF/Linie (automatisch): erweiterte Stufe-2-Diagnose bei "nicht baubar" (Mindestwert-Vorschlaege aus vfl-stufe2-diagnose) ergaenzt - vfl-hor-koerper-bauen: klemmt weiterhin still auf Mindestlaenge (Kollegen- Entscheidung, Bauteil muss fuer vf_spec.lsp deterministisch/kopflos bleiben), meldet das Klemmen jetzt aber ueber vfl-meldung - die urspruengliche interaktive "trotzdem bauen?"-Rueckfrage mit Checkpoint- Rueckbau war nicht ohne Bruch der Kopflos-Tauglichkeit restaurierbar Co-Authored-By: Claude Sonnet 5 --- Lisp/vf_linienzug.lsp | 268 +++++++++++++++++++++++++++++++++++------- lang/de_DE.json | 18 +++ lang/en_GB.json | 18 +++ 3 files changed, 259 insertions(+), 45 deletions(-) diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 9a59f92..6a2c53b 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -77,7 +77,12 @@ *vfl-acc-gfbogen* '() ; Alist ("L_90".n ...) GF-Boegen *vfl-acc-variokurve* '() ; Alist ("A_90".n ...) Vario-Kurven *vfl-ziel-punkt* nil ; Soll-ES-Punkt fuer Option-3-Ist-Ziel-Report - *vfl-acc-separator* 0)) ; Anzahl eingefuegter Separatoren (300 mm) + *vfl-acc-separator* 0 ; Anzahl eingefuegter Separatoren (300 mm) + ;; "Zurueck"/"Abbrechen"-Button (siehe vfl-in-value/vfl-modus-abbruch- + ;; sichern): nil (normal) / "zurueck" (letztes Glied verwerfen und neu + ;; fragen) / "abbrechen" (Bau hier stoppen, Baustand bleibt stehen). + *vfl-wizard-abbruch-grund* nil + *vfl-abbruch-letztes-ent* nil)) ;; Alist-Zaehler erhoehen / lesen (defun vfl-inc-count (al key / e) @@ -2147,12 +2152,22 @@ ;; vf-linienzug-modus. (defun vfl-modus-abbruch-sichern (lastEnt vfl-nummer anzahl-gf anzahl-vf startpunkt frame as-seite es-seite marker / - e cnt vfl-ins wickel-erg) + e cnt vfl-ins wickel-erg grund fwd n trunc) + ;; Abbruch-Grund VOR dem Wickeln merken (das Flag wird unten evtl. schon + ;; fuer den "Zurueck"-Neuaufruf zurueckgesetzt) UND immer konsumieren, damit + ;; kein "Zurueck"/"Abbrechen" aus diesem Lauf in einen etwaigen naechsten + ;; durchsickert (siehe auch Reset am Kopf von vf-linienzug-modus). + (setq grund *vfl-wizard-abbruch-grund*) + (setq *vfl-wizard-abbruch-grund* nil) + (dbgmsg (strcat "ABBRUCH-SICHERN erreicht: grund=" (if grund grund "nil(ESC/Fehler)"))) (setq cnt 0 e (if lastEnt (entnext lastEnt) (entnext))) (while e (setq cnt (1+ cnt)) (setq e (entnext e))) (cond ((or (= cnt 0) (null frame)) - (princ (ssg-text "vfl-abbruch-nichts-gebaut"))) + (princ (ssg-text "vfl-abbruch-nichts-gebaut")) + ;; "Zurueck" ohne jede gebaute Geometrie (z.B. ganz am Anfang) - nichts + ;; zu verwerfen, einfach denselben Lauf frisch neu starten. + (if (= grund "zurueck") (vl-catch-all-apply 'vf-linienzug-modus))) (t ;; vfl-block-erstellen nutzt intern (command "_.UCS" ...) fuer den ;; BKS-Wechsel (ssg-block-wrap-welt) - im *error*-Handler-Kontext @@ -2170,7 +2185,24 @@ (if (vl-catch-all-error-p wickel-erg) (princ (ssg-textf "vfl-abbruch-wickeln-fehler" (list (vl-catch-all-error-message wickel-erg)))) - (princ (ssg-textf "vfl-abbruch-gesichert" (list (itoa cnt))))) + (progn + (princ (ssg-textf "vfl-abbruch-gesichert" (list (itoa cnt)))) + (setq *vfl-abbruch-letztes-ent* vfl-ins) + ;; "Zurueck": letztes (angefangenes) Glied verwerfen und automatisch + ;; genau das tun, was der Sektions-Reset-Zweig von vfl-edit-ent sonst + ;; ueber den Auswahl-Dialog macht - nur ohne den Dialog, Ziel-Sektion + ;; ist immer "ein Glied weniger als jetzt vorhanden". + (if (and (= grund "zurueck") vfl-ins) + (progn + (setq fwd (reverse *vfl-journal*)) + (setq n (length (vfl-journal-glieder fwd))) + (setq trunc (vfl-journal-truncate fwd (max 0 (1- n)))) + (princ (ssg-text "vfl-zurueck-glied-verworfen")) + (entdel vfl-ins) + (vfl-journal-replay-start trunc) + (vl-catch-all-apply 'vf-linienzug-modus))) + ) + ) ) ) (princ)) @@ -3097,10 +3129,22 @@ ;; und der auf_3-Insert sitzt BEWUSST zwischen Subtraktion 1 und 2 - sein ;; Fussabdruck wird GEMESSEN (vfl-projiziere-distanz), nicht geschaetzt. ;; Hier darf nichts umsortiert werden. +;; Klemmt v auf *vfk-restlaenge-min-clamp*, falls es darunter faellt, und +;; meldet das (headless-sicher via vfl-meldung statt einer interaktiven +;; Rueckfrage - der Bauteil selbst bleibt deterministisch/kopflos-tauglich, +;; siehe vf_spec.lsp; anders als im urspruenglichen einteiligen Entwurf kann +;; hier daher nicht mehr nachgefragt/rueckgebaut werden, nur informieren). +(defun vfl-hor-koerper-klemmen (v / geklemmt) + (setq geklemmt (max *vfk-restlaenge-min-clamp* v)) + (if (< v *vfk-restlaenge-min-clamp*) + (vfl-meldung (ssg-textf "vfl-hinweis-horizontal-fussabdruck-geklemmt" + (list (rtos v 2 0) (rtos geklemmt 2 0))))) + geklemmt) + (defun vfl-hor-koerper-bauen (frame hz dL ziel-modus ende-code sep-vor sep-nach gf2-laenge / pt m1 pt-vor-bogen) (setq pt (car frame)) - (if (and ziel-modus sep-vor) (setq dL (max *vfk-restlaenge-min-clamp* (- dL *vfk-separator-laenge*)))) + (if (and ziel-modus sep-vor) (setq dL (vfl-hor-koerper-klemmen (- dL *vfk-separator-laenge*)))) ;; auf_3-Eintritt nur, wenn noch NICHT flach (sonst flache Zone fortsetzen). ;; dL ist die gewuenschte Reststrecke AB HIER (pt) - der reale Bogen- ;; Fussabdruck (gemessen, nicht aus der Tabellen-Masse geschaetzt - die @@ -3113,19 +3157,19 @@ (princ (ssg-text "vfl-bogen-auf3-uebergang")) (setq pt (insert-rotated-block-with-ks "Vario_Bogen_auf_3_TEF_rechts" pt (ssg-cfg-or "vario" "gefaelle_winkel" 3) (car m1) (caddr m1) hz)) - (setq dL (max *vfk-restlaenge-min-clamp* (- dL (vfl-projiziere-distanz pt-vor-bogen pt hz)))))) - (if (and ziel-modus sep-nach) (setq dL (max *vfk-restlaenge-min-clamp* (- dL *vfk-separator-laenge*)))) + (setq dL (vfl-hor-koerper-klemmen (- dL (vfl-projiziere-distanz pt-vor-bogen pt hz)))))) + (if (and ziel-modus sep-nach) (setq dL (vfl-hor-koerper-klemmen (- dL *vfk-separator-laenge*)))) ;; Ausgangs-Fussabdruck (Vario_Bogen_ab_3 + Motorstation) nur reservieren, ;; wenn die Einheit tatsaechlich sofort schliesst (Antwort 1 oder 3); bei ;; Antwort 1 zusaetzlich die GF2 hinter dem Motor. (if ziel-modus (cond ((= ende-code "1") - (setq dL (max *vfk-restlaenge-min-clamp* (- dL (car (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*))) *vfk-stations-laenge* + (setq dL (vfl-hor-koerper-klemmen (- dL (car (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*))) *vfk-stations-laenge* (* (if gf2-laenge gf2-laenge 0.0) (cos (* *vfk-gefaelle-winkel* (/ pi 180.0)))))))) ((= ende-code "3") - (setq dL (max *vfk-restlaenge-min-clamp* (- dL (car (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*))) *vfk-stations-laenge*)))))) + (setq dL (vfl-hor-koerper-klemmen (- dL (car (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*))) *vfk-stations-laenge*)))))) ;; optionaler Separator VOR - in der horizontalen Ebene (0 Grad) (if sep-vor (setq pt (vfl-sep-hz pt hz))) ;; horizontale Zwischenstrecke (0 Grad) @@ -3712,7 +3756,8 @@ linie-mess dL dH hn hzn richtn ent typ w lgf lvf letzt-hz fertig ziel-ende ziel-gf2 res3 gf2-eff entry-start res-h vor-antwort es-gewuenscht es-antwort save-eindx save-eindz - hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback) + hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback + schon-flach winkel-hoehen-erg) ;; Vorbelegung: ES gewuenscht (Default) - nur bei "3 - Kettenende definieren" ;; wird explizit gefragt und ggf. auf nil gesetzt (siehe dort). (setq es-gewuenscht t) @@ -3859,46 +3904,89 @@ ) ;; --- Auf/Ab-Foerderer (folgt der aktuellen Fahrtrichtung) --- (t + ;; Punkt 7: kommt die Kette hier bereits FLACH an (z.B. nach + ;; Horizontal-VF/Vario-Kurve), gibt es keine sinnvolle Zielhoehe zum + ;; Anpeilen - Auf/Ab wird dann direkt erfragt und aus einer + ;; Winkel/Hoehe-Tabelle gewaehlt (vfl-waehle-winkel-hoehen-tabelle), + ;; statt eine Zielhoehe abzufragen. schon-flach MUSS vor der + ;; vfl-nach-3grad-Wandlung ermittelt werden. + (setq schon-flach (vfl-frame-flach-p frame)) ;; gewinkeltes VF braucht 3-Grad-Basis -> flache Zone ggf. mit ab_3 beenden (setq frame (vfl-nach-3grad frame)) (setq linie-mess (vfl-neue-linie-messen (car frame) letzt-hz)) + (if (null linie-mess) (progn (princ (ssg-text "vfl-abgebrochen")) (exit))) (if linie-mess (progn (setq dL (car linie-mess) hzn (cadr linie-mess)) (if (> dL 1.0) - (progn - ;; NUR-VF-Vorschlaege (nicht vfl-segment-hoehe-vorschlaege): - ;; dieser Zweig setzt eine bestehende VF-Kette fort und lehnt - ;; ein hier zurueckkommendes typ="GF" explizit ab (siehe - ;; "vfl-segment-gf-nicht-erlaubt" unten) - der GF-Vorschlag - ;; (3-Grad-Formel) waere hier also gerade NICHT baubar. - (setq hoehe-vorschlaege (vfl-vf-hoehe-vorschlaege (caddr (car frame)) dL)) - (setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege)) - (setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr (car frame)))) - (vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf) - (if (vfl-wizard-aktiv) - (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl - (list (list hoehe-ab hoehe-auf (caddr (car frame)))))) - (setq hn (vfl-in-real - (if (and hoehe-ab hoehe-auf) - (ssg-textf "vfl-prompt-hoehe-endpunkt-2" - (list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1))) - (ssg-textf "vfl-prompt-hoehe-endpunkt" - (list (rtos hoehe-fallback 2 1)))))) - (if (null hn) (setq hn hoehe-fallback)) - (setq dH (- hn (caddr (car frame)))) - (setq richtn (if (>= dH 0.0) "Auf" "Ab")) - (setq dH (abs dH)) - (setq ent (vfl-segment-entscheidung dL dH richtn)) - (setq typ (nth 0 ent) w (nth 1 ent) lgf (nth 2 ent) lvf (nth 3 ent)) - (if (and typ (= typ "VF")) - (progn - (setq frame (vfl-frame-3grad (vfs-vf-koerper (car frame) richtn w lvf hzn) hzn)) - (setq vf-count (1+ vf-count) letzt-hz hzn) - (vfl-acc-vf-seg richtn w lvf) - (vfl-20m-check p-umlenk (car frame)) + (if schon-flach + (progn + (princ (ssg-text "vfl-frage-auf-ab-richtung")) + (princ (ssg-text "vfl-opt-richtung-auf")) + (princ (ssg-text "vfl-opt-richtung-ab")) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-richtung-impl + (list (ssg-text "vfl-frage-auf-ab-richtung")))) + (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") + (list (ssg-text "vfl-opt-richtung-auf") + (ssg-text "vfl-opt-richtung-ab")) 1 + "vfl-frage-auf-ab-richtung")) + (setq richtn (if (= antwort "2") "Ab" "Auf")) + (setq winkel-hoehen-erg + (vfl-waehle-winkel-hoehen-tabelle dL richtn (caddr (car frame)))) + (if winkel-hoehen-erg + (progn + (setq w (nth 0 winkel-hoehen-erg) lvf (nth 2 winkel-hoehen-erg)) + ;; Ist-Ziel-Vergleich: vorhergesagte Endhoehe sichern, um + ;; nach dem echten Bau (vfs-vf-koerper, unabhaengig + ;; verifiziert) auf Abweichung zu pruefen - Sicherheitsnetz + ;; fuer die neue Formel, ohne die reale Geometrie zu beeinflussen. + (setq hn (+ (caddr (car frame)) (nth 1 winkel-hoehen-erg))) + (setq frame (vfl-frame-3grad (vfs-vf-koerper (car frame) richtn w lvf hzn) hzn)) + (setq vf-count (1+ vf-count) letzt-hz hzn) + (vfl-acc-vf-seg richtn w lvf) + (vfl-20m-check p-umlenk (car frame)) + (if (> (abs (- (caddr (car frame)) hn)) 5.0) + (princ (ssg-textf "vfl-winkel-hoehen-abweichung" + (list (rtos hn 2 0) (rtos (caddr (car frame)) 2 0))))) + ) + (princ (ssg-text "vfl-linie-zu-kurz-simple")) + ) + ) + (progn + ;; NUR-VF-Vorschlaege (nicht vfl-segment-hoehe-vorschlaege): + ;; dieser Zweig setzt eine bestehende VF-Kette fort und lehnt + ;; ein hier zurueckkommendes typ="GF" explizit ab (siehe + ;; "vfl-segment-gf-nicht-erlaubt" unten) - der GF-Vorschlag + ;; (3-Grad-Formel) waere hier also gerade NICHT baubar. + (setq hoehe-vorschlaege (vfl-vf-hoehe-vorschlaege (caddr (car frame)) dL)) + (setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege)) + (setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr (car frame)))) + (vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl + (list (list hoehe-ab hoehe-auf (caddr (car frame)))))) + (setq hn (vfl-in-real + (if (and hoehe-ab hoehe-auf) + (ssg-textf "vfl-prompt-hoehe-endpunkt-2" + (list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1))) + (ssg-textf "vfl-prompt-hoehe-endpunkt" + (list (rtos hoehe-fallback 2 1)))))) + (if (null hn) (setq hn hoehe-fallback)) + (setq dH (- hn (caddr (car frame)))) + (setq richtn (if (>= dH 0.0) "Auf" "Ab")) + (setq dH (abs dH)) + (setq ent (vfl-segment-entscheidung dL dH richtn)) + (setq typ (nth 0 ent) w (nth 1 ent) lgf (nth 2 ent) lvf (nth 3 ent)) + (if (and typ (= typ "VF")) + (progn + (setq frame (vfl-frame-3grad (vfs-vf-koerper (car frame) richtn w lvf hzn) hzn)) + (setq vf-count (1+ vf-count) letzt-hz hzn) + (vfl-acc-vf-seg richtn w lvf) + (vfl-20m-check p-umlenk (car frame)) + ) + (princ (ssg-text "vfl-segment-gf-nicht-erlaubt")) ) - (princ (ssg-text "vfl-segment-gf-nicht-erlaubt")) ) ) (princ (ssg-text "vfl-linie-zu-kurz-simple")) @@ -4643,7 +4731,8 @@ hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback gf-laenge-modus gf-steigend-modus sep-vor-gf sep-nach-gf sep-anzahl erg-bogen vf-eingang-lgf vf-eingang-modus - eingang-laenge winkel-hoehen-erg) + eingang-laenge winkel-hoehen-erg + bogen-mass fest-drop fest-laenge eingang-fertig) (princ "\n\n=========================================") (princ (ssg-text "vfl-modus1-header")) (princ "\n=========================================") @@ -4929,7 +5018,64 @@ ;; VF"). (setq erg (vfl-eingang-modus-bestimmen letzter-typ kettenanfang as-vorhanden p-aktuell)) (setq vf-eingang-lgf (car erg) vf-eingang-modus (cdr erg)) - ;; VF-Einheit mit horizontalem ersten Koerper (winkel=0, L_VF=deltaL). + ;; Bei einem vollen Neuaufbau des Eingangs (modus=nil, GF1 wird + ;; frisch gebaut) wird GF1 nicht pauschal auf *vfl-gf-min-laenge* + ;; gesetzt, sondern aus einer abgefragten Zielhoehe berechnet - der + ;; Rest bleibt wie bisher horizontal. Bei den anderen Eingangs-Modi + ;; ("separator"/"gf"/"keine" - Fortsetzung nach einem Vorglied) wird + ;; ohnehin kein neues GF1 gebaut, daher unveraendert. + (if (null vf-eingang-modus) + (progn + (if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek)) + (setq rad3 (* *vfk-gefaelle-winkel* (/ pi 180.0))) + (setq bogen-mass (get-bogen-mass bogen-auf (fix *vfk-gefaelle-winkel*))) + ;; Hoehen- bzw. Laengenanteil der FIXEN Elemente (Separator + + ;; Umlenkstation + Uebergangsbogen), OHNE GF1 - empirisch + ;; bestaetigt: jedes Element traegt Schraeglaenge*sin(3 Grad) an + ;; Hoehe bei, der Uebergangsbogen einen festen, winkelunabhaengigen + ;; dx/dz-Fussabdruck aus der Bogen-Tabelle. + (setq fest-drop (+ (* *vfk-separator-laenge* (sin rad3)) + (* *vfk-stations-laenge* (sin rad3)) + (caddr bogen-mass))) + (setq fest-laenge (+ *vfk-separator-laenge* *vfk-stations-laenge* (car bogen-mass))) + (setq eingang-fertig nil) + (while (not eingang-fertig) + (setq eingang-fertig t) + (if (vfl-wizard-aktiv) + (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl + (list (- (caddr p-aktuell) fest-drop)))) + (setq hoehe-neu + (vfl-in-real (ssg-textf "vfl-prompt-hoehe-eingang-gf1" + (list (rtos (- (caddr p-aktuell) fest-drop) 2 1))))) + (if (null hoehe-neu) (setq hoehe-neu (- (caddr p-aktuell) fest-drop))) + (setq deltaH (- (caddr p-aktuell) hoehe-neu)) + (cond + ((<= deltaH 0.0) + (vfl-meldung (ssg-text "vfl-alert-eingang-kann-nicht-steigen")) + (setq vf-eingang-lgf nil)) + ((< deltaH fest-drop) + (vfl-meldung (ssg-textf "vfl-alert-eingang-hoehe-zu-klein" (list (rtos fest-drop 2 0)))) + (setq eingang-fertig nil)) + (t + (setq vf-eingang-lgf (/ (- deltaH fest-drop) (sin rad3))) + (if (> (+ vf-eingang-lgf fest-laenge) deltaL) + (progn + (vfl-meldung (ssg-textf "vfl-alert-eingang-hoehe-zu-gross" + (list (rtos (- (caddr p-aktuell) fest-drop + (* (- deltaL fest-laenge) (sin rad3))) 2 0)))) + (setq vf-eingang-lgf nil)) + ) + ) + ) + ) + ) + ) + ;; VF-Einheit mit horizontalem ersten Koerper (winkel=0, L_VF=deltaL) - + ;; nur bauen, wenn vf-eingang-lgf gueltig ist (s.o.). Ist es nil (Abbruch + ;; wegen unpassender Zielhoehe), wird NICHTS gebaut - die aeussere + ;; Schleife zeigt danach automatisch wieder "Naechstes Element waehlen". + (if vf-eingang-lgf + (progn (if dbg-an (dbgmsg (strcat "GEOMETRIE: vfl-vf-einheit-abschluss horizontal (deltaL=" (rtos deltaL 2 0) " L_GF=" (rtos vf-eingang-lgf 2 0) " L_VF=" (rtos deltaL 2 0) @@ -4949,6 +5095,8 @@ (if dbg-an (dbgmsg (strcat "GEOMETRIE ERFOLG: Horizontal-VF-Einheit gebaut, neue Position=" (dbg-tostring p-aktuell)))) + ) + ) ) ) ) @@ -5380,7 +5528,7 @@ (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-richtung-impl (list (ssg-text "vfl-frage-auf-ab-richtung")))) - (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2") + (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") (list (ssg-text "vfl-opt-richtung-auf") (ssg-text "vfl-opt-richtung-ab")) 1 "vfl-frage-auf-ab-richtung")) @@ -5450,6 +5598,21 @@ (progn (vfl-meldung (ssg-textf "vfl-alert-vf-nicht-baubar" (list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung))) + ;; Gesammelte Stufe-2-Diagnose (falls versucht) + kompaktes + ;; 2-Punkte-Alert mit Mindestwerten - analog vfl-body-abschluss. + (if *vfl-stufe2-diagnose-text* (princ *vfl-stufe2-diagnose-text*)) + (vfl-meldung + (strcat + (ssg-textf "vfl-alert-vf-entscheidung-p1" (list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)) + (cond + ((and *vfl-stufe2-minl-vorschlag* *vfl-stufe2-minh-vorschlag*) + (ssg-textf "vfl-alert-vf-entscheidung-p2-beide" + (list (rtos *vfl-stufe2-minl-vorschlag* 2 0) (rtos *vfl-stufe2-minh-vorschlag* 2 0)))) + (*vfl-stufe2-minh-vorschlag* + (ssg-textf "vfl-alert-vf-entscheidung-p2-nur-minh" (list (rtos *vfl-stufe2-minh-vorschlag* 2 0)))) + (*vfl-stufe2-minl-vorschlag* + (ssg-textf "vfl-alert-vf-entscheidung-p2-nur-minl" (list (rtos *vfl-stufe2-minl-vorschlag* 2 0)))) + (t "")))) (if dbg-an (dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie-VF nicht baubar (deltaL=" (rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0) @@ -5574,6 +5737,21 @@ (progn (vfl-meldung (ssg-textf "vfl-alert-segment-nicht-baubar" (list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung))) + ;; Gesammelte Stufe-2-Diagnose (falls versucht) + kompaktes + ;; 2-Punkte-Alert mit Mindestwerten - analog vfl-body-abschluss. + (if *vfl-stufe2-diagnose-text* (princ *vfl-stufe2-diagnose-text*)) + (vfl-meldung + (strcat + (ssg-textf "vfl-alert-vf-entscheidung-p1" (list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)) + (cond + ((and *vfl-stufe2-minl-vorschlag* *vfl-stufe2-minh-vorschlag*) + (ssg-textf "vfl-alert-vf-entscheidung-p2-beide" + (list (rtos *vfl-stufe2-minl-vorschlag* 2 0) (rtos *vfl-stufe2-minh-vorschlag* 2 0)))) + (*vfl-stufe2-minh-vorschlag* + (ssg-textf "vfl-alert-vf-entscheidung-p2-nur-minh" (list (rtos *vfl-stufe2-minh-vorschlag* 2 0)))) + (*vfl-stufe2-minl-vorschlag* + (ssg-textf "vfl-alert-vf-entscheidung-p2-nur-minl" (list (rtos *vfl-stufe2-minl-vorschlag* 2 0)))) + (t "")))) (if dbg-an (dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie (automatisch) nicht baubar" " (deltaL=" (rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0) diff --git a/lang/de_DE.json b/lang/de_DE.json index 3bffcc2..846e6e6 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -27,6 +27,10 @@ "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-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-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:", @@ -342,6 +346,10 @@ "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-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)", @@ -357,6 +365,7 @@ "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-horizontale-zwischenstrecke": "\n\nHorizontale Zwischenstrecke (0 Grad, L=%1 mm)", + "vfl-hinweis-horizontal-fussabdruck-geklemmt": "\n Hinweis: Reststrecke waere hier nur %1 mm gewesen (Minimum %2 mm) - auf das Minimum geklemmt; der Kettenpunkt landet dadurch entsprechend weiter als angeklickt.", "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-2": "\nHoehe (Z) des Endpunkts (Ab: %1 | Auf: %2) [%1]: ", @@ -370,6 +379,14 @@ "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-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-prompt-richtung-waehlen": "\n\nFahrtrichtung waehlen (Punkt in gewuenschter Richtung klicken - der Abstand wird ignoriert): ", + "vfl-winkel-hoehen-abweichung": "\n [Hinweis] Ist-Ziel-Vergleich: vorhergesagte Endhoehe %1 mm, tatsaechlich erreicht %2 mm.", + "vfl-antwort-ja": "Ja", + "vfl-antwort-nein": "Nein", + "vfl-wizard-antwort-echo": "\n -> Auswahl im Dialog: %1", "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", @@ -850,6 +867,7 @@ "tro-insert-prompt-punkt": "\nEinfuegepunkt: ", "tro-insert-eingefuegt": "\nTRO eingefuegt: ID = %1, TYP = %2", "vfl-abbruch-gesichert": "\n>>> Linienzug abgebrochen: %1 Objekt(e) als Block gesichert (per Doppelklick editierbar/fortsetzbar).", + "vfl-zurueck-glied-verworfen": "\n>>> Zurueck: letztes Kettenglied wird verworfen - bitte neu beantworten.", "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-edit-dialog-fehlt": "Dialog nicht gefunden: %1", diff --git a/lang/en_GB.json b/lang/en_GB.json index 125c002..ba56e33 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -27,6 +27,10 @@ "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-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-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:", @@ -343,6 +347,10 @@ "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-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)", @@ -357,6 +365,7 @@ "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)", + "vfl-hinweis-horizontal-fussabdruck-geklemmt": "\n Note: the remaining length here would have been only %1 mm (minimum %2 mm) - clamped to the minimum; the chain point will therefore end up further along than clicked.", "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-2": "\nHeight (Z) of the end point (down: %1 | up: %2) [%1]: ", @@ -370,6 +379,14 @@ "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-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-prompt-richtung-waehlen": "\n\nChoose direction (click a point in the desired direction - the distance is ignored): ", + "vfl-winkel-hoehen-abweichung": "\n [Note] Target-vs-actual check: predicted end height %1 mm, actually reached %2 mm.", + "vfl-antwort-ja": "Yes", + "vfl-antwort-nein": "No", + "vfl-wizard-antwort-echo": "\n -> Dialog selection: %1", "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", @@ -850,6 +867,7 @@ "tro-insert-prompt-punkt": "\nInsertion point: ", "tro-insert-eingefuegt": "\nTRO inserted: ID = %1, TYPE = %2", "vfl-abbruch-gesichert": "\n>>> Chain cancelled: %1 object(s) saved as a block (editable/resumable via double-click).", + "vfl-zurueck-glied-verworfen": "\n>>> Back: discarding the last chain element - please answer it again.", "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-edit-dialog-fehlt": "Dialog not found: %1",