| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung |
Autor
|
Thema: 3D-Blockdrehung GC10+210 mittels trans (1414 / mal gelesen)
|
archi.archi Mitglied
Beiträge: 101 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 26. Sep. 2017 15:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Forumer, mit einer Applikation werden Blöcke in senkrechte Linien eingesetzt. Diese Blöcke haben leider alle verschiedene Drehungen um die Z-Achse (s. Anlage), d.h. die Blöcke werden mit verschiedenen Extrusionsrichtungen GC210 z.B. (210 -0.877169 0.480181 -2.0091e-15) generiert. Die Drehung der Blöcke soll mittels Lisp orthogonal zur WKS-X- und -Y-Achse korrigiert werden, heißt GC210 für alle Blöcke auf (210 0.0 -1.0 0.0). Durch den Zusammenhang von GC10 und GC210 muss bei Änderung von GC210 auch GC10 mittels trans-Funktion umgerechnet werden https://ww3.cad.de/foren/ubb/Forum54/HTML/004981.shtml#000002. Ich habe versucht die GC10-Anpassung über trans hinzubekommen. Leider funktioniert es nicht: die Block-Einfügepunkte werden nicht auf auf "gerade" Werte wie z.B. (10 0.0 100.0 200.0) umgerechnet. Code: ;Transformation OKS - WKS ;(trans Pkt Objektkoordinatensystem Weltkoordinatensystem) ;OKS=Element-Name, WKS=0, BKS=1, DKS=2 (entmod (list '(10 (trans (cdr (assoc 10 edaten)) (assoc -1 edaten) 0)) ja,'(10 (trans... ist nicht korrekt, leider geht (trans... schon nicht! (assoc -1 edaten)) ) );Extrusionsrichtung setzen (entmod (list '(210 0.0 -1.0 0.0) (assoc -1 edaten) ) )
Ist das überhaupt ein richtige Ansatz? Gibt es einen eleganteren Weg, oder wo seht ihr einen Fehler? Verdrehte Grüße Archi
[Diese Nachricht wurde von archi.archi am 26. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Sep. 2017 16:28 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Das Trans funktioniert nicht weil du die LISTE (10 (trans (cdr (assoc 10 edaten)) (assoc -1 edaten) 0)) quotest', Acad soll also nichts ausführen und die Liste einfach eine Liste sein lassen. (list '(10 (trans (cdr (assoc 10 edaten)) (assoc -1 edaten) 0)) (assoc -1 edaten)) ) ergibt: ( (10 (trans (cdr (assoc 10 edaten)) (assoc -1 edaten) 0)) (-1 . <Objektname: 7ff6ccdf48a0> ) ) und damit könnte dann "entmod" nicht umgehen (list (10 (trans (cdr (assoc 10 edaten)) (assoc -1 edaten) 0)) (assoc -1 edaten)) ) würde nicht funktionieren weil 10 keine Funktion ist, zudem benötigt trans den ENAME<Objektname: 7ff6ccdf4670> und nicht eine dottedpair-Liste (-1 . <Objektname: 7ff6ccdf4670> ) also funktioniert: (subst (cons 10 (trans (cdr (assoc 10 edaten)) (cdr(assoc -1 edaten)) 0)) edaten) ) ======== Ab hier ist die Frage was du mit 210 0 -1 0 vorhast, denn dies ist ja nicht WKS!? Solltest du die Entitylist an zwei Stellen bearbeiten wollen, so müßte man auch auf die NEUEN Daten beim zweiten Mal zugreifen und nicht auf die alten, ansonsten hätte die erste Änderung(entmod) keinen Sinn. Vorschlag: Geänderte EntityList nur merken(setq) und die erst die fertig bearbeitete List in die Datenbank schreiben(entmod). Aber da mir die (210 0 -1 0) Sache als gewolltes Ziel noch nicht klar ist, breche ich hier vorerst mal ab. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 101 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 27. Sep. 2017 16:41 <-- editieren / zitieren --> Unities abgeben:
Hallo cadfm, auf dich als Moderator ist immer Verlass! Du moderierst erfolgreich zw. mir und dem Lisp-Programm! Die auszurichtenden, um die Z-Achse verdrehten Blöcke wurden alle mit einer Drehung von 90° in die senkrechten Linien eingefügt. Daher führt 210 0 -1 0 zur gewünschten orthogonalen Drehung um die Z-Achse. Dank deiner wertvollen Tips jetzt eine verbesserte Funktion: Code:
;;; setzt die Extrusionsrichtung von Blöcken orthogonal zur X- und Y-Achse ;;; beseitigt "Verdrehungen" der Blöcke um die Z-Achse(defun c:t1 ( / block zaehler edaten ) ;(defun c:BlockExtrusion_Z ( / block zaehler edaten ) ;Definitionen ;Block wählen (setq block (pick-block)) ;alle Blöcke in den Auswahlsatz (setq blk_list (ssget "_X" (list (cons 0 "INSERT")(cons 2 block)))) ;Liste nicht leer (if blk_list (progn (setq zaehler 0) ;Liste durchlaufen (repeat (sslength blk_list) (progn (setq edaten (entget (ssname blk_list zaehler))) (princ "\n") (princ (assoc 10 edaten)) (princ (assoc 210 edaten)) (princ "\n") ;Transformation OKS - WKS ;(trans Pkt Objektkoordinatensystem Weltkoordinatensystem) ;OKS=Element-Name, WKS=0, BKS=1, DKS=2 (setq edaten (subst (cons 10 (trans (cdr (assoc 10 edaten)) (cdr (assoc -1 edaten)) 0)) (assoc 10 edaten) edaten ) ) ;Extrusionsrichtung setzen (setq edaten (subst '(210 0.0 -1.0 0.0) (assoc 210 edaten) edaten ) ) (entmod edaten) (princ (assoc 10 edaten)) (princ (assoc 210 edaten)) (princ "\n") (setq zaehler (1+ zaehler)) ) ;progn ) ;repeat ) ;progn ) ;if (princ (strcat "\nBlock " block " " zaehler "x ausgerichtet!")) ;(princ (strcat "\nBlock " (cons 2 block) " ausgerichtet!")) (princ) ) ;end of BlockExtrusion_Z (defun pick-block ( / ent chk ) ;;; Block picken ;;; Rückgabe Blockname
(while (/= (if (setq ent (car (entsel "\nBlock zum Ausrichten wählen: ") ;_ end of entsel ) ;_ end of car ) ;_ end of setq (progn (setq chk (cdr (assoc 0 (entget ent)))) (if (/= chk "INSERT") (princ "\nKein Block, noch einmal!") ) ;_ end if CHK ) ;_ end of progn (princ "\nNICHTS gewählt, noch einmal!") ) ;_ end of if "INSERT" ) ;_ end of /= ) ;_ end of while (cdr (assoc 2 (entget ent))) ;Blockname zuweisen ) ;pick-block
und eine kleine Beispiel-dwg im Anhang. Stand: Die Blöcke werden gedreht, aber ihre Einfügepunkt wird falsch berechnet = Blockverschiebung. Irgendwie ist der Ansatz für die trans-Umrechnung von OKS zu WKS nicht korrekt. Hast du dazu vielleicht eine Idee? Entdrehte aber noch verschobene Grüße Archi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 27. Sep. 2017 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Schau dir mal Y und Z-Position Vorher/Nachher an, die vertauscht ja mit dem 210 0 -1 0 die Achsen, entsprechend müßte man dies dann berücksichtigen. Per Hand stimmt also das Ergenis, wenn der Y und Z-Wert in den Eigenschaften(Strg+1) getauscht wird, nach "T1", ja? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 101 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 27. Sep. 2017 21:41 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, die berühmte rechte-Hand-Regel! Wenn es weiter nichts ist!? Ganz nachvollziehen kann ich es jetzt noch nicht, aber ich werde mir morgen noch einmal die Grundlagen für die GC10+210-Kombination ansehen. Vertauschen von Y- und Z-Wert: geht das elegant, oder muss ich die Punkt-Koordinaten mühsam zerlegen? Kleiner Tipp spart viele Stunden ! Späte Grüße und gute bis morgen Archi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 101 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 29. Sep. 2017 11:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Forumer, das Tauschen der Y- und Z-Koordinaten ist gelöst. In den Auswahlsatz sollen aber nur Blöcke aufgenommen werden, die die gleiche Drehung wie der gepickte Block haben.
Code:
;Block wählen (while (/= (if (setq ent (car (entsel "\nBlock zum Ausrichten wählen: ") ;_ end of entsel ) ;_ end of car ) ;_ end of setq (progn (setq chk (cdr (assoc 0 (entget ent)))) (if (/= chk "INSERT") (princ "\nKein Block, noch einmal!") ) ;_ end if CHK ) ;_ end of progn (princ "\nNICHTS gewählt, noch einmal!") ) ;_ end of if "INSERT" ) ;_ end of /= ) ;_ end of while (setq bname (cdr (assoc 2 (entget ent)))) ;Blockname (setq bwinkel (cdr (assoc 50 (entget ent)))) ;Blockwinkel ;Auswahlsatz: gleicher Blockname + Blockwinkel (setq blk_list (ssget "_X" (list (cons 0 "INSERT")(cons 2 bname)(cons 50 bwinkel))))
Der Blockwinkel wird für alle Blöcke in den Eigenschaften mit 90° angezeigt. Auslesen von GC50 führt zu 1.5708. Im Filter-Befehl wird die Blockdrehung zu 1.570796. Es schlägt also irgendwie die Anzeigegenauigkeit zu! Daher werden nicht alle um 90° gedrehten Blöcke ausgewählt. Gibt es eine Lösung für die Auswahl von Blöcken mit "fast gleicher" Drehung? Gruß Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Sep. 2017 12:41 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Fast gleich gibt es in der Auswahl (ssget) nicht, man muss auf kleinerX grösserX testen oder in dem Fall EQUAL mit einer zulässigen Ungenauigkeit zum Vergleich verwenden. Dein angesprochenes Beispiel (verschiedene Anzeige bei demSELBEN Objekt luegt jedoch anders: Die Anzeige AM MONITOR unterliegt einer Variable: Auprec und Luprec Diese gehen bis max8 Nachkommastellen, Acad arbeitet aber immer mit dem richtigen kompletten wert welcher noch genauer gespeichert vorliegt. Teste mal sowas: (rtos (cdr(assoc 50 edaten)) 2 14) Also: alle Blockreferenzen des Blockes wählen und dann mit equal die Drehung prüfen.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 101 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 29. Sep. 2017 13:16 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, die verwendete Applikation setzt die Blöcke mit gerinfügig abweichenden Drehwinkeln (ab der 9. Stelle) ein, warum auch immer!? Hier nun also die Bewältigung der Aufgabe mit Winkeltest "fast gleich": Code:
(defun c:BlockExtrusion_Z ( / ent chk bname bwinkel zaehler stellen edaten xkoo ykoo zkoo ) ;Genauigkeit (setq stellen 0.000001) ;Block wählen (while (/= (if (setq ent (car (entsel "\nBlock zum Ausrichten wählen: ") ;_ end of entsel ) ;_ end of car ) ;_ end of setq (progn (setq chk (cdr (assoc 0 (entget ent)))) (if (/= chk "INSERT") (princ "\nKein Block, noch einmal!") ) ;_ end if CHK ) ;_ end of progn (princ "\nNICHTS gewählt, noch einmal!") ) ;_ end of if "INSERT" ) ;_ end of /= ) ;_ end of while (setq bname (cdr (assoc 2 (entget ent)))) ;Blockname (setq bwinkel (cdr (assoc 50 (entget ent)))) ;Blockwinkel ;Auswahlsatz: gleicher Blockname (setq blk_list (ssget "_X" (list (cons 0 "INSERT")(cons 2 bname)))) ;Liste nicht leer (if blk_list (progn (setq zaehler 0) ;Liste durchlaufen (repeat (sslength blk_list) (progn (setq edaten (entget (ssname blk_list zaehler))) (if (equal (cdr(assoc 50 edaten)) bwinkel stellen) ;"ähnlicher" Blockwinkel = fast gleiche Blockdrehung (progn ;Extrusionsrichtung setzen = orthogonale Drehung (setq edaten (subst '(210 0.0 -1.0 0.0) ;für B_R90!! (assoc 210 edaten) edaten ) ) ;Transformation OKS - WKS ;(trans Blockeinfügepunkt Objektkoordinatensystem Weltkoordinatensystem) ;OKS=Element-Name, WKS=0, BKS=1, DKS=2 ;mit jedem a in (c?r) verschwindet ein Klammerpaar UND die anderen Elemente der GLEICHEN Verschachtelungs-Ebene ;mit jedem d verschwindet ein Element (setq xkoo (car (trans (cdr (assoc 10 edaten)) (cdr (assoc -1 edaten)) 0))) ;x-Koordinate nach Transformation (setq ykoo (cadr (trans (cdr (assoc 10 edaten)) (cdr (assoc -1 edaten)) 0))) ;y-Koordinate nach Transformation (setq ykoo (* -1 ykoo)) ;erforderliche Umrechnung y-Koordinate wegen (210 0.0 -1.0 0.0) (setq zkoo (caddr (trans (cdr (assoc 10 edaten)) (cdr (assoc -1 edaten)) 0))) ;z-Koordinate nach Transformation (setq edaten (subst (list 10 xkoo zkoo ykoo) (assoc 10 edaten) edaten ) ) (entmod edaten) ) ;progn ) ;if (setq zaehler (1+ zaehler)) ) ;progn ) ;repeat ) ;progn ) ;if (princ (strcat "\n" (itoa zaehler) " Blöcke ausgerichtet!")) (princ) ) ;end of BlockExtrusion_Z
Das sollte es für dieses Problem gewesen sein! Aus meiner Sicht funktioniert es. Vielen Dank für deine zielführenden Tipps und ein schönes Wochenende Archi [Diese Nachricht wurde von archi.archi am 29. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |