fix: VF-Linienzug 100%-Wiederherstellung aus e76e24e abgeschlossen
Restauriert alles aus e76e24e, das nach dem Reset auf master fehlte oder nur teilweise wiederhergestellt war, und mit dem Kollegen-Umbau abgeglichen: - vf_core.lsp: Radio-Button-Dialoge fuer Anlagen-Typ/Linienzug-Modus (vfc-dialog-typ-waehlen/-linienzug-modus-waehlen) + Zurueck-Schleife im c:VarioFoerderer-Dispatcher - Vario-Kurve/GF-Bogen-Erkennung am Kettenanfang: vfl-eingang-modus-bestimmen threaded durch vfl-vf-eingang-bauen/vfl-vf-einheit/vfl-vf-einheit-abschluss, inkl. Punkt-7-Winkel/Hoehen-Tabelle fuer reduzierten Eingang - Modus 2: Lauf-Anfang/Lauf-Abschluss (offener Anfang/Ende, GF-Verteilung "alles Auslauf", Kletter-zu-kurz-Fallback) + Separator VOR/NACH bei GF-Geraden - Systemischer Bug behoben: mehrere Wizard-Dialogfunktionen nutzten noch start_list/add_list (Dropdown) gegen laengst auf boxed_radio_column umgestellte DCL-Dialoge (vflw-gruppe-as/-gefaelle/-variokurve/ -winkel-seite-impl, vflw-seg-linie-m2/-m3/-bogen-impl, vfl-glied-gf-bogen/-vario/-as-es-dialog) - Zentraler Abbruch-Trigger in vfl-in-value/-value-p wiederhergestellt (ohne ihn wirkte der Zurueck/Abbrechen-Button in keinem Wizard-Dialog) - vfl-frage-ist-endpunkt/-ist-kettenende als eigene Funktionen mit Wizard-Dialog extrahiert (vorher Konsolen-Duplikate ohne Dialog-Hookup) - 3 vfs-vf-entry-Aufrufe mit falscher Argumentzahl gefixt (akute Absturz-Bugs in Modus 2/3) - Tote Funktion vflw-gruppe-horizontal-impl entfernt (Tiles nicht mehr im DCL vorhanden) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4a444b4858
commit
0a1d21d8c5
13 files changed
+3106
-654
No files matched your search
@@ -776,6 +776,9 @@
|
||||
|
||||
;; AUS-Element: 30/90 (vor Seite), dann Seite (vor Winkelberechnung, da die
|
||||
;; Laengenanpassung von der AS/ES-Masse abhaengt). Masse fuer Variante setzen.
|
||||
(princ (ssg-text "vf-winkel-aus-header"))
|
||||
(princ (ssg-text "vf-winkel-90"))
|
||||
(princ (ssg-text "vf-winkel-30"))
|
||||
(setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header"))
|
||||
(princ (ssg-text "gf-seite-aus-header"))
|
||||
(princ (ssg-text "gf-seite-links"))
|
||||
@@ -785,6 +788,9 @@
|
||||
(vf-set-as-masse gf-as-winkel as-seite)
|
||||
|
||||
;; EIN-Element: 30/90 + Seite
|
||||
(princ (ssg-text "vf-winkel-ein-header"))
|
||||
(princ (ssg-text "vf-winkel-90"))
|
||||
(princ (ssg-text "vf-winkel-30"))
|
||||
(setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header"))
|
||||
(princ (ssg-text "gf-seite-ein-header"))
|
||||
(princ (ssg-text "gf-seite-links"))
|
||||
@@ -1760,6 +1766,9 @@
|
||||
(setq winkel (float winkel))
|
||||
|
||||
;; AUS-Element: 30/90 + Seite
|
||||
(princ (ssg-text "vf-winkel-aus-header"))
|
||||
(princ (ssg-text "vf-winkel-90"))
|
||||
(princ (ssg-text "vf-winkel-30"))
|
||||
(setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header"))
|
||||
(princ (ssg-text "gf-seite-aus-header"))
|
||||
(princ (ssg-text "gf-seite-links"))
|
||||
@@ -1768,6 +1777,9 @@
|
||||
(setq as-seite (if (= antwort "2") "rechts" "links"))
|
||||
|
||||
;; EIN-Element: 30/90 + Seite
|
||||
(princ (ssg-text "vf-winkel-ein-header"))
|
||||
(princ (ssg-text "vf-winkel-90"))
|
||||
(princ (ssg-text "vf-winkel-30"))
|
||||
(setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header"))
|
||||
(princ (ssg-text "gf-seite-ein-header"))
|
||||
(princ (ssg-text "gf-seite-links"))
|
||||
|
||||
+181
-64
@@ -598,9 +598,14 @@
|
||||
;; "vf-winkel-ein-header"). Rueckgabe: "30" oder "90" (Default 90).
|
||||
;; Wizard: nutzt vflw-wahl (dcl/vf_linienzug_wizard.dcl, definiert in
|
||||
;; vf_linienzug.lsp) falls dieses Modul geladen und *vfl-wizard-mode* aktiv
|
||||
;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Fragen
|
||||
;; (princ + getstring, de/en ueber ssg-text). Gemeinsam genutzt von
|
||||
;; Gefaellestrecke.lsp UND vf_linienzug.lsp.
|
||||
;; ist - sonst (oder bei jedem Fehler) unveraendert die Konsolen-Frage
|
||||
;; (getstring, de/en ueber ssg-text). Gemeinsam genutzt von Gefaellestrecke.lsp
|
||||
;; UND vf_linienzug.lsp. Druckt selbst KEINE Kopfzeile/Optionstexte mehr (das
|
||||
;; macht immer der AUFRUFER, unconditional, VOR diesem Aufruf) - sonst fehlt
|
||||
;; die Kopfzeile in der Konsole genau dann, wenn ein vfl-in-value-Wrapper den
|
||||
;; Wert bereits aus der Pending-Queue/dem Journal-Replay liest und diese
|
||||
;; Funktion dadurch gar nicht erst aufgerufen wird (Inkonsistenz Dialog vs.
|
||||
;; Konsole, siehe Aufrufer in vf_linienzug.lsp/Gefaellestrecke.lsp).
|
||||
(defun vf-frage-element-winkel (headerkey / antwort)
|
||||
;; Wizard-Dialog nur, wenn Wizard-Modus aktiv, vflw-wahl geladen UND die GUI
|
||||
;; global nicht abgeschaltet ist (Tests: (ssg-gui-aus)) - sonst Konsole/getstring.
|
||||
@@ -615,12 +620,7 @@
|
||||
(if (or (vl-catch-all-error-p antwort) (null antwort) (= antwort ""))
|
||||
(setq antwort "1"))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text headerkey))
|
||||
(princ (ssg-text "vf-winkel-90"))
|
||||
(princ (ssg-text "vf-winkel-30"))
|
||||
(setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
|
||||
)
|
||||
(setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
|
||||
)
|
||||
(if (= antwort "2") "30" "90"))
|
||||
|
||||
@@ -972,7 +972,7 @@
|
||||
(setq horizontal-info nil)
|
||||
(if (and horizontal-p (= richtung "Ab"))
|
||||
(progn
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab" nil))
|
||||
(if (and horizontal-info (caddr horizontal-info))
|
||||
(setq ergebnis-liste
|
||||
(append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T))))
|
||||
@@ -1078,6 +1078,94 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 11b: DIALOG-AUSWAHL FUER TYP/LINIENZUG-MODUS (Radio-Buttons)
|
||||
;; ============================================================
|
||||
;; Ersetzen die beiden Konsolen-Listen am Anfang von c:VarioFoerderer durch
|
||||
;; Radio-Button-Dialoge (dcl/variofoerderer.dcl, vfc_typ/vfc_linienzug_modus)
|
||||
;; - alle Optionen sofort sichtbar statt Dropdown. WICHTIG: Radio-Button-
|
||||
;; Labels sind im DCL fest auf Deutsch einprogrammiert (set_tile kann das
|
||||
;; Label eines radio_button nicht setzen, nur den Zustand - siehe DCL-
|
||||
;; Kommentar). Beide Funktionen geben deshalb nur dann etwas anderes als nil
|
||||
;; zurueck, wenn GUI erlaubt ist (Tests: ssg-gui-aus) UND Deutsch aktiv ist -
|
||||
;; sonst faellt der Aufrufer automatisch auf die alte, vollstaendig
|
||||
;; uebersetzte Konsolen-Liste zurueck (unveraendert im Code stehen
|
||||
;; geblieben). Rueckgabe jeweils: Ergebnis bei OK, 'ABBRUCH bei Cancel, nil
|
||||
;; wenn der Dialog gar nicht erst gezeigt werden konnte/durfte.
|
||||
;; "Zurueck" hat an dieser allerersten Frage der ganzen Anlage nichts, wohin es
|
||||
;; zurueckspringen koennte - wird daher lokal aufgeloest: der Dialog wird
|
||||
;; einfach erneut gezeigt (kein Sonderfall fuer den Aufrufer noetig).
|
||||
(defun vfc-dialog-typ-waehlen ( / dcl-pfad dat gtyp ergebnis fertig)
|
||||
(if (and (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p))
|
||||
(= *ssg-lang* "de_DE")
|
||||
(equal (mapcar 'car *vf-typ-registry*) '("standard" "etage" "linienzug")))
|
||||
(progn
|
||||
(setq fertig nil)
|
||||
(while (not fertig)
|
||||
(setq fertig t)
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/variofoerderer.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (not (new_dialog "vfc_typ" dat))
|
||||
(progn (if (and dat (>= dat 0)) (unload_dialog dat)) (setq ergebnis nil))
|
||||
(progn
|
||||
(set_tile "typ_standard" "1")
|
||||
(action_tile "accept"
|
||||
"(setq gtyp (cond ((= (get_tile \"typ_etage\") \"1\") \"etage\")
|
||||
((= (get_tile \"typ_linienzug\") \"1\") \"linienzug\")
|
||||
(t \"standard\")))
|
||||
(done_dialog 1)")
|
||||
(action_tile "cancel" "(done_dialog 0)")
|
||||
(action_tile "back" "(done_dialog 2)")
|
||||
(setq ergebnis (start_dialog))
|
||||
(unload_dialog dat)
|
||||
(cond
|
||||
((= ergebnis 1) (setq ergebnis gtyp))
|
||||
((= ergebnis 2) (setq fertig nil)) ;; Zurueck: Dialog erneut zeigen
|
||||
(t (setq ergebnis 'ABBRUCH))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
ergebnis
|
||||
)
|
||||
nil
|
||||
)
|
||||
)
|
||||
|
||||
;; "Zurueck" springt zur Anlagen-Typ-Frage zurueck - Rueckgabe 'ZURUECK, vom
|
||||
;; Aufrufer (c:VarioFoerderer) ausgewertet (dort erneuter Aufruf von
|
||||
;; vfc-dialog-typ-waehlen statt hier lokal aufzuloesen).
|
||||
(defun vfc-dialog-linienzug-modus-waehlen ( / dcl-pfad dat gmodus ergebnis)
|
||||
(if (and (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p))
|
||||
(= *ssg-lang* "de_DE"))
|
||||
(progn
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/variofoerderer.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (not (new_dialog "vfc_linienzug_modus" dat))
|
||||
(progn (if (and dat (>= dat 0)) (unload_dialog dat)) nil)
|
||||
(progn
|
||||
(set_tile "modus_1" "1")
|
||||
(action_tile "accept"
|
||||
"(setq gmodus (cond ((= (get_tile \"modus_2\") \"1\") 2)
|
||||
((= (get_tile \"modus_3\") \"1\") 3)
|
||||
(t 1)))
|
||||
(done_dialog 1)")
|
||||
(action_tile "cancel" "(done_dialog 0)")
|
||||
(action_tile "back" "(done_dialog 2)")
|
||||
(setq ergebnis (start_dialog))
|
||||
(unload_dialog dat)
|
||||
(cond
|
||||
((= ergebnis 1) gmodus)
|
||||
((= ergebnis 2) 'ZURUECK)
|
||||
(t 'ABBRUCH)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
nil
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 12: DISPATCHER c:VarioFoerderer
|
||||
;; ============================================================
|
||||
@@ -1088,7 +1176,7 @@
|
||||
best-winkel L_GF L_GF1 L_GF2 L_VF
|
||||
idx eintrag wahl antwort verteilung-modus
|
||||
n-scanner vf-nummer hoehe-von hoehe-bis lastEnt
|
||||
staustrecke-basis vf-insert)
|
||||
staustrecke-basis vf-insert dlg-typ dlg-modus zurueck-zu-typ)
|
||||
|
||||
(princ "\n=========================================")
|
||||
(princ (ssg-text "vfc-banner-titel"))
|
||||
@@ -1102,61 +1190,90 @@
|
||||
)
|
||||
)
|
||||
|
||||
(if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
|
||||
(progn
|
||||
(setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
|
||||
(princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*)))
|
||||
(setq *vf-vorauswahl-typ* nil)
|
||||
)
|
||||
(progn
|
||||
(setq *vf-vorauswahl-typ* nil)
|
||||
(princ (ssg-text "vfc-anlagen-typ-header"))
|
||||
(setq idx 1)
|
||||
(foreach eintr *vf-typ-registry*
|
||||
(princ (ssg-textf "vfc-typ-option" (list idx (nth 3 eintr))))
|
||||
(setq idx (1+ idx))
|
||||
;; Aeussere Schleife nur wegen "Zurueck" bei der Linienzug-Modus-Frage
|
||||
;; (springt zurueck zur Anlagen-Typ-Frage) - fuer Standard/Etage bleibt
|
||||
;; zurueck-zu-typ immer nil, die Schleife laeuft dann genau einmal.
|
||||
(setq zurueck-zu-typ t)
|
||||
(while zurueck-zu-typ
|
||||
(setq zurueck-zu-typ nil)
|
||||
(if (and *vf-vorauswahl-typ* (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
|
||||
(progn
|
||||
(setq typ-eintr (assoc *vf-vorauswahl-typ* *vf-typ-registry*))
|
||||
(princ (ssg-textf "vfc-typ-vorgewaehlt" (list *vf-vorauswahl-typ*)))
|
||||
(setq *vf-vorauswahl-typ* nil)
|
||||
)
|
||||
(progn
|
||||
(setq *vf-vorauswahl-typ* nil)
|
||||
(setq dlg-typ (vfc-dialog-typ-waehlen))
|
||||
(cond
|
||||
((eq dlg-typ 'ABBRUCH) (exit))
|
||||
(dlg-typ (setq typ-eintr (assoc dlg-typ *vf-typ-registry*)))
|
||||
(t
|
||||
;; Dialog nicht verfuegbar/nicht erlaubt (GUI aus, andere Sprache,
|
||||
;; abweichende Registry) - alte Konsolen-Liste unveraendert.
|
||||
(princ (ssg-text "vfc-anlagen-typ-header"))
|
||||
(setq idx 1)
|
||||
(foreach eintr *vf-typ-registry*
|
||||
(princ (ssg-textf "vfc-typ-option" (list idx (nth 3 eintr))))
|
||||
(setq idx (1+ idx))
|
||||
)
|
||||
(setq wahl (getint (ssg-textf "vfc-prompt-wahl-1-n"
|
||||
(list (length *vf-typ-registry*)))))
|
||||
(if (or (null wahl) (< wahl 1) (> wahl (length *vf-typ-registry*)))
|
||||
(setq wahl 1))
|
||||
(setq typ-eintr (nth (1- wahl) *vf-typ-registry*))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq wahl (getint (ssg-textf "vfc-prompt-wahl-1-n"
|
||||
(list (length *vf-typ-registry*)))))
|
||||
(if (or (null wahl) (< wahl 1) (> wahl (length *vf-typ-registry*)))
|
||||
(setq wahl 1))
|
||||
(setq typ-eintr (nth (1- wahl) *vf-typ-registry*))
|
||||
)
|
||||
)
|
||||
(setq anlage-typ (nth 0 typ-eintr))
|
||||
(setq berechne-fn (nth 1 typ-eintr))
|
||||
(setq einfuege-fn (nth 2 typ-eintr))
|
||||
(princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
|
||||
(setq anlage-typ (nth 0 typ-eintr))
|
||||
(setq berechne-fn (nth 1 typ-eintr))
|
||||
(setq einfuege-fn (nth 2 typ-eintr))
|
||||
(princ (ssg-textf "vfc-typ-gewaehlt" (list anlage-typ)))
|
||||
|
||||
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
|
||||
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
|
||||
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
|
||||
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
|
||||
(if (= anlage-typ "linienzug")
|
||||
(progn
|
||||
(princ (ssg-text "vfc-linienzug-modus-header"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-1"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-2"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-3"))
|
||||
(setq wahl (getint (ssg-text "prompt-wahl-1-2-3")))
|
||||
;; Konsolen-Nummer -> interne Funktion:
|
||||
;; 2 = fertiger Ziel-Hoehe-Modus (intern vf-linienzug-modus2)
|
||||
;; 3 = alter Vorwaerts-Nachbau (intern vf-linienzug-modus3, wird umgebaut)
|
||||
;; 1/Default = frische manuelle Eingabe. Ein abgebrochener Bau bleibt als
|
||||
;; VF_n-Block stehen und wird per Doppelklick fortgesetzt/editiert
|
||||
;; (vfl-edit-ent), kein separater Menuepunkt noetig.
|
||||
;; Journal-Reset gilt fuer JEDEN frischen Bau, nicht nur Modus 1: Modus 2
|
||||
;; schreibt sein Journal ebenfalls als XDATA (Marker "linienzug2"), erbte
|
||||
;; ohne Reset aber die Eintraege des Vorlaufs als Praefix - ein spaeterer
|
||||
;; Doppelklick spielte dann fremde Eingaben vor. Die Edit-/Konvertier-Pfade
|
||||
;; laufen nie hier durch (sie setzen ihre Queue selbst), darum ist das
|
||||
;; Hochziehen ein reiner Bugfix. Setzt zugleich *vfl-seg-glied-letzte*
|
||||
;; zurueck, das sonst vom Vorlauf stehenbleibt.
|
||||
(vfl-journal-reset)
|
||||
(cond ((= wahl 2) (vf-linienzug-modus2))
|
||||
((= wahl 3) (vf-linienzug-modus3))
|
||||
(t (vf-linienzug-modus)))
|
||||
(exit)
|
||||
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
|
||||
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
|
||||
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
|
||||
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
|
||||
(if (= anlage-typ "linienzug")
|
||||
(progn
|
||||
(setq dlg-modus (vfc-dialog-linienzug-modus-waehlen))
|
||||
(cond
|
||||
((eq dlg-modus 'ABBRUCH) (exit))
|
||||
((eq dlg-modus 'ZURUECK) (setq zurueck-zu-typ t))
|
||||
(dlg-modus (setq wahl dlg-modus))
|
||||
(t
|
||||
;; Dialog nicht verfuegbar/nicht erlaubt - alte Konsolen-Liste.
|
||||
(princ (ssg-text "vfc-linienzug-modus-header"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-1"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-2"))
|
||||
(princ (ssg-text "vfc-linienzug-modus-3"))
|
||||
(setq wahl (getint (ssg-text "prompt-wahl-1-2-3")))
|
||||
)
|
||||
)
|
||||
(if (not zurueck-zu-typ)
|
||||
(progn
|
||||
;; Konsolen-Nummer -> interne Funktion:
|
||||
;; 2 = fertiger Ziel-Hoehe-Modus (intern vf-linienzug-modus2)
|
||||
;; 3 = alter Vorwaerts-Nachbau (intern vf-linienzug-modus3, wird umgebaut)
|
||||
;; 1/Default = frische manuelle Eingabe (Journal vorher zuruecksetzen). Ein
|
||||
;; abgebrochener Bau bleibt als VF_n-Block stehen und wird per Doppelklick
|
||||
;; fortgesetzt/editiert (vfl-edit-ent), kein separater Menuepunkt noetig.
|
||||
;; Journal-Reset gilt fuer JEDEN frischen Bau, nicht nur Modus 1: Modus 2
|
||||
;; schreibt sein Journal ebenfalls als XDATA (Marker "linienzug2"), erbte
|
||||
;; ohne Reset aber die Eintraege des Vorlaufs als Praefix - ein spaeterer
|
||||
;; Doppelklick spielte dann fremde Eingaben vor. Die Edit-/Konvertier-Pfade
|
||||
;; laufen nie hier durch (sie setzen ihre Queue selbst), darum ist das
|
||||
;; Hochziehen ein reiner Bugfix. Setzt zugleich *vfl-seg-glied-letzte*
|
||||
;; zurueck, das sonst vom Vorlauf stehenbleibt.
|
||||
(vfl-journal-reset)
|
||||
(cond ((= wahl 2) (vf-linienzug-modus2))
|
||||
((= wahl 3) (vf-linienzug-modus3))
|
||||
(t (vf-linienzug-modus)))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1223,7 +1340,7 @@
|
||||
;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert.
|
||||
(if (and (= anlage-typ "standard") (= richtung "Ab"))
|
||||
(progn
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab" nil))
|
||||
(if (and horizontal-info (caddr horizontal-info))
|
||||
(progn
|
||||
(setq ergebnis-liste
|
||||
|
||||
@@ -271,6 +271,11 @@
|
||||
;; Wert geometrisch herleiten laesst statt empirisch fixiert zu bleiben.
|
||||
(if (null *vfk-bruecke-korrektur*) (setq *vfk-bruecke-korrektur* 10.48))
|
||||
|
||||
;; Konstruktions-Obergrenze (mm) fuer die Gesamtlaenge eines zusammen-
|
||||
;; haengenden VF-Laufs (Modus 2, vf-linienzug-modus2) - reiner Hinweis beim
|
||||
;; Ueberschreiten, kein Abbruch. Aktiv referenziert.
|
||||
(if (null *vfk-vf-laenge-max*) (setq *vfk-vf-laenge-max* 25000.0))
|
||||
|
||||
(setq *vfk-konstanten-geladen* t)
|
||||
(princ "\nvf_konstanten geladen.")
|
||||
(princ)
|
||||
+1897
-492
File diff suppressed because it is too large.
Load diff
+11
-2
@@ -202,6 +202,15 @@
|
||||
" erlaubt - jedes weitere erbt die Fahrtrichtung"
|
||||
" vom Vorgaenger und hat keinen Journal-Eintrag")))))
|
||||
|
||||
;; Reine Richtungswahl OHNE Laenge (vfl-in-richtung: journalisiert NUR REAL,
|
||||
;; kein DL-Token) - fuer den Kettenanfang-Fall der Zielhoehe-zuerst-Zweige
|
||||
;; ("Linie-GF" modus="hoehe"/"steigend"+"hoehe"), wo noch keine Laenge
|
||||
;; bekannt ist. Nur beim allerersten Segment der Kette relevant (sonst gar
|
||||
;; kein Aufruf, siehe Aufrufer) - toggelt *vsp-erster-dl* wie vsp-linie.
|
||||
(defun vsp-richtung (quelle)
|
||||
(vsp-zahl "REAL" (ssg-val quelle "hz") "hz (Richtungswahl, kein DL noetig)")
|
||||
(setq *vsp-erster-dl* nil))
|
||||
|
||||
;; Winkelwahl (vfl-waehle-winkel) steht nur im Journal, wenn mehrere
|
||||
;; Kandidatenwinkel gueltig waren - das haengt an der real gemessenen
|
||||
;; Restlaenge und ist vorab nicht immer bekannt. Fehlt das Feld und der Bau
|
||||
@@ -275,12 +284,12 @@
|
||||
(vsp-code-raus *vsp-tab-gf-laenge-modus* smodus "steigend_modus")
|
||||
(if (= smodus "endpunkt")
|
||||
(vsp-linie sek)
|
||||
(if erster (vsp-linie sek)))
|
||||
(if erster (vsp-richtung sek)))
|
||||
(if (= smodus "hoehe")
|
||||
(vsp-zahl "REAL" (ssg-val sek "hoehe") "hoehe"))
|
||||
(vsp-zahl "REAL" (ssg-val sek "winkel") "winkel"))
|
||||
((= modus "hoehe")
|
||||
(if erster (vsp-linie sek))
|
||||
(if erster (vsp-richtung sek))
|
||||
(vsp-raus "STR" (vsp-ja-code (ssg-val sek "sep_vor")))
|
||||
(vsp-raus "STR" (vsp-ja-code (ssg-val sek "sep_nach")))
|
||||
(vsp-zahl "REAL" (ssg-val sek "hoehe") "hoehe")
|
||||
|
||||
+34
-14
@@ -337,20 +337,32 @@
|
||||
;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger.
|
||||
;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR
|
||||
;; KLEINE deltaH ueberhaupt gueltig (wenige cm).
|
||||
;; schon-flach: T => KEIN Bogen1 (auf_3) am Eintritt - der Aufrufer ist
|
||||
;; bereits flach (0 Grad) angekommen und wird KEINEN Uebergangsbogen bauen
|
||||
;; (vermeidet ein ueberfluessiges auf_3/ab_3-Paar, wenn eine bereits flache
|
||||
;; Kette ohnehin ein horizontales Mittelstueck braucht - siehe
|
||||
;; vfl-body-abschluss). Default nil (unveraendertes Verhalten fuer alle
|
||||
;; anderen Aufrufer, die immer von der 3-Grad-Basis starten).
|
||||
;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar.
|
||||
(defun berechne-horizontale-mitte (deltaL deltaH richtung /
|
||||
(defun berechne-horizontale-mitte (deltaL deltaH richtung schon-flach /
|
||||
mass1 mass2 rad3 bogen-x1 bogen-z1
|
||||
bogen-x2 bogen-z2 deltaH-signiert
|
||||
A-hz B-hz GF_total L_VF-hz gueltig)
|
||||
(setq mass1 (get-bogen-mass bogen-auf (fix *vfk-gefaelle-winkel*)))
|
||||
(setq mass1 (if schon-flach t (get-bogen-mass bogen-auf (fix *vfk-gefaelle-winkel*))))
|
||||
(setq mass2 (get-bogen-mass bogen-ab (fix *vfk-gefaelle-winkel*)))
|
||||
(if (or (null mass1) (null mass2))
|
||||
nil
|
||||
(progn
|
||||
(setq rad3 (* *vfk-gefaelle-winkel* (/ pi 180.0)))
|
||||
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3))))
|
||||
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt
|
||||
;; auf 0 Grad - entfaellt bei schon-flach (kein Eintrittsbogen noetig).
|
||||
(if schon-flach
|
||||
(setq bogen-x1 0.0 bogen-z1 0.0)
|
||||
(progn
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3))))
|
||||
)
|
||||
)
|
||||
;; Bogen2 (immer ab_3): Eintritt bei 0 Grad (von der horizontalen Mitte), biegt auf 3 Grad
|
||||
(setq bogen-x2 (car mass2))
|
||||
(setq bogen-z2 (caddr mass2))
|
||||
@@ -412,7 +424,11 @@
|
||||
;; Beginnt eine reine VF-Einheit: bringt die Kette von der (3-Grad-geneigten)
|
||||
;; AS-Seite ueber GF1 + Separator bis zur Umlenkstation. Wird pro VF-Einheit
|
||||
;; GENAU EINMAL aufgerufen (auch wenn danach mehrere Sub-Segmente folgen).
|
||||
(defun vfs-vf-entry (aktueller-punkt L_GF1 hz)
|
||||
;; ohne-separator: T => der Separator entfaellt (das vorherige Kettenglied
|
||||
;; IST bereits ein Separator, siehe letzter-typ in vf-linienzug-modus - eine
|
||||
;; gueltige Trennstelle braucht nur einen Separator, nicht zwei hintereinander).
|
||||
;; L_GF1 sollte in diesem Fall vom Aufrufer bereits auf 0 gesetzt sein.
|
||||
(defun vfs-vf-entry (aktueller-punkt L_GF1 hz ohne-separator)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
;; 1. Gefaellestrecke GF1 (verbindet AS-Neigung mit Umlenkstation)
|
||||
@@ -425,13 +441,17 @@
|
||||
)
|
||||
(princ (ssg-text "vfs-vf-eingang-gf1-skip"))
|
||||
)
|
||||
;; 2. Separator (am GF1-Ende / vor Umlenkstation)
|
||||
(princ (ssg-text "vfs-vf-eingang-separator"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
;; 2. Separator (am GF1-Ende / vor Umlenkstation) - entfaellt bei ohne-separator
|
||||
(if (not ohne-separator)
|
||||
(progn
|
||||
(princ (ssg-text "vfs-vf-eingang-separator"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
)
|
||||
)
|
||||
;; 3. Umlenkstation
|
||||
(princ (ssg-text "vfs-vf-eingang-umlenk"))
|
||||
(setq aktueller-punkt
|
||||
@@ -604,7 +624,7 @@
|
||||
(defun vfs-mitte-teil (aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq aktueller-punkt (vfs-vf-entry aktueller-punkt L_GF1 hz))
|
||||
(setq aktueller-punkt (vfs-vf-entry aktueller-punkt L_GF1 hz nil))
|
||||
(setq aktueller-punkt (vfs-vf-koerper aktueller-punkt richtung best-winkel L_VF hz))
|
||||
(setq aktueller-punkt (vfs-vf-exit aktueller-punkt L_GF2 hz t))
|
||||
aktueller-punkt
|
||||
|
||||
Reference in new issue
Block a user