die DWG sind bereinigt. Die bisherige positionsbasierte Block-Einfügung (Punkt + Winkel) wurde durch eine vollständige 3D-Frame-Kettung über KS_EIN/KS_AUS-Koordinatensysteme ersetzt, sodass beliebige räumliche Orientierungen korrekt durch die gesamte VarioFoerderer- und Gefaellestrecke-Anlage propagiert werden.

This commit is contained in:
2026-06-30 12:29:33 +02:00
parent 4a9d29f243
commit 0bee5ad8d0
22 changed files with 327 additions and 36 deletions
+67 -30
View File
@@ -332,6 +332,22 @@
)
)
;; --- KS-Rahmen aus Fahrtrichtungsvektor (Fallback wenn vf_core nicht geladen) ---
(if (null (car (atoms-family 1 '("MAKE-FRAME-FROM-DIR"))))
(defun make-frame-from-dir (P xu-unit / hlen yu zu)
(setq hlen (sqrt (+ (* (car xu-unit)(car xu-unit))
(* (cadr xu-unit)(cadr xu-unit)))))
(setq yu
(if (> hlen 1e-6)
(list (/ (- (cadr xu-unit)) hlen) (/ (car xu-unit) hlen) 0.0)
'(1.0 0.0 0.0)))
(setq zu
(list (- (* (cadr xu-unit)(caddr yu)) (* (caddr xu-unit)(cadr yu)))
(- (* (caddr xu-unit)(car yu)) (* (car xu-unit)(caddr yu)))
(- (* (car xu-unit)(cadr yu)) (* (cadr xu-unit)(car yu)))))
(list P xu-unit yu zu))
)
;; --- Linie/Polylinie-Endpunkte lesen ---
(if (null (car (atoms-family 1 '("GET-LINE-START-END-POINTS"))))
(defun get-line-start-end-points (msg / ent obj obj-name sp ep)
@@ -775,20 +791,19 @@
)
;; Alle Segmente des Linienzugs einfuegen.
;; segmente: Ergebnis von gf-analysiere-kette
;; grade: Gefaellewinkel in Grad
;; startpunkt: 3D-Einfuegepunkt des ersten Blocks
;;
;; Reihenfolge bei Bogen:
;; ... Staustrecke (Linie) → Separator am Ende der Linie → Gefaellebogen ...
(defun gf-linienzug-einfuegen (segmente grade startpunkt /
aktuell i n seg naechstes
typ hz laenge bwinkel bseite blockname)
(setq aktuell startpunkt)
;; segmente : Ergebnis von gf-analysiere-kette
;; grade : Gefaellewinkel in Grad
;; startframe : Vollstaendiger Rahmen (P xu yu zu) am Kettenanfang
;; Rueckgabe : Vollstaendiger Rahmen (P xu yu zu) am Kettenende
(defun gf-linienzug-einfuegen (segmente grade startframe /
aktuell-frame i n seg naechstes
typ hz laenge bwinkel bseite blockname
rad-h rad-v xu-incl endpunkt)
(setq aktuell-frame startframe)
(setq n (length segmente))
(setq i 0)
(while (< i n)
(setq seg (nth i segmente))
(setq seg (nth i segmente))
(setq naechstes (if (< (1+ i) n) (nth (1+ i) segmente) nil))
(setq typ (car seg))
(setq hz (cadr seg))
@@ -801,9 +816,16 @@
": Staustrecke L=" (rtos laenge 2 1) " mm"
" hz=" (rtos hz 2 1) grad-zeichen
" v=" (rtos grade 2 2) grad-zeichen))
(setq aktuell
(setq endpunkt
(gf-insert-hz-incl-scaled
"Staustrecke_SP_1000_mm" aktuell laenge hz grade))
"Staustrecke_SP_1000_mm" (car aktuell-frame) laenge hz grade))
;; Ausgangsrahmen: geneigte Fahrtrichtung
(setq rad-h (* (float hz) (/ pi 180.0)))
(setq rad-v (* (float grade) (/ pi 180.0)))
(setq xu-incl (list (* (cos rad-h)(cos rad-v))
(* (sin rad-h)(cos rad-v))
(- (sin rad-v))))
(setq aktuell-frame (make-frame-from-dir endpunkt xu-incl))
;; Separator am Ende dieser Linie, falls naechstes Segment ein Bogen ist
(if (and naechstes (= (car naechstes) "Bogen"))
(progn
@@ -811,20 +833,20 @@
": Separator 300mm (vor Bogen)"
" hz=" (rtos hz 2 1) grad-zeichen
" v=" (rtos grade 2 2) grad-zeichen))
(setq aktuell
(setq endpunkt
(gf-insert-hz-with-ks
"Staustrecke_Separator_SP_300_mm" aktuell hz grade 300 0))
"Staustrecke_Separator_SP_300_mm" (car aktuell-frame) hz grade 300 0))
(setq aktuell-frame (make-frame-from-dir endpunkt xu-incl))
)
)
)
((= typ "Bogen")
(setq blockname (gf-bogen-blockname bwinkel bseite))
;; Gefaellebogen (nur Hz-Rotation, Block hat eigene 3D-Geometrie)
(princ (strcat "\n\n" (itoa (1+ i)) "/" (itoa n)
": " blockname
" hz=" (rtos hz 2 1) grad-zeichen))
(setq aktuell
(gf-insert-gefaellebogen-by-ks blockname aktuell hz))
;; Gefaellebogen: KS_EIN an aktuellem Rahmen ausrichten (volle 3D-Rotation)
(setq aktuell-frame (insert-block-ks-to-ks blockname aktuell-frame))
)
)
(setq i (1+ i))
@@ -832,8 +854,7 @@
(princ "\n\n=========================================")
(princ "\n>>> Linienzug-Gefaellestrecke eingefuegt! <<<")
(princ "\n=========================================")
aktuell
)
aktuell-frame)
;; Listenelement an Position idx durch val ersetzen.
(defun gf-replace-nth (lst idx val / i result)
@@ -873,10 +894,12 @@
entry-hz exit-hz
first-idx last-idx neu-l
chz shz as-target
aktuell-pt nach-aus-pt
aktuell-pt aktuell-frame nach-aus-pt
gf-nummer last-ent
L-gf-str delta-l-gf laengen-liste first-l l-item
bL90 bL60 bL30 bR90 bR60 bR30 n-bogen-gf)
bL90 bL60 bL30 bR90 bR60 bR30 n-bogen-gf
rad-h-as rad-v-as xu-entry
sep-endpunkt rad-h-es rad-v-es xu-exit sep-frame)
(princ "\n\n>>> MODUS 3: Linienzug auswaehlen <<<")
(princ "\nBitte alle Linien (LINE) und Boegen (ARC) des Pfades auswaehlen,")
(princ "\ndann ENTER druecken:")
@@ -1068,19 +1091,33 @@
(setq aktuell-pt (gf-insert-gefaellebogen-by-ks as-block as-target entry-hz))
(setq nach-aus-pt aktuell-pt)
;; Linienzug mit Gefaellebogen und Separatoren (gekuerzte Laengen)
(setq aktuell-pt (gf-linienzug-einfuegen segmente grade aktuell-pt))
;; Eingangsrahmen nach AS-Element: Position + geneigte Fahrtrichtung
(setq rad-h-as (* (float entry-hz) (/ pi 180.0)))
(setq rad-v-as (* (float grade) (/ pi 180.0)))
(setq xu-entry (list (* (cos rad-h-as)(cos rad-v-as))
(* (sin rad-h-as)(cos rad-v-as))
(- (sin rad-v-as))))
(setq aktuell-frame (make-frame-from-dir aktuell-pt xu-entry))
;; Linienzug mit Gefaellebogen und Separatoren (Frame-basiert)
(setq aktuell-frame (gf-linienzug-einfuegen segmente grade aktuell-frame))
;; Separator vor EIN-Element
(princ "\n>>> Separator vor EIN-Element")
(setq aktuell-pt
(setq sep-endpunkt
(gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm"
aktuell-pt exit-hz grade 300 0))
(car aktuell-frame) exit-hz grade 300 0))
;; Ausgangsrahmen nach Separator fuer ES-Element
(setq rad-h-es (* (float exit-hz) (/ pi 180.0)))
(setq rad-v-es (* (float grade) (/ pi 180.0)))
(setq xu-exit (list (* (cos rad-h-es)(cos rad-v-es))
(* (sin rad-h-es)(cos rad-v-es))
(- (sin rad-v-es))))
(setq sep-frame (make-frame-from-dir sep-endpunkt xu-exit))
;; EIN-Element mit Austrittsrichtung ausrichten (Rz um exit-hz)
(princ (strcat "\n>>> EIN-Element: " es-block
" (hz=" (rtos exit-hz 2 1) grad-zeichen ")"))
(gf-insert-gefaellebogen-by-ks es-block aktuell-pt exit-hz)
;; EIN-Element: KS_EIN an vollstaendigem Rahmen ausrichten (KS-zu-KS)
(princ (strcat "\n>>> EIN-Element: " es-block))
(insert-block-ks-to-ks es-block sep-frame)
;; --- GF_N-Block erstellen ---