fix: VF-Linienzug Modus 1 GF+ES-Separator-Laenge/Hoehe korrigieren

Neue Linie: GF (Zweig A+B) zog bei Kettenende mit ES-Element nur den
ES-eigenen Fussabdruck von deltaL/deltaH ab, nicht den zusaetzlichen
automatischen 300mm-Separator, den vfl-insert-es-element immer selbst
vor dem ES-Block einfuegt - die Kette baute dadurch zu lang/zu tief.

Zusaetzlich: "Separator NACH" im Wizard-Dialog (vflw-gruppe-sep-gf-impl)
wird jetzt ausgegraut statt gefragt+nachtraeglich verworfen, wenn das
GF-Segment ohnehin mit einem ES-Element endet (der automatische
Separator deckt das bereits ab). Pending-Queue-Anzahl bleibt dabei
unveraendert (Dialog pusht weiterhin 2 Werte), um keinen Versatz mit
den nachfolgenden Konsolen-Abfragen zu erzeugen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 09:55:38 +02:00
parent 1e2e28e532
commit 00fd48d02e
3 changed files with 79 additions and 12 deletions
+71 -12
View File
@@ -1033,7 +1033,17 @@
;; "Neue Linie: GF" - Separator VOR/NACH (2 Ja/Nein-Toggles in einem
;; Bildschirm). Siehe dcl/vf_linienzug_wizard.dcl (vflw_sep_gf).
(defun vflw-gruppe-sep-gf-impl ( / dat ergebnis gsepvor gsepnach)
;; es-folgt-sep: T, wenn dieses GF-Stueck das Kettenende MIT ES-Element ist
;; (gf-kettenende-antwort steht beim Aufruf schon fest, siehe Aufrufer) -
;; dann baut vfl-insert-es-element ohnehin IMMER seinen eigenen Separator
;; VOR dem ES-Block, ein zusaetzlicher "Separator NACH" waere ein zweiter,
;; direkt anschliessender Separator. Statt die Frage zu stellen und die
;; Antwort hinterher zu verwerfen (Nutzer-Feedback 2026-10-08: verwirrend),
;; wird die Kachel hier direkt deaktiviert+abgehakt - der bestehende
;; Konsolen-/Sicherheitsnetz-Pfad (siehe Aufrufer, "ueberschrieben"-Meldung)
;; bleibt UNVERAENDERT bestehen (deckt weiterhin den reinen Konsolen-Fall ab,
;; wo diese Dialog-Funktion gar nicht laeuft).
(defun vflw-gruppe-sep-gf-impl (es-folgt-sep / dat ergebnis gsepvor gsepnach)
(setq dat (load_dialog (vflw-dcl-pfad)))
(if (not (new_dialog "vflw_sep_gf" dat))
(if (and dat (>= dat 0)) (unload_dialog dat))
@@ -1041,6 +1051,7 @@
(set_tile "kopf" (vflw-clean (ssg-text "vfl-sep-gf-header")))
(set_tile "sepvor" "0")
(set_tile "sepnach" "0")
(if es-folgt-sep (mode_tile "sepnach" 1))
(action_tile "accept"
"(setq gsepvor (get_tile \"sepvor\")) (setq gsepnach (get_tile \"sepnach\")) (done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
@@ -7008,7 +7019,7 @@
(setq hz-neu (car (frame->hz-winkel frame)))
)
(setq rad3 (* gf-max-winkel (/ pi 180.0)))
(if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl nil))
(if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl (list (= gf-kettenende-antwort "1"))))
(princ (ssg-text "vfl-sep-vor-gf-frage"))
(princ (ssg-text "vfl-ja"))
(princ (ssg-text "vfl-nein"))
@@ -7050,9 +7061,16 @@
(if (> sep-anzahl 0)
(setq deltaH (max 0.0 (- deltaH (* sep-anzahl *vfk-separator-laenge* (sin rad3))))))
;; ES-Fussabdruck VORAB reservieren, siehe Kommentar bei
;; gf-kettenende-antwort oben.
;; gf-kettenende-antwort oben. ES bringt IMMER seinen eigenen
;; Separator mit (vfl-insert-es-element, siehe Kommentar oben
;; "bringt seinen eigenen Separator VOR dem ES-Block schon
;; mit") - dessen Hoehenanteil fehlte hier bisher komplett
;; (realer Bug, Nutzer-Meldung 2026-10-08: Kette baute zu lang/
;; zu tief, weil der automatische Kettenende-Separator anders
;; als die optionalen vor/nach-Separatoren oben NICHT reserviert
;; wurde).
(if (= gf-kettenende-antwort "1")
(setq deltaH (max 0.0 (- deltaH (abs ein-dz)))))
(setq deltaH (max 0.0 (- deltaH (* *vfk-separator-laenge* (sin rad3)) (abs ein-dz)))))
(if (vfl-wizard-aktiv)
(vl-catch-all-apply 'vflw-gruppe-gefaelle-impl
(list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) t nil)))
@@ -7116,7 +7134,7 @@
;; gepickten deltaL abgezogen, damit die Kette exakt am
;; gepickten Punkt endet statt danach ueberzustehen.
(setq rad3 (* gf-max-winkel (/ pi 180.0)))
(if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl nil))
(if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl (list (= gf-kettenende-antwort "1"))))
(princ (ssg-text "vfl-sep-vor-gf-frage"))
(princ (ssg-text "vfl-ja"))
(princ (ssg-text "vfl-nein"))
@@ -7139,9 +7157,15 @@
(if (> sep-anzahl 0)
(setq deltaL (- deltaL (* sep-anzahl *vfk-separator-laenge* (cos rad3)))))
;; ES-Fussabdruck VORAB reservieren, siehe Kommentar bei
;; gf-kettenende-antwort oben.
;; gf-kettenende-antwort oben. ES bringt IMMER seinen
;; eigenen Separator mit (vfl-insert-es-element) - dessen
;; Laenge fehlte hier bisher komplett (realer Bug,
;; Nutzer-Meldung 2026-10-08: Kette baute ca. 300mm*cos(w)
;; zu lang, weil der automatische Kettenende-Separator
;; anders als die optionalen vor/nach-Separatoren oben
;; NICHT reserviert wurde).
(if (= gf-kettenende-antwort "1")
(setq deltaL (- deltaL (abs ein-dx))))
(setq deltaL (- deltaL (* *vfk-separator-laenge* (cos rad3)) (abs ein-dx))))
(if (< deltaL 1.0)
(progn (princ (ssg-text "vfl-fehler-linie-zu-kurz")) (setq gf-ok nil)))
(if gf-ok
@@ -8985,6 +9009,12 @@
(princ (ssg-text "vfl-vwnb-titel"))
(princ "\n=========================================")
;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen - identischer Fix
;; wie in vf-linienzug-modus/-modus2 (siehe dortiger Kommentar): sonst
;; wuerde ein von einem VORHERIGEN Lauf noch gesetztes Flag den allerersten
;; vfl-in-*-Aufruf dieses NEUEN Laufs sofort wieder abbrechen.
(setq *vfl-wizard-abbruch-grund* nil)
;; --- Debug-Session (Schalter "vfl-modus3", DEFAULT AN) -------------------
;; Bei Bedarf abschaltbar: (dbg-schalter-off "vfl-modus3") in der Konsole.
;; Alle interaktiven Eingaben (Punkte, Hoehen, Seiten, Winkel, Menue-
@@ -9503,6 +9533,7 @@
nonclimber-cnt nkurve kurve-chords run-span
hor-koerper-len hor-pairs flat-p flat-zone-erste fill-len wahl3
rad3v feste-vf dH-adj dir-x dir-y fill-D end-hz
laengs-wert quer-wert soll-korrigiert
es-vek-fix es-along-fix
gf-total br-gf-mode br-gf2-exp filler-A-len filler-a-done
as-vorhanden es-vorhanden dbg-an dbg-old-error
@@ -9512,6 +9543,16 @@
(princ (ssg-text "vfl-m3-titel"))
(princ "\n=========================================")
;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen (auch schon vor
;; der ersten Praeambel-Frage) - sonst wuerde ein von einem VORHERIGEN Lauf
;; (egal ob Modus 1/2/3) noch gesetztes Flag (z.B. nach "Abbrechen") den
;; allerersten vfl-in-*-Aufruf DIESES NEUEN Laufs sofort wieder abbrechen
;; (siehe zentraler Check in vfl-in-value/-value-p) - identischer Fix wie in
;; vf-linienzug-modus (Modus 1). Realer Bug: ein zweiter Modus-2-Aufruf in
;; derselben Zeichnung/Session brach sofort mit "ABBRUCH-TRIGGER:
;; *vfl-wizard-abbruch-grund*=abbrechen" ab, ohne ueberhaupt die
;; Pfad-Auswahl anzuzeigen (Livetest 2026-09-21).
(setq *vfl-wizard-abbruch-grund* nil)
;; *vfl-journal* VOR dem allerersten vfl-in-*-Aufruf zuruecksetzen (nicht
;; *vfl-replay-queue*, siehe Kommentar bei vfl-journal-reset-lauf und die
;; analoge Korrektur in vf-linienzug-modus). Frueher stand dieser Reset erst
@@ -10304,12 +10345,30 @@
;; ~0 sein (Endpunkt liegt auf der KS_AUS-Achse), Laengs = ES-Ausladung.
(setq end-hz (car (frame->hz-winkel frame))) ; KS_AUS-Achsrichtung
(setq dir-x (cos (* end-hz (/ pi 180.0))) dir-y (sin (* end-hz (/ pi 180.0))))
(princ (ssg-textf "vfl-m3-laengs-quer"
(list (rtos (+ (* (- (car ist-ende) (car soll-ende)) dir-x)
(* (- (cadr ist-ende) (cadr soll-ende)) dir-y)) 2 1)
(rtos (+ (* (- (car ist-ende) (car soll-ende)) (- dir-y))
(* (- (cadr ist-ende) (cadr soll-ende)) dir-x)) 2 1))))
(setq laengs-wert (+ (* (- (car ist-ende) (car soll-ende)) dir-x)
(* (- (cadr ist-ende) (cadr soll-ende)) dir-y)))
(setq quer-wert (+ (* (- (car ist-ende) (car soll-ende)) (- dir-y))
(* (- (cadr ist-ende) (cadr soll-ende)) dir-x)))
(princ (ssg-textf "vfl-m3-laengs-quer" (list (rtos laengs-wert 2 1) (rtos quer-wert 2 1))))
(princ (ssg-text "vfl-m3-achse-hinweis"))
;; Soll (ES-korrigiert): der gepickte Zielpunkt, verschoben um den bereits
;; oben gemessenen Laengs-Wert entlang der KS_AUS-Achse - zeigt, dass die
;; Abweichung oben keine Unsicherheit ist, sondern GENAU der ES-eigene
;; Fussabdruck (90/30-Grad-Schwenk, siehe doc/VarioFoerderer_Linienzug_
;; Prinzipien.md Abschnitt 6/14.11: "seitliche ES-Ausladung, kein Fehler").
;; Bewusst aus dem bereits gemessenen Laengs-Wert abgeleitet statt ueber
;; eine zweite, eigenstaendige vf-element-ks-info-Neuberechnung - das waere
;; ein zweiter Rechenweg fuer dieselbe Information mit eigenem Bug-Risiko,
;; hier reicht die Umkehrung der bereits validierten Laengs/Quer-Zerlegung.
(setq soll-korrigiert (list (+ (car soll-ende) (* laengs-wert dir-x))
(+ (cadr soll-ende) (* laengs-wert dir-y))
(caddr soll-ende)))
(princ (ssg-textf "vfl-m3-ziel-soll-es-korrigiert"
(list (rtos (car soll-korrigiert) 2 1) (rtos (cadr soll-korrigiert) 2 1) (rtos (caddr soll-korrigiert) 2 1))))
(princ (ssg-textf "vfl-m3-abweichung-es-korrigiert"
(list (rtos (- (car ist-ende) (car soll-korrigiert)) 2 1)
(rtos (- (cadr ist-ende) (cadr soll-korrigiert)) 2 1)
(rtos (- (caddr ist-ende) (caddr soll-korrigiert)) 2 1))))
(princ "\n=========================================")
(if dbg-an
+4
View File
@@ -245,6 +245,8 @@
"vfl-m3-abweichung": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm",
"vfl-m3-laengs-quer": "\n Laengs KS_AUS-Achse: %1 mm | Quer zur Achse (soll ~0): %2 mm",
"vfl-m3-achse-hinweis": "\n (dZ=Ziel-Hoehe; Quer zur KS_AUS-Achse ~0 => Endpunkt liegt auf der Achse)",
"vfl-m3-ziel-soll-es-korrigiert": "\n Soll (ES-korrigiert): X=%1 Y=%2 Z=%3 (Ziel + bekannter ES-Laengsversatz)",
"vfl-m3-abweichung-es-korrigiert": "\n Abweichung (ES-korrigiert): dX=%1 dY=%2 dZ=%3 mm",
"gf-fehler-block-fehlt": "\n FEHLER: Block '%1' fehlt",
"gf-fehler-block-fehlt-ausruf": "\n FEHLER: Block '%1' fehlt!",
"gf-fehler-blockdatei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1",
@@ -500,6 +502,7 @@
"vfc-alert-keine-gueltige-linie": "Keine gueltige Linie ausgewaehlt!",
"vfc-bitte-3dlinie-foerderstrecke": "\nBitte 3D-Linie fuer die Foerderstrecke auswaehlen:",
"vfc-bks-weltkoordinaten": "\n BKS auf Weltkoordinaten gesetzt.",
"vfc-dlg-startpunkt-kopf": "Startpunkt der Anlage waehlen (X/Y):",
"vfc-eingabemodus-3dlinie": "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)",
"vfc-eingabemodus-header": "\n\nEingabemodus waehlen:",
"vfc-eingabemodus-werte": "\n 2 - Werte manuell eingeben",
@@ -526,6 +529,7 @@
"vfc-objekt-block-waehlen": "\n >> Objekt (Block) waehlen: ",
"vfc-prompt-delta-h": "\n%1H - Hoehenunterschied (mm): ",
"vfc-prompt-delta-l": "\n%1L - Horizontale Distanz (mm): ",
"vfc-prompt-einfuegehoehe-3dlinie": "\nEinfuegehoehe (mm) [%1 - Hoehe des Linien-Startpunkts]: ",
"vfc-prompt-startpunkt-aus": "\nStartpunkt fuer AUS_Element waehlen: ",
"vfc-prompt-wahl-1-2-ohne-default": "\nIhre Wahl (1/2): ",
"vfc-status-ok": " OK",
+4
View File
@@ -245,6 +245,8 @@
"vfl-m3-abweichung": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm",
"vfl-m3-laengs-quer": "\n Along KS_AUS axis: %1 mm | across axis (should be ~0): %2 mm",
"vfl-m3-achse-hinweis": "\n (dZ=target height; across KS_AUS axis ~0 => end point lies on the axis)",
"vfl-m3-ziel-soll-es-korrigiert": "\n Target (ES-corrected): X=%1 Y=%2 Z=%3 (target + known ES lateral offset)",
"vfl-m3-abweichung-es-korrigiert": "\n Deviation (ES-corrected): dX=%1 dY=%2 dZ=%3 mm",
"gf-fehler-block-fehlt": "\n ERROR: block '%1' missing",
"gf-fehler-block-fehlt-ausruf": "\n ERROR: block '%1' missing!",
"gf-fehler-blockdatei-fehlt": "\n ERROR: block file not found: %1",
@@ -500,6 +502,7 @@
"vfc-alert-keine-gueltige-linie": "No valid line selected!",
"vfc-bitte-3dlinie-foerderstrecke": "\nPlease select a 3D line for the conveyor section:",
"vfc-bks-weltkoordinaten": "\n UCS set to world coordinates.",
"vfc-dlg-startpunkt-kopf": "Select start point of the system (X/Y):",
"vfc-eingabemodus-3dlinie": "\n 1 - Select 3D line (start and end point with height)",
"vfc-eingabemodus-header": "\n\nSelect input mode:",
"vfc-eingabemodus-werte": "\n 2 - Enter values manually",
@@ -526,6 +529,7 @@
"vfc-objekt-block-waehlen": "\n >> Select object (block): ",
"vfc-prompt-delta-h": "\n%1H - height difference (mm): ",
"vfc-prompt-delta-l": "\n%1L - horizontal distance (mm): ",
"vfc-prompt-einfuegehoehe-3dlinie": "\nInsertion height (mm) [%1 - height of the line start point]: ",
"vfc-prompt-startpunkt-aus": "\nSelect start point for AUS_Element: ",
"vfc-prompt-wahl-1-2-ohne-default": "\nYour choice (1/2): ",
"vfc-status-ok": " OK",