This commit is contained in:
Yuelin Wang
2026-09-16 09:09:09 +02:00
7 changed files with 402 additions and 119 deletions
+26 -18
View File
@@ -6238,6 +6238,16 @@
;; zurueckgesetzt (spaeter im Ablauf) sowie unmittelbar vor jedem "Zurueck"-
;; Neuaufruf in vfl-modus-abbruch-sichern.
(setq *vfl-wizard-abbruch-grund* nil)
;; *vfl-journal* VOR dem allerersten vfl-in-*-Aufruf zuruecksetzen (nicht
;; *vfl-replay-queue* - ein REPLAY-getriebener Aufrufer wie vsp-bau-aus-spec
;; hat sie ueber vfl-journal-replay-start bereits VOR diesem Aufruf befuellt,
;; siehe Kommentar bei vfl-journal-reset-lauf). Frueher stand dieser Reset
;; ERST kurz vor der Hauptschleife (nach Startpunkt/Hoehe/AS-Praeambel) -
;; realer Bug: die bereits aufgezeichnete Praeambel wurde dadurch selbst
;; wieder geloescht, das gespeicherte Journal begann mit dem ERSTEN
;; STEP-Marker statt mit PT (sichtbar als vsp-bau-aus-spec-DESYNC "Token 1:
;; erwartet PT..., gebaut STEP...", betraf ausnahmslos JEDE Kette).
(vfl-journal-reset-lauf)
(princ "\n\n=========================================")
(princ (ssg-text "vfl-modus1-header"))
(princ "\n=========================================")
@@ -6386,18 +6396,10 @@
(setq letzter-typ nil fertig nil frame nil)
(setq anzahl-gf 0 anzahl-vf 0)
(vfl-acc-reset)
;; *vfl-journal* wurde bisher NIRGENDS zurueckgesetzt (vfl-journal-reset war
;; definiert, aber toter Code) - bei MEHREREN Ketten in derselben BricsCAD-
;; Sitzung blieben die Eintraege der vorigen Kette(n) im globalen Journal
;; stehen und wurden der naechsten Kette per (cons ...) VORANgestellt. Real
;; beobachteter Bug: eine fremde Kette (anderer Test/Bau) landete mit in der
;; XDATA der aktuellen Kette, mit Fehlfunktionen in der Attribut-/XDATA-
;; Erzeugung (u.a. "bad argument type ... at [itoa]"). vfl-journal-reset-
;; lauf statt vfl-journal-reset: NICHT *vfl-replay-queue* mitloeschen -
;; ein REPLAY-getriebener Aufrufer (vsp-bau-aus-spec) hat sie ueber
;; vfl-journal-replay-start bereits VOR diesem Aufruf befuellt (siehe
;; Kommentar bei vfl-journal-reset-lauf).
(vfl-journal-reset-lauf)
;; *vfl-journal*-Reset steht jetzt GANZ AM ANFANG der Funktion (vor der
;; Startpunkt/Hoehe/AS-Praeambel) - siehe Kommentar dort. Hier NICHT mehr
;; noetig (und schaedlich: wuerde die bereits aufgezeichnete Praeambel
;; dieses Laufs wieder loeschen).
(while (not fertig)
;; --- Naechstes Element bestimmen ---
@@ -9165,6 +9167,14 @@
(princ (ssg-text "vfl-m3-titel"))
(princ "\n=========================================")
;; *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
;; kurz vor Phase B (nach der Pfadauswahl UND der Startpunkt/Hoehe/AS-
;; Praeambel) und loeschte damit die bereits aufgezeichnete Praeambel dieses
;; Laufs selbst wieder.
(vfl-journal-reset-lauf)
;; --- Debug-Session (Schalter "vfl-modus2", DEFAULT AN) ------------------
;; (dbg-schalter-off "vfl-modus2") deaktiviert bei Bedarf. Alle Eingaben
;; laufen bereits durchgehend ueber die vfl-in-*-Wrapper (siehe unten) und
@@ -9529,12 +9539,10 @@
(setq vfl-nummer (vf-next-number))
(setq lastEnt (vf-lastent-ohne-attribute))
(vfl-acc-reset)
;; Siehe Kommentar bei vf-linienzug-modus: *vfl-journal* wurde bisher nie
;; zurueckgesetzt und konnte Eintraege einer vorigen Kette (Modus 1 ODER 2)
;; in dieselbe Sitzung hineintragen. vfl-journal-reset-lauf statt
;; vfl-journal-reset: NICHT *vfl-replay-queue* mitloeschen (siehe dortiger
;; Kommentar) - derselbe Grund wie in vf-linienzug-modus.
(vfl-journal-reset-lauf)
;; *vfl-journal*-Reset steht jetzt GANZ AM ANFANG der Funktion (vor der
;; Pfadauswahl/Praeambel) - siehe Kommentar dort. Hier NICHT mehr noetig
;; (und schaedlich: wuerde die bereits aufgezeichnete Praeambel dieses
;; Laufs wieder loeschen).
(setq anzahl-gf 0 anzahl-vf 0 frame nil)
;; --- Abbruch-Sicherung ab hier scharf (analog Modus 1, siehe dortiger
;; Kommentar) - Phase A (oben) baut noch keine Geometrie, ein Abbruch
+46 -14
View File
@@ -60,6 +60,9 @@
("auf-ab" . "3")))
(setq *vsp-tab-endpunkt* '(("motorstation" . "1") ("weiter" . "2")
("kettenende" . "3")))
;; Richtungswahl fuer "auf-ab", wenn die Kette bereits FLACH ankommt
;; (vfl-frage-auf-ab-richtung: "1"=Auf, "2"=Ab) - siehe vsp-vf-einheit.
(setq *vsp-tab-richtung* '(("auf" . "1") ("ab" . "2")))
(setq *vsp-tab-ende3* '(("ja-mit-es" . "1") ("ja-ohne-es" . "2")
("nein" . "3")))
(setq *vsp-tab-ende2* '(("ja-mit-es" . "1") ("nein" . "2")))
@@ -200,22 +203,22 @@
(setq v (ssg-val kopf "spec_id"))
(if v v "(ohne spec_id)"))
;; Segmentlaenge, und NUR beim allerersten Segment der Kette die gesnappte
;; Fahrtrichtung: vfl-in-abstand journalisiert die Richtung nur bei freier
;; Richtungswahl (hz-vorgabe nil), jedes weitere Segment erbt sie vom
;; Vorgaenger. Ein hz an spaeterer Stelle wuerde die ganze Replay-Queue um
;; einen Eintrag verschieben - darum hier ein harter Fehler.
;; Segmentlaenge und optional die gesnappte Fahrtrichtung. Feldpraesenz
;; entscheidet, NICHT *vsp-erster-dl*: die eingefrorene Aufzeichnung
;; (hm_recformat.json) journalisiert die Richtung nur beim allerersten
;; Segment der ganzen Kette, der heutige Ablauf (linienzug_tests.json/
;; -stufe2.json, 2026-09-12) dagegen bei JEDEM Segment neu, auch nach einer
;; Vario-Kurve oder einem neuen Glied. Beim ALLERERSTEN Segment MUSS die
;; Richtung dabeistehen (die Kette hat noch keine geerbte).
(defun vsp-linie (quelle / hz)
(vsp-zahl "DL" (ssg-val quelle "dl") "dl")
(setq hz (ssg-val quelle "hz"))
(cond
(*vsp-erster-dl*
(vsp-zahl "REAL" hz "hz (Pflicht beim ersten Segment der Kette)")
(setq *vsp-erster-dl* nil))
((and *vsp-erster-dl* (null hz))
(vsp-fehler "Feld \"hz\" fehlt (Pflicht beim ersten Segment der Kette)"))
(hz
(vsp-fehler (strcat "Feld \"hz\" ist nur beim ERSTEN Segment der Kette"
" erlaubt - jedes weitere erbt die Fahrtrichtung"
" vom Vorgaenger und hat keinen Journal-Eintrag")))))
(vsp-zahl "REAL" hz "hz")))
(setq *vsp-erster-dl* nil))
;; Reine Richtungswahl OHNE Laenge (vfl-in-richtung: journalisiert NUR REAL,
;; kein DL-Token) - fuer den Kettenanfang-Fall der Zielhoehe-zuerst-Zweige
@@ -234,6 +237,16 @@
(setq v (ssg-val quelle "winkel_idx"))
(if v (vsp-ganz v "winkel_idx")))
;; Stufe-2-Fallback (vfl-frage-gf2-minimum in vf_linienzug.lsp): steht nur im
;; Journal, wenn die am Kettenende automatisch berechnete GF2-Laenge UNTER
;; der ueblichen Mindestlaenge liegt (Stufe 1 - Winkeltabelle - hat dann
;; keinen gueltigen Kandidaten geliefert). "ja" = mit der exakt berechneten
;; (kuerzeren) Laenge bauen, "nein" = auf die Mindestlaenge auffuellen. Faellt
;; die Frage nicht an, kein Journal-Eintrag - wie vsp-winkel-idx.
(defun vsp-gf2-bestaetigung (quelle / v)
(setq v (ssg-val quelle "gf2_exakt_bauen"))
(if v (vsp-raus "STR" (vsp-ja-code v))))
;; Ziel-Hoehe fuer den GF1-Einlauf einer mit "Horizontal-VF" eroeffneten
;; VF-Einheit (vfl-prompt-hoehe-eingang-gf1). Optional, weil die Frage NUR
;; kommt, wenn der Eingang komplett neu gebaut wird - das ist der Fall, den
@@ -470,7 +483,8 @@
(vsp-code-raus *vsp-tab-seite* (ssg-val sub "es_seite") "es_seite")))
(vsp-linie sub)
(vsp-zahl "REAL" (ssg-val sub "hoehe") "hoehe")
(vsp-winkel-idx sub))
(vsp-winkel-idx sub)
(vsp-gf2-bestaetigung sub))
(T
(if letzter
@@ -491,8 +505,26 @@
"variante"))
((= wahl "auf-ab")
(vsp-linie sub)
(vsp-zahl "REAL" (ssg-val sub "hoehe") "hoehe")
(vsp-winkel-idx sub))))))
;; Zwei Auspraegungen, unterschieden per Feldpraesenz (kein
;; separates Modus-Flag noetig - "richtung" IST die Aussage):
;; kommt die Kette schon FLACH an (vfl-frame-flach-p), fragt
;; vf-linienzug-modus NICHT nach einer Zielhoehe, sondern nach der
;; Richtung (Auf/Ab) und waehlt den Winkel aus einer Kandidaten-
;; tabelle (vfl-waehle-winkel-hoehen-tabelle) - winkel_idx dabei
;; wie bei GF-Bogen/Vario-Kurve nur, wenn mehrere Kandidaten
;; gueltig waren. Kommt sie NICHT flach an (die urspruengliche,
;; einzige Auspraegung), wird weiterhin direkt eine Zielhoehe
;; erfragt. Welcher Fall ansteht, haengt am Zustand der Zeichnung
;; und wird hier nicht geraten - die Spec sagt es ueber die
;; Anwesenheit von "richtung".
(if (ssg-val sub "richtung")
(progn
(vsp-code-raus *vsp-tab-richtung* (ssg-val sub "richtung")
"richtung")
(vsp-winkel-idx sub))
(progn
(vsp-zahl "REAL" (ssg-val sub "hoehe") "hoehe")
(vsp-winkel-idx sub))))))))
;; --- Abschluss (vfl-vf-einheit-abschluss) ---
;; "zielpunkt-ohne-es": Kette endet direkt am Zielpunkt, keine Frage.
;; "automatisch": Glied "Linie" bzw. erreichter Zielpunkt - das