AutoLISP

(Nie)rysowanie

Krótki opis i prosty przykład programowego rysowania w AutoCAD-zie, bez tworzenia obiektów. Zatem jest to rodzaj pewnego rysowania, ale (po pierwsze) ulotnego, oraz (po drugie) nie w rysunku tylko na ekranie AutoCAD-a. Po trzecie (w końcu) rysowanie tylko wektorów – czyli jedynie odcinków określonych dwoma punktami.

Poniżej jako prosty przykład kod definicji polecenia TEMC , którego działanie widać na powyższej animacji. Do rysowania wektorów w aktualnej rzutni służą funkcje AutoLISP grdraw (wektor pomiędzy dwoma punktami), oraz grvecs (wiele wektorów). Tutaj została użyta tylko grdraw. Do odczytywania wartości z urządzenia wskazującego (tutaj współrzędnych podczas przeciągania kursora), służy funkcja grread. Ma ona także jeszcze inne zastosowanie – potrafi także odczytywać wartości klawiszy klawiatury. Odczytana współrzedna ekranu wykorzystywana jest do obliczenia w czasie rzeczywistym współrzędnych 48 punktów pomiędzy którymi rysowane są wektory, służące do aproksymacji okręgu (w rzeczywistości rysowany jest wielokąt foremny). Dla bardziej dokładnego odwzorowanie łuku czy okręgu trzeba użyc więcej punktów, co oczywiście spowalnia cały proces. Poniżej kod definicji polecenia TEMC:


; ----------------------------------------------------------------------- ;
(defun C:TEMC (/ e d p r c a l s)
  (if 
    (setq e (entsel "\nWybierz okrąg: ")) 
    (if 
      (= "CIRCLE" 
        (cdr (assoc 0 
          (setq d (entget (car e)))) 
        )
      ) 
      (progn 
        (setq p (cdr (assoc 10 d))
              r (cdr (assoc 40 d))
              c (cdr (assoc 62 d))
        )
        (while 
          (and 
            (setq s (grread t 13 0)) 
            (= (car s) 5) 
          ) 
          (redraw) 
          (setq a (cd:CAL_Sequence 0.0 48 (/ pi 24))
                l (mapcar
                     '(lambda (%)(polar (cadr s) % r))
                     a
                   )
                l (append (list (last l)) l) 
          )
          (while
            (/= (length l) 1)
            (grdraw
              (car l)
              (cadr l)
              (if (not c) 7 c)
              0
            )
            (setq l (cdr l)) 
          )
        )
      )
      (princ "\nTo nie jest okrąg.") 
    ) 
    (princ "\nNic nie wskazano. ") 
  ) 
  (princ) 
)
; ------------------------------------------------------------------------ ;

Ponieważ kursor jest dynamicznie przeciagany, wymagane jest aby przy każdorazowej zmianie współrzędnych (czyli narysowaniu okręgu) nastąpiło wymazanie poprzedniego.Dokonuje tego funkcja redraw. Mała zmiana w kodzie, polegająca na wyłączeniu tej funkcji, pokazuje w jaki sposób działa teraz polecenie TEMC.

Poniżej widać efekt – podczas przesuwania kursora na ekranie rysowane są okręgi, w każdym „przechwyconym” przez grread punkcie. Na koniec polecenie REGEN (albo REDRAW) pozwala je usunąć:

Wykorzystywanie grread oraz funkcji rysujących w aktywnej rzutni, nie jest pozbawione pewnych wad. Zasadniczą – brak jest trybów lokalizacji podczas przeciągania. Oznacza to że nie jest możliwe przecyzyjne określanie punktów w odniesieniu do rzeczywistych obiektów w rysunku. Oczywiście można stosować funkcję osnap, jednak w trakcie działania grread nie są one dynamicznie widoczne. Z tego powodu najlepiej jest stosować ten mechanizm raczej do wskazywania kierunku, niż określonego punktu. Istnieje w sieci kilka rozwiązań tego problemu, z programowo tworzonymi procedurami imitującymi standardowe tryby lokalizacji.

Poniżej przykłady zastosowania podobnego do omawianego tutaj sposobu wizualnego wyznaczania kierunku, oraz ilości obiektów w dwóch rodzajach szyku (prostokątnym i na zakładkę) w aplikacji służącej do projektowania terenów zieleni:

Do obliczania współrzednych wielokata odwzorujacego okrąg użyta jest tutaj funkcja o nazwie cd:CAL_Sequence która jest częścią biblioteki CADPL-Pack, a została już tutaj omówiona we wpisie Ciąg arytmetyczny. Oczywiście wymagane jest aby biblioteka była wcześniej wczytana.

To jest #216 wpis na blogu

( . . . )

2 uwagi do wpisu “(Nie)rysowanie

Dodaj komentarz

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.