feat: "Neue Linie BIS Kettenende" erkennt VF/GF-Startpunkt

Bei "Neue Linie BIS Kettenende" (Option 6) wird jetzt erkannt, ob der
Startpunkt zu einer bestehenden VF- oder GF-Kette gehoert (KS_AUS-Scan
am Kettenanfang bzw. letzter-typ bei laufender Fortsetzung) und die
Bau-Logik entsprechend verzweigt, statt immer die generische
Machbarkeits-Automatik zu fragen:

- VF erkannt: baut zwingend ueber die Stufe-1/Stufe-2-Diagnose
  (vfl-vf-entscheidung), auch wenn der natuerliche Winkel zufaellig
  nahe 3 Grad liegt (vfl-segment-entscheidung haette dort faelschlich
  eine reine GF gewaehlt)
- GF erkannt: neue Unterfrage mit denselben 2 Optionen wie "Neue Linie:
  GF" (Zielhoehe fest -> Laenge berechnen, ODER Laenge fest -> Winkel
  berechnen), eigener Radiobutton-Dialog (Wiederverwendung von
  vflw-gruppe-gf-steigend-untermodus-impl)
- nicht eindeutig zuordenbar (z.B. frischer AS-Element-Start): bisherige
  automatische Entscheidung unveraendert

