VBA dla AutoCAD-a -- kurs dla początkujących 1
Część I -- Pobieranie danych 2
Lekcja 1 -- Pobieranie danych od użytkownika -- część 1 (metody Getxxx) -- kontrola wprowadzonych danych -- Initialize User Input 2
Metoda Prompt 2
GetKeyword 3
GetString 4
GetInteger 5
GetReal 6
GetPoint 6
Lekcja 2 -- Pobieranie danych od użytkownika -- część 2 (metody Getxxx) 7
GetCorner 7
GetDistance 8
GetAngle 9
GetOrientation 10
GetEntity 10
GetSubEntity 12
Linia 13
Rysowanie polilinii 18
Rysowanie okręgu 23
Rysowanie elipsy 25
Rysowanie łuku 26
Kreskowanie 31
Tworzenie tekstu 39
Część III -- Płaskie elementy złożone 42
Obliczanie odległości pomiędzy dwoma punktami 42
Rysowanie trójkąta 45
Rysowanie prostokąta 49
Metoda PROMPT - rysowanie stopy (linia) 52
Modyfikowanie obiektów 57
Warstwy AutoCAD-a w VBA 63
Zbiory wskazań w VBA 67
Wymiarowanie w VBA w AutoCAD-zie 73
Instrukcje warunkowe 78
Tworzenie własnych funkcji 85
Widoki 88
Bloki 92
Menu w VBA w AutoCAD-zie 96
Jedną z wielkich innowacji wprowadzonych wraz z wersją 14. AutoCAD-a była możliwość pisania makr i aplikacji z wykorzystaniem Visual Basic for Applications, zwanym potocznie VBA.
W AutoCAD-zie 2000 jest to już pełnoprawny członek rodziny języków programowania, w których możemy pisać aplikacje pod AutoCAD-a. Kurs ten, podobnie jak i kurs z programowania okien dialogowych jest napisany specjalnie dla Wydawnictwa Helion, nie jest więc opisem zmagań projektanta nad tworzeniem jakiejś aplikacji, ale spójnym zestawem lekcji, gdzie każda następna korzysta z wiedzy zdobytej na lekcji poprzedniej. Lekcje te nie są też zbiorem wiedzy encyklopedycznej. Każde zagadnienie jest wytłumaczone w oparciu o przykłady, które można wykorzystać podczas pisania własnych aplikacji. Kursy te są również spłatą "moralnego długu" zaciągniętego przeze mnie, gdy zakupiłem pierwsze dwie książki Wydawnictwa Helion dotyczące programowania w AutoLisp-ie. Teraz ja oddaję Wam do rąk narzędzie, dzięki któremu jedynym, co tak naprawdę będzie Was ograniczać podczas pracy w AutoCAD-zie, będzie Wasza wyobraźnia.
Na marginesie dodam, że zamieszczone w tekście przykłady programów są nienaturalnie "połamane". Musieliśmy tak zrobić ze względu na ograniczenia jakie narzuca publikacja długich linii tekstu na stronach internetowych a co za tym idzie na łamach serwisu. Wszystkie zamieszczone przykłady są dostępne w pełnej formie w postaci plików DVB.
Wszystkie metody pobierania danych przez AutoCAD-a wymagają od użytkownika interakcji z wykorzystaniem rysunku lub linii poleceń. Jeżeli chcemy korzystać z tych metod w trakcie pracy z programem w VBA, który zawiera formularze, musimy na czas korzystania z tych metod ukryć formularz VBA. Dzieje się tak dlatego, iż w Autocad-zie w wersji 2000 zaimplementowany jest Visual Basic w wersji 5.0, w którym formularze są tzw. modalne, co oznacza, że podczas gdy są one aktywne, nie ma możliwości korzystania w Autocad-zie z ekranu graficznego ani linii poleceń (modalne są również okna dialogowe DCL). Wszystkie funkcje do pobierania informacji noszą potoczną nazwę Getxxx.
Przykład ukrywania formularza VBA na czas pobrania od użytkownika informacji:
Private Sub cmdGetReal_click ()
Dim dblinput As Double
Me.Hide
DblInput = ThisDrawing.Utility.GetReal("Podaj wartość typu Real: ")
Me.Show
End Sub
Należy pamiętać o tym, aby po ukryciu formularza VBA na czas pobierania od nas danych, ponownie go wyświetlić, ponieważ w przeciwnym przypadku może się okazać, że w tym formularzu znajduje się jeszcze kod programu, który nie zostanie wykonany, ponieważ program zakończył przedwcześnie swoje działanie.
Metoda Prompt służy do wyświetlania informacji w linii poleceń AutoCAD-a. Metoda ta nie zwraca wartości.
Składnia tej funkcji wygląda następująco: object.Prompt Message
Powyższe przykłady ilustrują sposób wykorzystania metody Prompt:
Przykład nr 1:
Public Sub Przykład_Prompt()
' funkcja sub deklaruje nazwę, argumenty i kod,
' który tworzy procedurę SUB
ThisDrawing.Utility.Prompt VbCr & "To jest przykładowa wiadomość"
' wyświetlenie informacji w linii poleceń AutoCAD-a,
' VbCr - znak powrotu karetki
End Sub ' zakończenie procedury sub
Rys. 1 Działanie metody Prompt
Przykład nr 2:
Sub Przykład_Prompt()
ThisDrawing.Utility.Prompt vbCr & "Wciśnij dowolny klawisz..."
Metoda GetKeyword służy do pobierania od użytkownika słowa kluczowego.
Składnia tej funkcji wygląda następująco: object.GetKeyword([Prompt])
AutoCAD zatrzymuje się w oczekiwaniu na wybór użytkownika. Parametr prompt określa łańcuch tekstowy, jaki zostaje wyświetlony w linii poleceń AutoCAD-a przed tym, jak zatrzymał się on w oczekiwaniu na wybór słowa kluczowego. Parametr Prompt jest parametrem opcjonalnym. Wprowadzony przez użytkownika łańcuch tekstowy nie może być dłuższy niż 511 znaków. Jeżeli nic nie zostanie wpisane i będzie wciśnięty klawisz Enter, jako wartość zwrotna zostanie zwrócony łańcuch pusty "". Można tego uniknąć poprzez wywołanie metody InitializeUserInput z parametrem 1, który na to nie pozwala.
InitializeUserInput 1, "[Opcja1] [Opcja2] [Opcja3]"
Listę akceptowanych słów kluczowych uzyskujemy poprzez wywołanie metody InitializeUserInput . Jeżeli użytkownik wpisze wyraz nie będący słowem kluczowym, AutoCAD wyświetla komunikat o błędzie i próbuje jeszcze raz, ponownie wyświetlając zachętę (jeśli takowa została określona).
Sub Przykład_GetKeyword1()
'Deklaracja nazwy nowej procedury
'Deklaracja zmiennej ListaSłówKluczowych jako zmienna
'typu String zmienna ta będzie przechowywała listę słów
'kluczowych
Dim ListaSłówKluczowych As String
'Przypisanie zmiennej ListaSłówKluczowych listy trzech
'dostępnych opcji
ListaSłówKluczowych = "Szerokość Wysokość Głębokość"
'ustalenie akceptowalnych słów kluczowych poprzez wywołanie
'metody InitializeUserInput Bits[, Keyword] gdzie:
'Bit = 1 = nie zezwala na wprowadzenie pustego łańcucha ""
ThisDrawing.Utility.InitializeUserInput 1, ListaSłówKluczowych
'Zachęta do wybrania słowa kluczowego,
'słowa kluczowe można wybrać również poprzez wybór
'mnemonika.
'W tym wypadku są to litery S W G
Dim ZwróconaWartość As String
ZwróconaWartość = ThisDrawing.Utility.GetKeyword _
("Wybierz opcję (Wysokość)(Szerokość)(Głębokość): ")
MsgBox "Wybrałęś " & ZwróconaWartość, , "Przykład GetKeyword 1"
Wskazówka:
Aby program stał się bardziej przyjazny użytkownikowi, w linii poleceń można umieścić wartość domyślną, która zostanie wybrana, jeżeli użytkownik wciśnie Enter.
Sub Przykład_GetKeyword2()
'nazwy nowej procedury
'ustalenie akceptowalnych słów kluczowych poprzez
'wywołanie metody InitializeUserInput Bits[, Keyword]
'gdzie:
ThisDrawing.Utility.InitializeUserInput 0, "Linia Okrąg Łuk"
(vbCrLf & "Enter an option (Linia/Okrąg/): ")
If keyWord = "" Then ZwróconaWartość = "Łuk"
MsgBox "Wybrałeś " & ZwróconaWartość, , "Przykład GetKeyword 2"
Metoda GetString służy do pobierania od użytkownika danych w postaci tekstu.
Składnia tej funkcji wygląda następująco: object.GetString (HasSpaces[, Prompt])
AutoCAD zatrzymuje się w oczekiwaniu na wprowadzenie przez użytkownika danych w postaci tekstu (string). Parametr HasSpaces określa, czy wprowadzany tekst może zawierać spacje. Jeżeli parametr HasSpaces ma wartość Prawda, łańcuch tekstowy może zawierać spacje i aby zakończyć wprowadzanie tekstu, musimy wcisnąć klawisz Enter. Jeżeli parametr HasSpaces ma wartość False, to wprowadzanie tekstu kończy wciśnięcie zarówno klawisza Enter, jak i klawisza Spacja. Jeżeli użytkownik wpisze więcej niż 132 znaki, wprowadzanie tekstu będzie kontynuowane aż do wciśnięcia Entera lub Spacji (jeśli parametr HasSpaces ma wartość Prawda), ale jako wynik zwracane są tylko 132 znaki. Parametr Prompt jest parametrem opcjonalnym i służy do wyświetlenia zachęty do wprowadzenia danych.
Przykład obrazujący różne sposoby pobierania od użytkownika wartości tekstowych.
Sub Przykład_GetString()
'Deklaracja nazwy procedury
Dim returnString As String
'returnString służącej do
'przechowywania łańcucha znaków
returnString = ThisDrawing.Utility.GetString _
(False, "Wpisz tekst (spacja lub
kończy wprowadzanie danych): ")
'przypisanie zmiennej returnString wartości
' będącej wynikiem działania metody GetString
MsgBox "Wpisano tekst:'" & returnString & "'", ,
"Przykład metody GetString "
'wykorzystanie okna informacyjnego do
'wyświetlenia pobranego tekstu. Tekst
'zachęty i wprowadzony tekst może zawierać spacje
(True, "Wisz tekst ( kończy wprowadzanie danych):")
MsgBox "Wpisano tekst'" & returnString & "'", ,
" Przykład metody GetString "
'Tekst zachęty i wprowadzony tekst może
'zawierać spacje ale nie może zawierać
'pustego łańcucha znaków
Dim NieZero As Integer
'Deklaracja zmiennej nie zero jako Integer
NieZero = 1
'przypisanie zmiennej NieZero wartości 1
ThisDrawing.Utility.InitializeUserInput NieZero
'użycie metody InitializeUserInput do określenia,
'że łańcuch pusty nie zostanie zaakceptowany ponieważ
'ThisDrawing.Utility.InitializeUserInput = NieZero = 1
(True, " Wpisz tekst ( kończy
wprowadzanie danych): ")
'będącej wynikiem działania metody GetString
MsgBox "The string entered was '" & returnString &
"'", , "GetString Example"
'wykorzystanie okna informacyjnego do wyświetlenia
'pobranego tekstu.
'Tekst zachęty
'zakończenie procedury Przykład_GetString
Metoda GetInteger służy do pobierania od użytkownika liczby całkowitej z zakresu -32,768 to +32,767.
Składnia tej funkcji wygląda następująco: object.GetInteger([Prompt])
AutoCAD zatrzymuje się w oczekiwaniu na podanie przez użytkownika liczby całkowitej. Parametr prompt jest parametrem opcjonalnym i określa tekst zachęty wyświetlanej w linii poleceń AutoCAD-a.
Jeśli zamiast liczby całkowitej zostanie zwrócone słowo kluczowe, AutoCAD wygeneruje informacje o błędzie.
Przykład
Sub Przykład_GetInteger1()
'W tym przykładzie wyświetlona zostanie liczba
'całkowita pobrana od użytkownika
'Deklaracja zmiennej returnInt jako zmienna typu
'integer, będzie ona wykorzystywana do
'przechowywania wartości liczby całkowitej pobranej
'od użytkownika
Dim returnInt As Integer
'Zwrócenie wartości pobranej od użytkownika.
'Prompt jest parametrem opcjonalnym.
'Wyświetla zachętę w linii poleceń AutoCAD-a.
'Składnia: object.GetInteger([Prompt])
returnInt = ThisDrawing.Utility.GetInteger
("Podaj liczbę całkowitą: ")
MsgBox "Podana liczbę całkowita to: " & returnInt
& vbCrLf & _ "(Podaj następną liczbę bez zachęty.)", ,
"Przykład GetInteger"
returnInt = ThisDrawing.Utility.GetInteger()
...
mgkmagic