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:
@@ -156,6 +156,81 @@
|
||||
(cadr item))))
|
||||
ks-rel))
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 4b: KS-FRAME MATHEMATIK
|
||||
;; ============================================================
|
||||
|
||||
;; Vektorkreuzprodukt a x b
|
||||
(defun vec3-cross (a b)
|
||||
(list (- (* (cadr a)(caddr b)) (* (caddr a)(cadr b)))
|
||||
(- (* (caddr a)(car b)) (* (car a)(caddr b)))
|
||||
(- (* (car a)(cadr b)) (* (cadr a)(car b)))))
|
||||
|
||||
;; Vektor auf Einheitslaenge normieren
|
||||
(defun vec3-normalize (v / len)
|
||||
(setq len (vec-length v))
|
||||
(if (> len 1e-10)
|
||||
(list (/ (car v) len) (/ (cadr v) len) (/ (caddr v) len))
|
||||
'(1.0 0.0 0.0)))
|
||||
|
||||
;; 3x3-Rotationsmatrix (Zeilenliste) mal 3D-Vektor
|
||||
(defun mat3-mul-vec3 (R v / r0 r1 r2)
|
||||
(setq r0 (car R) r1 (cadr R) r2 (caddr R))
|
||||
(list (+ (* (car r0)(car v)) (* (cadr r0)(cadr v)) (* (caddr r0)(caddr v)))
|
||||
(+ (* (car r1)(car v)) (* (cadr r1)(cadr v)) (* (caddr r1)(caddr v)))
|
||||
(+ (* (car r2)(car v)) (* (cadr r2)(cadr v)) (* (caddr r2)(caddr v)))))
|
||||
|
||||
;; Rotationsmatrix R sodass: R*xe=xt, R*ye=yt, R*ze=zt
|
||||
;; (xt yt zt) = Ziel-Achsen; (xe ye ze) = Quell-Achsen (je normierte Einheitsvektoren)
|
||||
;; Formel: R = M_target * M_source^T
|
||||
;; R[i][j] = xt[i]*xe[j] + yt[i]*ye[j] + zt[i]*ze[j]
|
||||
(defun mat3-from-frames (xt yt zt xe ye ze)
|
||||
(list
|
||||
(list (+ (* (car xt)(car xe)) (* (car yt)(car ye)) (* (car zt)(car ze)))
|
||||
(+ (* (car xt)(cadr xe)) (* (car yt)(cadr ye)) (* (car zt)(cadr ze)))
|
||||
(+ (* (car xt)(caddr xe)) (* (car yt)(caddr ye)) (* (car zt)(caddr ze))))
|
||||
(list (+ (* (cadr xt)(car xe)) (* (cadr yt)(car ye)) (* (cadr zt)(car ze)))
|
||||
(+ (* (cadr xt)(cadr xe)) (* (cadr yt)(cadr ye)) (* (cadr zt)(cadr ze)))
|
||||
(+ (* (cadr xt)(caddr xe)) (* (cadr yt)(caddr ye)) (* (cadr zt)(caddr ze))))
|
||||
(list (+ (* (caddr xt)(car xe)) (* (caddr yt)(car ye)) (* (caddr zt)(car ze)))
|
||||
(+ (* (caddr xt)(cadr xe)) (* (caddr yt)(cadr ye)) (* (caddr zt)(cadr ze)))
|
||||
(+ (* (caddr xt)(caddr xe)) (* (caddr yt)(caddr ye)) (* (caddr zt)(caddr ze))))))
|
||||
|
||||
;; Normierter KS-Rahmen aus rohen KS-Daten (origin x-end y-end z-end)
|
||||
;; Eingabe: Teilliste aus extract-ks-from-block-raw, z.B. (cadr (assoc "KS_EIN" ks-data))
|
||||
;; Rueckgabe: (P xu yu zu) - Ursprung + 3 normierte Einheitsvektoren
|
||||
(defun ks-frame-extract (ks-raw / origin x-end y-end z-end)
|
||||
(setq origin (car ks-raw)
|
||||
x-end (cadr ks-raw)
|
||||
y-end (caddr ks-raw)
|
||||
z-end (cadddr ks-raw))
|
||||
(list origin
|
||||
(vec3-normalize (list (- (car x-end)(car origin))
|
||||
(- (cadr x-end)(cadr origin))
|
||||
(- (caddr x-end)(caddr origin))))
|
||||
(vec3-normalize (list (- (car y-end)(car origin))
|
||||
(- (cadr y-end)(cadr origin))
|
||||
(- (caddr y-end)(caddr origin))))
|
||||
(vec3-normalize (list (- (car z-end)(car origin))
|
||||
(- (cadr z-end)(cadr origin))
|
||||
(- (caddr z-end)(caddr origin))))))
|
||||
|
||||
;; KS-Rahmen aus normiertem Fahrtrichtungsvektor mit horizontaler Senkrechtachse
|
||||
;; Rueckgabe: (P xu yu zu)
|
||||
;; Konvention: yu = horizontal senkrecht zu xu (links der Fahrtrichtung)
|
||||
;; zu = xu x yu (senkrecht zur Gurtoberflaeche, nach oben)
|
||||
(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 (vec3-cross xu-unit yu))
|
||||
(list P xu-unit yu zu))
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 5: KS_EIN/KS_AUS EXTRAKTION
|
||||
;; ============================================================
|
||||
@@ -395,6 +470,77 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; Fuegt Block ein und richtet KS_EIN am Ziel-Rahmen aus (volle 3D-Rotation).
|
||||
;; target-frame : (P xt yt zt) - Ziel-Rahmen, z.B. KS_AUS des Vorgaenger-Elements
|
||||
;; Rueckgabe : (P xu yu zu) - KS_AUS-Rahmen des eingefuegten Blocks
|
||||
(defun insert-block-ks-to-ks (blockname target-frame /
|
||||
block-obj ks-data ks-ein-raw ks-aus-raw
|
||||
f-ein f-aus P-t xt yt zt
|
||||
P-ein xe ye ze P-aus xu-aus yu-aus zu-aus
|
||||
R R-Pein R-Paus tx ty tz T4
|
||||
P-out xu-out yu-out zu-out)
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: Block '" blockname "' nicht in Bibliothek"))
|
||||
(exit)))
|
||||
;; Ziel-Rahmen auspacken
|
||||
(setq P-t (car target-frame)
|
||||
xt (cadr target-frame)
|
||||
yt (caddr target-frame)
|
||||
zt (cadddr target-frame))
|
||||
;; Block am Ursprung einfuegen (Rotation=0, Massstab=1)
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
;; KS_EIN und KS_AUS extrahieren (nutzt Cache nach erstem Aufruf)
|
||||
(setq ks-data (extract-ks-from-block block-obj))
|
||||
(setq ks-ein-raw (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus-raw (cadr (assoc "KS_AUS" ks-data)))
|
||||
(if (not (and ks-ein-raw ks-aus-raw))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: KS_EIN/KS_AUS fehlen in '" blockname "'"))
|
||||
(vla-Delete block-obj)
|
||||
(exit)))
|
||||
;; Normierte Rahmen (P xu yu zu) aus rohen KS-Daten berechnen
|
||||
(setq f-ein (ks-frame-extract ks-ein-raw)
|
||||
f-aus (ks-frame-extract ks-aus-raw))
|
||||
(setq P-ein (car f-ein)
|
||||
xe (cadr f-ein)
|
||||
ye (caddr f-ein)
|
||||
ze (cadddr f-ein))
|
||||
(setq P-aus (car f-aus)
|
||||
xu-aus (cadr f-aus)
|
||||
yu-aus (caddr f-aus)
|
||||
zu-aus (cadddr f-aus))
|
||||
;; Rotationsmatrix: R * xe = xt, R * ye = yt, R * ze = zt
|
||||
(setq R (mat3-from-frames xt yt zt xe ye ze))
|
||||
;; Translation: t = P_target - R * P_ein
|
||||
(setq R-Pein (mat3-mul-vec3 R P-ein))
|
||||
(setq tx (- (car P-t) (car R-Pein))
|
||||
ty (- (cadr P-t) (cadr R-Pein))
|
||||
tz (- (caddr P-t) (caddr R-Pein)))
|
||||
;; 4x4-Transformationsmatrix aufbauen und auf Block anwenden
|
||||
(setq T4 (vlax-tmatrix
|
||||
(list (list (car (car R)) (cadr (car R)) (caddr (car R)) tx)
|
||||
(list (car (cadr R)) (cadr (cadr R)) (caddr (cadr R)) ty)
|
||||
(list (car (caddr R)) (cadr (caddr R)) (caddr (caddr R)) tz)
|
||||
(list 0.0 0.0 0.0 1.0))))
|
||||
(vla-TransformBy block-obj T4)
|
||||
;; Ausgabe-Rahmen fuer KS_AUS mathematisch berechnen (kein Re-Extrahieren noetig)
|
||||
(setq R-Paus (mat3-mul-vec3 R P-aus))
|
||||
(setq P-out (list (+ (car R-Paus) tx)
|
||||
(+ (cadr R-Paus) ty)
|
||||
(+ (caddr R-Paus) tz)))
|
||||
(setq xu-out (mat3-mul-vec3 R xu-aus)
|
||||
yu-out (mat3-mul-vec3 R yu-aus)
|
||||
zu-out (mat3-mul-vec3 R zu-aus))
|
||||
(princ (strcat "\n '" blockname "' eingefuegt"
|
||||
"\n KS_AUS: X=" (rtos (car P-out) 2 2)
|
||||
" Y=" (rtos (cadr P-out) 2 2)
|
||||
" Z=" (rtos (caddr P-out) 2 2)))
|
||||
(list P-out xu-out yu-out zu-out))
|
||||
|
||||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel /
|
||||
rad matrix block-obj endpunkt scale)
|
||||
(if (<= laenge 0.1)
|
||||
|
||||
Reference in New Issue
Block a user