| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Probleme mit TRANS (3572 mal gelesen)
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 23. Mrz. 2011 20:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich weiß noch nicht ob ich grundlegend was falsch mache oder nur den Wald vor lauter Bäumen nicht sehe: Ich möchte von einem Block bestimmt Koordinaten im Blocksystem erhalten, beispielhaft habe ich einen Block definiert, der aus einem Kreis und 2 Linien besteht. Die Linienendpunkte möchte ich im Block Koordinatensystem haben. Die Längen sind jeweils 20m, so daß im Uhrzeigersinn bei 12 beginnend folgende Koordinaten heraus kommen: 0,10 / 10,0 / 0,-10 / -10,0 Jetzt das Problem mit TRANS im WKS:
Code:
(defun c:test ( / ) (setq obj (car (entsel "\nBlock wählen:"))) (setq koord (getpoint "\nLinienendpunkt:")) (trans koord 0 obj))
Bei dem TRANS-Aufruf kommt aber die Koordinate im WKS raus, was mache ich das falsch?? ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 23. Mrz. 2011 20:35 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
So transformierst du nur ins BKS der Blockreferenz (im Beispiel ist BKS=WKS) und nicht etwa in das Koordinatensystem der Blockdefinition. Die Transformation musst du die selbst ausrechnen (gepickter Punkt minus Blockeinfügepunkt), ggf. noch Drehung und bei Bedarf Skalierung zurückrechnen. ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 24. Mrz. 2011 06:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, schade, dann habe ich das wohl falsch verstanden. Ok. den Punkt auf der Ebene zu berechnen (wie in meinem einfachen Beispiel gezeigt) kein Problem, was ist aber, wenn der Block noch zusäzlich in allen Richtungen gedreht ist, dann habe ich den Normalenvektor als Hinweis (GC 210) => in dem Fall dann ungleich (0.0 0.0 1.0) Gibt es irgendwo ein Beispiel, wie man mit den Werten des Normalenvektors die Transformation rechnen kann? ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 24. Mrz. 2011 07:27 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Wenn ich es richtig versstanden habe, soll deine Funktion so funktionieren: (defun c:test ( / ) (command "_ucs" "_world") (setq obj (car (entsel "\nBlock wählen:"))) (setq koord (getpoint "\nLinienendpunkt:")) (command "_ucs" "_object" obj) (print (trans koord 0 1)) (command "_ucs" "_world") ) ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 24. Mrz. 2011 07:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, vom Prinzip ja, aber die Commandbefehle machen mir performance-mäßig unter ACAD2011 alles kaputt. Daher möchte ich weg von den Commands, auch wenn die natürlich erstmal schön bequem sind. Hast Du das auch schon nachvollziehen können, daß es sich unter ACAD2011 mit den Commands gar nicht mehr so richtig arbeiten läßt? ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 24. Mrz. 2011 10:57 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich schon wieder, ich komme noch nicht so recht weiter: ich möchte jetzt die Command-Variante BKS von Objekt ersetzen: Ich habe einen Block gedreht im Raum: (50 . 0.0)(210 0.57735 -0.57735 0.57735) Um ein BKS mit Entmake zu Definieren brauche ich den GC11 (X-Achsenrichtung) und den GC12 (Y-Achsenrichtung) mit folgender Funktion von Robert McNeel & Associates erhalte ich aus dem Normalenvektor des Blockes den GC 11: => (0.707107 0.707107 0.0)
Code:
(defun ArbAxis(v) (if (and (< (abs (car v)) 0.015625) (< (abs (cadr v)) 0.015625)) (VectorUnitize (VectorCrossProduct '(0.0 1.0 0.0) v)) (VectorUnitize (VectorCrossProduct '(0.0 0.0 1.0) v)) ) )(defun VectorCrossProduct(v1 v2) (list (- (* (cadr v1) (caddr v2)) (* (cadr v2) (caddr v1))) (- (* (caddr v1) (car v2)) (* (caddr v2) (car v1))) (- (* (car v1) (cadr v2)) (* (car v2) (cadr v1))))) (defun VectorUnitize(v / dist) (setq dist (VectorLength v)) (if (> dist 0.0) (list (/ (car v) dist) (/ (cadr v) dist) (/ (caddr v) dist)) v ) ) (defun VectorLength(v / dist) (setq dist (+ (* (car v) (car v)) (* (cadr v) (cadr v)) (* (caddr v) (caddr v)))) (if (> dist 0.0) (sqrt dist) 0.0 ))
Wie berechne ich jetzt aber die noch fehlende Y-Achsenrichtung GC12?? ------------------ viele Grüße Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 24. Mrz. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 24. Mrz. 2011 18:41 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 24. Mrz. 2011 21:04 <-- editieren / zitieren --> Unities abgeben:
Einmal heute noch, kann ich ein Userkoordinatensystem ohne Namen erstellen? Wenn ich die mit Namen erstelle, dann muss ich im Schleifenablauf das vorher erstellte immer wieder löschen und dann wieder ein neues erstellen, und das geht stark an die Performance (unten links erscheint ständig der ACAD-Fortschrittsbalken (sucht in Zeichnung). Anders nochmal gefragt, die Variable USCORG, UCSXDIR und UCSYDIR sind schreibgeschützt, stellen aber das aktuelle Koordinatensystem dar. Aber dann ist das UCS ja nicht mit Namen gespeichert, und genau das brauch ich. Bin wie immer dankbar für jeden Tip ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 19. Apr. 2011 20:14 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Hallo, auch wenn dieses Topic etwas älter ist, will ich noch schnell sagen, dass es mir bisher nicht gelungen ist ein BKS ohne Namen zu erstellen - auch nicht via ActiveX. Du könntest allenfalls versuchen ein anonymes BKS zu erstellen - vglbar mit anonymen Blöcken. Aber das habe ich noch nicht versucht. Du musst wohl oder übel einen Namen vergeben. VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 20. Apr. 2011 07:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, nachdem dieser Thread in einen Monolog ausgeartet ist finde ich es schön, doch noch eine Antwort zu bekommen. Ich habe es jetzt auch so gelöst, daß ich einen Namen vergeben habe. Ist aber letztendlich nicht wirklich schlimm, denn ich kann mit demselben Namen immer wieder ein neues BKS erstellen, am Ende des Programms wird es dann gelöscht. Als Ergebnis habe ich eine Funktion, die mir das BKS von Objekt für Blöcke erstellt, leider erst in 2D.
Code:
(defun c:test ( / OBJ P W) (setq obj(car(entsel "\nBitte Block auswählen:"))) (setq w (cdr(assoc 50 (entget obj))) p (cdr(assoc 10 (entget obj))))
(JB_test:Ucs:Set w p)) ;;;BKS erstellen (defun JB_test:Ucs:Set (w p / ucs) (setq ucs (vla-add (vla-get-usercoordinatesystems (vla-get-activedocument(vlax-get-acad-object))) (vlax-make-variant(JB_test oint->variant '(0.0 0.0 0.0))) (vlax-make-variant(JB_test oint->variant (list (cos w)(sin w) 0.0))) (vlax-make-variant(JB_test oint->variant (list(* -1.0(sin w))(cos w)0.0))) "TEST")) (vla-put-Origin ucs (JB_test oint->variant p)) (vla-put-activeucs (vla-get-activedocument (vlax-get-acad-object)) ucs)) ;;;Tripelliste -> Variant (defun JB_test oint->variant (liste / point) (setq point (vlax-make-safearray vlax-vbDouble '(0 . 2))) (vlax-safearray-put-element point 0 (car liste)) (vlax-safearray-put-element point 1 (cadr liste)) (vlax-safearray-put-element point 2 (if (caddr liste)(caddr liste)0.0)) point)
Wenn ich jetzt sowieso gerade wieder dabei bin kann ich meine ursprüngliche Frage wieder auffrischen, kann mir einer Beispielhaft zeigen, wie ich das für den Fall mache, wenn der Block um alle Achsen verdreht ist? Mein jetziges Beispiel geht nur für den Fall, das die Normale des Blockes (0.0 0.0 1.0) ist. CADmium hatte mir bereits einen Link geschickt, aber damit bin ich leider nicht so ganz klar gekommen. http://lee-mac.com/matrixtransformationfunctions.html Nachtrag: Die Smilies im Code z.B. durch [Doppelpunkt und "P"] ersetzen. ------------------ viele Grüße Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 20. Apr. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 20. Apr. 2011 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Hallo Jörn, Deine Funktion Point->variant verstehe ich nicht: Was spricht gegen(vlax-3d-point '(0 0 0)) ? Wenn Du das BKS von einem Block aktiv stellen möchtest, warum machst Du dann nicht einfach (command "_ucs" "_obj" entBlockRef)? Nur damit ich es richtig verstehe: Du willst (gemäß Deinem obigen Beispiel) die Linienendpunkte der Blockdefinition basierend auf den Blockreferenzen incl. Drehung und Skalierung haben? VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 20. Apr. 2011 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Hallo, Jörn, für den Fall, dass Du die Linienendpunkte der Blockdefinition basierend auf den Blockreferenzen incl. Drehung und Skalierung haben willst, wäre das der erste Teil des Auslesens der Punkte unter Anwendung der Beispiele aus dem von Dir angegebenen Link. Code: (defun c:test (/ lstPoints entBlock lstEnt ptBase reaAngle vecNormal vecVector matScale matRotation) (setq lstPoints (list (list 0 10 0) (list 10 0 0) (list 0 -10 0) (list -10 0 0))) (setq entBlock (car (entsel))) (setq lstEnt (entget entBlock)) (setq ptBase (cdr (assoc 10 lstEnt))) (setq reaAngle (cdr (assoc 50 lstEnt))) (setq vecNormal (cdr (assoc 210 lstEnt))) ;; Punkte zum Einfügepunkt des Blocks (WKS) verschieben (setq ptBase (trans ptBase entBlock 0)) (setq lstPoints (mapcar '(lambda (ptPoint) (mapcar '+ ptPoint ptBase)) lstPoints)) ;; Punkte skalieren (entsprechend der ungleichmäßigen Blockskalierung) (setq matScale (list (list (cdr (assoc 41 lstEnt)) 0.0 0.0) (list 0.0 (cdr (assoc 42 lstEnt)) 0.0) (list 0.0 0.0 (cdr (assoc 43 lstEnt))))) (setq vecVector (mapcar '- ptBase (mxv matScale ptBase))) (setq lstPoints (mapcar '(lambda (ptPoint) (mapcar '+ (mxv matScale ptPoint) vecVector)) lstPoints)) ;; Punkte drehen (setq matRotation (list (list (cos reaAngle) (- (sin reaAngle)) 0.0) (list (sin reaAngle) (cos reaAngle) 0.0) (list 0.0 0.0 1.0))) (setq vecVector (mapcar '- ptBase (mxv matRotation ptBase))) (setq lstPoints (mapcar '(lambda (ptPoint) (mapcar '+ (mxv matRotation ptPoint) vecVector)) lstPoints)) lstPoints ); test (defun mxv ( matMatrix vecVector ) (mapcar '(lambda ( r ) (apply '+ (mapcar '* r vecVector))) matMatrix) )
Als nächstes müsstest Du den Abzissenvektor der x-y-Ebene zum Normalenvektor ermitteln und dann könntest Du mit 3D-Drehung die Punkte auf die x-y-Ebene hieven. Zum Thema 3D-Drehung habe ich hier etwas gefunden: http://www.theswamp.org/index.php?topic=37319.msg423620#msg423620 VG, Fred ------------------ Fred Tomke Dipl.-Ing. (FH) Landespflege Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 20. Apr. 2011 17:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Fred, Zitat: Was spricht gegen(vlax-3d-point '(0 0 0)) ?
Kannte ich noch nicht, werde ich jetzt verwenden. Zitat: warum machst Du dann nicht einfach (command "_ucs" "_obj" entBlockRef)?
Das ist mein ursprüngliches Problem, daß dauert unter AutoCAD 2011 einfach zu lange. Ich habe ja vohin schon mit Fred telefoniert, scheinbar ist mein Anliegen nicht ganz deutlich angekommen, ich probiere es nochmal: Ich möchte den Command-Befehl "BKS von Objekt" nachbauen und für einen Block, der in allen Achsen gedreht sein kann, verwenden. Dafür habe ich folgende Daten zur Verfügung (siehe anhängende Beispielzeichnung): (50 . 1.40088);;;Drehung des Blockes (210 -0.707107 -0.5 0.5);;;Normalenvektor des Blockes Als Ergebnis muss ich die Normalenvektoren für X und Y erhalten: UCSXDIR 0.5000,0.1464,0.8536 UCSYDIR -0.5000,0.8536,0.1464 In der Zeichnung habe ich die blockbezogenen Normalenvektoren jeweils als Linie dargestellt: rot = X, grün = Y, blau = Z. Ich bin fest davon überzeugt, daß es möglich sein muss aus den Ausgangsdaten die X- und Y-Vektoren zu berechnen, leider nützt meine Überzeugung gar nichts wenn ich das mathematisch nicht auf Reihe bekomme Gibt es nicht irgendeinen unter Euch der dort weiter weiß?? Bin wie immer dankbar für jeden Tip ------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 222 Registriert: 22.08.2006
|
erstellt am: 21. Apr. 2011 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
hallo joern, isses das hier ang ... winkel des blocks (50 . 1.40088) nv ... normalenvektor des blocks (210 -0.707107 -0.5 0.5) ucsxdir:
Code: (trans (polar '(0 0 0) ang 1.0) nv '(0 0 1))
ucsydir:
Code: (trans (polar '(0 0 0) (+ ang (/ pi 2.0)) 1.0) nv '(0 0 1))
gruss marco
------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 21. Apr. 2011 15:57 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 26. Apr. 2011 08:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Marco, es hat "Klick" gemacht.,Ich habe eben nochmal die Hilfe für den TRANS-Befehl ein wenig genauer studiert. Die Möglichkeit, 3D-Vektoren als Argumente für FROM und TO zu verwenden hatte ich bisher scheinbar immer überlesen. Also, vielen Dank, es funzt. ------------------ viele Grüße Jörn http://www.bosse-engineering.com [Diese Nachricht wurde von joern bosse am 26. Apr. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |