AutoCAD... AutoLISP... VisualLISP...

  [66] O prawie rysowaniu...

index  

  bowiem opowiem teraz o rysowaniu "na niby"... czyli o wyświetlaniu wektorów na ekranie. Służą do tego dwie funkcje: grdraw - rysująca w aktualnej rzutni wektor pomiędzy dwoma punktami, oraz grvecs - rysująca wiele wektorów. Teraz szerzej będzie o tej pierwszej: funkcja posiada cztery argumenty z czego ostatni jest argumentem opcjonalnym i może zostać pominięty. Dwa pierwsze to punkty 2 lub 3D, definiują one początek i koniec wektora, a podawane są w aktualnym UCS. Trzeci argument to kolor wyświetlanego wektora, przy czym jeśli ma wartość -1, wektor jest rysowany w kolorze XOR - czyli kolorem tzw. dopełniającym w stosunku do innych elementów. Umożliwia to zawsze widoczne rysowanie linii na obiektach rysunkowych. Czwarty opcjonalny argument funkcji grread to liczba całkowita różna od zera, określająca rysowanie wektora w trybie wyróżniania (linia kreskowa). Funkcja zawsze zwraca nil.
Do wymazywania wyświetlonych wektorów służy funkcja (bez argumentów): redraw
Właściwie są to dwa najważniejsze narzędzia służące do rysowania "na niby". Czy istnieje możliwość tak szybkiego rysowania wektora i jego szybkiego wymazywania aby spowodować złudzenie ruchu?

Od słów przechodzimy do czynów - poniżej zdefiniowane polecenie TESTUJLINIE, po wskazaniu obiektu rysunkowego typu LINE w trybie dynamicznym "przesuwa" obraz tej linii, wraz liniami łączącymi początki i końce tych linii. Funkcja wygląda tak:

;;; ===============================================================;
; Polecenie TESTUJLINIE jest przykladem dzialania funkcji grread   ;
; i grvecs do dynamicznego wyswietlania wskazanej linii            ;
;;; ===============================================================;
(defun C:TESTUJLINIE (/ en d p s e a drag ps pe c)
  (if
    (setq en (entsel "\nWybierz linię: "))
    (if
      (= "LINE"
        (cdr
          (assoc 0 (setq d (entget (car en))))
        )
      )
      (progn
        (setq p (osnap (cadr en) "_nea")
              s (trans (cdr (assoc 10 d)) 0 1)
              e (trans (cdr (assoc 11 d)) 0 1)
              a (angle s e)
              c (cdr (assoc 62 d))
        )
        (while
          (and 
            (setq drag (grread t 4 4)) 
            (= (car drag) 5) 
          )
          (redraw)
          (setq ps
            (polar
              (cadr drag)
              (+ pi a)
              (distance p s)
            )
                pe
            (polar
              (cadr drag)
              a
              (distance p e)
            )
          )
          (foreach %
            (list
              (list ps pe)
              (list ps s)
              (list pe e)
            )
            (grdraw
              (car %)
              (cadr %)
              (if (not c) 7 c)
              0
            )
          )
        )
      )
      (princ "\nTo nie jest linia! ")
    )
    (princ "\nNic nie wskazano. ")
  )
  (princ)
)
O ile za rysowanie i wymazywanie wektora odpowiedzialne są funkcje grdraw i redraw, pobieraniem współrzędnych punktów "pod kursorem" zajmuje się funkcja grread. Funkcja ta ze względu na swoje szerokie możliwości wymaga osobnego pełnego omówienia, teraz zajmiemy się tylko możliwością pobrania współrzędnych z poruszającego się urządzenia wskazującego. Możliwość tę daje różny od nil pierwszy argument funkcji grread. Dwa następne argumenty odpowiadają za tryb dynamicznych przesunięc, sposób wyświetlania kursora, i wyświetlenie komunikatu błędu. Funkcja zwraca listę której pierwszy element określa typ danych wejścowych. Dla współrzędnych przesuwającego się kursora jest to kod 5, i warstość ta jest jednym z warunków pętli while, (drugim jest samo grread).
Podsumowując: Na podstawie współrzednych przesuwającego się dynamicznie kursora, wyliczane są "nowe" współrzędne a na ich podstawie rysowane (i wymazywane) są trzy wektory... i to tyle... ;)
      aktualizacja: 14-05-2010