VF-Linienzug: baubare Hoehen-Vorschlaege (Ab/Auf) statt unveraenderter Ist-Hoehe, negative Restlaenge nach AS-Element abgefangen
- Hoehe-Prompt/Wizard-Dialog schlagen jetzt zwei tatsaechlich baubare Zielhoehen vor (Ab/Auf) statt der unveraenderten Kettenhoehe, die bei direkter Uebernahme immer als deltaH=0 abgelehnt wurde (Linie-GF, Linie-VF, automatische Linie, VF-Kette fortsetzen, Kettenende-Abschluss) - Nach dem AS-Element-Einfuegen kann die real gemessene Restlaenge negativ werden (Klickpunkt zu nah); Linie-GF und automatische Linie pruefen das jetzt und brechen sauber ab statt eine entartete GF-Strecke zu bauen - Debug-Log (Modus 1) protokolliert jetzt Erfolg/Misserfolg der Geometrieerzeugung inkl. der verwendeten Werte - Neue Lisp/vf_konstanten.lsp: zentrale, dokumentierte Sammlung aller Laengen-/Winkel-Magic-Numbers aus dem VarioFoerderer-Cluster als Nachschlagewerk (Module selbst noch unveraendert) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+582
-194
@@ -536,15 +536,34 @@
|
||||
;; Zahl (Default = aktuelle Kettenhoehe, wie im Original-Prompt). Nutzt
|
||||
;; bewusst den generischen Einzel-Dialog vflw_zahl (kein Punkt-Button, der
|
||||
;; faelschlich eine hier moegliche Punktwahl suggerieren wuerde).
|
||||
;; hoehe-default: aktuelle Kettenhoehe (Vorbelegung, wie im Original-Prompt).
|
||||
(defun vflw-gruppe-ziel-hoehe-impl (hoehe-default / dat dcl-pfad ergebnis dlg-wert)
|
||||
;; hoehe-default: entweder eine Zahl (aktuelle Kettenhoehe, alte Vorbelegung -
|
||||
;; die bei direkter Uebernahme immer als deltaH=0 abgelehnt wird), ODER eine
|
||||
;; Liste (hoehe-ab hoehe-auf) mit zwei baubaren Vorschlaegen (siehe
|
||||
;; vfl-vf-hoehe-vorschlaege/vfl-segment-hoehe-vorschlaege) - dann zeigt der
|
||||
;; Kopftext beide Richtungen, vorbelegt wird die Ab-Variante (haeufigerer
|
||||
;; Fall, siehe vfl-segment-entscheidung). Ist hoehe-ab nil (kein baubarer
|
||||
;; Wert in der sondierten Zone gefunden), faellt die Vorbelegung auf die
|
||||
;; unveraenderte Kettenhoehe zurueck (altes Verhalten) plus Warnhinweis.
|
||||
(defun vflw-gruppe-ziel-hoehe-impl (hoehe-default / dat dcl-pfad ergebnis dlg-wert
|
||||
zwei-werte hoehe-ab hoehe-auf hoehe-kette vorbelegt)
|
||||
(setq zwei-werte (listp hoehe-default))
|
||||
(if zwei-werte
|
||||
(progn
|
||||
(setq hoehe-ab (nth 0 hoehe-default) hoehe-auf (nth 1 hoehe-default))
|
||||
(setq hoehe-kette (nth 2 hoehe-default))
|
||||
(setq vorbelegt (if hoehe-ab hoehe-ab hoehe-kette)))
|
||||
(setq vorbelegt hoehe-default))
|
||||
(setq dat (load_dialog (vflw-dcl-pfad)))
|
||||
(if (not (new_dialog "vflw_zahl" dat))
|
||||
(if (and dat (>= dat 0)) (unload_dialog dat))
|
||||
(progn
|
||||
(set_tile "kopf" (vflw-clean (ssg-textf "vfl-prompt-hoehe-endpunkt"
|
||||
(list (rtos hoehe-default 2 1)))))
|
||||
(set_tile "wert" (rtos hoehe-default 2 1))
|
||||
(set_tile "kopf"
|
||||
(vflw-clean
|
||||
(if (and zwei-werte hoehe-ab hoehe-auf)
|
||||
(ssg-textf "vfl-prompt-hoehe-endpunkt-2"
|
||||
(list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1)))
|
||||
(ssg-textf "vfl-prompt-hoehe-endpunkt" (list (rtos vorbelegt 2 1))))))
|
||||
(set_tile "wert" (rtos vorbelegt 2 1))
|
||||
(action_tile "accept" "(setq dlg-wert (get_tile \"wert\")) (done_dialog 1)")
|
||||
(action_tile "cancel" "(done_dialog 0)")
|
||||
(setq ergebnis (start_dialog))
|
||||
@@ -1020,6 +1039,223 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; Stumme Variante von berechne-alle-winkel: NUR die Machbarkeits-Pruefung
|
||||
;; (mind. ein Winkel mit L_GF>=0 und L_VF>=0), OHNE die Diagnosetabelle auf
|
||||
;; die Kommandozeile zu schreiben. Rechenweg 1:1 aus berechne-alle-winkel
|
||||
;; (vf_standard.lsp) uebernommen - bei Aenderungen dort auch hier nachziehen.
|
||||
;; Gebraucht von vfl-vf-machbar-p fuer die Sondierung in vfl-vf-min-deltah,
|
||||
;; die viele Testwerte durchprobiert (dort wuerde die Tabellenausgabe von
|
||||
;; berechne-alle-winkel die Konsole zuspammen).
|
||||
(defun vfl-winkel-machbar-p (deltaL deltaH richtung feste-hz /
|
||||
winkel-list cos3 sin3 mass1 mass2 rad5 rad7
|
||||
bogen-x1 bogen-z1 bogen-x2 bogen-z2 cosa sina
|
||||
A B winkel-eff cosEff sinEff L_GF L_VF
|
||||
abs-dz-AUS abs-dz-EIN gefunden)
|
||||
(if (null feste-hz) (setq feste-hz FESTE_HORIZONTAL))
|
||||
(setq abs-dz-AUS (abs aus-dz) abs-dz-EIN (abs ein-dz))
|
||||
(setq winkel-list (ssg-cfg-or "vario" "bogen_winkel"
|
||||
'(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||||
(setq cos3 (cos (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0)))
|
||||
sin3 (sin (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0))))
|
||||
(setq gefunden nil)
|
||||
(foreach winkel winkel-list
|
||||
(if (not gefunden)
|
||||
(progn
|
||||
(if (= richtung "Auf")
|
||||
(setq mass1 (get-bogen-mass bogen-auf winkel)
|
||||
mass2 (get-bogen-mass bogen-ab winkel))
|
||||
(setq mass1 (get-bogen-mass bogen-ab winkel)
|
||||
mass2 (get-bogen-mass bogen-auf winkel)))
|
||||
(if (and mass1 mass2)
|
||||
(progn
|
||||
(setq rad5 (* 3.0 (/ pi 180.0)))
|
||||
(setq rad7 (* (float (if (= richtung "Auf") (- 3 winkel) (+ winkel 3)))
|
||||
(/ pi 180.0)))
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad5)) (* (caddr mass1) (sin rad5))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad5)) (* (caddr mass1) (cos rad5))))
|
||||
(setq bogen-x2 (+ (* (car mass2) (cos rad7)) (* (caddr mass2) (sin rad7))))
|
||||
(setq bogen-z2 (+ (* (- (car mass2)) (sin rad7)) (* (caddr mass2) (cos rad7))))
|
||||
(setq cosa (cos (* winkel (/ pi 180.0)))
|
||||
sina (sin (* winkel (/ pi 180.0))))
|
||||
(setq A (- deltaL aus-dx ein-dx bogen-x1 bogen-x2 (* feste-hz cos3)))
|
||||
(setq winkel-eff (if (= richtung "Auf") (- winkel 3) (+ winkel 3)))
|
||||
(setq cosEff (cos (* winkel-eff (/ pi 180.0)))
|
||||
sinEff (sin (* winkel-eff (/ pi 180.0))))
|
||||
(if (= richtung "Auf")
|
||||
(setq B (+ deltaH abs-dz-AUS abs-dz-EIN (- bogen-z1) (- bogen-z2)
|
||||
(* feste-hz sin3)))
|
||||
(setq B (+ (- deltaH abs-dz-AUS abs-dz-EIN (* feste-hz sin3))
|
||||
bogen-z1 bogen-z2)))
|
||||
(if (> (abs sina) 0.0001)
|
||||
(progn
|
||||
(setq L_GF (/ (- (* A sinEff) (* B cosEff)) sina))
|
||||
(if (= richtung "Auf")
|
||||
(setq L_VF (/ (+ (* A sin3) (* B cos3)) sina))
|
||||
(setq L_VF (/ (- (* B cos3) (* A sin3)) sina)))
|
||||
(if (and (numberp L_GF) (numberp L_VF) (>= L_GF 0) (>= L_VF 0))
|
||||
(setq gefunden t))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
gefunden
|
||||
)
|
||||
|
||||
;; Nur-Machbarkeits-Check (kein interaktives Waehlen wie vfl-waehle-winkel):
|
||||
;; T, wenn fuer deltaL/deltaH/richtung MINDESTENS ein gueltiger Winkel bzw.
|
||||
;; die horizontale Mitte existiert - sonst nil. Nutzt dieselbe Fallunter-
|
||||
;; scheidung wie vfl-vf-entscheidung, aber ohne Nutzer-Interaktion (fuer die
|
||||
;; Sondierung in vfl-vf-min-deltah). aus-dx/aus-dz werden wie in vfl-vf-winkel
|
||||
;; temporaer genullt (AS-Footprint an dieser Stelle bereits verbraucht) -
|
||||
;; sonst wuerde die Sondierung ein zu kleines Budget sehen und einen
|
||||
;; eigentlich baubaren Wert faelschlich als "nicht baubar" verwerfen.
|
||||
(defun vfl-vf-machbar-p (deltaL deltaH richtung / horizontal-info save-ausdx save-ausdz ergebnis)
|
||||
(if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek))
|
||||
(cond
|
||||
((< deltaL 1000.0) nil)
|
||||
((< deltaH 1.0) nil)
|
||||
((= richtung "Auf")
|
||||
(setq save-ausdx aus-dx save-ausdz aus-dz)
|
||||
(setq aus-dx 0.0 aus-dz 0.0)
|
||||
(setq ergebnis (vfl-winkel-machbar-p deltaL deltaH "Auf" *vfl-feste-horizontal*))
|
||||
(setq aus-dx save-ausdx aus-dz save-ausdz)
|
||||
ergebnis)
|
||||
(t
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(if (and horizontal-info (caddr horizontal-info))
|
||||
t
|
||||
(progn
|
||||
(setq save-ausdx aus-dx save-ausdz aus-dz)
|
||||
(setq aus-dx 0.0 aus-dz 0.0)
|
||||
(setq ergebnis (vfl-winkel-machbar-p deltaL deltaH "Ab" *vfl-feste-horizontal*))
|
||||
(setq aus-dx save-ausdx aus-dz save-ausdz)
|
||||
ergebnis)))
|
||||
)
|
||||
)
|
||||
|
||||
;; Kleinste baubare Hoehendifferenz (mm, > 0) fuer deltaL/richtung sondieren -
|
||||
;; linearer Anstieg in 10-mm-Schritten (grob genug fuer einen Vorschlagswert,
|
||||
;; fein genug um keine schmale gueltige Zone zu ueberspringen) bis 1/3 von
|
||||
;; deltaL (grosszuegige Obergrenze; steilere Faelle braucht kein Vorschlag).
|
||||
;; Rueckgabe: deltaH (mm) oder nil, wenn in diesem Bereich nichts baubar ist.
|
||||
(defun vfl-vf-min-deltah (deltaL richtung / schritt grenze h gefunden)
|
||||
(setq schritt 10.0)
|
||||
(setq grenze (/ deltaL 3.0))
|
||||
(setq h schritt gefunden nil)
|
||||
(while (and (not gefunden) (<= h grenze))
|
||||
(if (vfl-vf-machbar-p deltaL h richtung)
|
||||
(setq gefunden h)
|
||||
(setq h (+ h schritt)))
|
||||
)
|
||||
gefunden
|
||||
)
|
||||
|
||||
;; Liefert zwei baubare Ziel-Hoehen-Vorschlaege (Ab zuerst, Auf danach) fuer
|
||||
;; die aktuelle Kettenhoehe p-aktuell-z bei gegebenem deltaL - Ersatz fuer den
|
||||
;; blossen "unveraenderte Ist-Hoehe"-Default, der bei direkter Uebernahme
|
||||
;; immer als deltaH=0 ("kein sinnvolles VF") abgelehnt wird (siehe
|
||||
;; vfl-vf-entscheidung). NUR-VF-Variante: fuer den expliziten "Linie-VF"-
|
||||
;; Menuepunkt, wo GF keine Option ist (der Nutzer hat VF bereits gewaehlt).
|
||||
;; Rueckgabe: (hoehe-ab hoehe-auf) - je nil, wenn in der sondierten Zone kein
|
||||
;; baubarer Wert existiert.
|
||||
(defun vfl-vf-hoehe-vorschlaege (p-aktuell-z deltaL / min-ab min-auf)
|
||||
(setq min-ab (vfl-vf-min-deltah deltaL "Ab"))
|
||||
(setq min-auf (vfl-vf-min-deltah deltaL "Auf"))
|
||||
(list
|
||||
(if min-ab (- p-aktuell-z min-ab) nil)
|
||||
(if min-auf (+ p-aktuell-z min-auf) nil))
|
||||
)
|
||||
|
||||
;; Wie vfl-vf-hoehe-vorschlaege, aber fuer den automatischen "Linie"-Menue-
|
||||
;; punkt (vfl-segment-entscheidung: GF ODER VF). Der Ab-Vorschlag nutzt dort
|
||||
;; NICHT die VF-Sondierung, sondern direkt die feste 3-Grad-GF-Neigung
|
||||
;; (deltaH = deltaL*tan(3 Grad), wie im bestehenden Kurzsegment-Zweig,
|
||||
;; vfl-baue-mehrsegment-linie oben) - bei exakt 3 Grad natuerlichem Winkel
|
||||
;; greift IMMER der GF-Zweig von vfl-segment-entscheidung (Toleranzband um
|
||||
;; 3 Grad), eine reine Gefaellestrecke hat keine deltaL-Mindestlaenge und ist
|
||||
;; damit garantiert baubar, ohne die (teurere) VF-Sondierung zu brauchen. Der
|
||||
;; Auf-Vorschlag bleibt VF-only (GF kann nicht steigen).
|
||||
(defun vfl-segment-hoehe-vorschlaege (p-aktuell-z deltaL / min-ab min-auf rad3)
|
||||
(setq rad3 (* (float (ssg-cfg-or "vario" "gefaelle_winkel" 3)) (/ pi 180.0)))
|
||||
(setq min-ab (* deltaL (/ (sin rad3) (cos rad3))))
|
||||
(setq min-auf (vfl-vf-min-deltah deltaL "Auf"))
|
||||
(list
|
||||
(- p-aktuell-z min-ab)
|
||||
(if min-auf (+ p-aktuell-z min-auf) nil))
|
||||
)
|
||||
|
||||
;; Hinweis auf die Konsole, wenn NUR EINE der beiden Richtungen einen
|
||||
;; baubaren Vorschlag hat (die andere Richtung ist bei dieser Segmentlaenge
|
||||
;; also aussichtslos) - macht sichtbar, warum der Dialog/Prompt dann nur
|
||||
;; einen Wert zeigt, statt es wie einen Fehler wirken zu lassen.
|
||||
(defun vfl-hoehe-hinweis-falls-noetig (hoehe-ab hoehe-auf)
|
||||
(if (or (and hoehe-ab (not hoehe-auf)) (and hoehe-auf (not hoehe-ab)))
|
||||
(princ (ssg-text "vfl-hinweis-hoehe-vorschlag-fehlt")))
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; Wie vfl-vf-machbar-p, aber fuer das Budget von vfl-body-zerlegung
|
||||
;; (Kettenende-Modus, "Ja - Motorstation setzen, Kettenende festlegen"):
|
||||
;; feste-hz=800 (nur Motor+Separator, KEIN Umlenk-/AS-Anteil) statt
|
||||
;; *vfl-feste-horizontal*, Mindestlaenge 800mm statt 1000mm, und bei
|
||||
;; praktisch flachem Rest (deltaH<1) NUR die horizontale Mitte (kein
|
||||
;; direkter GF-Fallback wie bei vfl-vf-machbar-p - vfl-body-zerlegung prueft
|
||||
;; GF nur beim natuerlichen ~3-Grad-Fall weiter unten). aus-dx/aus-dz werden
|
||||
;; wie im Original immer genullt (nicht nur bedingt wie bei vfl-vf-machbar-p),
|
||||
;; da der Abschluss-Koerper nie einen AS-Fussabdruck traegt.
|
||||
(defun vfl-body-machbar-p (deltaL deltaH richtung / horizontal-info save-ausdx save-ausdz ergebnis)
|
||||
(if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek))
|
||||
(setq save-ausdx aus-dx save-ausdz aus-dz)
|
||||
(setq aus-dx 0.0 aus-dz 0.0)
|
||||
(setq ergebnis
|
||||
(cond
|
||||
((< deltaL 800.0) nil)
|
||||
((< deltaH 1.0)
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(and horizontal-info (caddr horizontal-info) t))
|
||||
((= richtung "Auf")
|
||||
(vfl-winkel-machbar-p deltaL deltaH "Auf" 800.0))
|
||||
(t
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(if (and horizontal-info (caddr horizontal-info))
|
||||
t
|
||||
(vfl-winkel-machbar-p deltaL deltaH "Ab" 800.0)))
|
||||
)
|
||||
)
|
||||
(setq aus-dx save-ausdx aus-dz save-ausdz)
|
||||
ergebnis
|
||||
)
|
||||
|
||||
;; Wie vfl-vf-min-deltah, aber mit vfl-body-machbar-p (Budget von
|
||||
;; vfl-body-zerlegung statt vfl-vf-entscheidung).
|
||||
(defun vfl-body-min-deltah (deltaL richtung / schritt grenze h gefunden)
|
||||
(setq schritt 10.0)
|
||||
(setq grenze (/ deltaL 3.0))
|
||||
(setq h schritt gefunden nil)
|
||||
(while (and (not gefunden) (<= h grenze))
|
||||
(if (vfl-body-machbar-p deltaL h richtung)
|
||||
(setq gefunden h)
|
||||
(setq h (+ h schritt)))
|
||||
)
|
||||
gefunden
|
||||
)
|
||||
|
||||
;; Wie vfl-vf-hoehe-vorschlaege, aber fuer vfl-body-abschluss (Kettenende-
|
||||
;; Modus): nutzt vfl-body-min-deltah (800mm-Budget) statt vfl-vf-min-deltah
|
||||
;; (1300mm-Budget) - sonst wuerde ein Vorschlag als baubar erscheinen, der es
|
||||
;; am Kettenende (kleineres Budget: nur Motor+Separator, kein Umlenk-Anteil)
|
||||
;; tatsaechlich nicht ist.
|
||||
(defun vfl-body-hoehe-vorschlaege (p-aktuell-z deltaL / min-ab min-auf)
|
||||
(setq min-ab (vfl-body-min-deltah deltaL "Ab"))
|
||||
(setq min-auf (vfl-body-min-deltah deltaL "Auf"))
|
||||
(list
|
||||
(if min-ab (- p-aktuell-z min-ab) nil)
|
||||
(if min-auf (+ p-aktuell-z min-auf) nil))
|
||||
)
|
||||
|
||||
;; Rueckgabe: (typ winkel L_GF L_VF)
|
||||
;; typ="GF": winkel = kontinuierlicher Neigungswinkel, L_GF/L_VF ungenutzt (nil)
|
||||
;; typ="VF": winkel = best-winkel (0 = Horizontale Mitte), L_GF/L_VF wie
|
||||
@@ -1405,7 +1641,8 @@
|
||||
;; Rueckgabe: (frame anzahl-koerper letzt-hz gf2-laenge) oder nil.
|
||||
(defun vfl-body-abschluss (frame letzt-hz p-umlenk /
|
||||
linie-mess dL hzn hn dH richtn rad3 dec typ w lgf lvf
|
||||
gf2 cnt p0 tx ty)
|
||||
gf2 cnt p0 tx ty
|
||||
hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback)
|
||||
;; Der Abschluss-Koerper (vfs-vf-koerper) und der Motor gehen von 3-Grad-Basis
|
||||
;; aus - eine gerade laufende flache Zone hier mit ab_3 abschliessen.
|
||||
(setq frame (vfl-nach-3grad frame))
|
||||
@@ -1414,11 +1651,24 @@
|
||||
(progn (princ (ssg-text "vfl-abgebrochen-kein-ziel")) nil)
|
||||
(progn
|
||||
(setq dL (car linie-mess) hzn (cadr linie-mess))
|
||||
;; Baubare Vorschlaege (Ab/Auf) statt der unveraenderten Kettenhoehe als
|
||||
;; Default - sonst waere dH=0 ("Auf", da (>= 0.0 0.0)) und der Rest wird
|
||||
;; von vfl-body-zerlegung sofort als "nicht baubar" abgelehnt (kleineres
|
||||
;; Budget als vfl-vf-entscheidung: nur Motor+Separator, 800mm statt
|
||||
;; 1300mm) - siehe vfl-body-hoehe-vorschlaege/vfl-body-machbar-p.
|
||||
(setq hoehe-vorschlaege (vfl-body-hoehe-vorschlaege (caddr (car frame)) dL))
|
||||
(setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege))
|
||||
(setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr (car frame))))
|
||||
(vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr (car frame)))))
|
||||
(setq hn (vfl-in-real (ssg-textf "vfl-prompt-hoehe-kettenende"
|
||||
(list (rtos (caddr (car frame)) 2 1)))))
|
||||
(if (null hn) (setq hn (caddr (car frame))))
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl
|
||||
(list (list hoehe-ab hoehe-auf (caddr (car frame))))))
|
||||
(setq hn (vfl-in-real
|
||||
(if (and hoehe-ab hoehe-auf)
|
||||
(ssg-textf "vfl-prompt-hoehe-kettenende-2"
|
||||
(list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1)))
|
||||
(ssg-textf "vfl-prompt-hoehe-kettenende" (list (rtos hoehe-fallback 2 1))))))
|
||||
(if (null hn) (setq hn hoehe-fallback))
|
||||
(setq dH (- hn (caddr (car frame))))
|
||||
(setq richtn (if (>= dH 0.0) "Auf" "Ab"))
|
||||
(setq dH (abs dH))
|
||||
@@ -1430,8 +1680,15 @@
|
||||
(if (null typ)
|
||||
(progn
|
||||
(princ (ssg-text "vfl-fehler-rest-nicht-baubar"))
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Kettenende-Abschluss nicht baubar (dL="
|
||||
(rtos dL 2 0) " dH=" (rtos dH 2 0) " richtung=" richtn ")"))
|
||||
nil)
|
||||
(progn
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-body-zerlegung ERFOLG (dL=" (rtos dL 2 0)
|
||||
" dH=" (rtos dH 2 0) " richtung=" richtn
|
||||
" typ=" typ " winkel=" (rtos (float w) 2 1)
|
||||
" L_GF=" (if lgf (rtos lgf 2 0) "nil")
|
||||
" L_VF=" (if lvf (rtos lvf 2 0) "nil") ")"))
|
||||
;; Soll-ES-Punkt fuer den Ist-Ziel-Report merken (Startpunkt +
|
||||
;; projizierter Laenge entlang der Fahrtrichtung).
|
||||
(setq p0 (car frame))
|
||||
@@ -1460,6 +1717,8 @@
|
||||
(princ (ssg-textf "vfl-hinweis-gf2-minimum"
|
||||
(list (rtos gf2 2 0) (rtos *vfl-gf-min-laenge* 2 0))))
|
||||
(setq gf2 *vfl-gf-min-laenge*)))
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: Kettenende-Abschluss gebaut (cnt=" (itoa cnt)
|
||||
" gf2=" (rtos gf2 2 0) "), neue Position=" (dbg-tostring (car frame))))
|
||||
(list frame cnt hzn gf2)
|
||||
)
|
||||
)
|
||||
@@ -1472,7 +1731,8 @@
|
||||
p-umlenk vf-count antwort L_GF-eff L_GF1-bau L_GF2-bau
|
||||
linie-mess dL dH hn hzn richtn ent typ w lgf lvf
|
||||
letzt-hz fertig ziel-ende ziel-gf2 res3 gf2-eff entry-start
|
||||
res-h vor-antwort es-gewuenscht es-antwort save-eindx save-eindz)
|
||||
res-h vor-antwort es-gewuenscht es-antwort save-eindx save-eindz
|
||||
hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback)
|
||||
;; Vorbelegung: ES gewuenscht (Default) - nur bei "3 - Kettenende definieren"
|
||||
;; wird explizit gefragt und ggf. auf nil gesetzt (siehe dort).
|
||||
(setq es-gewuenscht t)
|
||||
@@ -1620,11 +1880,25 @@
|
||||
(setq dL (car linie-mess) hzn (cadr linie-mess))
|
||||
(if (> dL 1.0)
|
||||
(progn
|
||||
;; NUR-VF-Vorschlaege (nicht vfl-segment-hoehe-vorschlaege):
|
||||
;; dieser Zweig setzt eine bestehende VF-Kette fort und lehnt
|
||||
;; ein hier zurueckkommendes typ="GF" explizit ab (siehe
|
||||
;; "vfl-segment-gf-nicht-erlaubt" unten) - der GF-Vorschlag
|
||||
;; (3-Grad-Formel) waere hier also gerade NICHT baubar.
|
||||
(setq hoehe-vorschlaege (vfl-vf-hoehe-vorschlaege (caddr (car frame)) dL))
|
||||
(setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege))
|
||||
(setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr (car frame))))
|
||||
(vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr (car frame)))))
|
||||
(setq hn (vfl-in-real (ssg-textf "vfl-prompt-hoehe-endpunkt"
|
||||
(list (rtos (caddr (car frame)) 2 1)))))
|
||||
(if (null hn) (setq hn (caddr (car frame))))
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl
|
||||
(list (list hoehe-ab hoehe-auf (caddr (car frame))))))
|
||||
(setq hn (vfl-in-real
|
||||
(if (and hoehe-ab hoehe-auf)
|
||||
(ssg-textf "vfl-prompt-hoehe-endpunkt-2"
|
||||
(list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1)))
|
||||
(ssg-textf "vfl-prompt-hoehe-endpunkt"
|
||||
(list (rtos hoehe-fallback 2 1))))))
|
||||
(if (null hn) (setq hn hoehe-fallback))
|
||||
(setq dH (- hn (caddr (car frame))))
|
||||
(setq richtn (if (>= dH 0.0) "Auf" "Ab"))
|
||||
(setq dH (abs dH))
|
||||
@@ -1714,17 +1988,26 @@
|
||||
(defun vfl-insert-gf-bogen-block (frame bwinkel bseite / blockname neuer-frame hz-gemessen hz-gesnappt)
|
||||
(setq blockname (gf-bogen-blockname bwinkel bseite))
|
||||
(princ (ssg-textf "vfl-fuege-block-ein" (list blockname)))
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-insert-gf-bogen-block (block=" blockname
|
||||
" bwinkel=" (itoa bwinkel) " bseite=" bseite ")"))
|
||||
;; GF-Bogen zaehlen (Seite L/R + Winkel) -> Attribut GF_Bogen_L/R_xx
|
||||
(setq *vfl-acc-gfbogen*
|
||||
(vfl-inc-count *vfl-acc-gfbogen*
|
||||
(strcat (if (= bseite "rechts") "R" "L") "_" (itoa bwinkel))))
|
||||
(setq neuer-frame (insert-block-ks-to-ks blockname frame))
|
||||
(setq hz-gemessen (car (frame->hz-winkel neuer-frame)))
|
||||
(setq hz-gesnappt (vfl-hz-snappen-absolut hz-gemessen))
|
||||
;; Reine Z-Drehung statt make-frame-from-dir-Neuaufbau: erhaelt die aus dem
|
||||
;; Block gemessene Rollung (yu/zu) - siehe Kommentar bei vfl-frame-um-z-drehen.
|
||||
(if (> (abs (- hz-gemessen hz-gesnappt)) 0.0001)
|
||||
(setq neuer-frame (vfl-frame-um-z-drehen neuer-frame (- hz-gesnappt hz-gemessen))))
|
||||
(if (null neuer-frame)
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Block " blockname " nicht eingefuegt"))
|
||||
(progn
|
||||
(setq hz-gemessen (car (frame->hz-winkel neuer-frame)))
|
||||
(setq hz-gesnappt (vfl-hz-snappen-absolut hz-gemessen))
|
||||
;; Reine Z-Drehung statt make-frame-from-dir-Neuaufbau: erhaelt die aus dem
|
||||
;; Block gemessene Rollung (yu/zu) - siehe Kommentar bei vfl-frame-um-z-drehen.
|
||||
(if (> (abs (- hz-gemessen hz-gesnappt)) 0.0001)
|
||||
(setq neuer-frame (vfl-frame-um-z-drehen neuer-frame (- hz-gesnappt hz-gemessen))))
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: GF-Bogen gebaut, neue Position="
|
||||
(dbg-tostring (car neuer-frame))))
|
||||
)
|
||||
)
|
||||
neuer-frame
|
||||
)
|
||||
|
||||
@@ -2126,7 +2409,8 @@
|
||||
frame letzter-typ fertig linie-ende-modus rad3
|
||||
anzahl-gf anzahl-vf vfl-nummer lastEnt
|
||||
gf-max-winkel gf-ok kettenanfang pick-punkt
|
||||
as-vorhanden erg old-error vfl-ins dbg-an)
|
||||
as-vorhanden erg old-error vfl-ins dbg-an
|
||||
hoehe-vorschlaege hoehe-ab hoehe-auf hoehe-fallback)
|
||||
(princ "\n\n=========================================")
|
||||
(princ (ssg-text "vfl-modus1-header"))
|
||||
(princ "\n=========================================")
|
||||
@@ -2327,10 +2611,17 @@
|
||||
)
|
||||
)
|
||||
(if (< deltaL 1000.0)
|
||||
(princ (ssg-text "vfl-fehler-horizontal-vf-kurz"))
|
||||
(progn
|
||||
(princ (ssg-text "vfl-fehler-horizontal-vf-kurz"))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Horizontal-VF zu kurz (deltaL="
|
||||
(rtos deltaL 2 0) ")"))))
|
||||
(progn
|
||||
;; VF-Einheit mit horizontalem ersten Koerper (winkel=0, L_VF=deltaL,
|
||||
;; L_GF = Mindestlaenge fuer den Einlauf-Anschluss).
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-vf-einheit-abschluss horizontal (deltaL=" (rtos deltaL 2 0)
|
||||
" L_GF=" (rtos *vfl-gf-min-laenge* 2 0) " L_VF=" (rtos deltaL 2 0) ")")))
|
||||
(setq vf-einheit-res
|
||||
(vfl-vf-einheit-abschluss frame hz-neu "Ab" 0 *vfl-gf-min-laenge* deltaL nil))
|
||||
(setq frame (nth 0 vf-einheit-res))
|
||||
@@ -2339,6 +2630,9 @@
|
||||
(if (nth 3 vf-einheit-res) (setq es-seite (nth 3 vf-einheit-res)))
|
||||
(setq letzter-typ "VF")
|
||||
(setq p-aktuell (car frame))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: Horizontal-VF-Einheit gebaut, neue Position="
|
||||
(dbg-tostring p-aktuell))))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -2371,89 +2665,119 @@
|
||||
(setq frame (nth 0 erg) deltaL (nth 1 erg) p-aktuell (car frame))
|
||||
)
|
||||
)
|
||||
(setq gf-ok t)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-gefaelle-impl
|
||||
(list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)))))
|
||||
(princ (ssg-text "vfl-gefaelle-festlegen-header"))
|
||||
(princ (ssg-text "vfl-gefaelle-opt-hoehe"))
|
||||
(princ (ssg-text "vfl-gefaelle-opt-winkel"))
|
||||
(setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2")
|
||||
(list (ssg-text "vfl-gefaelle-opt-hoehe")
|
||||
(ssg-text "vfl-gefaelle-opt-winkel")) 1
|
||||
"vfl-gefaelle-festlegen-header"))
|
||||
(if (= antwort "2")
|
||||
;; Nach dem AS-Einfuegen kann die reale Restlaenge (aus dem
|
||||
;; tatsaechlichen KS_AUS neu gemessen) kleiner als der urspruenglich
|
||||
;; gepickte Rohwert sein - bei einem knapp gepickten Punkt sogar
|
||||
;; NEGATIV (das AS-Element allein braucht bereits mehr Platz als bis
|
||||
;; zum Klickpunkt vorhanden war). Ohne diese zweite Pruefung wuerde
|
||||
;; vfl-insert-gf-segment mit negativem deltaL "erfolgreich" eine
|
||||
;; entartete/unsichtbare GF-Strecke bauen (leerer Sprung zwischen AS
|
||||
;; und dem naechsten Element) statt den Nutzer erneut picken zu
|
||||
;; lassen - siehe vfl-fehler-linie-zu-kurz oben (dieselbe Meldung).
|
||||
;; Sofortiger Abbruch DIESES Zweigs (kein Weiterfragen nach Winkel/
|
||||
;; Hoehe fuer ein Segment, das ohnehin nicht gebaut werden kann) -
|
||||
;; gf-ok wird unten sonst mehrfach ueberschrieben.
|
||||
(if (< deltaL 1.0)
|
||||
(princ (ssg-text "vfl-fehler-linie-zu-kurz"))
|
||||
(progn
|
||||
;; Winkel direkt vorgeben - deltaH ergibt sich aus deltaL*tan(winkel).
|
||||
(setq winkel
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-neigungswinkel" (list (rtos gf-max-winkel 2 1)))))
|
||||
(if (null winkel) (setq winkel gf-max-winkel))
|
||||
(if (or (<= winkel 0.0) (> winkel gf-max-winkel))
|
||||
(setq gf-ok t)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-gefaelle-impl
|
||||
(list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)))))
|
||||
(princ (ssg-text "vfl-gefaelle-festlegen-header"))
|
||||
(princ (ssg-text "vfl-gefaelle-opt-hoehe"))
|
||||
(princ (ssg-text "vfl-gefaelle-opt-winkel"))
|
||||
(setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2")
|
||||
(list (ssg-text "vfl-gefaelle-opt-hoehe")
|
||||
(ssg-text "vfl-gefaelle-opt-winkel")) 1
|
||||
"vfl-gefaelle-festlegen-header"))
|
||||
(if (= antwort "2")
|
||||
(progn
|
||||
(alert (ssg-textf "vfl-alert-winkel-ungueltig"
|
||||
(list (rtos winkel 2 1) (rtos gf-max-winkel 2 1))))
|
||||
(setq gf-ok nil))
|
||||
(progn
|
||||
(setq richtung "Ab")
|
||||
(setq deltaH (* deltaL (/ (sin (* winkel (/ pi 180.0)))
|
||||
(cos (* winkel (/ pi 180.0))))))
|
||||
;; Winkel direkt vorgeben - deltaH ergibt sich aus deltaL*tan(winkel).
|
||||
(setq winkel
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-neigungswinkel" (list (rtos gf-max-winkel 2 1)))))
|
||||
(if (null winkel) (setq winkel gf-max-winkel))
|
||||
(if (or (<= winkel 0.0) (> winkel gf-max-winkel))
|
||||
(progn
|
||||
(alert (ssg-textf "vfl-alert-winkel-ungueltig"
|
||||
(list (rtos winkel 2 1) (rtos gf-max-winkel 2 1))))
|
||||
(setq gf-ok nil))
|
||||
(progn
|
||||
(setq richtung "Ab")
|
||||
(setq deltaH (* deltaL (/ (sin (* winkel (/ pi 180.0)))
|
||||
(cos (* winkel (/ pi 180.0))))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
;; Gegebene Hoehe - wie bisher, aber Winkel wird daraus abgeleitet
|
||||
;; und gegen den GF-Maximalwinkel geprueft (GF kann nicht steigen).
|
||||
;; p-aktuell ist ab hier immer der reale Referenzpunkt (bei
|
||||
;; Kettenanfang das echte KS_AUS des AS-Elements). Vorschlag/
|
||||
;; Enter-Default = vfl-gf-hoehe-vorschlag (siehe dort), NICHT
|
||||
;; die unveraenderte Ist-Hoehe - sonst waere deltaH=0 und die
|
||||
;; GF-Pruefung wiese den Wert als "kann nicht steigen" ab.
|
||||
(setq hoehe-neu
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt"
|
||||
(list (rtos (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) 2 1)))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu (vfl-gf-hoehe-vorschlag (caddr p-aktuell))))
|
||||
(setq deltaH (- hoehe-neu (caddr p-aktuell)))
|
||||
(setq richtung (if (>= deltaH 0.0) "Auf" "Ab"))
|
||||
(setq deltaH (abs deltaH))
|
||||
(cond
|
||||
((= richtung "Auf")
|
||||
(alert (ssg-text "vfl-alert-gf-kann-nicht-steigen"))
|
||||
(setq gf-ok nil))
|
||||
(t
|
||||
(setq winkel (* (atan (/ deltaH deltaL)) (/ 180.0 pi)))
|
||||
(if (> winkel gf-max-winkel)
|
||||
(progn
|
||||
(alert (ssg-textf "vfl-alert-gefaelle-zu-steil"
|
||||
(list (rtos winkel 2 1) (rtos gf-max-winkel 2 1))))
|
||||
(progn
|
||||
;; Gegebene Hoehe - wie bisher, aber Winkel wird daraus abgeleitet
|
||||
;; und gegen den GF-Maximalwinkel geprueft (GF kann nicht steigen).
|
||||
;; p-aktuell ist ab hier immer der reale Referenzpunkt (bei
|
||||
;; Kettenanfang das echte KS_AUS des AS-Elements). Vorschlag/
|
||||
;; Enter-Default = vfl-gf-hoehe-vorschlag (siehe dort), NICHT
|
||||
;; die unveraenderte Ist-Hoehe - sonst waere deltaH=0 und die
|
||||
;; GF-Pruefung wiese den Wert als "kann nicht steigen" ab.
|
||||
(setq hoehe-neu
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt"
|
||||
(list (rtos (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) 2 1)))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu (vfl-gf-hoehe-vorschlag (caddr p-aktuell))))
|
||||
(setq deltaH (- hoehe-neu (caddr p-aktuell)))
|
||||
(setq richtung (if (>= deltaH 0.0) "Auf" "Ab"))
|
||||
(setq deltaH (abs deltaH))
|
||||
(cond
|
||||
((= richtung "Auf")
|
||||
(alert (ssg-text "vfl-alert-gf-kann-nicht-steigen"))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie-GF kann nicht steigen"
|
||||
" (deltaL=" (rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0) ")")))
|
||||
(setq gf-ok nil))
|
||||
)
|
||||
(t
|
||||
(setq winkel (* (atan (/ deltaH deltaL)) (/ 180.0 pi)))
|
||||
(if (> winkel gf-max-winkel)
|
||||
(progn
|
||||
(alert (ssg-textf "vfl-alert-gefaelle-zu-steil"
|
||||
(list (rtos winkel 2 1) (rtos gf-max-winkel 2 1))))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie-GF zu steil (deltaL="
|
||||
(rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0)
|
||||
" winkel=" (rtos winkel 2 1) " max=" (rtos gf-max-winkel 2 1) ")")))
|
||||
(setq gf-ok nil))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(if gf-ok
|
||||
(progn
|
||||
(setq frame (vfl-insert-gf-segment (car frame) hz-neu deltaL winkel))
|
||||
(setq anzahl-gf (1+ anzahl-gf))
|
||||
(vfl-acc-gf-seg (/ deltaL (cos (* (float winkel) (/ pi 180.0)))) winkel)
|
||||
(setq letzter-typ "GF")
|
||||
(setq p-aktuell (car frame))
|
||||
(princ (ssg-text "vfl-ist-kettenende-header"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-ohne-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-nein"))
|
||||
(setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3")
|
||||
(list (ssg-text "vfl-kettenende-opt-ja-es")
|
||||
(ssg-text "vfl-kettenende-opt-ja-ohne-es")
|
||||
(ssg-text "vfl-kettenende-opt-nein")) 3
|
||||
"vfl-ist-kettenende-header"))
|
||||
(cond
|
||||
((= antwort "1")
|
||||
(setq es-seite (vfl-frage-es-seite))
|
||||
(setq frame (vfl-insert-es-element "GF" frame hz-neu winkel
|
||||
(caddr (car frame)) es-seite))
|
||||
(setq fertig t))
|
||||
((= antwort "2") (setq fertig t))
|
||||
(if gf-ok
|
||||
(progn
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-insert-gf-segment (deltaL=" (rtos deltaL 2 0)
|
||||
" hz=" (rtos hz-neu 2 1) " winkel=" (rtos winkel 2 1) ")")))
|
||||
(setq frame (vfl-insert-gf-segment (car frame) hz-neu deltaL winkel))
|
||||
(setq anzahl-gf (1+ anzahl-gf))
|
||||
(vfl-acc-gf-seg (/ deltaL (cos (* (float winkel) (/ pi 180.0)))) winkel)
|
||||
(setq letzter-typ "GF")
|
||||
(setq p-aktuell (car frame))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: GF-Segment gebaut, neue Position="
|
||||
(dbg-tostring p-aktuell))))
|
||||
(princ (ssg-text "vfl-ist-kettenende-header"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-ohne-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-nein"))
|
||||
(setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3")
|
||||
(list (ssg-text "vfl-kettenende-opt-ja-es")
|
||||
(ssg-text "vfl-kettenende-opt-ja-ohne-es")
|
||||
(ssg-text "vfl-kettenende-opt-nein")) 3
|
||||
"vfl-ist-kettenende-header"))
|
||||
(cond
|
||||
((= antwort "1")
|
||||
(setq es-seite (vfl-frage-es-seite))
|
||||
(setq frame (vfl-insert-es-element "GF" frame hz-neu winkel
|
||||
(caddr (car frame)) es-seite))
|
||||
(setq fertig t))
|
||||
((= antwort "2") (setq fertig t))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -2480,11 +2804,20 @@
|
||||
(if (< deltaL 1000.0)
|
||||
(princ (ssg-text "vfl-fehler-vf-kurz"))
|
||||
(progn
|
||||
(setq hoehe-vorschlaege (vfl-vf-hoehe-vorschlaege (caddr p-aktuell) deltaL))
|
||||
(setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege))
|
||||
(setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr p-aktuell)))
|
||||
(vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr p-aktuell))))
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl
|
||||
(list (list hoehe-ab hoehe-auf (caddr p-aktuell)))))
|
||||
(setq hoehe-neu
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos (caddr p-aktuell) 2 1)))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu (caddr p-aktuell)))
|
||||
(vfl-in-real
|
||||
(if (and hoehe-ab hoehe-auf)
|
||||
(ssg-textf "vfl-prompt-hoehe-linienendpunkt-2"
|
||||
(list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1)))
|
||||
(ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos hoehe-fallback 2 1))))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu hoehe-fallback))
|
||||
(setq deltaH (- hoehe-neu (caddr p-aktuell)))
|
||||
(setq richtung (if (>= deltaH 0.0) "Auf" "Ab"))
|
||||
(setq deltaH (abs deltaH))
|
||||
@@ -2492,9 +2825,19 @@
|
||||
(setq typ (nth 0 entscheidung) winkel (nth 1 entscheidung)
|
||||
L_GF (nth 2 entscheidung) L_VF (nth 3 entscheidung))
|
||||
(if (null typ)
|
||||
(alert (ssg-textf "vfl-alert-vf-nicht-baubar"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)))
|
||||
(progn
|
||||
(alert (ssg-textf "vfl-alert-vf-nicht-baubar"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie-VF nicht baubar (deltaL="
|
||||
(rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0)
|
||||
" richtung=" richtung ")"))))
|
||||
(progn
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-vf-einheit-abschluss (deltaL=" (rtos deltaL 2 0)
|
||||
" deltaH=" (rtos deltaH 2 0) " richtung=" richtung
|
||||
" winkel=" (rtos (float winkel) 2 1)
|
||||
" L_GF=" (rtos L_GF 2 0) " L_VF=" (rtos L_VF 2 0) ")")))
|
||||
(setq vf-einheit-res
|
||||
(vfl-vf-einheit-abschluss frame hz-neu richtung winkel L_GF L_VF nil))
|
||||
(setq frame (nth 0 vf-einheit-res))
|
||||
@@ -2503,6 +2846,9 @@
|
||||
(if (nth 3 vf-einheit-res) (setq es-seite (nth 3 vf-einheit-res)))
|
||||
(setq letzter-typ "VF")
|
||||
(setq p-aktuell (car frame))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: VF-Einheit gebaut, neue Position="
|
||||
(dbg-tostring p-aktuell))))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -2531,105 +2877,147 @@
|
||||
(setq frame (nth 0 erg) deltaL (nth 1 erg) p-aktuell (car frame))
|
||||
)
|
||||
)
|
||||
;; Segment-Typ bestimmen. Kurzsegment (deltaL < 1000 mm): KEINE
|
||||
;; Hoehenabfrage - automatisch 3-Grad-Gefaellestrecke. Grund: ein VF
|
||||
;; braucht >= 1000 mm deltaL (Umlenk- + Motorstation = 500+500 mm),
|
||||
;; und eine GF ist mindestens 3 Grad geneigt. Die Endhoehe ergibt
|
||||
;; sich damit fest aus deltaH = deltaL*tan(3 Grad).
|
||||
;; Im Kettenende-Modus (Option 4) wird IMMER nach der Zielhoehe
|
||||
;; gefragt (Kurzsegment-Automatik hier ueberspringen).
|
||||
(if (and (< deltaL 1000.0) (not linie-ende-modus))
|
||||
;; Nach dem AS-Einfuegen kann die reale Restlaenge (aus dem
|
||||
;; tatsaechlichen KS_AUS neu gemessen) kleiner als der urspruenglich
|
||||
;; gepickte Rohwert sein - bei einem knapp gepickten Punkt sogar
|
||||
;; NEGATIV. Ohne diese zweite Pruefung wuerde die Kurzsegment-
|
||||
;; Automatik unten (< 1000mm) mit negativem deltaL trotzdem ein
|
||||
;; "erfolgreiches" GF-Segment bauen (entartete/unsichtbare Strecke,
|
||||
;; das naechste Element - z.B. ein GF-Bogen - erscheint dann direkt
|
||||
;; am AS-Element, obwohl der Nutzer davor noch eine Linie wollte).
|
||||
(if (< deltaL 1.0)
|
||||
(princ (ssg-text "vfl-fehler-linie-zu-kurz"))
|
||||
(progn
|
||||
(setq typ "GF" winkel 3.0 richtung "Ab" L_GF nil L_VF nil)
|
||||
(setq deltaH (* deltaL (/ (sin (* 3.0 (/ pi 180.0)))
|
||||
(cos (* 3.0 (/ pi 180.0))))))
|
||||
(setq hoehe-neu (- (caddr p-aktuell) deltaH))
|
||||
(princ (ssg-textf "vfl-info-kurzes-segment"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 1))))
|
||||
)
|
||||
(progn
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr p-aktuell))))
|
||||
(setq hoehe-neu
|
||||
(vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos (caddr p-aktuell) 2 1)))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu (caddr p-aktuell)))
|
||||
(setq deltaH (- hoehe-neu (caddr p-aktuell)))
|
||||
(setq richtung (if (>= deltaH 0.0) "Auf" "Ab"))
|
||||
(setq deltaH (abs deltaH))
|
||||
;; Kettenende-Modus (Option 4): Der abgefragte Endpunkt (XY+Z)
|
||||
;; ist das exakte Ende der Kette NACH Separator + ES-Element.
|
||||
;; Deren Footprint (Separator 300 mm bei ~3 Grad + ES-Element
|
||||
;; ein-dx/ein-dz) muss vom baubaren GF/VF-Segment reserviert
|
||||
;; (abgezogen) werden, damit das ES-Element genau am Zielpunkt
|
||||
;; endet. Naeherung: Separator-Neigung = 3 Grad (Auslauf).
|
||||
(if linie-ende-modus
|
||||
;; Segment-Typ bestimmen. Kurzsegment (deltaL < 1000 mm): KEINE
|
||||
;; Hoehenabfrage - automatisch 3-Grad-Gefaellestrecke. Grund: ein VF
|
||||
;; braucht >= 1000 mm deltaL (Umlenk- + Motorstation = 500+500 mm),
|
||||
;; und eine GF ist mindestens 3 Grad geneigt. Die Endhoehe ergibt
|
||||
;; sich damit fest aus deltaH = deltaL*tan(3 Grad).
|
||||
;; Im Kettenende-Modus (Option 4) wird IMMER nach der Zielhoehe
|
||||
;; gefragt (Kurzsegment-Automatik hier ueberspringen).
|
||||
(if (and (< deltaL 1000.0) (not linie-ende-modus))
|
||||
(progn
|
||||
(setq rad3 (* (float (ssg-cfg-or "vario" "gefaelle_winkel" 3))
|
||||
(/ pi 180.0)))
|
||||
(setq deltaL (max 1.0 (- deltaL (* 300.0 (cos rad3))
|
||||
(abs (if ein-dx ein-dx 0.0)))))
|
||||
(setq deltaH (max 0.0 (- deltaH (* 300.0 (sin rad3))
|
||||
(abs (if ein-dz ein-dz 0.0)))))
|
||||
(princ (ssg-textf "vfl-info-kettenende-footprint"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0))))
|
||||
(setq typ "GF" winkel 3.0 richtung "Ab" L_GF nil L_VF nil)
|
||||
(setq deltaH (* deltaL (/ (sin (* 3.0 (/ pi 180.0)))
|
||||
(cos (* 3.0 (/ pi 180.0))))))
|
||||
(setq hoehe-neu (- (caddr p-aktuell) deltaH))
|
||||
(princ (ssg-textf "vfl-info-kurzes-segment"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 1))))
|
||||
)
|
||||
)
|
||||
(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))
|
||||
)
|
||||
)
|
||||
|
||||
(if (null typ)
|
||||
(alert (ssg-textf "vfl-alert-segment-nicht-baubar"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)))
|
||||
(progn
|
||||
(if (= typ "GF")
|
||||
(progn
|
||||
;; --- reine Gefaellestrecke ---
|
||||
(setq frame (vfl-insert-gf-segment (car frame) hz-neu deltaL winkel))
|
||||
(setq anzahl-gf (1+ anzahl-gf))
|
||||
;; GF-Segment erfassen (Schraeglaenge = deltaL/cos(winkel))
|
||||
(vfl-acc-gf-seg (/ deltaL (cos (* (float winkel) (/ pi 180.0)))) winkel)
|
||||
(setq letzter-typ "GF")
|
||||
(setq p-aktuell (car frame))
|
||||
;; Kettenende-Modus (Option 4): ohne Frage direkt ES setzen.
|
||||
;; Sonst nachfragen, ob die Kette hier endet.
|
||||
(setq hoehe-vorschlaege (vfl-segment-hoehe-vorschlaege (caddr p-aktuell) deltaL))
|
||||
(setq hoehe-ab (nth 0 hoehe-vorschlaege) hoehe-auf (nth 1 hoehe-vorschlaege))
|
||||
(setq hoehe-fallback (if hoehe-ab hoehe-ab (caddr p-aktuell)))
|
||||
(vfl-hoehe-hinweis-falls-noetig hoehe-ab hoehe-auf)
|
||||
(if (vfl-wizard-aktiv)
|
||||
(vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl
|
||||
(list (list hoehe-ab hoehe-auf (caddr p-aktuell)))))
|
||||
(setq hoehe-neu
|
||||
(vfl-in-real
|
||||
(if (and hoehe-ab hoehe-auf)
|
||||
(ssg-textf "vfl-prompt-hoehe-linienendpunkt-2"
|
||||
(list (rtos hoehe-ab 2 1) (rtos hoehe-auf 2 1)))
|
||||
(ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos hoehe-fallback 2 1))))))
|
||||
(if (null hoehe-neu) (setq hoehe-neu hoehe-fallback))
|
||||
(setq deltaH (- hoehe-neu (caddr p-aktuell)))
|
||||
(setq richtung (if (>= deltaH 0.0) "Auf" "Ab"))
|
||||
(setq deltaH (abs deltaH))
|
||||
;; Kettenende-Modus (Option 4): Der abgefragte Endpunkt (XY+Z)
|
||||
;; ist das exakte Ende der Kette NACH Separator + ES-Element.
|
||||
;; Deren Footprint (Separator 300 mm bei ~3 Grad + ES-Element
|
||||
;; ein-dx/ein-dz) muss vom baubaren GF/VF-Segment reserviert
|
||||
;; (abgezogen) werden, damit das ES-Element genau am Zielpunkt
|
||||
;; endet. Naeherung: Separator-Neigung = 3 Grad (Auslauf).
|
||||
(if linie-ende-modus
|
||||
(setq antwort "1")
|
||||
(progn
|
||||
(princ (ssg-text "vfl-ist-kettenende-header"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-ohne-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-nein"))
|
||||
(setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3")
|
||||
(list (ssg-text "vfl-kettenende-opt-ja-es")
|
||||
(ssg-text "vfl-kettenende-opt-ja-ohne-es")
|
||||
(ssg-text "vfl-kettenende-opt-nein")) 3
|
||||
"vfl-ist-kettenende-header"))
|
||||
(setq rad3 (* (float (ssg-cfg-or "vario" "gefaelle_winkel" 3))
|
||||
(/ pi 180.0)))
|
||||
(setq deltaL (max 1.0 (- deltaL (* 300.0 (cos rad3))
|
||||
(abs (if ein-dx ein-dx 0.0)))))
|
||||
(setq deltaH (max 0.0 (- deltaH (* 300.0 (sin rad3))
|
||||
(abs (if ein-dz ein-dz 0.0)))))
|
||||
(princ (ssg-textf "vfl-info-kettenende-footprint"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0))))
|
||||
)
|
||||
)
|
||||
(cond
|
||||
((= antwort "1")
|
||||
(setq es-seite (vfl-frage-es-seite))
|
||||
(setq frame (vfl-insert-es-element "GF" frame hz-neu winkel
|
||||
(caddr (car frame)) es-seite))
|
||||
(setq fertig t))
|
||||
((= antwort "2") (setq fertig 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))
|
||||
)
|
||||
)
|
||||
|
||||
(if (null typ)
|
||||
(progn
|
||||
;; --- VarioFoerderer-Einheit (Umlenk..Motor, mehrsegmentig) ---
|
||||
;; linie-ende-modus=T -> direkt Kettenende (Separator + ES).
|
||||
(setq vf-einheit-res
|
||||
(vfl-vf-einheit-abschluss frame hz-neu richtung winkel L_GF L_VF
|
||||
linie-ende-modus))
|
||||
(setq frame (nth 0 vf-einheit-res))
|
||||
(setq anzahl-vf (+ anzahl-vf (nth 1 vf-einheit-res)))
|
||||
(if (nth 2 vf-einheit-res) (setq fertig t))
|
||||
(if (nth 3 vf-einheit-res) (setq es-seite (nth 3 vf-einheit-res)))
|
||||
(setq letzter-typ "VF")
|
||||
(setq p-aktuell (car frame))
|
||||
(alert (ssg-textf "vfl-alert-segment-nicht-baubar"
|
||||
(list (rtos deltaL 2 0) (rtos deltaH 2 0) richtung)))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE FEHLGESCHLAGEN: Linie (automatisch) nicht baubar"
|
||||
" (deltaL=" (rtos deltaL 2 0) " deltaH=" (rtos deltaH 2 0)
|
||||
" richtung=" richtung ")"))))
|
||||
(progn
|
||||
(if (= typ "GF")
|
||||
(progn
|
||||
;; --- reine Gefaellestrecke ---
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-insert-gf-segment (deltaL=" (rtos deltaL 2 0)
|
||||
" hz=" (rtos hz-neu 2 1) " winkel=" (rtos (float winkel) 2 1) ")")))
|
||||
(setq frame (vfl-insert-gf-segment (car frame) hz-neu deltaL winkel))
|
||||
(setq anzahl-gf (1+ anzahl-gf))
|
||||
;; GF-Segment erfassen (Schraeglaenge = deltaL/cos(winkel))
|
||||
(vfl-acc-gf-seg (/ deltaL (cos (* (float winkel) (/ pi 180.0)))) winkel)
|
||||
(setq letzter-typ "GF")
|
||||
(setq p-aktuell (car frame))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: GF-Segment gebaut, neue Position="
|
||||
(dbg-tostring p-aktuell))))
|
||||
;; Kettenende-Modus (Option 4): ohne Frage direkt ES setzen.
|
||||
;; Sonst nachfragen, ob die Kette hier endet.
|
||||
(if linie-ende-modus
|
||||
(setq antwort "1")
|
||||
(progn
|
||||
(princ (ssg-text "vfl-ist-kettenende-header"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-ja-ohne-es"))
|
||||
(princ (ssg-text "vfl-kettenende-opt-nein"))
|
||||
(setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3")
|
||||
(list (ssg-text "vfl-kettenende-opt-ja-es")
|
||||
(ssg-text "vfl-kettenende-opt-ja-ohne-es")
|
||||
(ssg-text "vfl-kettenende-opt-nein")) 3
|
||||
"vfl-ist-kettenende-header"))
|
||||
)
|
||||
)
|
||||
(cond
|
||||
((= antwort "1")
|
||||
(setq es-seite (vfl-frage-es-seite))
|
||||
(setq frame (vfl-insert-es-element "GF" frame hz-neu winkel
|
||||
(caddr (car frame)) es-seite))
|
||||
(setq fertig t))
|
||||
((= antwort "2") (setq fertig t))
|
||||
)
|
||||
)
|
||||
(progn
|
||||
;; --- VarioFoerderer-Einheit (Umlenk..Motor, mehrsegmentig) ---
|
||||
;; linie-ende-modus=T -> direkt Kettenende (Separator + ES).
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE: vfl-vf-einheit-abschluss (deltaL=" (rtos deltaL 2 0)
|
||||
" deltaH=" (rtos deltaH 2 0) " richtung=" richtung
|
||||
" winkel=" (rtos (float winkel) 2 1)
|
||||
" L_GF=" (rtos L_GF 2 0) " L_VF=" (rtos L_VF 2 0)
|
||||
" linie-ende-modus=" (if linie-ende-modus "T" "nil") ")")))
|
||||
(setq vf-einheit-res
|
||||
(vfl-vf-einheit-abschluss frame hz-neu richtung winkel L_GF L_VF
|
||||
linie-ende-modus))
|
||||
(setq frame (nth 0 vf-einheit-res))
|
||||
(setq anzahl-vf (+ anzahl-vf (nth 1 vf-einheit-res)))
|
||||
(if (nth 2 vf-einheit-res) (setq fertig t))
|
||||
(if (nth 3 vf-einheit-res) (setq es-seite (nth 3 vf-einheit-res)))
|
||||
(setq letzter-typ "VF")
|
||||
(setq p-aktuell (car frame))
|
||||
(if dbg-an
|
||||
(dbgmsg (strcat "GEOMETRIE ERFOLG: VF-Einheit gebaut, neue Position="
|
||||
(dbg-tostring p-aktuell))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user