Hallo Forum
Situation:
Ich schreibe für meinen Betrieb ein Lisp, mit welchem Koordinatenrahmen auf den Zeichnungen erstellt werden.
Diese sind sowohl für Vertikale-Pläne (mit Koordinaten von Welt und eigenem BKS) und auch für Senkrechte-Pläne.
Die Senkrechten-Pläne sind auf einem BKS das auch senkrecht zu Welt steht.
Die Koordinaten die am Rahmen angeschrieben werden, sollen aber entweder als Welt-Koordinaten oder aber als BKS-Koordinaten vom Vertikalen-BKS (!) angeschrieben werden.
Schwierigkeit:
Soweit so gut. Probleme machen mir die Senkrechten.
Da ich die Koordinaten für den Rahmen im Senkrechten-BKS bekomme, sie zur korrekten Berechnung der geraden Koordinaten und der Abstände aber in das Vertikale-BKS umrechnen muss und sie am Schluss, um die Linien mit Entmake zu erstellen, in Welt haben muss, ich die Koordinaten aber auch noch immer im Vertikalen abgreifen können muss um den Text zu beschriften, brauche ich eine möglichst Flexible/häufig anwendbare Transformation.
Erste Lösung:
Ich habe im Internet natürlich schon einiges gesucht und habe das hier gefunden:
Code:
;;;-----------------------------------------------------------------------------------------------------------------------------------;;;
;;; Befehl: MVX / TransFromWCS / TRP / TransToWCS
;;; Zweck: Umrechnungsmatrix zwischen BKS und Welt
;;; Funktionen: Keine Unterfunktionen
;;; Autor: MVX - Vladimir Nesterovsky - TransFromWCS / TRP / TransToWCS - Doug Wilson
;;; URL: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/usage-of-the-trans-function/td-p/9038723
;;; Datum: -
;;; Argumente: MVX: M --> Matrix
;;; V --> Vector
;;; TransFromWCS: Pt --> Punkt
;;; Mat --> Trasformationsmatrix
;;; Org --> Ursprungskoordinaten vom UCS in WCS
;;; TRP: M --> Matrix
;;; TransToWCS: Pt --> Punkt
;;; Mat --> Trasformationsmatrix
;;; Org --> Ursprungskoordinaten vom UCS in WCS
;;; Variablen: -
;;; Func-Key: R
;;; Code:
(defun MXV ( M V / R )
(mapcar
(function (lambda (R) (apply '+ (mapcar '* R V))))
M
);end mapcar
);end defun (defun TransFromWCS ( Pt Mat Org / )
(MXV Mat (mapcar '- Pt Org))
);end defun
(defun TRP ( M / ) (apply 'mapcar (cons 'list M)))
(defun TransToWCS (Pt Mat Org)
(mapcar '+ (MXV (TRP Mat) Pt) Org)
);end defun
;;;-----------------------------------------------------------------------------------------------------------------------------------;;;
Und habe mir das dann noch etwas weiter zusammen gesetzt:
Code:
;;;-----------------------------------------------------------------------------------------------------------------------------------;;; (defun TransFlex ( Pt / PrUCS CoUCS )
(setq PrUCS (tblsearch "UCS" (cadr UCS))
CoUCS (tblsearch "UCS" (car UCS))
Pt (TransToWCS
Pt
(list (cdr (assoc 11 PrUCS))(cdr (assoc 12 PrUCS))(cdr (assoc 10 PrUCS)))
(cdr (assoc 10 PrUCS))
);end TransToWCS
);end setq
(if
(/= (car UCS) "Welt")
(setq Pt (TransFromWCS
Pt
(list (cdr (assoc 11 CoUCS))(cdr (assoc 12 CoUCS))(cdr (assoc 10 CoUCS)))
(cdr (assoc 10 CoUCS))
);end TransFromWCS
);end setq
);end if
Pt
);end defun
;;;-----------------------------------------------------------------------------------------------------------------------------------;;;
Hiermit (und den einzeln angewandten Funktionen oben) habe ich aber das Problem, dass die Koordinaten nach mehrfachem Transformieren nicht mehr stimmen.
Gerade die Z-Koordinate, die für mich sehr Wichtig ist, ist so dann komplett falsch.
Zweite Lösung:
Als zweites habe ich versucht ein Workaround zu bauen um das klassische Trans zu benutzen:
Code:
;;;-----------------------------------------------------------------------------------------------------------------------------------;;; (defun TransFlex ( Pt / ;|PrUCS CoUCS|; )
(if
(/= (getvar "UCSNAME")(cadr UCS))
(command "._UCS" "_NAMED" "_RESTORE" (cadr UCS))
);end if
(setq Pt (trans Pt 1 0))
(if
(/= (car UCS) "Welt")
(progn
(if
(/= (getvar "UCSNAME")(car UCS))
(command "._UCS" "_NAMED" "_RESTORE" (car UCS))
);end if
(setq Pt (trans Pt 0 1))
);end progn
);end if
Pt
);end defun
;;;-----------------------------------------------------------------------------------------------------------------------------------;;;
Das funktioniert zwar und gibt mir stehts die korrekten Koordinaten, ist aber durch den dauerhaften Wechsel des BKS mit command in der Anwendung mit Schlaufen sehr ineffizient.
Frage:
Habe ich bei der Ersten Lösung einfach einen Fehler in der Anwendung gemacht?
Ist das Grundsätzlich schwierig oder gibt es da eine andere Lösung die ich noch nicht gefunden habe?
Ich bin selber nicht wirklich in der Materie wenn es um Vektoren, Matrixen oder diesen "Arbitrary Axis Algorithm" geht.
Im Anhang eine .dwg mit allen BKSs -/ 2022-02 = Vertikales, Fl_09-N-Profil = Senkrechtes /-
Wäre für Tipps und Hilfen sehr Dankbar!
Vielen Dank im Voraus und einen Schönen Morgen/Mittag/Abend
------------------
___________________________________________
Bubi spiele, Bubi glücklich!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP