biuro@zwcad.pl

Przykład 1

Koniec tego teoretyzowania :-). W tej "lekcji" zrobimy coś praktycznego. Przykład, którym się posłużę, będzie prosił użytkownika o wskazanie punktu, a następnie w miejscu wskazanym wstawiony zostanie krzyżyk opisujący współrzędne, X i Y.

p1 cel

Kod rysujący taki znaczek wyglądałby następująco:

  1. (vl-load-com)
  2. (setq *ZCApp* (vlax-get-zwcad-object))
  3. (setq *ActiveDocument* (vla-get-activedocument *ZCApp*))
  4. (setq *MSpace* (vla-get-modelspace *ActiveDocument*))
  5. (defun FullGetpoint (startPoint promp DefVal / ans outVal )
  6. (if startPoint
  7. (setq ans(vl-catch-all-apply 'getpoint (list startPoint promp ))) ; Wskaż punkt, z uwzględnieniem punku początkowego
  8. (setq ans(vl-catch-all-apply 'getpoint (list promp ))) ; Wskaż punkt
  9. )
  10. (if (not(vl-catch-all-error-p ans)) ;warunek sprawdzający czy nie wystąpił błąd we wskazywaniu punku
  11. (progn
  12. (if ans ;Warunek sprawdzający czy został wskazany prawidłowy punkt
  13. (setq outVal ans) ; Zwrócona zostanie lista współrzędnych wskazanego punktu
  14. (setq outVal DefVal) ; Zwrócona zostanie wartość domyślna
  15. )
  16. )
  17. (setq outVal nil) ; zwrócona zostanie pusta wartość
  18. )
  19. outVal
  20. )
  21. (defun C:Krzyz ( / P0 P0v Wysokosc TextX TextXEnt TextY TextYEnt TextBBox textwidth)
  22. (setq P0 (FullGetpoint nil "Wskaż punkt" nil))
  23. (setq P0v (vlax-3d-point P0))
  24. (setq Wysokosc 5)
  25. (if P0
  26. (progn
  27. (setq TextX (vla-addtext *MSpace* (rtos (car P0) 2 2) P0v Wysokosc)) ;dodaje tekst
  28. (setq TextXEnt(entget(vlax-vla-object->ename TextX)))
  29. (setq TextBBox (textbox TextXEnt))
  30. (setq textwidth (caar(cdr TextBBox ))) ;Oblicza szerokość tekstu
  31. (vlax-invoke-method TextX 'Move P0v (vlax-3d-point(list (+ (car P0) (* 0.2 Wysokosc )) (+ (cadr P0) (* 0.2 Wysokosc )) (+ (caddr P0) (* 0.1 Wysokosc ))))) ; Przesuwa punkt
  32. (vla-addline *MSpace* (vlax-3d-point (list (- (car P0) (+ textwidth (* 0.2 Wysokosc ))) (cadr P0) (caddr P0))) ;Tworzy linię
    (vlax-3d-point (list (+ (car P0) (+ textwidth (* 0.2 Wysokosc ))) (cadr P0) (caddr P0))))
  33. (vla-addline *MSpace* (vlax-3d-point (list (car P0) (+ (cadr P0) (+ textwidth (* 0.2 Wysokosc ))) (caddr P0)))
    (vlax-3d-point (list (car P0) (- (cadr P0) (+ textwidth (* 0.2 Wysokosc ))) (caddr P0))))
  34. (setq TextY (vla-addtext *MSpace* (rtos (cadr P0) 2 2) P0v Wysokosc))
  35. (vlax-invoke-method TextY 'Move P0v (vlax-3d-point(list (+ (car P0) (* 0.2 Wysokosc )) (+ (cadr P0) (* 0.2 Wysokosc )) (+ (caddr P0) (* 0.1 Wysokosc )))))
  36. (vlax-invoke-method TextY 'Rotate P0v (/ pi -2.0))
  37. )
  38. )
  39. (command "regen")
  40. (print )
  41. )

  • Linie 1-4 są podstawą, najlepiej zapisać sobie to w szablonie i każdy tworzony plik lispa zaczynać od tych linii.
  • Linie 5-20 to funkcja prosząca użytkownika o wskazanie punktu. Zawiera obsługę sytuacji wyjątkowych jak wciśnięcie klawisza [ESC]. Jeśli użytkownik wciśnie [ENTER] zostanie zwrócona domyślna wartość (trzeci parametr wywołania funkcji).
  • Linie 21 - 41 Główna funkcja rysująca znacznik
  • Linia 27 Tworzony jest nowy obiekt - tekst jednowierszowy.
    (rtos (car P0) 2 2) pobiera współrzędną X wskazanego punktu. Jest to liczba. Natomiast do tworzenia tekstu potrzebna jest nam zmienna typu tekst. Konwersji liczby rzeczywistej na tekst można dokonać funkcją rtos. Jej parametrami wywołania są trzy liczby: Pierwsza to wartość jaką chcemy zamienić. Druga to system w którym chcemy wyświetlić, gdzie 2 oznacza system dziesiętny. Trzecia to ilość miejsc po przecinku, do których chcemy zaokrąglić. Po takiej zamianie mamy wartość, która będzie wyświetlana, kolejne parametry to współrzędne punktu wstawienia takiego tekstu oraz wysokość tekstu.
  • Wielkość znaku krzyża, czyli długości linii tworzących znak możemy ustawić na stałe. Na potrzeby tego przykładu postanowiłem że długość tych linii zależna będzie od szerokości tekstu, czyli pokreślony zostanie cały napis, niezależnie od tego, ile znaków będzie miał tekst. Szerokość tekstu możemy poznać na dwa sposoby. Pierwszy sposób dotyczy jedynie tekstów jednowierszowych i jest to funkcje textbox. Inny to GetBoundingBox, ale o niej porozmawiamy innym razem
  • Linia 29 "mierzy" szerokość tekstu jednowierszowego. Jej parametrem jest nazwa obiektu (zwracana przez entget). Funkcja zwraca dwuelementową listę, na podstawie której, możliwe jest określenie wysokości i szerokości tekstu.
  • Linia 28 Zmienia teksty typu obiekt na nazwę obiektu, która jest potrzebna do funkcji textbox
  • Linia 31 Gdyby tekst leżał dokładnie na linii czyli we współrzędnych wskazanych przez użytkownika byłoby to mało czytelne, dlatego podniesiemy nasz napis odrobinę, a dokładnie to o 1/5 wysokości napisu i przesuniemy go w prawo.
  • Linia 32, 33 Tworzą linie, których współrzędne początku i końca są odsunięte w poszczególnych kierunkach o szerokość tekstu.
  • Linie 34-41 Dodają ostatni tekst, określający współrzędną y. Tekst ten również jest przesuwany, żeby nie pokrywać się z linią a następnie obracany jest o 90 stopni, aby unaocznić że dotyczy to współrzędnej y.