feat: VF-Linienzug Modus 1 - steigende Gefaellestrecke (Sonderfall, bis 3 Grad) mit automatischen Uebergangsboegen
Neue dritte Option "Steigend" im Dialog "Wie soll die Laenge dieser Gefaellestrecke bestimmt werden?": erlaubt eine GF, die statt zu fallen bis zu 3 Grad steigt (Neigungswinkel 0..3 statt bisher nur 0..3 fallend). Neuer Helfer vfl-bogen-uebergang erkennt anhand der tatsaechlichen Frame-Neigung, ob 0/1/2 Uebergangsboegen (Vario_Bogen_auf_3/ab_3) noetig sind, und baut sie automatisch - fuer den Normalfall (fallend->fallend) bleibt das ein No-Op. Ausserdem in dieser Sitzung: - Modus 2: Separator VOR/NACH bei GF-Segmenten, Wahlfreiheit am Lauf-Anfang/-Ende (Umlenkstation/Motorstation optional), Stufe-1/2- Vereinheitlichung wie in Modus 1. - Stufe-1/Stufe-2-Entscheidungslogik (vfl-winkel-stufe-entscheidung): fehlenden Stufe-2-Fallback fuer "Auf" und "Ab, steiler als 3 Grad" ergaenzt; ungenauen "~3 Grad reine GF"-Kurzschluss in zwei Funktionen durch praezise Berechnung ersetzt (behebt reale Hoehenfehler). - Wizard-Dialoge: DCL-Text-Umbruch fuer lange Hinweise (vflw-umbruch-zeilen, 3 Groessenvarianten statt fester Zeilenzahl), Konsolen-Echo der Wizard-Antworten fuer Debug-Logs. - Neuer Regressionstest TEST_LINIENZUG_STUFE2 (linienzug_tests_stufe2.json) reproduziert den behobenen Stufe-2-Kettenende-Bug; bestehender LZ_Standard-Test an aktuelle Menue-Nummerierung angepasst (Kettenanfang- Menue ist inzwischen 6 statt 4 Optionen gross). - Neue Anleitung doc/vf_linienzug_modus1_anleitung.md: Modus 1 anhand des obigen Testfalls erklaert (Fragen-Bedeutung, Stufe-1/2-Logik, typische Stolperfallen: GF laengenhungrig bei 3 Grad, fester Motor+Separator+ES- Fussabdruck, 90-Grad-Element-Versatz). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+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