Neue Helfer: vfl-letzter-typ-familie (Pendant zu vfl-kette-typ-familie
fuer den session-lokalen letzter-typ-String).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Yuelin Wang
2026-09-12 00:38:15 +02:00
co-authored by Claude Sonnet 5
parent 942012e44d
commit 0f1c7d2edf
+105 -5
View File
@@ -4428,6 +4428,19 @@
)
)
;; Wie vfl-kette-typ-familie, aber fuer den SESSION-LOKALEN "letzter-typ"-
;; String (statt eines per Blockname erkannten XDATA-Typs) - fuer eine
;; laufende Fortsetzung (kettenanfang=nil) ist der Vorgaengertyp bereits
;; ohne KS_AUS-Scan bekannt. "Separator" zaehlt als GF-Familie (er folgt in
;; diesem Ablauf immer auf ein GF-Segment, siehe "Linie-GF"-Zweig).
(defun vfl-letzter-typ-familie (letzter-typ)
(cond
((member letzter-typ '("VF" "Vario-Kurve")) "VF")
((member letzter-typ '("GF" "Separator")) "GF")
(t nil)
)
)
;; Eingang-Modus + L_GF-Stumpf fuer eine neue VF-Einheit bestimmen - EINE
;; gemeinsame Entscheidung fuer "Neue VF mit horizontalem Anfang" UND "Neue
;; Linie: Ab/Auf VF" (Punkt 5). Reihenfolge:
@@ -4827,7 +4840,8 @@
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
bogen-mass fest-drop fest-laenge eingang-fertig)
bogen-mass fest-drop fest-laenge eingang-fertig
linie-ende-familie linie-ende-untermodus)
;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen (auch schon vor
;; der ersten Praeambel-Frage) - sonst wuerde ein von einem VORHERIGEN Lauf
;; noch gesetztes Flag (z.B. nach "Abbrechen") den allerersten vfl-in-*-
@@ -5771,7 +5785,12 @@
)
)
((= wahl "Linie") ;; --- Neue Linie BIS Kettenende (automatische GF/VF-Entscheidung, unveraendert) ---
((= wahl "Linie") ;; --- Neue Linie BIS Kettenende ---
;; GF/VF-Entscheidung: wird der Startpunkt eindeutig einer bestehenden
;; VF- oder GF-Kette zugeordnet (linie-ende-familie, siehe unten),
;; entscheidet DAS die Bau-Logik (Stufe-1/2-Diagnose bzw. Endpunkt/
;; Zielhoehe-Wahl) - nur wenn nicht eindeutig, greift weiterhin die
;; automatische Machbarkeits-Entscheidung (vfl-segment-entscheidung).
;; Fahrtrichtung folgt dem vorherigen Element (Frame); nur das erste
;; Segment (frame=nil) definiert die Richtung frei.
(setq linie-mess (vfl-neue-linie-messen p-aktuell
@@ -5779,6 +5798,25 @@
(if (null linie-mess) (progn (princ (ssg-text "vfl-abgebrochen")) (exit)))
(setq deltaL (car linie-mess) hz-neu (cadr linie-mess))
(setq kettenanfang (null frame))
;; Startpunkt-Typ erkennen (VF/GF/nicht eindeutig): bei einer
;; laufenden Fortsetzung ist der Vorgaengertyp schon bekannt
;; (letzter-typ); am echten Kettenanfang OHNE AS-Element wird wie bei
;; vfl-eingang-modus-bestimmen per KS_AUS-Scan erkannt, ob der
;; gepickte Startpunkt auf einer bestehenden VF- oder GF-Kette liegt.
;; Steht schon ein AS-Element (as-vorhanden), ist der Anfang per
;; Definition neutral/nicht zuordenbar - dann bleibt die generische
;; Automatik (vfl-segment-entscheidung) unten aktiv. Genutzt weiter
;; unten, um bei erkannter Familie NICHT die generische Automatik zu
;; fragen, sondern direkt die passende (VF: Stufe-1/2-Diagnose; GF:
;; Endpunkt/Zielhoehe-Wahl wie "Neue Linie: GF") Logik zu verwenden.
(setq linie-ende-familie
(if kettenanfang
(if (not as-vorhanden)
(progn
(setq erg (vfl-ks-aus-hz-an-punkt p-aktuell))
(if erg (vfl-kette-typ-familie (cdr erg)) nil))
nil)
(vfl-letzter-typ-familie letzter-typ)))
(if (< deltaL 1.0)
(princ (ssg-text "vfl-fehler-linie-zu-kurz"))
(progn
@@ -5856,9 +5894,71 @@
(list (rtos deltaL 2 0) (rtos deltaH 2 0))))
)
)
(setq entscheidung (vfl-segment-entscheidung deltaL deltaH richtung))
(setq typ (nth 0 entscheidung) winkel (nth 1 entscheidung)
L_GF (nth 2 entscheidung) L_VF (nth 3 entscheidung))
(cond
;; --- Startpunkt als VF-Familie erkannt ---
;; IMMER ueber die Stufe-1/Stufe-2-Diagnose bauen (auch
;; wenn der natuerliche Winkel zufaellig nahe 3 Grad
;; liegt) - vfl-segment-entscheidung wuerde in dem Fall
;; faelschlich eine reine GF waehlen, obwohl der
;; Vorgaenger eindeutig eine VF-Kette ist.
((equal linie-ende-familie "VF")
(setq entscheidung (vfl-vf-entscheidung deltaL deltaH richtung))
(setq typ (nth 0 entscheidung) winkel (nth 1 entscheidung)
L_GF (nth 2 entscheidung) L_VF (nth 3 entscheidung)))
;; --- Startpunkt als GF-Familie erkannt ---
;; Dieselbe Endpunkt-/Zielhoehe-Wahl wie "Neue Linie: GF"
;; (Zweig A/B) statt der generischen Automatik - eine
;; reine Gefaellestrecke kann nicht steigen.
((equal linie-ende-familie "GF")
;; Stufe-2-Diagnosevariablen zuruecksetzen: dieser Zweig
;; ruft vfl-vf-entscheidung NICHT auf, ein evtl. noch
;; von einem frueheren Versuch gesetzter Text/Vorschlag
;; darf bei einem hier fehlschlagenden GF-Segment nicht
;; faelschlich mit angezeigt werden (siehe gemeinsamer
;; "typ=nil"-Meldungsblock unten).
(setq *vfl-stufe2-diagnose-text* nil)
(setq *vfl-stufe2-minl-vorschlag* nil *vfl-stufe2-minh-vorschlag* nil)
(if (= richtung "Auf")
(setq typ nil)
(progn
(princ (ssg-text "vfl-gf-laenge-modus-header"))
(princ (ssg-text "vfl-gf-laenge-modus-opt-endpunkt"))
(princ (ssg-text "vfl-gf-laenge-modus-opt-hoehe"))
(if (vfl-wizard-aktiv)
(vl-catch-all-apply 'vflw-gruppe-gf-steigend-untermodus-impl nil))
(setq linie-ende-untermodus
(vfl-menu (ssg-text "prompt-wahl-1-2")
(list (ssg-text "vfl-gf-laenge-modus-opt-endpunkt")
(ssg-text "vfl-gf-laenge-modus-opt-hoehe")) 1
"vfl-gf-laenge-modus-header"))
(if (= linie-ende-untermodus "2")
;; Zielhoehe fest, Winkel fix *vfk-gefaelle-winkel*
;; -> Laenge wird daraus berechnet (ersetzt die
;; oben gemessene/reservierte deltaL).
(progn
(setq winkel *vfk-gefaelle-winkel*)
(setq deltaL
(/ deltaH (/ (sin (* winkel (/ pi 180.0))) (cos (* winkel (/ pi 180.0))))))
(if (< deltaL 1.0)
(setq typ nil)
(setq typ "GF" L_GF nil L_VF nil)))
;; Endpunkt (deltaL) fest, Winkel aus deltaL +
;; Zielhoehe berechnen.
(progn
(setq winkel (* (atan (/ deltaH deltaL)) (/ 180.0 pi)))
(if (> winkel *vfk-gefaelle-winkel*)
(setq typ nil)
(setq typ "GF" L_GF nil L_VF nil)))
)
)
)
)
;; --- Nicht eindeutig zuordenbar: bisherige Automatik ---
(t
(setq entscheidung (vfl-segment-entscheidung deltaL deltaH richtung))
(setq typ (nth 0 entscheidung) winkel (nth 1 entscheidung)
L_GF (nth 2 entscheidung) L_VF (nth 3 entscheidung)))
)
)
)