AutoLISP

Obroty 3D / Rotate3D

Tworzenie modelu trójwymiarowego dowolnego obiektu staje się dziś już powszechną praktyką. Niemniej nadal duża część projektów wykonywana jest w tradycyjny sposób – jako obiekty dwuwymiarowe. W branży architektonicznej i budowlanej są to zwykle rzuty, przekroje i elewacje. Na ich podstawie można zbudować całkowicie trójwymiarowy model projektowanego obiektu. W praktyce wszystkie konieczne rzuty i widoki trzeba umieścić na płasczyźnie, a następnie ustawić je odpowiednio w przestrzeni. Pozwala to poprzez rzutowanie w dowolnym kierunku na kontrolę tworzonego modelu 3D. Zwykle najlepiej jest tworzyć bloki z poszczególnych widoków, aby potem w całości je obracać w przestrzeni. Widać to na animacji poniżej:

W AutoCAD do manipulacji obiekami w przestrzeni służą polecenia ROTATE3D i MIRROR3D. Jednak aby wyeliminować zbędne klikanie, polegajace na wskazywaniu punktów, wyborze obiektów itd. napisałem proste makro aby zautomatyzować ten proces. Ogólnym przyjętym założeniem jest obrót wskazango obiektu (tutaj zawsze wstawienia bloku) o 90 stopni w płaszczyżnie prostopadłej do płaszczyzny konstruktyjnej definicji bloku. Rzecz jasna płaszczyzna ta przechodzi przez punkt bazowy (wstawienia) bloku. Zdefiniowane polecenie BLR3 przy każdorazowym wskazaniu bloku obraca go o 90 stopni:

Kod makra jest krótki i stosunkowo prosty, a wygląda tak:


; ----------------------------------------------------------------------- ;
; by kojacek 2023/2024
(defun C:BLR3 (/ %e %o %i %s)
  (if
    (and
      (setq %e
        (car
          (entsel "\nSelect section to rotate:")
        )
      )
      (=
        (cdr (assoc 0 (entget %e)))
        "INSERT"
      )
    )
    (progn
      (setq %o (vlax-ename->vla-object %e)
            %i (vlax-get %o "InsertionPoint")
            %s (mapcar '+ %i (list 0 1 0))
      )
      (cd:SYS_UndoBegin)
      (vla-rotate3d %o
        (vlax-3d-point %i)
        (vlax-3d-point %s)
        (* 0.5 pi)
      )
      (cd:SYS_UndoEnd)
    )
    (princ "\nWrong selected - it is not a block.")
  )
  (princ)
)
; ------------------------------------------------------------------------ ;

Ponieważ obrót bloku wykonywany jest wokół osi, której pierwszy punkt jest punktem wstawienia, (a drugi przesuniety o jedną jednostkę w osi X), ważnym jest aby blok został wcześniej poprawnie zdefiniowany. Istotną rzeczą jest określenie punku bazowego (wstawienia). Punkt ten definiuje oś obrotu bloku. Po ustawieniu bloku w przestrzeni trójwymiarowej, od tego punktu zależą wartości poziomów:

Kilka słów o przestrzeniach 2D i 3D napisałem wcześniej już tu: Zrozumieć 3D : kod 210 – następny krok, oraz wcześniej TUTAJ. Także w wielu innych wpisach poruszyłem tematy dotyczace modelowania trójwymiarowego.

To jest #217 wpis na blogu

( . . . )