This commit is contained in:
Simon Hensch
2026-09-14 13:30:53 +02:00
9 changed files with 1502 additions and 968 deletions
+23 -4
View File
@@ -264,6 +264,19 @@
(setq *vfl-journal* '() *vfl-replay-queue* nil *vfl-seg-glied-letzte* 0)
(if (boundp '*vflw-pending*) (setq *vflw-pending* nil)))
;; Wie vfl-journal-reset, aber OHNE *vfl-replay-queue*/*vflw-pending*/die
;; Meldungs-Sammler zu loeschen. Fuer den Aufruf INNERHALB von
;; vf-linienzug-modus/-modus2 selbst (siehe dortige Kommentare): die
;; REPLAY-getriebenen Aufrufer (vsp-bau-aus-spec) haben *vfl-replay-queue*
;; per vfl-journal-replay-start VOR dem Aufruf absichtlich befuellt - ein
;; voller Reset hier wirft die noch unverbrauchte Queue mitten im Bau weg
;; (realer Bug: HEADLESS-ABBRUCH direkt nach der AS-Element-Praeambel,
;; obwohl die Queue laut Debug-Log noch Eintraege hatte). Der eigentliche
;; Zweck - *vfl-journal* nicht ueber mehrere Ketten derselben Sitzung
;; hinweg wachsen zu lassen - bleibt erhalten.
(defun vfl-journal-reset-lauf ()
(setq *vfl-journal* '() *vfl-seg-glied-letzte* 0))
;; Eintrag anhaengen (vorn, da Reverse-Reihenfolge).
;; Zusaetzlich (falls ein Debug-Schalter fuer die aktuelle Sitzung eine .dbg-
;; Datei geoeffnet hat, siehe ssg_dbg.lsp/dbg-schalter-open) wird jeder
@@ -6113,8 +6126,12 @@
;; 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)
;; 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)
(while (not fertig)
;; --- Naechstes Element bestimmen ---
@@ -9133,8 +9150,10 @@
(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)
;; 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)
(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
+45 -2
View File
@@ -234,6 +234,33 @@
(setq v (ssg-val quelle "winkel_idx"))
(if v (vsp-ganz v "winkel_idx")))
;; 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
;; vfl-eingang-modus-bestimmen mit nil beantwortet: echter Kettenanfang MIT
;; AS-Element bzw. Anschluss an eine fertige VF-Einheit ("letzter-typ"="VF"),
;; und am Kettenanfang OHNE AS auch dann, wenn der KS_AUS-Scan die GF-Familie
;; erkennt oder der Nutzer die 3-Optionen-Rueckfrage mit "2" beantwortet.
;; Folgt die Sektion dagegen auf GF/Separator/Vario-Kurve, gibt es kein neues
;; GF1 und damit keine Frage - dann fehlt das Feld. Ob der Fall ansteht, haengt
;; am Zustand der Zeichnung und kann hier nicht berechnet werden; die Spec sagt
;; es, geraten wird nichts.
;; "auto" (statt einer Zahl): die Frage kommt zwar (siehe oben), aber es
;; wird bewusst KEINE Zahl vorgegeben - genau wie eine leere Konsolen-
;; Eingabe (getreal liefert dann nil) laesst das den Bauablauf seinen
;; eigenen, aus dem Fussabdruck der festen Elemente berechneten Vorschlag
;; nehmen (vfl-baue-horizontal-koerper-Aufrufstelle: "(if (null hoehe-neu)
;; (setq hoehe-neu (- (caddr p-aktuell) fest-drop)))"). Dafuer wird ein
;; "NIL"-Token (Wert nil) statt "REAL" ausgegeben - vfl-replay-pop liefert
;; dafuer (nil) zurueck, was vfl-in-value als "keine Antwort" erkennt und
;; genauso behandelt wie eine leere Live-Eingabe.
(defun vsp-eingang-hoehe (quelle / v)
(setq v (ssg-val quelle "eingang_hoehe"))
(cond
((null v) nil)
((and (= (type v) 'STR) (= (strcase v) "AUTO")) (vsp-raus "NIL" nil))
(T (vsp-zahl "REAL" v "eingang_hoehe"))))
(defun vsp-praeambel (kopf / punkt)
(setq *vsp-wo* "start")
(setq punkt (ssg-val kopf "start_punkt"))
@@ -360,6 +387,7 @@
((= label "Horizontal-VF")
(vsp-linie sek)
(vsp-eingang-hoehe sek)
(vsp-vf-einheit sek subs T))
((= label "Linie")
@@ -394,8 +422,14 @@
;; der flachen Queue liegt sie aber IMMER an derselben Position: direkt nach
;; den Werten des Vorgaenger-Knotens. Darum genau EIN Code je sub.
(defun vsp-vf-einheit (sek subs erst-hor / n i wahl letzter ende)
(vsp-code-raus *vsp-tab-verteilung* (ssg-val sek "gf_verteilung")
"gf_verteilung")
;; GF-Verteilung: beim horizontalen Erstkoerper wird sie NICHT gefragt - die
;; Aufrufstelle in vf-linienzug-modus gibt "2" (alles am Einlauf) fest vor
;; (vfl-vf-einheit-abschluss, Argument gf-verteilung-fest), weil L_GF dort nur
;; der strukturelle Mindest-Eingang ist. Ein "gf_verteilung"-Feld an einer
;; Horizontal-VF-Sektion bleibt darum wirkungslos (alte Specs tragen es noch).
(if (not erst-hor)
(vsp-code-raus *vsp-tab-verteilung* (ssg-val sek "gf_verteilung")
"gf_verteilung"))
(if erst-hor
(progn
(vsp-raus "STR" (vsp-ja-code (ssg-val sek "vf_sep_vor")))
@@ -425,6 +459,15 @@
" aber noch weitere subs")))
(vsp-code-raus *vsp-tab-endpunkt* "kettenende" "sub")
(vsp-raus "STR" (vsp-ja-code (ssg-val sub "es")))
;; Mit ES: Winkel+Seite werden SCHON HIER erfragt (vfl-frage-es-seite,
;; inkl. eigenem STEP-Marker) und nicht erst im Abschluss - sie
;; bestimmen den ES-Fussabdruck, der in die Streckenzerlegung eingeht.
;; Darum stehen sie am sub und nicht in einer eigenen ES-Sektion.
(if (vsp-ja-p (ssg-val sub "es"))
(progn
(vsp-raus "STEP" "ES")
(vsp-wert-str (ssg-val sub "es_winkel") "es_winkel")
(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))