Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  3D-Blockdrehung GC10+210 mittels trans

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  3D-Blockdrehung GC10+210 mittels trans (1354 mal gelesen)
archi.archi
Mitglied



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 77
Registriert: 08.10.2010

Windows 10
AutoCAD 2023
Revit 2023

erstellt am: 26. Sep. 2017 15:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Blockdrehung.dwg

 
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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 26. Sep. 2017 16:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 77
Registriert: 08.10.2010

Windows 10
AutoCAD 2023
Revit 2023

erstellt am: 27. Sep. 2017 16:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Blockdrehung.dwg

 
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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 27. Sep. 2017 16:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 77
Registriert: 08.10.2010

Windows 10
AutoCAD 2023
Revit 2023

erstellt am: 27. Sep. 2017 21:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 77
Registriert: 08.10.2010

Windows 10
AutoCAD 2023
Revit 2023

erstellt am: 29. Sep. 2017 11:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 29. Sep. 2017 12:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 77
Registriert: 08.10.2010

Windows 10
AutoCAD 2023
Revit 2023

erstellt am: 29. Sep. 2017 13:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz