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:
+67
-30
@@ -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 ---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user