Vba Dla Autocad
-
Upload
mateusz-witkowski -
Category
Documents
-
view
311 -
download
20
Transcript of Vba Dla Autocad
1
Podstawy programowania w VBA dla AutoCAD-a
Opracowano na podstawie „VBA dla AutoCAD-a”, Wyd. Helion, 2001
I. Część I -- Pobieranie danych 1. Lekcja 1 -- Pobieranie danych od uŜytkownika (metody Getxxx) -- część 1 2. Lekcja 2 -- Pobieranie danych od uŜytkownika (metody Getxxx) -- część 2
II. Część II -- Rysowanie obiektów płaskich 1. Lekcja 3 -- Linia 2. Lekcja 4 -- Polylinia 3. Lekcja 5 -- Okrąg, Elipsa, Łuk 4. Lekcja 6 -- Kreskowanie 5. Lekcja 7 -- Tekst
III. Część III -- Płaskie elementy złoŜone 1. Lekcja 8 -- Obliczanie odległości pomiędzy dwoma punktami 2. Lekcja 9 -- Rysowanie trójkąta 3. Lekcja 10 -- Rysowanie prostokąta 4. Lekcja 11 -- Rysowanie stopy fundamentowej 5. Lekcja 12 -- Modyfikacje obiektów AutoCAD-a 6. Lekcja 13 -- Warstwy 7. Lekcja 14 -- Zbiory wskazań 8. Lekcja 15 -- Wymiarowanie 9. Lekcja 16 -- Instrukcje warunkowe 10. Lekcja 17 -- Tworzenie własnych funkcji 11. Lekcja 18 -- Widoki 12. Lekcja 19 -- Bloki 13. Lekcja 20 -- Menu w VBA w AutoCAD-zie
1 - Pobieranie danych od uŜytkownika
część 1 (metody Getxxx) - kontrola wprowadzonych danych
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 war to ść 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
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
2
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ład owa 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..." End Sub
GetKeyword
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 zmie nna 'typu String zmienna ta b ędzie przechowywała list ę słów 'kluczowych Dim ListaSłówKluczowych As String 'Przypisanie zmiennej ListaSłówKluczowych listy tr zech '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.
3
'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" End Sub
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 Dim ListaSłówKluczowych As String 'ustalenie akceptowalnych słów kluczowych poprzez 'wywołanie metody InitializeUserInput Bits[, Keywo rd] 'gdzie: 'Bit = 1 = nie zezwala na wprowadzenie pustego ła ńcucha "" ThisDrawing.Utility.InitializeUserInput 0, "Linia Okr ąg Łuk" ZwróconaWarto ść = ThisDrawing.Utility.GetKeyword _ (vbCrLf & "Enter an option (Linia/Okr ąg/): ") If keyWord = "" Then ZwróconaWarto ść = "Łuk" MsgBox "Wybrałe ś " & ZwróconaWarto ść, , "Przykład GetKeyword 2" End Sub
GetString
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
4
'zach ęty i wprowadzony tekst mo Ŝe zawiera ć spacje returnString = ThisDrawing.Utility.GetString _ (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 returnString = ThisDrawing.Utility.GetString _ (True, " Wpisz tekst ( ko ńczy wprowadzanie danych): ") 'przypisanie zmiennej returnString warto ści '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 End Sub 'zako ńczenie procedury Przykład_GetString
GetInteger
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])
5
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" 'Zwrócenie warto ści pobranej od u Ŝytkownika. returnInt = ThisDrawing.Utility.GetInteger() MsgBox " Podana liczb ę całkowita to: " & returnInt, , "Przykład GetInteger" End Sub
GetReal
Mtoda GetReal jest uŜywana do pobierania od uŜytkownika danych typu Double.
Składnia tej metody wygląda następująco: UtilityObject.GetReal([Prompt]) JeŜeli pobrana od uŜytkownika wartość jest liczbą typu Real, AutoCAD zwraca jej wartość, jeŜeli zaś nią nie jest, to AutoCAD wygeneruje informacje o błędzie Requires numeric values. Sub Przykład_GetReal() 'Ten przykład zwraca liczb ę rzeczywist ą p 'obran ą od u Ŝytkownika 'Deklaracja zmiennej, która b ędzie przechowywa ć 'pobran ą warto ść Dim returnReal As Double 'Zwraca warto ść podan ą przez u Ŝytkownika. 'Prompt, ła ńcuch tekstowy w 'cudzysłowie stanowi ący zach ęt ę do podania 'liczby rzeczywistej. returnReal = ThisDrawing.Utility.GetReal ("Wpisz liczb ę rzeczywist ą: ") MsgBox "Wpisałe ś liczb ę " & returnReal & vbCrLf & _ "(Nast ępną warto ść wprowad Ŝ bez zach ęty.)", , "Przykład metody GetReal" 'Zwrócenie warto ści pobranej od u Ŝytkownika. returnReal = ThisDrawing.Utility.GetReal( "Wpisz liczb ę rzeczywist ą: ") MsgBox "Wpisałe ś liczb ę " & returnReal & vbCrLf, , "Przykład metody GetReal" End Sub
GetPoint
Składnia: UtilityObject.GetPoint([Point][, Prompt]) Zwraca wartość typu Variant. Parametr Point jest parametrem opcjonalnym. AutoCAD zatrzymuje się w oczekiwaniu na podanie punktu przez uŜytkownika, jako wartość zwrotną zwraca wartość tego punktu. Parametr Point określa względny punkt bazowy w globalnym układzie współrzędnych. Parametr Point określa łańcuch tekstowy, który został wyświetlony przed zatrzymaniem się AutoCAD-a UŜytkownik moŜe określić punkt, podając współrzędne w bieŜącym układzie współrzędnych. GetPoint treats the Point parameter and the return value as three-dimensional points. UŜytkownik moŜe równieŜ wskazać punkt określając jego połoŜenie na ekranie graficznym. JeŜeli parametr Point jest określony, AutoCAD rysuje linię tymczasową od niego do bieŜącego połoŜenia kursora. Sub Przykład_GetPoint()
6
'Ten przykład zwraca punkt podany przez u Ŝytkownika. 'Deklaracja zmiennej do przechowywania warto ści 'punktu zwróconego przez AutoCAD-a. Dim returnPnt As Variant 'Zwrot warto ści Point returnPnt = ThisDrawing.Utility.GetPoint (, "Wska Ŝ punkt: ") MsgBox "WCS punkt: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2) & vbCrLf & _"(nast ępna warto ść bez zach ęty.)", , "Przykład GetPoint" 'zwraca punkt returnPnt = ThisDrawing.Utility.GetPoint MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "Przykład GetPoint" 'Zwraca punkt korzysta z punktu basePnt 'jako punktu bazowego Dim basePnt(0 To 2) As Double basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0# returnPnt = ThisDrawing.Utility.GetPoint (basePnt, "Enter a point: ") MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2) 'Rysuje lini ę od punktu bazowego do ostatniego 'punktu podanego przez u Ŝytkownika Dim lineObj As AcadLine Set lineObj = ThisDrawing.ModelSpace.AddLine (basePnt, returnPnt) ZoomAll End Sub
2 - Pobieranie danych od uŜytkownika
część 2 (metody Getxxx)
GetCorner
Metoda GetCorner słuŜy do pobierania od uŜytkownika naroŜników prostokąta
Składnia tej funkcji wygląda następująco: object.GetCorner(Point[, Prompt]) AutoCAD zatrzymuje działanie w oczekiwaniu na wskazanie przez uŜytkownika naroŜnika prostokąta poprzez wybranie dowolnego punktu w globalnym układzie współrzędnych. UŜytkownik moŜe równieŜ wskazać lokalizację tego punktu bazowego poprzez wybranie dowolnego punktu na ekranie graficznym. AutoCAD rysuje wtedy dynamiczny prostokąt, zaczepiony we wskazanym punkcie bazowym i w miejscu, gdzie w danej chwili znajduje się kursor programu, aby ułatwić uŜytkownikowi wskazanie drugiego naroŜnika. Prostokąt jest rysowany w Globalnym układzie współrzędnych w płaszczyźnie XY. Gdy do wskazania punktów zostało wykorzystane urządzenie wskazujące (np. mysz ), współrzędna Z obu punktów jest ignorowana, a współrzędnej Z zostaje przypisana bieŜąca wartość zmiennej systemowej poziom (elevation). Parametr Point określa połoŜenie punktu bazowego prostokąta w przestrzeni 3D w globalnym układzie współrzędnych. Parametr ten jest wymagany. Parametr Prompt określa łańcuch tekstowy, jaki AutoCAD wyświetla w linii poleceń jako zachętę dla uŜytkownika do wprowadzenia danych. Parametr Prompt jest opcjonalny. Przykład działania metody GetCorner
7
Zostaje pobrany od uŜytkownika punkt bazowy, a następnie zostaje wyświetlona zachęta (opcjonalna) do wskazania drugiego punktu. Sub Example_GetCorner() 'zmienna zostanie wykorzystana do 'przechowywania warto ści 'zwrotnej metody Dim returnPnt As Variant 'zmienna wykorzystana do przechowania 'punktu bazowego Dim basePnt(0 To 2) As Double 'Zadeklarowanie zmiennej typu Double basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0# 'Zach ęta dla u Ŝytkownika do 'wskazania drugiego punktu. returnPnt = ThisDrawing.Utility.GetCorner (basePnt, "Wska Ŝ naro Ŝnik: ") 'Wy świetlamy drugi punkt wskazany 'przez u Ŝytkownika. MsgBox "Wskazano punkt " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "Przykład GetCorner" End Sub
GetDistance
Pobiera odległość pomiędzy dwoma punktami.
Składnia: Object.GetDistance([Point][, Prompt]) AutoCAD zatrzymuje się w oczekiwaniu na wprowadzenie danych przez uŜytkownika liniowej odległości i zwraca jej wartość. Parametr Point określa punkt bazowy w Globalnym Układzie Współrzędnych. Parametr Prompt określa łańcuch tekstowy, jaki AutoCAD wyświetla w linii poleceń jako zachętę dla uŜytkownika do wprowadzenia danych. Oba Parametry Point i Prompt są opcjonalne. UŜytkownik moŜe określić odległość, wpisując jej wartość w bieŜącym formacie jednostek, jak teŜ poprzez wskazanie dwóch punktów na ekranie graficznym. AutoCAD tworzy tymczasową linię od pierwszego punktu do pozycji, w jakiej znajduje się kursor. JeŜeli parametr Point jest określony, AutoCAD traktuje go jako pierwszy z dwóch wskazywanych punktów. Parametry Point i Prompt nie są wymagane. NiezaleŜnie od metody wykorzystanej do określenia odległości, zawsze zwracana jest wartość typu Double. Przykład Sub Przykład_GetDistance() 'Przyład działania metody GetDistance Dim returnDist As Double Dim basePnt(0 To 2) As Double basePnt(0) = 0#: basePnt(1) = 0#: basePnt(2) = 0# 'zwraca warto ść podan ą podan ą przez u Ŝytkownika. returnDist = ThisDrawing.Utility.GetDistance (, "Enter distance: ") MsgBox "Podana odległo ść " & returnDist & vbCrLf & _"(Podaj odległo ść bez zach ęty.)", , "Przykład GetDistance" 'zwraca warto ść podan ą podan ą przez u Ŝytkownika. returnDist = ThisDrawing.Utility.GetDistance() MsgBox "Podana odległo ść " & returnDist, , "Przykład GetDistance" 'zwraca warto ść podan ą podan ą przez u Ŝytkownika. returnDist = ThisDrawing.Utility.GetDistance (basePnt, "Podaj odległo ść: ") MsgBox "Podana odległo ść " & returnDist, , "Przykład GetDistance" End Sub
8
GetAngle
Metoda GetAngle słuŜy do pobierania od uŜytkownika wartości kąta. Składnia tej funkcji
wygląda następująco: Object.GetAngle([Point][, Prompt]) AutoCAD zatrzymuje się na czas pobrania od uŜytkownika wartości kąta i przypisuje ją jako wartość zwrotną do tego kąta. Parametr Point określa punkt bazowy kąta w trójwymiarowym globalnym układzie współrzędnych. Parametr Prompt określa łańcuch tekstowy, jaki AutoCAD wyświetla w linii poleceń jako zachętę dla uŜytkownika do wprowadzenia danych. Oba Parametry Point i Prompt są opcjonalne. UŜytkownik moŜe określić kąt poprzez wpisanie wartości w bieŜącym formacie pomiaru kątów. Kąt moŜna jeszcze określić, wskazując na ekranie graficznym dwa punkty. Po wskazaniu pierwszego AutoCAD prowadzi z niego tymczasową linię do miejsca, w którym znajduje się kursor. JeŜeli podany jest parametr Point, AutoCAD traktuje go jako jeden z punktów do wskazania. Kąt mierzony jest w płaszczyźnie XY globalnego układu współrzędnych (GetAngle ignoruje współrzędną Z). NiezaleŜnie od metody uŜytej do podania kąta, GetAngle zwraca wartość powrotną do wartości kąta wyraŜonego w radianach. Kierunek mierzenia kąta jest zawsze kierunkiem przeciwnym do ruchu wskazówek zegara. Kierunek zerowy kąta jest zaleŜny od bieŜących ustawień zmiennej systemowej ANGBASE.
Rys. 1
Przykład Sub Przykład_GetAngle() 'Przykład ten demonstruje cztery ró Ŝne sposoby na 'zmierzenie k ąta przy pomocy metody GetAngle Dim retAngle As Double 'Deklaracja zmiennej retAngle 'Zwraca k ąt w radianach, w cudzysłowie 'zach ęta do wpisania k ąta retAngle = ThisDrawing.Utility. GetAngle(, "Podaj k ąt: ") MsgBox "Podany k ąt wynosi " & retAngle, , "Przykład metody GetAngle " 'Zwraca k ąt w radianach, brak zach ęty retAngle = ThisDrawing.Utility.GetAngle() MsgBox " Podany k ąt wynosi " & retAngle, , " Przykład GetAngle " 'Zwraca k ąt w radianach, z tekstem zach ęty 'i punktem bazowym Dim basePnt(0 To 2) As Double basePnt(0) = 2#: basePnt(1) = 2#: base Pnt(2) = 0# retAngle = ThisDrawing.Utility.GetAngle (basePnt, "Podaj k ąt: ") MsgBox " Podany k ąt wynosi " & retAngle, , "Przykład GetAngle" 'Zwraca k ąt w radianach, retAngle = ThisDrawing.Utility.GetAngle(basePnt) MsgBox " Podany k ąt wynosi " & retAngle, , "Przykład GetAngle " End Sub
9
GetOrientation
Metoda GetOrientation słuŜy do pobierania od uŜytkownika wartości kąta. Składnia:
GetOrientation([Point][, Prompt]) AutoCAD zatrzymuje się na czas pobrania od uŜytkownika wartości kąta i przypisuje ją jako wartość zwrotną do tego kąta. Parametr Point określa punkt bazowy kąta w trójwymiarowym globalnym układzie współrzędnych. Parametr Prompt określa łańcuch tekstowy, jaki AutoCAD wyświetla w linii poleceń jako zachętę dla uŜytkownika do wprowadzenia danych. Oba Parametry Point i Prompt są opcjonalne. NiezaleŜnie od metody uŜytej do podania kąta, GetOrientation zwraca wartość powrotną do wartości kąta wyraŜonego w radianach. Kierunek mierzenia kąta jest zawsze kierunkiem przeciwnym do ruchu wskazówek zegara. Kierunek zerowy kąta jest niezaleŜny od bieŜących ustawień zmiennej systemowej ANGBASE. Tym samym kąt zerowy jest zawsze "na godzinie trzeciej". Przykład Sub Przykład_GetOrientation1() 'Przykład ilustruje pobieranie kierunku od 'u Ŝytkownika trzema ró Ŝnymi sposobami Dim retOrientation As Double 'Zwrócona zostaje warto ść kierunku 'w radianach retOrientation = ThisDrawing.Utility.GetOrientatio n _ (, "Wska Ŝ kierunek: ") MsgBox "Kierunek to " & retOrientation & vbCrLf & _ "(wska Ŝ nast ępny ju Ŝ bez zach ęty.)", , "Przykład GetOrientation " End Sub Sub Przykład_GetOrientation2() Dim retOrientation As Double ' Zwrócona zostaje warto ść kierunku w radianach retOrientation = ThisDrawing.Utility.GetOrientatio n() MsgBox "Kierunek to " & retOrientation, , "Przykład GetOrientation" End Sub Sub Przykład_GetOrientation3() Dim retOrientation As Double 'Zwraca kierunek w radianach z zach ęt ą 'i punktem bazowym Dim basePnt(0 To 2) As Double basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0# retOrientation = ThisDrawing.Utility.GetOrientatio n (basePnt, "Wska Ŝ kierunek: ") MsgBox "Kierunek to " & retOrientation, , "Przykład GetOrientation" End Sub
GetEntity
Metoda GetEntity słuŜy do pobierania przez uŜytkownika obiektu AutoCAD-a poprzez wskazania na ekranie graficznym.
Składnia tej funkcji wygląda następująco: Object.GetEntity Object, PickedPoint[, Prompt] JeŜeli obiekt zostanie wskazany, to w pierwszym parametrze zostaje zwrócona jego wartość, a drugi parametr będzie zawierał punkt wskazany w Globalnym Układzie współrzędnych. Dzięki metodzie GetEntity moŜna uzyskiwać dostęp do obiektów, które nie są widoczne na ekranie, gdyŜ znajdują się na zamroŜonej warstwie. Przykład
10
Sub Przykład_GetEntity() 'Przykład ten tworzy kilkana ście obiektów 'w przestrzeni modelu. 'Nast ępnie u Ŝytkownik jest proszony 'o wskazanie którego ś z nich 'Działanie przykładu zostaje przerwane, 'gdy u Ŝytkownik wska Ŝe puste miejsce. 'Tworzy obiekt typu xray (prosta) Dim rayObj As AcadRay Dim basePoint(0 To 2) As Double Dim SecondPoint(0 To 2) As Double basePoint(0) = 3#: basePoint(1) = 3#: basePoint(2) = 0# SecondPoint(0) = 1#: SecondPoint(1) = 3#: SecondPoint(2) = 0# Set rayObj = ThisDrawing.ModelSpace.AddRay (basePoint, SecondPoint) ' Rysuje polilini ę w przestrzeni modelu Dim plineObj As AcadLWPolyline Dim points(0 To 5) As Double points(0) = 3: points(1) = 7 points(2) = 9: points(3) = 2 points(4) = 3: points(5) = 5 Set plineObj = ThisDrawing.ModelSpace.AddLight WeightPolyline(points) plineObj.Closed = True 'Tworzy lini ę w przestrzeni modelu Dim lineObj As AcadLine Dim startPoint(0 To 2) As Double Dim endPoint(0 To 2) As Double startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 endPoint(0) = 2: endPoint(1) = 2: endPoint(2) = 0 Set lineObj = ThisDrawing.ModelSpace.AddLine (startPoint, endPoint) ' Tworzy okr ąg w przestrzeni modelu Dim circObj As AcadCircle Dim centerPt(0 To 2) As Double Dim radius As Double centerPt(0) = 20: centerPt(1) = 30: centerPt(2) = 0 radius = 3 Set circObj = ThisDrawing.ModelSpace.AddCircle (centerPt, radius) ' Tworzy elips ę w przestrzeni modelu Dim ellObj As AcadEllipse Dim majAxis(0 To 2) As Double Dim center(0 To 2) As Double Dim radRatio As Double center(0) = 5#: center(1) = 5#: center(2) = 0# majAxis(0) = 10: majAxis(1) = 20#: majAxis(2) = 0# radRatio = 0.3 Set ellObj = ThisDrawing.ModelSpace.AddEllipse (center, majAxis, radRatio) ZoomAll ' Rozpoczynamy wskazywanie obiektów Dim returnObj As AcadObject Dim basePnt As Variant On Error Resume Next ' oczekiwanie na wybór obiektu przez u Ŝytkownika RETRY: ThisDrawing.Utility.GetEntity returnObj, basePnt, "Wska Ŝ obiekt" If Err <> 0 Then Err.Clear MsgBox "Good Bye.", , "Przykład GetEntity" Exit Sub Else returnObj.Color = acRed returnObj.Update MsgBox "The object type is: " & returnObj.Entity Name, ,
11
"Przykład GetEntity" returnObj.Color = acByLayer returnObj.Update End If GoTo RETRY End Sub
GetSubEntity
Składnia tej funkcji wygląda następująco: object.GetSubEntity Object, PickedPoint,
TransMatrix, ContextData[, Prompt] JeŜeli obiekt zostanie wskazany, to w pierwszym parametrze zostaje zwrócona jego wartość, a drugi parametr będzie zawierał punkt wskazany w Globalnym Układzie współrzędnych. Dzięki metodzie GetEntity moŜna uzyskiwać dostęp do obiektów, które nie są widoczne na ekranie, gdyŜ znajdują się na zamroŜonej warstwie. Parametr prompt jest opcjonalny. Parametr określa współrzędne punktu wskazanego przez uŜytkownika w globalnym układzie współrzędnych. Parametr TransMatrix jest to macierz opisująca wskazany obiekt. Parametr ContexData to tablica identyfikatorów podobiektów w wybranym obiekcie. Przykład Sub Przykład_GetSubEntity() 'U Ŝytkownik zostaje poproszony o wskazanie 'obiektu na ekranie poprzez wskazanie przyciskiem 'myszy oraz zwraca informacje o wybranym obiekcie Dim Object As Object Dim PickedPoint As Variant, TransMatrix As Variant, ContextData As Variant Dim HasContextData As String On Error GoTo NOT_ENTITY TRYAGAIN: MsgBox "Wska Ŝ kursorem obiekt na rysunku po zamkni ęciu tego okna _ dialogowego." 'Pobranie informacji o wybranym obiekcie ThisDrawing.Utility.GetSubEntity Object, PickedPoi nt, TransMatrix, ContextData 'Przetwarzanie I wy świetlenie informacji HasContextData = IIf(VarType(ContextData) = vbEmpty, " nie ma ", " ma ") MsgBox "Wskazałe ś obiekt: " & TypeName(Object) & vbCrLf & _ "Wskazany punkt : " & PickedPoint(0) & ", " & _ PickedPoint(1) & ", " & _ PickedPoint(2) & vbCrLf & _ "Ten obiekt" & HasContextData & "zawiera podobiekty." Exit Sub NOT_ENTITY: 'je Ŝeli wska Ŝesz puste miejsce na rysunku 'lub nie wska Ŝesz obiektu, 'zostanie wy świetlony nast ępuj ący 'komunikat bł ędu If MsgBox("Nie wskazałe ś obiektu. Wci śnij Ok aby spróbowa ć ponownie.", _ vbOKCancel & vbInformation) = vbOK Then Resume TRYAGAIN End If End Sub
12
3 - Linia
Dzisiejsza lekcja będzie poświęcona tworzeniu linii w AutoCAD-zie z wykorzystaniem VBA.
W pierwszej części stworzymy program rysujący prosty odcinek linii pomiędzy dwoma dowolnymi punktami wskazanymi przez uŜytkownika na ekranie. W drugiej części stworzymy program rysujący prosty odcinek linii pomiędzy dwoma punktami o znanych współrzędnych.
W lekcji tej zapoznamy się bliŜej z:
• menadŜerem VBA • edytorem VBA • instrukcją Set
Wykorzystamy poznaną na wcześniejszych lekcjach metodę GetPoint do pobrania od uŜytkownika punktów początku i końca linii Część pierwsza - rysowanie linii między dwoma punktami wskazanymi przez uŜytkownika. Na początek kilka ogólnych informacji na temat tworzenia nowego programu w VBA.
KaŜdy program lub podprogram musi się zawierać pomiędzy dwoma liniami: Sub
[nazwa_programu] ([lista_argumentów]) - jest to linia definiująca początek nowej procedury oraz End Sub, która oznacza koniec bieŜącej procedury. Moim zdaniem, najszybciej moŜna rozpocząć tworzenie nowej procedury od wpisania w linii poleceń AutoCAD-a polecenia VBAMAN. Po wpisaniu tego polecenia i potwierdzeniu klawiszem Enter, powinno nam się ukazać okno dialogowe menadŜera VBA.
Rys. 1 Okno dialogowe menadŜera programów
Nowy projekt tworzymy klikając przycisk Nowy. W oknie menadŜera na liście dostępnych projektów pojawił się nowy projekt o nazwie ACADproject i połoŜeniu Global. Teraz moŜemy zapisać nasz projekt. W tym celu klikamy przycisk Zapisz jako ... i zapisujemy nasz projekt w dowolnym katalogu, nadając mu dowolną nazwę np. rys_linii1.dvb.
13
Rys. 2 Okno menadŜera projektów VBA z nowym projektem widocznym w polu Projekty
Po zapisaniu pliku projektu klikamy przycisk Edytor Visual Basic w menadŜerze VBA, co powoduje wyświetlenie okna edytora.
Rys. 3 . Okno edytora VBA w AutoCAD-zie
A więc nasza procedura rysująca linię w AutoCAD-zie rozpocznie się od zdefiniowania jej nazwy: Sub rysowanie_linii (). Następną rzeczą, na którą musimy zwrócić szczególną uwagę, jest zdefiniowanie zmiennych, jakie będą występowały w danej procedurze. Linia Dim Linia As AcadLine jest deklaracją nowego obiektu jako nowego obiektu AutoCAD-a. Następnie przechodzimy do zadeklarowania zmiennych, które będą przechowywały współrzędne początku i końca linii. Dim Pt1 As Variant - deklaracja zmiennej, która będzie przechowywała początek linii. Dim Pt2 As Variant - deklaracja zmiennej, która będzie przechowywała współrzędną punktu końcowego linii. Mając zadeklarowane zmienne, przystępujemy do pobrania punktów początku i końca linii od uŜytkownika za pomocą metody GetPoint, którą poznaliśmy w poprzednich lekcjach patrz: metody
pobierania danych). I tak dla pierwszego punktu będzie to: Pt1 =
14
ThisDrawing.Utility.GetPoint(, "Wskaz pierwszy punkt [Pt1]:"). Linia ta powoduje, Ŝe AutoCAD zgłosi zachętę do wskazania pierwszego punktu (tektst znajdujący się w
cudzysłowie). Analogicznie dla punktu drugiego: Pt2 = ThisDrawing.Utility.GetPoint(,
"Wskaz drugi punkt [Pt2]:") Mamy juŜ pobrane i przypisane do zmiennych Pt1 i Pt2
współrzędne punktu początku i końca linii, moŜemy więc przystąpić do jej narysowania. Aby narysować linię wykorzystamy instrukcję Set do skojarzenia odwołania do obiektu
ze zmienną. Set Linia = ThisDrawing.ModelSpace.AddLine(Pt1, Pt2) - w przestrzeni modelu rysowany jest odcinek linii od punktu Pt1 do punktu Pt2. I na koniec dodajemy linię End Sub, która kończy naszą procedurę. Zapisujemy nasz projekt, wybierając z menu górnego edytora VBA File-->Save lub za pomocą klawiszy Ctrl+S.
Rys. 4 Zapisywanie pliku projektu w edytorze VBA w AutoCAD-zie
Przechodzimy teraz do testowania napisanej przez nas procedury. W tym celu zamykamy edytor VBA i w AutoCAD-zie w linii poleceń wpisujemy VBARUN i potwierdzamy Enterem. Wyświetli się okno dialogowe Makra, w którym wybieramy wśród makr dostępnych na liście nazwę naszego makra, po czym klikamy przycisk Uruchom.
Rys. 5 Okno dialogowe Makra z widocznym plikiem projektu
15
Po uruchomieniu procedury rysowania linii, w linii poleceń AutoCAD-a zostanie wyświetlona zachęta do wskazania na ekranie punktu początkowego rysowanej linii.
Rys. 6 Linia poleceń AutoCAD-a z zachętą do wskazania punktu
Po wskazaniu pierwszego punktu w linii poleceń pojawi się zachęta do wskazania na ekranie punktu końcowego.
Rys. 7 Linia poleceń AutoCAD-a z zachętą do wskazania na ekranie drugiego punktu
Po wskazaniu obu punktów zostanie narysowany między nimi prosty odcinek linii. Część druga - rysowanie linii pomiędzy dwoma punktami o zadanych współrzędnych Przyjmijmy załoŜenia zgodne z tym, co widzimy na poniŜszym rysunku. Mamy za zadanie narysować linię łączącą te punkty.
Rys. 8 Współrzędne punktów: Pt1 (10,10,0) Pt2(20,30,0)
Zwróćcie Państwo uwagę na to, Ŝe wypisałem wszystkie trzy współrzędne, czyli
Pt1(x1,y1,z1) oraz Pt2(x2,y2,z2), pomimo tego, Ŝe korzystając ze standardowych
narzędzi rysunkowych pominęlibyśmy współrzędną Z obu punktów. Na potrzeby Visual Basica musimy się przyzwyczaić do trochę odmiennej pracy ze współrzędnymi
• pt1(0) = 10# 'x współrzędna pt1 • pt1(1) = 10# 'y współrzędna pt1 • pt1(2) = 0# 'z współrzędna pt1 • pt2(0) = 20# 'x współrzędna pt2 • pt2(1) = 30# 'y współrzędna pt2
16
• pt2(2) = 0# 'z współrzędna pt2
Pisanie programu, tak jak w części pierwszej, rozpoczynamy od zdefiniowania za
pomocą instrukcji Sub nowej procedury Sub RysLinii_1 () Następnie deklarujemy
potrzebne zmienne:
Dim Linia As AcadLine ' Deklaracja zmiennej linia jako obiektu AutoCAD-a
Dim Pt1(0 To 2) As Double 'Deklaracja zmiennej Pt1 (punkt początkowy linii)
Dim Pt2 (0 To 2) As Double 'Deklaracja zmiennej Pt2 (końcowy linii)
'Punkty
Pt1(0) = 10# ' Współrzędne X pierwszego punktu
Pt1(1) = 10# ' Współrzędne Y pierwszego punktu
Pt1(2) = 0# ' Współrzędne Z pierwszego punktu
Pt2(0) = 20# ' Współrzędne X drugiego punktu
Pt2(1) = 30# ' Współrzędne Y drugiego punktu
Pt2(2) = 0# ' Współrzędne Z drugiego punktu Po czym moŜemy uŜyć instrukcji, która narysuje w przestrzeni modelu linię łączącą oba punkty.
Set Linia = ThisDrawing.ModelSpace.AddLine(Pt1, Pt2)
End Sub 'kończy procedurę. Obie metody rysowania linii lub jakiegokolwiek obiektu AutoCAD-a wykorzystuje się w trochę innych sytuacjach. Np. rysowanie pomiędzy punktami wskazanymi na ekranie wykorzystuje się w AutoCAD-zie podczas pisania programów wymagających duŜej interakcji z uŜytkownikiem. Rysowanie linii pomiędzy dwoma punktami o zadanych współrzędnych najczęściej wykorzystujemy w programach, gdzie punkty te uzyskaliśmy w toku wcześniejszych obliczeń w tym programie.
4 - Polilinia
Rysowanie polilinii
Celem dzisiejszej lekcji jest napisanie programu, rysującego kątownik nierównoramienny w postaci zamkniętej polilinii. W lekcji tej zapoznamy się bliŜej z:
• rysowaniem polilinii z poziomu VBA • wykorzystaniem metody SetBulgle do zaokrąglania wierzchołków polilinii
Wykorzystamy poznaną we wcześniejszych lekcjach metodę GetPoint do pobrania od uŜytkownika punktu początkowego polilinii
17
Rys. 1
Dane tego kątownika: H = 60 S = 40 t = 6 g = 6 r = 6 r1 = 3 Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. MoŜemy teŜ uruchomić go z menu górnego: Narzędzia -> Makro-> Makra. W oknie dialogowym wpisujemy nazwę nowego makra: ZmierzOdległość i klikamy przycisk Utwórz.
Rys. 2
Wyświetli się kolejne okno dialogowe, które pozwala nam na dołączenie naszego makra do istniejącego rysunku lub Projektu.
18
Rys. 3
Z listy wybieramy Rysunek (nasze makro będzie dzięki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostało dołączone do bieŜącego rysunku i został uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien się znajdować kod naszego makra. Jak dotychczas, składa się on zaledwie z dwóch linijek - początkowej i końcowej. Teraz musimy pomiędzy tymi dwoma liniami umieścić kod naszego makra.
Rys. 4 Okno interfejsu VBA w AutoCAD-zie z widocznym kodem makra katownik
Sub katownik() - deklarujemy nową procedurę. Kolejnym krokiem jest zadeklarowanie
zmiennych dla poszczególnych wymiarów kątownika. Dim h As Double Dim s As Double Dim t As Double Dim g As Double Dim r As Double Dim r1 As Double
Deklarujemy zmienną pt1, którą wykorzystamy do przechowywania współrzędnych punktu początkowego.
Dim pt1 As Variant Deklarujemy zmienną pkt, która posłuŜy nam do przechowywania współrzędnych wierzchołków polilinii.
Dim pkt(0 To 17) As Double Korzystając z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujący się w cudzysłowie pojawi się w linii poleceń jako zachęta do wskazania pierwszego punktu.
Punkt1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Punkt wstawienia: ") Przypisanie wartości do zmiennych: h = 60 s = 40
19
t = 6 g = 6 r = 6 r1 = 3
Deklarujemy zmienną newPline jako nowy obiekt AutoCAD-a (polilinia, którą będziemy tworzyć w oparciu o podane wcześniej dane).
Dim newPline As AcadLWPolyline Przypisanie wartości współrzędnych punktu początkowego (uzyskaliśmy go wcześniej korzystając z metody GetPoint) do współrzędnych pierwszego wierzchołka polilinii. pkt(0) = punkt1(0) 'X1 pkt(1) = punkt1(1) 'Y1
Obliczamy teraz pozostałe wierzchołki polilinii:
Rys. 5
pkt(2) = pkt(0) + s 'X2 wsp. pkt(3) = pkt(1) 'Y2 pkt(4) = pkt(2) 'X3 pkt(5) = pkt(3) + (t - r1) 'Y3 pkt(6) = pkt(4) - r1 'X4 pkt(7) = pkt(1) + t 'Y4 pkt(8) = pkt(0) + g + r 'X5 pkt(9) = pkt(1) + t 'Y5 pkt(10) = pkt(8) - r 'X6 pkt(11) = pkt(9) + r 'Y6 pkt(12) = pkt(10) 'X7 pkt(13) = pkt(1) + h - r1 Y7 pkt(14) = pkt(0) + g - r1 pkt(15) = pkt(1) + h pkt(16) = pkt(0) pkt(17) = pkt(15)
Po wyznaczeniu wierzchołków naszego kątownika przechodzimy do rysowania polilinii pomiędzy tymi wierzchołkami. Set newPline = ThisDrawing. ModelSpace.AddLightWeightPolyline(pkt) newPline.Closed = True 'zamkni ęcie polilinii
20
newPline.update 'od świe Ŝenie ekranu End Sub - 'linia ko ńcz ąca nasz ą procedur ę
Aby przetestować działanie naszego makra, wciskamy kombinację klawiszy Alt + Q, co powoduje zamknięcie edytora Visual Basic i powrót do AutoCAD-a. W linii poleceń wpisujemy VBARUN i wciskamy Enter. Pojawiło się nam okno dialogowe Makra z widoczną w nim nazwą makra Rysunek1.dwg!Module1.katownik. Klikamy przycisk Uruchom. W lini poleceń pojawia się zachęta do wskazania punktu na ekranie. Po wskazaniu tego punktu zostanie narysowany obiekt, widoczny na rysunku poniŜej.
Rys. 6
Mamy narysowany kątownik w postaci zamkniętej polilinii. Kolejnym krokiem jest zaokrąglenie niektórych segmentów polilinii. Wykorzystamy w tym celu metode SetBulgle.
Rys. 7
21
Wypukłość (Bulge) jest to tangens 1 kąta zawartego pomiędzy dwoma sąsiednimi wierzchołkami łuku (polilinii). Ujemna wartość oznacza, Ŝe łuk biegnie zgodnie ze wskazówkami zegara od wybranego wierzchołka do następnego wierzchołka na liście. JeŜeli wypukłość jest równa 0, oznacza to, Ŝe segment jest płaski. JeŜeli wypukłość jest równa 1, oznacza to, Ŝe segment jest półkolem. Wykorzystamy wzór:
Kąt zawarty = 90 stopni. Zamieniamy stopnie na radiany: 90 stopni = PI/2 radianów = 1,57076327 radianów Dim newBulge As Double newBulge = (Tan(1.570796327 / 4)) Call newPline.SetBulge(2, newBulge) 'promie ń wierzchołka numer 2 Call newPline.SetBulge(4, - newBulge) 'promie ń wierzchołka numer 4 Call newPline.SetBulge(6, newBulge) 'promie ń wierzchołka numer 6 newPline.update 'ponowne od świe Ŝenie ekranu End Sub
Po uruchomieniu naszego makra i podaniu punktu początkowego powinien zostać narysowany kątownik nierównoramienny widoczny na poniŜszym rysunku.
Rys. 9
Na tym kończymy naszą lekcję, której tematem było rysowanie polilinii w AutoCAD-zie z poziomu VBA.
5 - Okrąg, Elipsa, Łuk
Rysowanie okręgu
Okręgi moŜna rysować za pomocą kilku sposobów. Standardową metodą jest określenie środka i promienia okręgu. MoŜna równieŜ określić środek i średnicę, lub samą średnicę poprzez podanie dwóch punktów. Innym sposobem jest podanie trzech punktów, które wyznaczają obwód okręgu. Okrąg moŜna równieŜ narysować poprzez wskazanie trzech obiektów, do których ma być on styczny, lub przez podanie promienia i wskazanie dwóch obiektów, do których ma być on styczny.
22
Przykład 1 - Okrąg w oparciu o dane pobrane od uŜytkownika PoniŜszy przykład rysuje okrąg w oparciu o dane pobrane od uŜytkownika (środek i promień).
Rys. 1
Tworzenie programu rozpoczynamy od zdefiniowania nazwy nowej procedury Sub
rys_okrąg1(). Kolejnym krokiem jest zadeklarowanie zmiennych. Deklarujemy zmienne,
które będą przechowywały dane środka i promienia okręgu. Dim varSrodek As Variant Dim dblPromien As Double
Oraz deklarujemy zmienną objEnt jako nowy obiekt AutoCAD-a
Dim objEnt As AcadCircle Pobranie danych od uŜytkownika za pomocą GetPoint i GetDistance With ThisDrawing.Utility varSrodek = .GetPoint(, vbCr & "Wska Ŝ środek okr ęgu: ") dblPromien = .GetDistance(varSrodek, vbCr & "Pod aj promie ń: ") End With
Mamy juŜ zadeklarowane zmienne i przypisane do nich wartości, moŜemy więc przystąpić do narysowania okręgu. Aby narysować okrąg, wykorzystamy instrukcję Set do skojarzenia odwołania do obiektu ze zmienną. Rysowany jest okrąg o promieniu dblPromien i środku varSrodek.
Set objEnt = ThisDrawing.ModelSpace.AddCircle(varSrodek, dblPromien)
Na koniec odświeŜamy ekran objEnt.Update i kończymy naszą procedurę End Sub. Przykład 2 - Okrąg w oparciu o istniejące dane PoniŜszy przykład rysuje okrąg w oparciu o podane dane (środek i promień). Przykład Sub rysOkr ąg2() Dim ObOkrag As AcadCircle 'Deklaracja zmiennej jako obiekt AutoCAD-a Dim PtSrodek(0 To 2) As Double ' 'Deklaracja zmiennej dla punktu środka okr ęgu Dim dblPromien As Double 'Deklaracja zmiennej dla promienia 'Dane okr ęgu: PtSrodek(0) = 100# 'Współrz ędna X środka okr ęgu
23
PtSrodek(1) = 200# 'Współrz ędna Y środka okr ęgu PtSrodek(2) = 0# 'Współrz ędna Z środka okr ęgu dblPromien = 50# 'Warto ść promienia 'Tworzenie okr ęgu w przestrzeni modelu Set ObOkrag = ThisDrawing.ModelSpace.AddCircle (PtSrodek, dblPromien) 'Koniec procedury rysowania okr ęgu. End Sub
Rysowanie elipsy
Celem dzisiejszej lekcji jest stworzenie procedury rysującej elipsę w przestrzeni modelu w Autocad-zie. Na początek, dla przypomnienia kilka podstawowych danych na temat elipsy. Elipsa, zamknięta krzywa płaska, miejsce geometryczne punktów płaszczyzny, których suma odległości do dwóch wybranych punktów (tzw. ognisk elipsy) jest stała, dana jest równaniem (x/a)2+(y/b)2=1, gdzie a2- b2=c2, 2c - odległość między ogniskami, a - długość większej półosi elipsy, b - długość mniejszej półosi elipsy, c/a = e i nazywa się mimośrodem elipsy. Pole elipsy wynosi S = (ab)PI
Rys. 2
Pisanie procedury jak zwykle rozpoczniemy od zdefiniowania nazwy procedury Sub rys_elipsę () Następnie przejdziemy do zadeklarowania zmiennych.
Dim ellObj As AcadEllipse - delarujemy zmienną ellObj jako nowy obiekt AutoCAD-a
Dim majAxis(0 To 2) As Double - deklarujemy zmienną, która posłuŜy nam do
przechowywania informacji o większej osi elipsy.
Dim center(0 To 2) As Double - deklarujemy zmienną, która posłuŜy nam do
przechowywania współrzędnej środka elipsy.
Dim radRatio As Double - deklarujemy zmienną, która posłuŜy nam do przechowywania
informacji o stosunku większej i mniejszej półosi. Gdy mamy juŜ zadeklarowane dane, moŜemy do nich przypisać wartości. center(0) = 5#: center(1) = 5#: center(2) = 0#
24
majAxis(0) = 10: majAxis(1) = 20#: majAxis(2) = 0# radRatio = 0.3
Aby narysować elipsę, wykorzystamy instrukcję Set do skojarzenia odwołania do obiektu ze zmienną.
Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio)
End Sub kończy naszą procedurę.
Rysowanie łuku
Łuki moŜna rysować na kilka sposobów. Standardową metodą jest określenie trzech punktów - punktu początkowego, dowolnego punktu leŜącego na łuku i punktu końcowego. MoŜna określać równieŜ kąt rozwarcia, promień, kierunek i długość cięciwy łuku. Cięciwa to linia prosta łącząca końce łuku. AutoCAD, standardowo, rysuje łuki w kierunku przeciwnym do ruchu wskazówek zegara. W poniŜszych przykładach łuk zostanie narysowany w oparciu o punkt środkowy, promień, kąt początkowy oraz kąt końcowy. Przykład 1 - rysowanie łuku o zadanych parametrach. Środek łuku = (200,100,0) Promień = 80 Kąt początkowy = 30 stopni Kąt końcowy = 180 stopni
Rys. 3
Przechodzimy do tworzenia procedury rysującej łuk w AutoCAD-zie. Definiujemy nazwę
procedury Sub rys_luk1(). Przechodzimy teraz do deklaracji zmiennych: Dim objArc As Object 'Deklaracja zmiennych (Łuk jako obiekt AutoCAD-a) Dim PtSrodek(0 To 2) As Double 'Deklaracja zmiennych ( środek łuku) Dim dblPromien As Double 'Deklaracja zmiennych promie ń łuku Dim KatStartDeg As Double 'Deklaracja zmiennych kat w pkt start w stopniach Dim KatStartRad As Double 'Deklaracja zmiennych kat wpkt start w radianach Dim KatKoniecDeg As Double
25
'Deklaracja zmiennych kat w pkt ko ńcowym w stopniach Dim KatKoniecRad As Double 'Deklaracja zmiennych kat wpkt ko ńcowym w radianach
Przypisanie danych do zadeklarowanych zmiennych PtSrodek(0) = 200# 'Współrz ędna X środka łuku PtSrodek(1) = 100# 'Współrz ędna Y środka łuku PtSrodek(2) = 0# 'Współrz ędna Z środka łuku dblPromien = 80# 'Promie ń łuku KatStartDeg = 30# 'K ąt 30 stopni (k ąt pocz ątkowy łuku) KatKoniecDeg = 180# 'K ąt 180 stopni (k ąt ko ńcowy łuku)
Aby narysować łuk, potrzebne są nam wartości kąta początkowego i końcowego wyraŜone w radianach, a nie w stopniach. Zamieniamy stopnie na radiany korzystając ze wzoru: Kąt w radianach = (Kąt w stopniach * PI / 180) KatStartRad = KatStartDeg * 3.141592 / 180# 'Zamiana stopni na radiany KatKoniecRad = KatKoniecDeg * 3.141592 / 180# 'Zamiana stopni na radiany
Mając zadeklarowane dane oraz przypisane do nich wartości, a takŜe wartości kątów zamienione ze stopni na radiany, moŜemy przystąpić do rysowania łuku w oparciu o te dane.
Set objArc = ThisDrawing.ModelSpace.AddArc(PtSrodek, dblPromien, KatStartRad,
KatKoniecRad)
End Sub kończy naszą procedurę Rysowanie łuku przy wykorzystaniu danych pobranych od uŜytkownika W poniŜszym przykładzie potrzebne dane zostaną uzyskane za pomocą funkcji:
• środek łuku za pomocą funkcji GetPoint • promień za pomocą funkcji GetDistance (punktem odniesienia jest tu środek łuku) • kąt początkowy i końcowy za pomocą funkcji GetAngle.
Public Sub rys_łuk2() 'Zdefiniowanie nowej procedury Dim varCenter As Variant 'Deklaracja zmiennej dla środka łuku Dim dblRadius As Double 'Deklaracja zmiennej dla warto ści promienia łuku Dim dblStart As Double 'Deklaracja zmiennej dla k ąta pocz ątkowego Dim dblKoniec As Double 'Deklaracja zmiennej dla k ąta ko ńcowego Dim objEnt As AcadArc 'Deklaracja zmiennej jako nowy obiekt AutoCAD-a
Po dokonaniu deklaracji zmiennych przechodzimy do pobrania danych od uŜytkownika:
With ThisDrawing.Utility Pobranie za pomocą metody GetPoint współrzędnych środka łuku
26
varCenter = .GetPoint(, vbCr & "Wskaż środek łuku: ") Pobranie za pomocą metody GetDistance wielkości promienia łuku.
dblRadius = .GetDistance(varCenter, vbCr & "Podaj promień: ") Pobranie za pomocą metody GetAngle kąta początkowego łuku
dblStart = .GetAngle(varCenter, vbCr & "Podaj kąt początkowy: ") Pobranie za pomocą metody GetAngle kąta końcowego łuku
dblKoniec = .GetAngle(varCenter, vbCr & "Podaj kąt końcowy: ")
End With Po przypisaniu wartości do zmiennych przystępujemy do rysowania łuku w przestrzeni modelu
Set objEnt = ThisDrawing.ModelSpace.AddArc(varCenter, dblRadius, _ dblStart,
dblKoniec)
OdświeŜamy ekran objEnt.Update i kończymy procedurę End Sub
6 - Kreskowanie
Kreskowanie
Kreskowanie to wypełnianie wskazanych obszarów rysunku wzorami kreskowania.
Składnia: object.HatchStyle Rodzaje stylów kreskowania Styl Normalny - kreskuje wnętrze obszaru wyznaczonego przez obwiednię. Kreskowanie rozpoczyna się od obwiedni zewnętrznej do środka obszaru przeznaczonego do zakreskowania. JeŜeli wewnątrz obszaru przeznaczonego do zakreskowania zostanie zlokalizowana obwiednia wewnętrznej wyspy, to kreskowanie zostanie przerwane. JeŜeli wewnątrz wyspy będzie dodatkowa wyspa, to od obwiedni tej wyspy do następnej obwiedni wewnętrznej, kreskowanie zostanie wznowione
AcHatchStyleNormal
Rys. 1 Przykład stylu normalnego
Styl Skrajny - kreskuje tylko obszar ograniczony obwiednią zewnętrzną całego obszaru i pierwszą napotkaną obwiednią wewnętrzną.
acHatchStyleOuter
27
Rys. 2 Przykład stylu skrajnego
Styl Całkowity kreskuje cały obszar, ignorując wszystkie obwiednie wewnętrzne.
AcHatchStyleIgnore
Rys. 3 Przykład stylu całkowitego
Tworzenie nowej procedury rozpoczynamy, jak w poprzednich przykładach, od
zdefiniowania nowej procedury: Sub kreskowanie() Po jej zdefiniowaniu przystępujemy
do deklarowania zmiennych. Deklarujemy obiekt hatchObj jako nowy obiekt AutoCAD-a.
Dim hatchObj As AcadHatch Deklarujemy zmienną patterName jako łańcuch tekstowy
Dim patternName As String Deklarujemy typ kreskowania jako zmienną typu Long
Dim PatternType As Long Deklarujemy zmienną bAssociativity jako zmienną typu boolean
28
Dim bAssociativity As Boolean Definiujemy kreskowanie, gdzie nazwa kreskowania to ANSI31, typ kreskowania 0, oraz Ŝe jest to kreskowanie skojarzone. patternName = "ANSI31" PatternType = 0 bAssociativity = True
Tworzymy nowe skojarzone kreskowanie w przestrzeni modelu
Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName,
bAssociativity) Tworzymy okrąg o promieniu 50 i środku w punkcie (5,3,0), który będzie naszą zewnętrzną granicą kreskowania.
Dim outerLoop(0) As AcadEntity Deklaracja zmiennej jako nowego obiektu AutoCAD-a
Dim center(0 To 2) As Double Deklaracja zmiennej środka okręgu jako Double
Dim radius As Double Deklaracja zmiennej promienia okręgu jako Double Przypisanie zadeklarowanej zmiennej środka okręgu wartości ( współrzędne środka = (5,3,0)
center(0) = 5: center(1) = 3: center(2) = 0 Przypisanie zmiennej promienia o wartości 50
radius = 50 Aby narysować okrąg, będący zewnętrzną granicą kreskowania, wykorzystamy instrukcję Set do skojarzenia odwołania do obiektu ze zmienną. Rysowany jest okrąg o promieniu radius i środku center. Set outerLoop(0) = ThisDrawing.ModelSpace.AddCircle (center, radius) With outerLoop(0)
Ustalenie grubości okręgu, który definiuje nam zewnętrzną granicę kreskowania na równą 35
outerLoop(0).Lineweight = acLnWt035 Ustalenie koloru okręgu będącego zewnętrzną granicą kreskowania jako czerwony outerLoop(0).Color = acRed End With
Rys. 4 Zewnętrzna granica kreskowania
Dodanie granicy kreskowania do kreskowania
hatchObj.AppendOuterLoop (outerLoop) Ustalenie koloru kreskowania na kolor zielony
hatchObj.Color = acGreen
29
Rys. 5 Zewnętrzna granica kreskowania wraz z kreskowaniem
Tworzymy teraz kwadrat wewnątrz okręgu, który będzie pierwszą wewnętrzną granicą kreskowania. Deklarujemy zmienne dla wewnętrznej granicy kreskowania. Dim innerLoop1(0) As AcadEntity Dim innerLoop(0) As AcadEntity
Deklarujemy zmienną plineObj, jako obiekt AutoCAD-a - polilinia ta będzie wyznaczała pierwszą wewnętrzną granicę kreskowania (wyspę).
Dim plineObj As AcadLWPolyline Deklarujemy zmienną, która będzie przechowywać wartości współrzędnych wierzchołków polilini.
Dim points(0 To 9) As Double Współrzędna x i y pierwszego wierzchołka polilinii
points(0) = 35: points(1) = 33 Współrzędna x i y drugiego wierzchołka polilinii
points(2) = -25: points(3) = 33 Współrzędna x i y trzeciego wierzchołka polilinii
points(4) = -25: points(5) = -27 Współrzędna x i y czwartego wierzchołka polilinii
points(6) = 35: points(7) = -27 Współrzędna x i y pierwszego wierzchołka polilinii
points(8) = 35: points(9) = 33 Przypisanie polilinii do wewnęrznej granicy kreskowania
Set innerLoop(0) = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
30
Rys. 6 Polilinia wewnątrz okręgu, tworząca wewnętrzną granicę kreskowania
With innerLoop(0) Ustalenie grubości polilinii, która definiuje nam wewnętrzną granicę kreskowania na równą 35
innerLoop(0).Lineweight = acLnWt035 Ustalenie koloru polilinii, będącego wewnętrzną granicą kreskowania, jako czerwony innerLoop(0).Color = acRed End With
Dodanie obiektu do kreskowania
hatchObj.AppendInnerLoop (innerLoop) Tworzymy teraz okrąg wewnątrz kwadratu, który będzie drugą wewnętrzną granicą kreskowania Deklarujemy zmienne dla drugiej wewnętrznej granicy kreskowania.Deklaracja zmiennej drugiej wewnętrznej granicy kreskowania jako obiektu AutoCAD-a
Dim innerLoop2(0) As AcadEntity Przypisanie zmiennej promienia o wartości 20 (zmienna dla współrzędnej środka okręgu nie zmienia się)
radius = 20 Przypisanie okręgu jako drugiej wewnętrznej granicy kreskowania
Set innerLoop2(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)
31
Rys. 7 Okrąg (druga wewnętrzna granica kreskowania) wewnątrz kwadratu
With innerLoop2(0) Ustawienie wartości grubości na 35
innerLoop2(0).Lineweight = acLnWt035 oraz ustalenie koloru na czerwony innerLoop2(0).Color = acRed End With
Dodanie drugiej zewnętrznej granicy kreskowania do kreskowania.
hatchObj.AppendInnerLoop (innerLoop2) Ustawienie stylu kreskowania na Normal
hatchObj.HatchStyle = acHatchStyleNormal Przetwarzanie kreskowania
hatchObj.Evaluate Regeneracja rysunku
ThisDrawing.Regen True
32
Rys. 7 Obiekt z wyspami z kreskowaniem styl Normal Aby obiekt kreskowany był lepiej widoczny, wykonujemy przybliŜenie (zoom okno). Deklarujemy zmienną point1, która będzie przechowywać współrzędne pierwszego punktu okna
Dim point1(0 To 2) As Double Deklarujemy zmienną point2, która będzie przechowywać współrzędne drugiego punktu okna
Dim point2(0 To 2) As Double Przypisanie zmiennej point1 wartości współrzędnej (-60,60,0)
point1(0) = -60: point1(1) = -60: point1(2) = 0 Przypisanie zmiennej point2 wartości współrzędnej (60,60,0)
point2(0) = 60: point2(1) = 60: point2(2) = 0 Wykonywanie przybliŜenia zdefiniowanego oknem od punktu point1 do point2
ThisDrawing.Application.ZoomWindow point1, point2 Wyświetlenie okna informacyjnego
MsgBox "To jest styl kreskowania Normal", , "przykład stylu Normal"
Rys. 9 Okno informacyjne AutoCAD-a
Koniec procedury kreskowania
End Sub
7 - Tekst
Tworzenie tekstu
Podczas tworzenia tekstu w AutoCAD-zie kaŜda indywidualna linia tekstu jest odmiennym obiektem. Do tworzenia obiektu tekstowego wykorzystujemy metodę AddText. Metoda ta wymaga podania na wejściu trzech wartości: łańcucha tekstu (zmienna typu string), punktu wstawienia tekstu i wysokości tworzonego tekstu. Punkt wstawienia jest punktem w przestrzeni 3D AutoCAD-a, zdefiniowanym w globalnym układzie współrzędnych. Parametr wysokości tekstu jest liczbą dodatnią i jest mierzony w aktualnych jednostkach rysunkowych. Tekst jednowierszowy. Ten przykład tworzy linię tekstu w przestrzeni modelu, w punkcie
wstawienia o współrzędnych ( 2 , 2 , 0 ). Składnia: Set TextObject =
Object.AddText(TextString, InsertionPoint, Height) Przykładowa procedura tworząca tekst w przestrzeni modelu w oparciu o podane wartości Sub Tekst1() 'w pierwszej linii definiujemy nazw ę procedury Dim textObj As AcadText 'deklarujemy zmienn ą textObj jako obiekt AutoCAD-a. Dim textString As String 'deklarujemy zmienn ą tekst string jako zmienn ą typu ła ńcuch Dim insertionPoint(0 To 2) As Double 'deklarujemy zmienn ą insertionPoint jako zmienn ą typu double Dim height As Double 'definiujemy zmienn ą height jako zmienn ą typu double 'przypisujemy warto ści do zmiennych textString = "Kurs VBA - www.cad.pl"
33
' przypisanie ła ńcucha tekstu do zmiennej tekstString insertionPoint(0) = 100 ' Przypisanie warto ści współrz ędnej X punktu wstawienia tekstu insertionPoint(1) = 100 ' Przypisanie warto ści współrz ędnej Y punktu wstawienia tekstu insertionPoint(2) = 0 'Przypisanie warto ści współrz ędnej Z punktu wstawienia tekstu height = 2 'Przypisanie warto ści zmiennej height
Aby stworzyć tekst, wykorzystamy instrukcję Set do skojarzenia odwołania do obiektu ze zmienną. Set textObj = ThisDrawing.ModelSpace.AddText (textString, insertionPoint, height) textObj.Update 'od świe Ŝamy obiekt tekst End Sub 'ko ńczymy tworzenie procedury tworzenia tekstu
Rys. 1
Przykładowa procedura tworząca tekst w przestrzeni modelu w oparciu o wartości pobrane od uŜytkownika. Public Sub Tekst2() 'Definiujemy nazw ę procedury Dim varStart As Variant 'Deklarujemy zmienn ą varStart jako zmienn ą typu variant 'zmienna ta zostanie wykorzystana przechowywania 'współrz ędnych punktu wstawienia tekstu Dim dblHeight As Double 'Deklarujemy zmienn ą dblHeight jako zmienn ą typu double Dim strText As String 'Deklarujemy zmienn ą strText jako ła ńcuch Dim objEnt As AcadText 'Deklarujemy zmienn ą objEnt jako obiekt AutoCAD-a ' Pobranie informacji od u Ŝytkownika With ThisDrawing.Utility 'Pobranie od u Ŝytkownika punktu wstawienia tekstu varStart = .GetPoint(, vbCr & "Wska Ŝ punkt wstawienia: ") 'Pobranie od u Ŝytkownika wysoko ści tekstu dblHeight = .GetDistance (varStart, vbCr & "Podaj wysoko ść: ") 'Pobranie od u Ŝytkownika ła ńcucha znaków - 'tekstu, który ma by ć utworzony strText = .GetString(True, vbCr & "Wpisz tekst: ") End With 'tworzymy tekst w przestrzeni modelu, korzystamy z 'funkcji set do skojarzenia obiektu ze zmienn ą Set objEnt = ThisDrawing.ModelSpace.AddText (strText, varStart, dblHeight) objEnt.Update 'Od świe Ŝenie obiektu End Sub 'Koniec procedury
Efekt działania tej procedury widoczny jest na poniŜszym rysunku.
Rys. 2 Tekst utworzony za pomocą procedury tekst1
Przykładowa procedura tworząca tekst wielowierszowy w przestrzeni modelu
34
w oparciu o podane wartości
Składnia: Set MtextObject = Object.AddMText(InsertionPoint, Width, TextString) KaŜdy tekst w rysunku w AutoCAD-zie posiada stowarzyszony z nim styl. Podczas tworzenia tekstu, AutoCAD wykorzystuje aktualny styl tekstu do określenia rodzaju czcionki, rozmiaru, kąta pochylenia, orientacji i innych cech nowego stylu. Formatowanie tekstu moŜemy zmienić poprzez zmianę lub edycję stylu, w oparciu o który został on stworzony. Nie moŜna zmienić pojedynczych wyrazów lub znaków. MoŜna jednak utworzyć nowy styl tekstu dla pojedynczego wyrazu lub znaku. Sub Mtext1() 'definiujemy za pomoc ą funkcji Sub nazw ę nowej procedury Dim mtextObj As AcadMText 'deklarujemy zmienn ą mtextObj jako obiekt AutoCAD-a Dim insertPoint(0 To 2) As Double 'deklarujemy zmienn ą insertPoint jako zmienn ą typu double Dim width As Double 'deklarujemy zmienn ą width jako zmienn ą typu double Dim textString As String 'deklarujemy zmienn ą textString jako ła ńcuch, zmienna 'ta posłu Ŝy nam do przechowywania informacji o tek ście, 'który ma zosta ć utworzony. insertPoint(0) = 2 'przypisujemy warto ść współrz ędnej X punktu wstawienia insertPoint(1) = 2 'przypisujemy warto ść współrz ędnej Y punktu wstawienia insertPoint(2) = 0 'przypisujemy warto ść współrz ędnej Z punktu wstawienia width = 4 'podajemy wysoko ść tekstu textString = "Wydawnictwo Helion www.helion.pl." 'Pobranie od u Ŝytkownika ła ńcucha 'znaków - tekstu, który ma by ć utworzony 'tworzenie tekstu wielowierszowego w przestrzeni m odelu Set mtextObj = ThisDrawing.ModelSpace.AddMText (insertPoint, width, textString) End Sub
Rys. 3
Przykładowa procedura tworząca tekst wielowierszowy w przestrzeni modelu w oparciu o podane wartości Sub Mtext2() 'definiujemy za pomoc ą funkcji Sub nazw ę nowej procedury Dim varStart As Variant 'deklarujemy zmienn ą varStart jako zmienn ą typu variant Dim dblWidth As Double 'deklarujemy zmienn ą dblWidth jako zmienn ą typu double Dim strText As String 'deklarujemy zmienn ą textString jako ła ńcuch, zmienna 'ta posłu Ŝy nam do przechowywania informacji o tek ście, 'który ma zosta ć utworzony. Dim objEnt As AcadMText 'deklarujemy zmienn ą objEnt jako obiekt AutoCAD-a 'przyst ępujemy do pobierania informacji od u Ŝytkownika
35
With ThisDrawing.Utility 'przypisujemy zmiennej varStart współrz ędne punktu 'wstawienia tekstu pobranego od 'u Ŝytkownika za pomoc ą metody GetPoint. varStart = .GetPoint(, vbCr & "Wska Ŝ punkt wstawienia: ") 'przypisujemy zmiennej dblWidth warto ść szeroko ści 'tekstu wielowierszowego pobranego od 'u Ŝytkownika za pomoc ą funkcji GetDistance dblWidth = .GetDistance(varStart, vbCr & "Podaj szeroko ść tekstu: ") 'przypisujemy zmiennej strText warto ść w postaci 'tekstu, który ma zosta ć utworzony strText = .GetString(True, vbCr & "Enter the text: ") End With 'wprowadzamy formatowanie tekstu strText = "\Fromand.shx;\H0.5;" & strText 'tworzenie tekstu w przestrzeni modelu Set objEnt = ThisDrawing.ModelSpace.AddMText (varStart, dblWidth, strText) objEnt.Update End Sub
Rys. 4
8 - Obliczanie odległości pomiędzy dwoma punktami
Obliczanie odległości pomiędzy dwoma punktami
Celem dzisiejszej lekcji jest napisanie programu, obliczającego odległość pomiędzy dwoma wskazanymi przez nas punktami. W naszym przypadku są to punkty Pt1, Pt2 o współrzędnych Pt1 = (x1,y1,z1) Pt2 = (x2,y2,z2). W VBA współrzędne kaŜdego punktu reprezentowane są poprzez indeksy liczone od 0 do 2. A więc dla naszych dwóch punktów będą miały postać Pt1 = (Pt1(0), Pt1(1), Pt1(2)) Pt2 = (Pt2(0), Pt2(1), Pt2(2)). Ilustruje to rysunek zamieszczony poniŜej.
36
Rys. 1
Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. MoŜemy teŜ uruchomić go z menu górnego: Narzędzia -> Makro -> Makra. W oknie dialogowym wpisujemy nazwę nowego makra: ZmierzOdległość i klikamy przycisk Utwórz.
Rys. 2
Wyświetli się kolejne okno dialogowe, które pozwala nam na dołączenie naszego makra do istniejącego rysunku lub Projektu.
37
Rys. 3
Z listy wybieramy Rysunek (nasze makro będzie dzięki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostało dołączone do bieŜącego rysunku i został uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien się znajdować kod naszego makra. Jak dotychczas składa się on zaledwie z dwóch linijek - początkowej i końcowej. Teraz musimy pomiędzy tymi dwoma liniami umieścić kod naszego makra.
Rys. 4 Okno interfejsu VBA w AutoCAD-zie z widocznym kodem makra ZmierzOdległość Sub ZmierzOdległo ść() 'Pocz ątek makra ZmierzOdległo ść bez argumentów. Dim pt1 As Variant 'Deklarujemy zmienn ą pt1 jako Variant. Dim pt2 As Variant 'Deklarujemy zmienn ą pt2 jako Variant. pt1 = ThisDrawing.Utility.GetPoint _ (, vbCrLf & "Pierwszy punkt: ")
Korzystając z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujący się w cudzysłowie pojawi się w linii poleceń jako zachęta do wskazania pierwszego punktu.
Rys. 5
38
pt2 = ThisDrawing.Utility.GetPoint _ (Pt1, vbCrLf & "Drugi punkt: ")
Korzystając z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujący się w cudzysłowie pojawi się w linii poleceń jako zachęta do wskazania pierwszego punktu. Obie linie kodu są bardzo podobne, róŜnica między nimi (pomijając zamknięty w cudzysłów tekst zachęty do wskazania punktu na rysunku) to umieszczenie w drugim przypadku przed znakiem powrotu karetki (VbCrLf) przed przecinkiem Pt1. Mamy juŜ dwa punkty, które zostały przypisane do zmiennych pt1, pt2. MoŜemy przystąpić do tworzenia procedury obliczającej odległość między nimi. Najpierw musimy obliczyć odległości pomiędzy tymi punktami wzdłuŜ osi X, Y, Z. W tym celu deklarujemy trzy nowe zmienne, które będą nam przechowywać te odległości. Dim x As Double, y As Double, z As Double Dim Dist As Double
Deklarujemy zmienną Dist jako Double. PosłuŜy nam ona do przechowywania obliczonej odległości pomiędzy punktami.
x = pt1(0) - pt2(0) Zmiennej x przypisujemy wartość uzyskaną w wyniku odjęcia współrzędnej x pierwszego punktu od współrzędnej x drugiego punktu.
y = pt1(1) - pt2(1) Zmiennej y przypisujemy wartość uzyskaną w wyniku odjęcia współrzędnej y pierwszego punktu od współrzędnej y drugiego punktu.
z = pt1(2) - pt2(2) Zmiennej z przypisujemy wartość uzyskaną w wyniku odjęcia współrzędnej z pierwszego punktu od współrzędnej z drugiego punktu. Do wyliczenia odległości wykorzystamy znany ze szkoły wzór, który w VBA ma postać:
Dist = Sqr((Sqr((x^2) + (y^2))^2) + (z^2)) Funkcja Sqr(liczba) oblicza pierwiastek z liczby. Np. Sqr(4)=2 Otrzymaną wartość odległości wyliczonej z powyŜszego wzoru wyświetlamy w oknie typu MsgBox. Aby poprawnie sformatować komunikat w oknie MsgBox łączymy tekst "Odległość pomiędzy punktami wynosi: " i wartość zmiennej dist. Na końcu znajduje się zamknięty w cudzysłów tekst, który pojawi się w nagłówku - w naszym przypadku jest to Obliczanie odległości. MsgBox " Odległo ść pomi ędzy punktami wynosi: " _ & dist, , "Obliczanie odległo ści" End Sub
Rys. 6
Program wyświetlił sformatowany tekst w oknie Msgbox.
9 - Rysowanie trójkąta
Rysowanie trójkąta
Mamy za zadanie narysowanie trójkąta. W tym celu pobierzemy od uŜytkownika punkt bazowy (punkt, z którego rozpoczniemy rysowanie naszego trójkąta), Szerokość i Wysokość trójkąta.
39
Rys. 1
Przy tworzeniu tego programu wykorzystywane będą funkcje GetPoint do wskazania punktu bazowego, GetDistance do podania wysokości i szerokości trójkąta oraz funkcja PolarPoint do wyznaczenia na podstawie punktu bazowego, wysokości i szerokości pozostałych wierzchołków trójkąta. Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. MoŜemy teŜ uruchomić go z menu górnego: Narzędzia -> Makro -> Makra. W oknie dialogowym wpisujemy nazwę nowego makra: RysujTrójkąt i klikamy przycisk Utwórz.
Rys. 2
Wyświetli się kolejne okno dialogowe, które pozwala nam na dołączenie naszego makra do istniejącego rysunku lub Projektu.
40
Rys. 3 Z listy wybieramy Rysunek (nasze makro będzie dzięki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostało dołączone do bieŜącego rysunku i został uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien się znajdować kod naszego makra. Jak dotychczas składa się on zaledwie z dwóch linijek - początkowej i końcowej. Teraz musimy pomiędzy tymi dwoma liniami umieścić kod naszego makra.
Public Const dblcPI As Double = 3.1415923 Deklarujemy stałą PI, która potrzebna jest do wyznaczenia wartości kąta. Deklaracja stałych musi się znajdować przed definicją procedury, którą piszemy.
Rys. 4 Widok szablonu procedury RysujTrójkąt z zadeklarowaną stałą PI
Public Const dblcPI As Double = 3.1415923 Sub RysujTrójkat() End Sub
End Sub Mamy szablon procedury rysującej trójkąt oraz zadeklarowaną stałą PI. Musimy jeszcze zadeklarować pozostałe zmienne: VarPtBazowy, varSzerPt oraz varWysPt jako Variant, natomiast dblSzerokosc oraz dblWysokosc jako zmienne typu double. Public Const dblcPI As Double = 3.1415923 Sub RysujTrójkat() Dim dblSzerokosc As Double Dim dblWysokosc As Double Dim VarPtBazowy As Variant Dim varSzerPt As Variant Dim varWysPt As Variant
Zmiennej varPtBazowy przypisujemy wartość działania funkcji GetPoint. Zostaniemy poproszeni przez AutoCAD-a poprzez zachętę w linii poleceń o wskazanie punktu bazowego (punktu, z którego rozpoczniemy rysowanie trójkąta).
VarPtBazowy = ThisDrawing.Utility.GetPoint(, "Wskaż punkt wstawienia:") Zmiennej dblSzerokosc przypisujemy wartość działania funkcji GetDistance. Zostaniemy poproszeni przez AutoCAD-a poprzez zachętę w linii poleceń o podanie szerokości trójkąta. MoŜemy wskazać drugi punkt na rysunku, gdzie punkt bazowy jest punktem odniesienia, a odległość między nimi jest szerokością trójkąta. MoŜemy równieŜ wpisać dowolną liczbę w linii poleceń AutoCAD-a, która będzie szerokością.
dblSzerokosc = ThisDrawing.Utility.GetDistance(VarPtBazowy, "Podaj szerokość:") Zmiennej dblWysokosc przypisujemy wartość działania funkcji GetDistance. Zostaniemy poproszeni przez AutoCAD-a poprzez zachętę w linii poleceń o podanie wysokości trójkąta. MoŜemy wskazać drugi punkt na rysunku, gdzie punkt bazowy jest punktem odniesienia, a odległość między nimi jest wysokością trójkąta. MoŜemy równieŜ wpisać dowolną liczbę w linii poleceń AutoCAD-a, która będzie wysokością.
dblwysokosc = ThisDrawing.Utility.GetDistance(VarPtBazowy, "Podaj wysokość:") Znamy juŜ punkt bazowy, szerokość i wysokość trójkąta. Na tej podstawie moŜemy wyznaczyć pozostałe wierzchołki trójkąta. Wykorzystamy do tego celu metodę PolarPoint. Metoda PolarPoint jest uŜywana do uzyskania nowego punktu, przy znanym kącie i odległości od danego punktu. W wyniku otrzymujemy zmienną typu Variant - trójelementową tablicę zmiennych typu double.
41
Składnia: Function PolarPoint(Punkt, Kąt As Double, Odległość As Double) Zwraca punkt w podanej odległości i kącie od podanego punktu. Wyznaczamy punkt P2.
Rys. 5 Widok szablonu procedury RysujTrójkąt z zadeklarowaną stałą PI
varSzerPt = ThisDrawing.Utility.PolarPoint(VarPtBazowy, 0, dblSzerokosc) Naszym punktem odniesienia jest P1, kąt jest równy 0, a odległość punktu P1 od P2 jest równa dblSzerokosc. Wyznaczamy punkt P3.
varWysPt = ThisDrawing.Utility.PolarPoint(VarPtBazowy, dblcPI / 2, dblWysokosc) Naszym punktem odniesienia jest P1, kąt jest równy PI/2 = 90, a odległość punktu P1 od P3 jest równa dblWysokosc.
Rys. 6
Rysowanie linii między punktami P1 i P2 Call ThisDrawing.ModelSpace.AddLine(VarPtBazowy, va rSzerPt) With ThisDrawing.ModelSpace
Rysowanie linii między punktami P1 i P3
Call .AddLine(VarPtBazowy, varWysPt) Rysowanie linii między punktami P3 i P2 Call .AddLine(varWysPt, varSzerPt) End With End Sub
42
10 - Rysowanie prostokąta
Rysowanie prostokąta
Prostokąt w AutoCAD-zie rysowany jest standardowo poprzez podanie lewego dolnego oraz prawego dolnego punktu prostokąta. W poniŜszym przykładzie prostokąt zostanie narysowany w oparciu o pobrany od uŜytkownika za pomocą funkcji GetPoint lewy dolny punkt prostokąta oraz szerokość i wysokość prostokąta.
Rys. 1
Option Explicit 'Zadeklarowanie stałej publicznej Pi Public Const dblcPI As Double = 3.1415923 Public Sub Bas1() 'Zadeklarowanie zmiennych, które b ędą przechowywa ć 'współrz ędne wierzchołków prostok ąta Dim varPt1, varPt2, varPt3, varPt4 As Variant 'Zadeklarowanie zmiennych, które b ędą 'przechowywa ć wysoko ść i szeroko ść prostok ąta Dim dblHeight As Double Dim dblWidth As Double 'Pobranie od u Ŝytkownika punktu wstawienia i 'przypisanie go do zmiennej varPt1 varPt1 = ThisDrawing.Utility.GetPoint(, "Punkt wsta wienia:") 'Pt1 'Pobranie od u Ŝytkownika szeroko ści prostok ąta i 'przypisanie go do zmiennej dblWidth dblWidth = ThisDrawing.Utility.GetReal("Szer:") 'd blWidth 'Pobranie od u Ŝytkownika wysoko ści prostok ąta i 'przypisanie go do zmiennej dblHeight dblHeight = ThisDrawing.Utility.GetReal("Wys:") 'db lHeight 'Wyliczenie pozostałych współrz ędnych prostok ąta i 'przypisanie ich warto ści zmiennym With ThisDrawing.Utility varPt2 = .PolarPoint(varPt1, 0, dblWidth) ' Pt2 varPt3 = .PolarPoint(varPt2, dblcPI / 2, dblHeigh t) 'Pt3 varPt4 = .PolarPoint(varPt3, dblcPI, dblWidth) 'Pt4 End With 'Rysowanie prostok ąta With ThisDrawing.ModelSpace Call .AddLine(varPt1, varPt2) Call .AddLine(varPt2, varPt3) Call .AddLine(varPt3, varPt4)
43
Call .AddLine(varPt4, varPt1) 'Rysowanie linii ł ącz ących wierzchołki prostok ąta. Call .AddLine(varPt1, varPt3) Call .AddLine(varPt2, varPt4) End With End Sub
Do wyznaczenia brakujących wierzchołków wykorzystaliśmy metodę PolarPoint.
Rys. 2
Metoda PolarPoint jest uŜywana do uzyskania nowego punktu, przy znanym kącie i odległości od danego punktu. W wyniku otrzymujemy zmienną typu Variant - trójelementową tablicę zmiennych typu double.
Składnia: Function PolarPoint(Punkt, Kąt As Double, Odległość As Double) Zwraca ona punkt w podanej odległości i kącie od podanego punktu. Wyznaczanie punktu Pt2 Znane nam są wszystkie wartości potrzebne do wyznaczenia punktu Pt2 (patrz rys) : Punkt = punkt początkowy (lewy dolny róg prostokąta Pt1) Kąt = 0 stopni (kąt mierzony jest od osi X a obydwa punkty Pt1, Pt2 leŜą na osi X) Odległość = Szerokości prostokąta Wyznaczanie punktu Pt3 Po wyznaczeniu punktu Pt2 znane nam są wszystkie wartości potrzebne do wyznaczenia punktu Pt3 (patrz rys) : Punkt = Pt2 (prawy dolny róg prostokąta) Kąt = 90 stopni = PI/2 radianów (kąt mierzony jest od osi X ) Odległość = Wysokość prostokąta Wyznaczanie punktu Pt4 Po wyznaczeniu punktu Pt3 znane nam są wszystkie wartości potrzebne do wyznaczenia punktu Pt4 (patrz rys) : Punkt = Pt3 (prawy górny róg prostokąta) Kąt = 180 stopni = PI radianów (kąt mierzony jest od osi X ) Odległość = szerokość prostokąta Proszę zwrócić uwagę, Ŝe równie dobrze przy wyznaczaniu punktu Pt4 jako punkt bazowy mogliśmy wykorzystać punkt Pt1. Wtedy Punkt = Pt1, Kąt = PI/2 a odległość = wysokości prostokąta. Efekt byłby identyczny. JeŜeli z jakichś powodów nie chcielibyśmy korzystać z metody PolarPoint, moglibyśmy wyznaczyć brakujące punkty w sposób tradycyjny. Jeśli Pt1 jest znany i ma współrzędne (X1, Y1, Z1) to: Pt2 X2 = X1 + szeroko ść Y2 = Y1 Z2 = Z1 Pt3 X3 = X2 Y3 = Y2 + wysoko ść Z3 = Z2 Pt4 X4 = X3 - szeroko ść lub X4 = X1 Y4 = Y3 lub Y4 = X1+wysoko ść
44
Z4 = Z3
Na początku listingu umieszczona została zadeklarowana stała PI, poniewaŜ kąt musimy zawsze podawać w radianach, np. 90 stopni = PI/2, 180 stopni = PI itd. Stopnie na radiany konwertujemy korzystając ze wzoru X stopni = (X * PI) /180 radianów np. 35 stopni = (35 * PI) / 180 radianów. Do procedury rysującej nasz prostokąt dodałem rysowanie linii łączących Pt1 z Pt3 i Pt2 z Pt4. Zrobiłem to celowo, aby uprzedzić pytania, po co to wszystko, skoro w AutoCAD-zie mamy standardowe polecenie rysujące prostokąt. Celem tego i innych ćwiczeń jest poznanie przez Was zasad programowania w VBA w AutoCAD-zie i jeśli tak się stanie, to proszę mi wierzyć, Ŝe nie będą Państwo narzekać na brak jakiejś funkcji w programie. JeŜeli będzie Wam jakaś potrzebna, to sobie ją po prostu napiszecie, a ograniczać Was będzie jedynie Wasza wyobraźnia.
11 - Rysowanie stopy fundamentowej
Metoda PROMPT - rysowanie stopy (linia)
Lekcja ta obrazuje, jak za pomocą kilku danych pobranych od uŜytkownika narysować złoŜony obiekt rysunkowy. Funkcje wykorzystane w bieŜącym ćwiczeniu: GetPoint do pobrania punktu początkowego -> varPtBazowy GetDistance do pobrania szerokości rysowanego elementu (dblSzerokosc) oraz jego wysokości (dblWysokosc) PolarPoint do wyliczenia współrzędnych punktów P1, P2, P3, P4, P5, P6, P7. Pozostałe wymiary oraz punkty wyznaczymy, korzystając ze zwymiarowanego rysunku zamieszczonego poniŜej.
Rys. 1
Public Const dblcPI As Double = 3.1415923 Public Sub rys_stopy() 'Otwarcie procedury rys_stopy Dim dblWidth As Double 'Deklaracja zmiennej do przechowywania szeroko ści Dim dblHeight As Double 'Deklaracja zmiennej do przechowywania wysoko ści Dim varBasePoint As Variant 'Deklaracja zmiennej do przechowywania pkt bazoweg o Dim varPoints(0 To 7) As Variant 'Deklaracja zmiennych pozostałych punktów varBasePoint = ThisDrawing.Utility.GetPoint (, "Punkt wstawienia:") 'Pobranie od u Ŝytkownika punktu wstawienia, 'w linii polece ń zostaje wy świetlona 'zach ęta do wskazania punktu na rysunku varPoints(0) = varBasePoint
45
'Przypisanie pkt bazowego do zmiennej VarPoints(0) dblWidth = ThisDrawing.Utility.GetDistance (varBasePoint, "Podaj szerokosc:") 'Pobranie od u Ŝytkownika szeroko ści, 'w linii polece ń zostaje wy świetlona 'zach ęta 'do podania szeroko ści dblHeight = ThisDrawing.Utility.GetDistance (varBasePoint, "podaj wysokosc:") 'Pobranie od u Ŝytkownika wysoko ści, 'w linii polece ń zostaje wy świetlona 'zach ęta 'do podania wysoko ści
Wyliczenie pozostałych punktów przy pomocy metody PolarPoints
Składnia: Function PolarPoint(Punkt, Kąt As Double, Odległość As Double)
With ThisDrawing.Utility
Rys. 2
varPoints(1) = .PolarPoint(varPoints(0), 0, dblWidt h) 'Pkt odniesienia = varPoints(0), k ąt = 0, 'odległo ść = dblSzeroko ść
Rys. 3
varPoints(2) = .PolarPoint(varPoints(1), dblcPI / 2 , dblHeight) 'Pkt odniesienia = varPoints(1), k ąt = PI/2 , 'odległo ść = dblWysokosc
46
Rys. 4
varPoints(3) = .PolarPoint(varPoints(2), dblcPI, db lWidth / 3) 'Pkt odniesienia = varPoints(2), k ąt = PI (180), 'odległo ść = dblSzeroko ść / 3
Rys. 5
varPoints(4) = .PolarPoint(varPoints(3), dblcPI * 3 / 2, dblHeight / 2) 'Pkt odniesienia = varPoints(3), k ąt = (PI * 3) / 2, 'odległo ść = dblWysoko ść / 2
Rys. 6
varPoints(5) = .PolarPoint(varPoints(4), dblcPI, db lWidth / 3) 'Pkt odniesienia = varPoints(4), k ąt = PI , 'odległo ść = dblSzeroko ść / 3
47
Rys. 7
varPoints(6) = .PolarPoint(varPoints(5), dblcPI / 2 , dblHeight / 2) 'Pkt odniesienia = varPoints(5), k ąt = PI / 2, 'odległo ść = dblWysoko ść / 2
Rys. 8
varPoints(7) = .PolarPoint(varPoints(0), dblcPI / 2 , dblHeight) 'Pkt odniesienia = varPoints(0), k ąt = PI / 2, 'odległo ść = dblWysoko ść End With 'Rysowanie stopy w oparciu o wyliczone punkty With ThisDrawing.ModelSpace Call .AddLine(varBasePoint, varPoints(1)) Call .AddLine(varPoints(1), varPoints(2)) Call .AddLine(varPoints(2), varPoints(3))
48
Call .AddLine(varPoints(3), varPoints(4)) Call .AddLine(varPoints(4), varPoints(5)) Call .AddLine(varPoints(5), varPoints(6)) Call .AddLine(varPoints(6), varPoints(7)) Call .AddLine(varPoints(7), varBasePoint) End With End Sub
12 - Modyfikacje obiektów AutoCAD-a
Modyfikowanie obiektów
Public Sub rys_logo() 'definiujemy nazw ę nowej procedury
FAZA 1 - rysowanie logo składającego się z dwóch polilinii Deklarujemy zmienne objEnt1 i objEnt2 jako obiekt polilinia Dim objEnt1 As AcadLWPolyline Dim objEnt2 As AcadLWPolyline
Deklarujemy zmienną dbl Verticles. Zmienna ta będzie przechowywała wartości współrzędnych wierzchołków polilinii stanowiących górną część logo Dim dblVertices(0 To 11) As Double Dim dblVertices2(0 To 7) As Double
Tworzy nową warstwę i ustawia ją aktywną
Dim newlayer1 As AcadLayer Wykorzystujemy instrukcję Set do skojarzenia obiektu ze zmienną (tworzymy nową warstwę o nazwie "1_Logo_01"
Set newlayer1 = ThisDrawing.Layers.Add("1_Logo_01") Ustawiamy tą warstwę jako warstwę bieŜącą (aktywną)
ThisDrawing.ActiveLayer = newlayer1 Ustawiamy kolor warstwy na czerwony
newlayer1.Color = acRed przypisujemy wartości współrzędnych wierzchołków polilini do zmiennych (są to współrzędne górnej polilinii) dblVertices(0) = 17.1446: dblVertices(1) = 19.2585: dblVertices(2) = 21.4243: dblVertices(3) = 25.2029: dblVertices(4) = 21.4243: dblVertices(5) = 35.2017: dblVertices(6) = 10.2008: dblVertices(7) = 35.2017: dblVertices(8) = 4.1794: dblVertices(9) = 27.3974: dblVertices(10) = 17.1446: dblVertices(11) = 27.397 4:
Rysujemy polilinię, która będzie stanowić górną część logo Set objEnt1 = ThisDrawing.ModelSpace. AddLightWeightPolyline(dblVertices)
Zamykamy polilinię objEnt1.Closed = True i odświeŜamy ekran objEnt1.Update przypisujemy wartości współrzędnych wierzchołków polilini do zmiennych (są to współrzędne dolnej polilinii ) dblVertices2(0) = 17.1446: dblVertices2(1) = 3.4776 dblVertices2(2) = 47.2736: dblVertices2(3) = 45.327 5 dblVertices2(4) = 36.7349: dblVertices2(5) = 45.327 5 dblVertices2(6) = 17.1446: dblVertices2(7) = 18.116 1
Rysujemy polilinię, która będzie stanowić dolną część logo Set objEnt2 = ThisDrawing.ModelSpace. AddLightWeightPolyline(dblVertices2) objEnt2.Closed = True 'zamykamy t ą polilini ę objEnt2.Update
Zoom okno od pkt (-10,-10) do pkt (60,50) deklarujemy zmienną pkt1 jako double,
49
zmienna ta będzie przechowywać współrzędne lewego dolnego rogu okna zoom
Dim pkt1(0 To 2) As Double deklarujemy zmienną pkt2 jako double, zmienna ta będzie przechowywać współrzędne prawego górnego rogu okna zoom
Dim pkt2(0 To 2) As Double Przypisujemy wartości do zmiennych pkt1 i pkt2 ( punkty te wyznaczają nam okno przybliŜenia) pkt1(0) = -10: pkt1(1) = -10: pkt1(2) = -10 pkt2(0) = 60: pkt2(1) = 50: pkt2(2) = 0
Wykonujemy przybliŜenie
ThisDrawing.Application.ZoomWindow pkt1, pkt2 FAZA2 - wykorzystanie metody offset do modyfikowania obiektu (odsunięcie)
Składnia: Object.Offset Definiujemy zmienne offsetObj1 I offsetObj2 jako zmienne typu Variant Dim offsetObj1 As Variant Dim offsetObj2 As Variant
Wyświetlamy okno MsgBox, ( informuje nas, Ŝe górna polilinia zostanie odsunięta o jedną jednostkę do wewnątrz rysunku
MsgBox "Offset górnej części logo ", , " Info"
Wykonujemy odsunięcie offsetObj1 = objEnt1.Offset(-1)
Przypisujemy powstałemu obiektowi kolor biały offsetObj1(0).Color = acWhite
offsetObj1(0).Update i odświeŜamy ekran
Wyświetlamy okno typu MsgBox, informujące o tym, Ŝe nastąpi odsunięcie dolnej polilini MsgBox "Offset dolnej cz ęści logo ", , "Info" offsetObj2 = objEnt2.Offset(-1)
Odsuwamy polilinię (objEnt2) o jeden punkt do środka
offsetObj2(0).Color = acWhite Przypisujemy do obiektu kolor biały
offsetObj2(0).Update OdświeŜamy obiekt FAZA 3 - usuwanie obiektów (metoda delete)
Składnia: Object.Delete Wyświetlamy okno informacyjne
MsgBox "Kasowanie dolnej części logo", , " Info"
offsetObj2(0).Delete Usuwamy obiekt powstały z odsunięcia dolnej polilini
ThisDrawing.Regen acActiveViewport Przeprowadzamy regenerację bieŜącej rzutni
MsgBox "Kasowanie górnej części logo", , " Info" Wyświetlamy informację
offsetObj1(0).Delete Usuwamy obiekt powstały z odsunięcia górnej polilinii
ThisDrawing.Regen acActiveViewport Przeprowadzamy regenerację bieŜącej rzutni FAZA 4 - Lustro (metoda mirror)
Define the mirror axis Aby wykonać odbicie lustrzane obiektu, musimy najpierw zdefiniować oś odbicia
Dim point1(0 To 2) As Double deklarujemy zmienną, która będzie przechowywać współrzędne pierwszego punktu leŜącego na osi odbicia
50
Dim point2(0 To 2) As Double deklarujemy zmienną, która będzie przechowywać współrzędne pierwszego punktu leŜącego na osi odbicia Przypisujemy wartości do zmiennych point1(0) = 0: point1(1) = 1: point1(2) = 0 point2(0) = 4: point2(1) = 1: point2(2) = 0
Wyświetlamy okno informacyjne.
MsgBox "Zoom window", , " Info" Wyświetlamy okno informacyjne
pkt1(0) = -10: pkt1(1) = -60: pkt1(2) = 0 Przypisujemy wartości do zmiennych, które będą nam wyznaczać okno zoom.
pkt2(0) = 60: pkt2(1) = 50: pkt2(2) = 0 Wykonujemy przybliŜenie oknem zdefiniowanym punktami pkt1 i pkt2
ThisDrawing.Application.ZoomWindow pkt1, pkt2 Wyświetlamy okno z informacją MsgBox "Lustro górnej cz ęści logo ", , " Info" Dim mirrorObj1 As AcadLWPolyline
deklarujemy zmienną mirrorObj1 jako polilinię AutoCAD-a
Dim mirrorObj2 As AcadLWPolyline deklarujemy zmienną mirrorObj1 jako polilinię AutoCAD-a Odbijamy obiekt objEnt1 (górna część logo) względem osi wyznaczonej przez punkty point1 i point2
Set mirrorObj1 = objEnt1.Mirror(point1, point2) Przypisujemy do obiektu powstałego w wyniku odbicia kolor czerwony mirrorObj1.Color = acRed mirrorObj1.Update
odświeŜamy obiekt. Wyświetlamy okno informacyjne
MsgBox "Lustro dolnej części logo ", , " Info" Odbijamy obiekt objEnt2 (dolna część logo) względem osi wyznaczonej przez punkty point1 i point2 Set mirrorObj2 = objEnt2.Mirror(point1, point2) mirrorObj2.Color = acRed
Przypisujemy do obiektu powstałego w wyniku odbicia kolor czerwony
mirrorObj2.Update odświeŜamy obiekt Wyświetlamy okno informacyjne
MsgBox "Przesuwanie dolnej części logo ", , " Info" FAZA 5 - wykorzystanie metody Move do przesunięcia obiektu
Składnia: Object.Move Przesuwamy obiekt powstały z odbicia górnej części logo. Punkt bazowy i przesunięcie wyznaczają nam punkty point1, point2 o współrzędnych (0,1) (4,1) punkty te zadeklarowane zostały przez nas przy odbijaniu obiektów mirrorObj1.Move point1, point2 mirrorObj1.Update 'od świe Ŝamy przesuni ęty obiekt
FAZA 6 - wykorzystanie metody Rotate do obracania obiektu
Składnia: Object.Rotate Wyświetlamy okno informacyjne
MsgBox "Obrót dolnej części logo ", , " Info" Definiujemy kąt obrotu obiektu (45 stopni) i punkt bazowy (4, 4.25, 0). Deklarujemy
51
zmienną basePoint jako
Dim basePoint(0 To 2) As Double Deklarujemy zmienną rotationAngle jako zmienną typu double
Dim rotationAngle As Double Przypisujemy wartości do zmiennych basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0 rotationAngle = 0.7853981 ' 45 degrees
Obracamy pierwszą polilinię (mirrorObj1) względem punktu bazowego o kąt 45 stopni mirrorObj1.Rotate basePoint, rotationAngle mirrorObj1.Update 'od świe Ŝamy obiekt
obracamy drugą polilinię (mirrorObj2) względem punktu bazowego o kąt 45 stopni mirrorObj2.Rotate basePoint, rotationAngle mirrorObj2.Update ' od świe Ŝamy obiekt
Wyświetlamy okno informacyjne
MsgBox "Zoom window", , " Info" Wykonujemy przybliŜenie (zoom okno) pkt1(0) = -5: pkt1(1) = -20: pkt1(2) = 0 pkt2(0) = 90: pkt2(1) = 50: pkt2(2) = 0 ThisDrawing.Application.ZoomWindow pkt1, pkt2
Wyświetlamy okno informacyjne
MsgBox "Oczko ", , " Info" Rysujemy okrąg o środku w punkcie (11,33,0) i promieniu równym 1 (metoda sendcommand) ThisDrawing.SendCommand "_circle 11,33,0 1 " End Sub
koniec procedury
13 - Warstwy
Warstwy AutoCAD-a w VBA
Rysowanie zawsze odbywa się na warstwie, która jest warstwą standardową lub warstwą utworzoną i nazwaną przez uŜytkownika. Z kaŜdą warstwą jest skojarzony kolor i rodzaj linii. Przykładowa procedura tworząca w AutoCAD-zie nową warstwę o nazwie Wymiary i kolorze niebieskim Pisanie procedury tworzącej nową warstwę w AutoCAD-zie rozpoczynamy od zdefiniowania jej nazwy
Sub nowa_warstwa1() Deklarujemy zmienną layerObj jako nowy obiekt AutoCAD-a
Dim layerObj As AcadLayer Tworzymy nową warstwę w AutoCAD-zie i wykorzystujemy instrukcję Set do skojarzenia odwołania do obiektu ze zmienną.
Set layerObj = ThisDrawing.Layers.Add("Wymiary") Zmieniamy kolor warstwy na kolor czerwony (przypisujemy warstwie Wymiary kolor czerwony) layerObj.Color = acRed End Sub ' koniec procedury
52
Rys. 1 Lista rozwijana warstwy z nową warstwą o nazwie Wymiary i kolorze niebieskim Umieszczanie obiektów na wybranej warstwie W drugim przykładzie nauczymy się, jak przypisać nowo utworzony obiekt do danej warstwy. W tym celu utworzymy nową warstwę o nazwie "Opisy" i przypiszemy jej kolor czerwony, a następnie przypiszemy do niej wcześniej utworzony okrąg.
Definiujemy nazwę nowej procedury Sub nowa_warstwa2() Rysujemy okrąg o środku leŜącym w punkcie (20,20,0). Deklarujemy zmienną circleObj jako nowy obiekt AutoCAD-a
Dim circleObj As AcadCircle Deklarujemy zmienną center jako zmienną typu double, zostanie ona wykorzystana do przechowywania wartości współrzędnych punktu środkowego okręgu.
Dim center(0 To 2) As Double Deklarujemy zmienną radius jako double, zostanie ona wykorzystana do przechowywania wartości promienia okręgu. Dim radius As Double 'Przypisujemy do zmienej center warto ści 'współrz ędnych punktu środkowego center(0) = 2: center(1) = 2: center(2) = 0 Przypisujemy do zmiennej promie ń warto ść 1 radius = 1
Tworzymy okrąg o środku w punkcie center i promieniu radius
Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius) Przypisujemy do okręgu kolor ByLayer. W ten sposób okrąg automatycznie przejmie kolor warstwy, na której zostanie umieszczony.
circleObj.Color = acByLayer Deklarujemy zmienną layerObj jako nowy obiekt AutoCAD-a.
Dim layerObj As AcadLayer Tworzymy nową warstwę o nazwie opisy.
Set layerObj = ThisDrawing.Layers.Add("opisy") przypisujemy tej warstwie kolor czerwony
layerObj.Color = acRed
Rys. 2 Lista rozwijana warstwy z nową warstwą o nazwie Opisy i kolorze czerwonym
Przypisujemy okrąg do warstwy Opisy
53
circleObj.Layer = "opisy" Przerysowujemy ekran
circleObj.Update
End Sub kończymy procedurę
Rys. 3 Okrąg umieszczony na warstwie Opisy
Przykładowy program wyświetlający nazwy wszystkich warstw występujących w rysunku Sub LayerNames() 'Zdefiniowanie nazwy nowej proceduryDeklaracja 'zmiennej obLayer jako warstwy AutoCAD-a Dim objLayer As AcadLayer 'Deklaracja zmiennej objLayers jako zbioru warstw. Dim objLayers As AcadLayers 'Deklaracja zmiennej strLayers jako zmiennej typu tekst. Dim strLayers As String 'Wykorzystanie instrukcji Set do skojarzenia ' odwołania obiektu ze zmian ą. Set objLayers = ThisDrawing.Layers 'Dla ka Ŝdej warstwy w zbiorze warstw For Each objLayer In objLayers 'Przypisz zmiennej strLayers nazw ę warstw, 'po czym dodaj znak powrotu karetki strLayers = strLayers & objLayer.Name & vbCr 'Dalej Next 'Wy świetl nazwy wszystkich warstw dost ępnych 'na rysunku MsgBox strLayers, vbInformation, "Warstwy w rysunku:" End Sub 'Koniec procedury.
Rys. 4 Okno informacyjne AutoCAD-a z listą dostępnych warstw na rysunku
Ustawianie bieŜącej warstwy Rysujemy zawsze na warstwie bieŜącej. JeŜeli ustawimy daną warstwę jako bieŜącą, moŜemy rysować na tej warstwie nowe obiekty. JeŜeli uczynimy warstwą bieŜącą
54
jakąkolwiek inną warstwę, to wszystkie nowo tworzone obiekty umieszczone zostaną na tej warstwie, a takŜe kolor oraz typ linii obiektów będzie taki, jaki ma ta warstwa. Sub warstwy4 () 'definiujemy now ą nazw ę procedury Dim newlayer As AcadLayer 'deklarujemy zmienn ą newlayer jako 'nowy obiekt AutoCAD-a Set newlayer = ThisDrawing.Layers.Add ("Wymiary") 'Wykorzystujemy instrukcj ę Set ThisDrawing.ActiveLayer = newlayer 'ustawiamy warstw ę Wymiary jako aktywn ą warstw ę End Sub 'koniec procedury.
ZamraŜanie warstw Przykładowa procedura zamraŜająca warstwę o nazwie Opisy, która została stworzona w przykładzie drugim. Sub zamrazanie_warstwy() 'definiujemy now ą nazw ę procedury Dim objLayer As AcadLayer 'deklarujemy zmienn ą newlayer jako 'nowy obiekt AutoCAD-a Dim strNazwa As String 'deklarujemy zmienn ą strNazwa jako 'zmienn ą typu string. Zmienn ą t ę wykorzystamy 'do przechowywania nazwy warstwy strNazwa = "Opisy" 'przypisujemy do zmiennej strNazwa nazw ę warstwy Set objLayer = ThisDrawing.Layers(strNazwa) 'korzystamy z instrukcji Set do skojarzenia 'odwołania do obiektu ze zmienn ą objLayer.Freeze = True 'zamra Ŝamy warstw ę End Sub
Rys. 5 Widok paska rozwijalnego warstwy z zamroŜoną warstwą Opisy
Zamroziliśmy warstwę Opisy. Została ona utworzona we wcześniejszym przykładzie. JeŜeli nie jesteśmy pewni, czy dana warstwa została utworzona, naleŜy dokonać sprawdzenia, czy warstwa o danej nazwie występuje w naszym rysunku. MoŜemy wykorzystać w tym celu następującą składnię:
If objLayer is Nothing Then JeŜeli zamiast podawać nazwę warstwy do zamroŜenia chcemy np. zamrozić wszystkie warstwy w rysunku, moŜemy w tym celu wykorzystać pętlę For Each. Sub zamrazanie_warstwy2() 'definiujemy now ą nazw ę procedury Dim objLayer As AcadLayer 'deklarujemy zmienn ą newlayer 'jako nowy obiekt AutoCAD-a On Error Resume Next 'omijamy bie Ŝącą warstw ę For Each objLayer In This.Drawing.Layers 'wchodzimy w p ętl ę jak długo objLayer.Freeze = True 'zamra Ŝamy warstw ę Next objLayer 'przechodzimy do nast ępnej warstwy End Sub 'koniec procedury
Posługując się metodą GetEntity, która była omawiana na drugiej lekcji, moŜna takŜe poprosić uŜytkownika o wskazanie obiektu na ekranie AutoCAD-a i zamrozić warstwę, na której ten obiekt się znajduje.
55
Sub zamra Ŝanie_wskazanej() 'definiujemy nazw ę nowej procedury Dim WskazanyObiekt As AcadObject 'deklarujemy zmienn ą WskazanyObiekt jako obiekt 'AutoCAD-a Dim Warstwa_do_zamro Ŝenia As AcadLayer 'deklarujemy zmienn ą Warstwa_do_zamro Ŝenia 'jako warstwa AutoCAD-a Dim WskazanyPunkt As Variant 'deklarujemy zmienn ą WskazanyPunkt jako Variant On Error Resume Next 'pomijamy przypadek, gdy zostanie wskazana warstwa bie Ŝąca With ThisDrawing.Utility 'Pobranie danych od u Ŝytkownika GetEntity WskazanyObiekt, WskazanyPunkt, vbCr & "Wska Ŝ obiekt le Ŝący na warstwie do zamro Ŝenia " End With If WskazanyObiekt Is Nothing Then 'je śli zmienna wskazany obiekt ma warto ść 'pust ą ( gdy warstwa nie została wskazana) MsgBox "Nie wybrano obiektu" ' wy świetlenie komunikatu Exit Sub 'i zako ńczenie procedury End If 'w przeciwnym razie 'Korzystamy z instrukcji Set do 'skojarzenia odwołania do obiektu ze zmienn ą Set Warstwa_do_zamro Ŝenia = ThisDrawing.Layers(WskazanyObiekt.Layer) 'Zamra Ŝamy warstw ę na której le Ŝy wskazany obiekt Warstwa_do_zamro Ŝenia.Freeze = True End Sub 'koniec procedury
14 - Zbiory wskazań
Zbiory wskazań w VBA
AutoCAD pozwala na wykonywanie operacji na grupach obiektów znajdujących się w tzw. "zbiorze wskazań". Na dzisiejszej lekcji nauczymy się, jak tworzyć zbiory wskazań, jak dodawać do nich elementy oraz jak przeprowadzać róŜne operacje na tak zgrupowanych obiektach. Przykładowa procedura tworząca w AutoCAD-zie nowy zbiór wskazań o nazwie KursVBA. Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy
Sub ss_onscreen() Deklarujemy zmienną ss jako nowy zbiór wskazań AutoCAD-a
Dim ss As AcadSelectionSet Tworzenie nowego zbioru wskazań.
Set ss = ThisDrawing.SelectionSets.Add("KursVBa") Wybieramy obiekty poprzez wskazanie ich na ekranie AutoCAD-a.
Call ss.SelectOnScreen Wyświetlenie informacji w oknie MsgBox o tym, ile obiektów zostało dodanych do zbioru wskazań.
MsgBox ss.Count & " obiekty zostały dodane do zbioru wskazań" Podświetlamy obiekty wskazane przez uŜytkownika.
56
ss.Highlight True Wyświetlenie informacji w oknie MsgBox o tym, Ŝe obiekty znajdujące się w zbiorze wskazań zostały podświetlone.
MsgBox " obiekty zostały podświetlone" Regeneracja rysunku.
ThisDrawing.Regen True Wyświetlenie informacji w oknie MsgBox o tym, Ŝe zostanie usunięte podświetlenie obiektów.
MsgBox " usuwamy podświetlenie obiektów" Usunięcie podświetlenia obiektów znajdujących się w zbiorze wskazań.
ss.Highlight False Wyświetlenie informacji w oknie MsgBox o tym, Ŝe zostanie usunięty zbiór wskazań.
MsgBox " usuwamy zbór wskazań" Usunięcie zbioru wskazań.
ss.Delete Koniec procedury ss_onscreen.
End Sub Jeszcze zanim przejdziemy do testowania powyŜszej procedury, musimy narysować kilka obiektów, które będziemy następnie dodawać do zbioru wskazań. Ewentualnie moŜemy wczytać projekt ss_rys.dvb, który narysuje obiekty widoczne na poniŜszym rysunku.
Rys. 1 Polilinia i dwa okręgi stworzone za pomocą procedury ss_rys
worzenie polilini i okręgów za pomącą VBA zostało szerzej wytłumaczone w lekcji 4 i 5. W linii poleceń wpisujemy: Polecenie: - vbaload Otwórz projekt VBA: ss_rys Po załadowaniu pliku projektu uruchamiamy nasze makro. Polecenie: -vbarun Nazwa makra: ss_rys.dvb!Module1.Rys_ss Następnie przechodzimy do testowania naszej procedury. Uruchamiamy makro wpisując w linii poleceń: Polecenie: -vbarun Nazwa makra: ss_rys.dvb!Module1.ss_onscreen
Rys. 2 Po uruchomieniu makra w linii poleceń pojawia się zachęta do wskazania
obiektów
57
Wskazujemy zielony okrąg oraz prostokąt.
Rys. 3 Wskazany okrąg i prostokąt widoczny jako przerywana linia
Kończymy wskazywanie obiektów poprzez wciśnięcie klawisza Enter. W oknie MsgBox następuje wyświetlenie informacji w oknie o tym, ile obiektów zostało dodanych do zbioru wskazań.
Rys. 4 Okno informacyjne AutoCAD-a
Następuje podświetlenie tych obiektów.
Rys. 5 Podświetlenie obiektów
Następnie podświetlenie obiektów zostaje usunięte.
Rys. 6 Usunięcie podświetlenia obiektów
58
Następnie obiekty zostają usunięte ze zbioru wskazań.
Rys. 7 Usunięcie obiektów ze zbioru wskazań
MoŜemy korzystać z róŜnych trybów dodawania obiektów do zbioru wskazań.
Rys. 8 Tryby dodawania obiektów do zbioru wskazań
Przykładowa procedura, która tworzy w AutoCAD-zie nowy zbiór wskazań o nazwie KursVBA oraz umieszcza w tym zbiorze wskazań wszystkie obiekty znajdujące się na rysunku Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy. Sub ss_All() 'Deklarujemy zmienn ą ss jako nowy zbiór 'wskaza ń AutoCAD-a. Dim ss As AcadSelectionSet 'Tworzenie nowego zbioru wskaza ń o nazwie KursVBA. Set ss = ThisDrawing.SelectionSets.Add("KursVBa") 'Wybieramy wszystkie obiekty znajduj ące si ę 'na ekranie AutoCAD-a. ss.Select acSelectionSetAll 'Pod świetlamy wybrane obiekty. ss.Highlight True 'Wy świetlenie informacji w oknie MsgBox o tym, 'ile obiektów zostało dodane do zbioru wskaza ń. MsgBox ss.Count & " obiekty(-ów) zostały dodane do zbioru wskaza ń" 'Wy świetlenie informacji w oknie MsgBox o tym, ' Ŝe obiekty znajduj ące si ę w zbiorze wskaza ń 'zostały pod świetlone. MsgBox " obiekty zostały pod świetlone" 'Przeprowadzamy regeneracj ę rysunku ThisDrawing.Regen True 'Wy świetlenie informacji w oknie MsgBox o tym, ' Ŝe zostanie usuni ęte pod świetlenie obiektów. MsgBox " usuwamy pod świetlenie obiektów" 'Usuni ęcie pod świetlenia obiektów znajduj ących
59
'si ę w zbiorze wskaza ń. ss.Highlight False 'Wy świetlenie informacji w oknie MsgBox 'o tym, Ŝe zostanie usuni ęty zbiór wskaza ń. MsgBox " usuwamy zbór wskaza ń" 'Usuni ęcie zbioru wskaza ń. ss.Delete 'Koniec procedury ss_All. End Sub
Z doświadczenia wiem, Ŝe nawet najbardziej logiczny wywód teoretyczny na nic się zda, jeŜeli nie idzie za nim praktyczny przykład, ilustrujący zastosowanie omawianej metody. Dlatego teŜ poniŜej opisana jest procedura, która ma za zadanie przesunięcie obiektów dodanych do zbioru wskazań. Punktem bazowym przesunięcia jest punkt spt o współrzędnych (0,0,0), a drugim punktem przesunięcia jest punkt ept o współrzędnych (200,100,0). Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy. Sub ss_move() 'Definiujemy potrzebne zmienne: 'Deklarujemy zmienn ą ss jako nowy 'zbiór wskaza ń AutoCAD-a. Dim ss As AcadSelectionSet 'Deklarujemy zmienn ą spt i ept jako 'zmienn ą typu double. Dim sPt(0 To 2) As Double Dim ePt(0 To 2) As Double 'Deklarujemy zmienn ą I jako liczb ę 'całkowit ą. Zmiennej tej przypiszemy 'warto ść licznika. Dim I As Integer 'Przypisujemy warto ści do zmiennych 'współrz ędnych punktów spt i ept. sPt(0) = 0# 'współrz ędna X punktu bazowego sPt(1) = 0# 'współrz ędna Y punktu bazowego sPt(2) = 0# 'współrz ędna Z punktu bazowego ePt(0) = 200# 'współrz ędna X drugiego punktu ePt(1) = 100# 'współrz ędna Y drugiego punktu ePt(2) = 0# 'współrz ędna Z drugiego punktu 'Tworzymy nowy zbiór wskaza ń o nazwie ss. Set ss = ThisDrawing.SelectionSets.Add("ss") 'Dodajemy obiekty do zbioru wskaza ń 'poprzez wskazanie tych obiektów na 'ekranie AutoCAD-a. Call ss.SelectOnScreen 'Przesuwamy obiekty znajduj ące si ę w zbiorze 'wskaza ń o wektor wyznaczony 'przez punkty sPt i ePt. 'Wchodzimy w p ętl ę For I = 1 To ss.Count 'Przesuwamy pierwszy obiekt ze 'zbioru wskaza ń ss.Item(I - 1).Move sPt, ePt 'Od świe Ŝamy obiekt ss.Item(I - 1).Update
60
'Zwi ększamy licznik Next I 'Po wyj ści z p ętli FOR usuwamy 'zbiór wskaza ń ss.Delete 'Ko ńczymy procedur ę End Sub
15 - Wymiarowanie
Wymiarowanie w VBA w AutoCAD-zie
Tematem dzisiejszej lekcji jest wymiarowanie obiektów rysunkowych w AutoCAD-zie z poziomu VBA. Nie będziemy tworzyć nowego obiektu od podstaw. Wykorzystamy w tym ćwiczeniu funkcję rysującą kątownik nierównoramienny z lekcji 4. dotyczącej rysowania polilinii. Funkcja ta, jak Państwo pamiętają, rysuje kątownik o wymiarach jak na rysunku poniŜej.
Rys. 1 Rysunek kątownika
Pisanie procedury tworzącej nową warstwę w AutoCAD-zie rozpoczynamy od zdefiniowania jej nazwy.
Sub wym_katownik() Deklarujemy zmienną dimObj1 i dimObj2 jako nowe obiekty AutoCAD-a. Dim dimObj1 As AcadDimAligned Dim dimObj2 As AcadDimAligned
Deklarujemy punkty dpt1, dpt2, dpt3 jako zmienne typu double. Dim dpt1(0 To 2) As Double Dim dpt2(0 To 2) As Double Dim dpt3(0 To 2) As Double
Deklarujemy zmienne lokation1, lokation2 jako nowe zmienne typu double. Dim location1(0 To 2) As Double Dim location2(0 To 2) As Double
Przypisujemy wartość do zmiennej, która określa początek pierwszej linii wymiarowej. dpt1(0) = punkt1(0) 'X1 dpt1(1) = punkt1(1)
61
Przypisujemy wartość do zmiennej, która określa koniec pierwszej linii wymiarowej. dpt2(0) = punkt1(0) + s 'X2 dpt2(1) = punkt1(1)
Przypisujemy wartość do zmiennej określającej połoŜenie pierwszej linii wymiarowej location1(0) = dpt1(0) location1(1) = dpt1(1) - 5 location1(2) = 0
Tworzymy pierwszą linię wymiarową. Set dimObj1 = ThisDrawing.ModelSpace. _ AddDimAligned(dpt1, dpt2, location1)
Zmieniamy tekst napisu wymiarowego.
dimObj1.TextOverride = "s = <>" OdświeŜamy obiekt
dimObj1.Update
Rys. 2 Wymiar liniowy od punktu dpt1 do punktu dpt2
Przypisujemy wartość do zmiennej dpt3, która określa koniec drugiej linii wymiarowej. dpt3(0) = punkt1(0) 'X2 dpt3(1) = punkt1(1) + h Przypisujemy wartość do zmiennej określającej połoŜenie drugiej linii wymiarowej. location2(0) = dpt1(0) - 5 location2(1) = dpt1(1) location2(2) = 0
Tworzymy drugą linię wymiarową. Set dimObj1 = ThisDrawing.ModelSpace. AddDimAligned(dpt1, dpt3, location2)
Zmieniamy tekst napisu wymiarowego.
dimObj1.TextOverride = "h = <>" OdświeŜamy obiekt.
dimObj1.Update
62
Rys. 3 Wymiar liniowy od punktu dpt1 do punktu dpt3
Deklarujemy zmienną dimrad jako nowy obiekt AutoCAD-a
Dim dimrad As AcadDimRadial
Rys. 4 Rysunek pomocniczy do stworzenia wymiaru kątowego
Deklarujemy zmienną center jako zmienną typu double.
Dim center(0 To 2) As Double Deklarujemy zmienną chordPoint jako zmienną typu Variant.
Dim chordPoint As Variant Deklarujemy zmienną leaderLen jako zmienną typu Integer.
Dim leaderLen As Integer Przypisujemy wartość do zmiennej center. Zmienna ta jest potrzebna do przechowywania wartości współrzędnych punktu początku wymiaru kątowego. center(0) = punkt1(0) + s - r1 'punkt1(0) + 40 - 3 = 37 - wsp. X center(1) = punkt1(1) + r1
63
'punkt1(1) + 3 = 3 - wsp. Y center(2) = 0 'wsp. Z
Przypisujemy wartość do zmiennej chordPoint. Zmienna ta jest potrzebna do przechowywania wartości współrzędnych punktu środka wymiaru kątowego. Wiemy, Ŝe kąt pomiędzy osią X a prostą wyznaczoną przez punkty center oraz chordpoint wynosi 45 stopni. Znamy takŜe (lub moŜemy sobie wyliczyć ) odległość pomiędzy tymi dwoma punktami. Do wyznaczenia współrzędnych punktu chordpoint moŜemy więc uŜyć metody PolarPoint. Musimy pamiętać, Ŝe kąty podajemy w radianach 90 stopni = PI / 4 (funkcja obliczająca PI znajduje się na samym początku procedury). chordPoint = ThisDrawing.Utility.PolarPoint (center, PI / 4, r1) leaderLen = 5
Tworzenie wymiaru kątowego Set dimrad = ThisDrawing.ModelSpace. _ AddDimRadial(center, chordPoint, leaderLen)
OdświeŜenie obiektu
dimrad.Update
Rys. 5 Wymiar kątowy (zwymiarowanie promienia zaokrąglenia)
Wyświetlenie w oknie typu MsgBox informacji.
MsgBox " Zmieniamy grot wymiaru kątowego na strzałkę" Zmiana typu grota wymiaru kątowego na strzałkę.
dimrad.ArrowheadType = acArrowClosed OdświeŜenie obiektu
dimrad.Update Koniec procedury
End Sub Efekt działania procedury stworzonej przez nas na dzisiejszej lekcji widoczny jest na rysunku poniŜej.
64
Rys. 6 Zwymiarowany rysunek kątownika
16 - Instrukcje warunkowe
Instrukcje warunkowe
Instrukcje warunkowe i pętle logiczne w Visual Basicu dają nam do ręki potęŜne narzędzie do sterowania przepływem programu. Omawiając poszczególne instrukcje na podstawie przykładów chciałbym gorąco zachęcić do testowania w początkowej fazie programowania pętli i instrukcji logicznych w tzw. Oknie Immediate (Ctr + G).
Rys. 1
If...Then Instrukcji warunkowej IF uŜywamy wtedy, gdy chcemy wykonać jedną lub więcej instrukcji warunkowo. IF moŜe występować pojedynczo lub teŜ moŜe być pogrupowane w blok instrukcji. Sub test_if_then ()
65
Licznik = 3 If licznik < 10 Then licznik = licznik + 1 'je Ŝeli warunek jest spełniony, wykonywana jest 'pojedyncza instrukcja If licznik < 10 Then licznik = licznik + 1 End If End Sub
Oba przykłady są równoznaczne.
Rys. 2 Wynik działania funkcji test_if_then w oknie immediate
Rys. 3 Zmieniliśmy wartość licznika z 1 na 11. Wynikiem działania jest zwrócenie w oknie immediate liczby 11. Dzieje się tak dlatego, Ŝe warunek: licznik < 10 nie jest
spełniony, a więc nie jest wykonywane wyraŜenie licznik = licznik + 1 If...Then...Else Instrukcji warunkowej If...Then...Else uŜywamy, gdy chcemy zdefiniować kilka bloków wyraŜeń, z których tylko jedno wyraŜenie zostanie wykonane. If warunek1 Then [wyra Ŝenie-1] [ElseIf warunek2 Then [wyra Ŝenie-2]] ... [Else [wyra Ŝenie -n]] End If
Visual Basic testuje warunek-1. JeŜeli ten warunek zwraca FAŁSZ, Visual Basic przechodzi do sprawdzenia warunku-2, i tak dalej, aŜ zwróci PRAWDA
66
If Index = 0 Then ObjLayer.color = acRed ElseIf Index = 1 Then ObjLayer.color = acGreen ElseIf Index = 2 Then ObjLayer.color = acYellow Else ObjLayer.color = acWhite End If End Sub
Rys. 4 Testowanie instrukcji warunkowej if...then...else w oknie immediate
Select Case Instrukcja warunkowa Select Case jest instrukcją alternatywną do If ... Then ... Else, która posiada te same moŜliwości sterowania kodem programu. RóŜnica na korzyść instrukcji Select Case jest bardzo widoczna, gdy mamy do czynienia z kilkunastoma moŜliwościami. Mówiąc w skrócie, kod jest bardziej "czytelny". Instrukcja Select Case przetwarza Test i porównuje wartość z kaŜdym kolejnym wyraŜeniem Case. JeŜeli są zgodne, wykonywany jest blok instrukcji powiązany z danym wyraŜeniem Case. Select Case Test [Case warunek1 [blok wyra Ŝeń-1]] [Case warunek2 [blok wyra Ŝeń-2]] [Case Else [blok wyra Ŝeń-n]] End Select
Przykład wykorzystania Select Case w procedurze sprawdzającej, z jakiego zakresu jest podana liczba: Sub select_case() Dim Number Number = 11 'inicjalizacja zmiennej. Select Case Number 'ewaluacja zmiennej number. Case 1 To 5 'liczba mi ędzy 1 a 5. Debug.Print "Pomiedzy 1 and 5" Case 6, 7, 8 'liczba mi ędzy 6 a 8. Debug.Print "Pomiedzy 6 and 8" Case 9 To 10 '9 lub 10. Debug.Print "Wieksza niz 8" Case Else 'inne wartosci. Debug.Print "nie z pomiedzy 1 a 10" End Select End Sub
67
Rys. 5 Testowanie instrukcji warunkowej select case w oknie immediate
Number = 3 -> Pomiędzy 1 a 5 Number = 7 -> Pomiędzy 6 a 8 Number = 9 -> Większa niŜ 8 Number = 11 -> Nie z pomiędzy 1 a 10 While...Wend Statement Example Instrukcja logiczna While...Wend jest wykorzystywana do wykonywania zestawu instrukcji tak długo, jak długo wartość logiczna test zwraca PRAWDA. PoniŜszy przykład podnosi wartość licznika o jeden. WyraŜenia w pętli są wykonywane tak długo, jak długo licznik < 20. Sub test_while_wend () Dim Counter Counter = 0 ' Initialize variable. While Counter < 20 ' Test value of Counter. Counter = Counter + 1 ' Increment Counter. Wend ' End While loop when Counter > 19. Debug.Print Counter ' Prints 20 in the Immedi ate window. End Sub
Rys. 6 Testowanie instrukcji warunkowej While...wend w oknie immediate
Licznik mamy ustawiony na 0. Uruchamiamy naszą procedurę klikając ikonę
Rys. 7
Instrukcje wewnątrz pętli (counter = counter + 1) są przetwarzane tak długo, jak długo prawdziwy jest warunek counter < 20. Gdy licznik (counter) przyjmie wartość 20, pętla zostanie przerwana. Wyjście z pętli powoduje przetwarzanie linii kodu znajdujących się za linią WEND, tzn. wyświetlenie w oknie immediate wartości zmiennej counter.
68
Zmienna ta ma wartość 20 (musi mieć tyle, poniewaŜ gdyby miała mniej, nie opuściła by pętli While). Aby zobaczyć, co dzieje się wewnątrz funkcji While, przenosimy linijkę Debug.Print Counter przed linijkę Wend. Sub test_while_wend() Dim Counter Counter = 0 'ustawiamy licznik While Counter < 20 'test wartosci licznika. Counter = Counter + 1 'zwiekszamy licznik. Debug.Print Counter 'Wyswietla warto ść licznika 'w oknie Immediate. Wend 'Koniec p ętli gdy licznik > 19 End Sub
Rys. 8 Widok okna immediate po zmianie miejsca umieszczenia linii odpowiedzialnej za
wyświetlanie wartości zmiennej counter w oknie immediate Na końcu linii Debug.Print Counter umieściłem średnik. Nie spełnia on Ŝadnego zadania w procedurze test_while_wend2, a powoduje jedynie wyświetlenie wartości licznika w jednej linii. For...Next Pętla For ... Next jest wykorzystywana wtedy, kiedy znana jest liczba wymaganych iteracji. W poniŜszym przykładzie instrukcje w pętli są przetwarzane 6 razy. Podczas kolejnych przebiegów pętli dodawany jest kolejny znak do zmiennej Mystring, po czym jej wartość jest wyświetlana w oknie immediate. Sub test_for_next1() Dim Chars, MyString For Chars = 0 To 5 'Ustawiamy 6 powtórze ń. MyString = MyString & Chars 'dodajemy znak. Debug.Print MyString 'wyswietlenie w oknie immediate Next Chars 'zwiekszenie licznika End Sub
69
Rys. 9 Pojedyncza pętla for ... next
W poniŜszym przykładzie instrukcje w pętli For Words są umieszczone w kolejnej pętli for, tzw. "Pętla w pętli". W pierwszej pętli tworzony jest wyraz, a w drugiej z tego wyrazu tworzone jest zdanie. Sub test_for_next2() Dim Words, Chars, MyString For Words = 5 To 1 Step -1 'ustawienie 5 powtorzen. For Chars = 0 To 4 'ustawienie 5 powtorzen. MyString = MyString & Chars 'dodajemy znak. Next Chars 'zwiekszenie licznika chars MyString = MyString & " " 'Append a space. Debug.Print MyString 'wyswietlenie w oknie immediate Next Words 'zwiekszenie licznika words End Sub
70
Rys. 10 Podwójna pętla for ... next
Pętla For Each jest wykorzystywana, gdy nie jest znana liczba powtórzeń. Pętla jest wykonywana tak długo, jak długo Test logiczny ma wartość PRAWDA. Klasycznym przykładem pętli for next jest procedura wyświetlająca nazwy wszystkich warstw występujących w rysunku.
Rys. 11 Testowanie instrukcji warunkowej For Each...Next w oknie immediate
17 - Tworzenie własnych funkcji
Tworzenie własnych funkcji
Prawdopodobnie nie mieli Państwo problemów ze zrozumieniem lekcji 5., w której zostały wytłumaczone sposoby tworzenia prostych obiektów rysunkowych tj. okręgu, elipsy, łuku. Niemniej jednak tworzenie od podstaw kilkunastu okręgów o róŜnych punktach wstawienia i średnicy jest bardzo czasochłonne, a ponadto plik projektu osiąga monstrualne rozmiary. Aby temu zaradzić, programiści piszą funkcje automatyzujące najczęściej spotykane zadania projektowe. VBA nie jest tu wyjątkiem. Myślę, Ŝe ludzie piszący w AutoLispie doskonale wiedzą, o czym mówię. Z Visual Basic-em sprawa jest o tyle odmienna, Ŝe w VBA w AutoCAD-zie generalnie wykorzystujemy metody oraz cechy, a nie jak to jest np. w AutoLispie funkcje i
71
polecenia. Ale zaręczam, Ŝe po przerobieniu tej lekcji nie będą Państwo mieli kłopotów ze stworzeniem swojej własnej funkcji. Weźmy na początek zagadnienie rysowania okręgu. W lekcji 5. jeden z przykładów ilustruje tworzenie okręgu w oparciu o dane pobrane od uŜytkownika (wskaŜ punkt środkowy, wskaŜ środek okręgu). Cechą tego rozwiązania jest pełna "interaktywność" uŜytkownika z AutoCAD-em. Drugi przykład rysuje okrąg w oparciu o znane dane (środek, promień). To rozwiązanie jest wykorzystywane, gdy te dwie wielkości pochodzą z wcześniejszych obliczeń w ramach programu lub są przekazywane jako parametry przez inną funkcję. Na początek wyodrębnijmy z naszej procedury część "główną" .Będzie ona miała za zadanie pobranie informacji od uŜytkownika i przekazanie jej do funkcji. Część pierwsza : Procedura Główna Public Sub RysujOkrag() Dim PromienOkregu As Double Dim SrodekOkregu As Variant SrodekOkregu = ThisDrawing.Utility.GetPoint (, "Wska Ŝ środek okr ęgu:") CircleRadius = ThisDrawing.Utility.GetReal ("Podaj promie ń:") DrawACircle CDbl(CentrePoint(0)), CDbl(CentrePoint(1)),_ CDbl(CentrePoint(2)) , CircleRadius End Sub
Stworzyliśmy procedurę o nazwie RysujOkrag.
Public Sub RysujOkrag() Zmienne lokalne w tej procedurze : PromienOkregu, SrodekOkregu Składnia Dim słuŜy do deklaracji zmiennych (ustala typ zmiennych). W VBA mamy do czynienia z wieloma róŜnymi typami danych. Dla zmiennej lokalnej PromienOkregu typ zmiennej deklarujemy jako double tzw. "podwójnej precyzji".
Dim PromienOkregu As Double Dla zmiennej lokalnej SrodekOkregu typ zmiennej deklarujemy jako Variant. Ten typ pozwala zmiennej przyjmować róŜne typy danych wejściowych. Jest to waŜne, poniewaŜ dzięki temu nie musimy obawiać się wystąpienia błędu z uwagi na róŜne jednostki uŜywane w AutoCAD-zie np. imperial, metric, itd.
Dim SrodekOkregu As Variant Do pobrania punktu SrodekOkregu wykorzystamy metode GetPoint
SrodekOkregu = ThisDrawing.Utility.GetPoint(, "Wskaż środek okręgu:") Mamy środek okręgu wskazany przez uŜytkownika. Jego współrzędne przechowuje zmienna SrodekOkregu. Następnie musimy uzyskać od uŜytkownika wielkość promienia naszego okręgu. Drobna uwaga - promień okręgu nie moŜe być równy 0. Aby upewnić się, Ŝe uŜytkownik wpisze w linii poleceń wartość większą od zera, do pobrania wielkości promienia wykorzystamy metodę GetReal (metoda ta zwraca tylko liczby rzeczywiste).
CircleRadius = ThisDrawing.Utility.GetReal("Podaj promień:") Następna linia "załatwia" nam sprawę rysowania okręgu. RysOkrag CDbl(CentrePoint(0)), CDbl(CentrePoint(1)),_ CDbl(CentrePoint(2)), CircleRadius
Linia powyŜsza wywołuje funkcję RysOkrag z dwoma argumentami (SrodekOkregu, PromienOkregu). CDbl (wbudowana funkcja VBA) konwertuje dane typu Variant na dane typu Double. Zmienna SrodekOkregu ma współrzędne (SrodekOkregu(0), SrodekOkregu(1), SrodekOkregu(2)) Gdzie: SrodekOkregu(0) = X
72
SrodekOkregu(1) = Y SrodekOkregu(2) = Z Przykładowe wywołanie procedury: RysOkrag 4,5,6,7 4,5,6 -> środek okręgu 7 -> promień okręgu Część druga : Funkcja rysująca Nazwa funkcji: RysOkrąg Zmienne lokalne: CenX, CenY, CenZ, Rad, CircleCentre Funkcja RysOkrag wymaga podania dwóch parametrów, bez których nie moŜe być uruchomiona. Parametrami tymi są: środek okręgu oraz promień okręgu. Prametry te są przechowywane w zmiennych lokalnych CenX, CenY, CenZ, Rad, CircleCentre i są zadeklarowane jako obiekt AutoCAD-a (okrąg). Public Function RysOkrag(CenX As Double , CenY As Double, CenZ As Double, _ Rad As Double) As AcadCircle
W następnej linii deklarujemy zmienną SrodekOkregu jako zmienną typu double. Zmienna ta posłuŜy nam do przechowywania informacji o współrzędnych środka okręgu.
Dim SrodekOkregu (0 To 2) As Double Przypisujemy zmiennym X, Y i Z wartości wyodrębnione ze zmiennej SrodekOkręgu.
SrodekOkregu (0) = CenX: SrodekOkregu (1) = CenY: SrodekOkregu (2) = CenZ Zmienne z procedury RysujOkrag przekazywane są do procedury RysOkrag do zmiennej SrodekOkręgu oraz promień okręgu do zmiennej Rad. Teraz moŜemy przejść juŜ do dodania linii kodu do naszej funkcji, która spowoduje narysowanie okręgu w AutoCAD-zie.
Set RysOkrag = ThisDrawing.ModelSpace.AddCircle(SrodekOkregu, Rad) Koniec funkcji RysOkrag
End Function Funkcja RysOkrag rysuje nam okrąg w przestrzeni modelu w AutoCAD-zie. Następnie funkcja kończy swoje działanie, po czym powraca do procedury, z której została wywołana. PoniŜej zamieszczony został kompletny listing zawierający przykłady rysowania okręgów. Public Function DrawACircle (CenX As Double, CenY As Double, CenZ As Double, Rad As Double) As AcadCircle Dim CircleCentre(0 To 2) As Double CircleCentre(0) = CenX: CircleCentre(1) = CenY: CircleCentre(2) = CenZ Set DrawACircle = ThisDrawing.ModelSpace. AddCircle(CircleCentre, Rad) End Function Public Sub DrawCircle() Dim CircleRadius As Double Dim CentrePoint As Variant CentrePoint = ThisDrawing.Utility.GetPoint (, "Select Centre Point:") CircleRadius = ThisDrawing.Utility.GetReal ("Enter Circle Radius:") DrawACircle CDbl(CentrePoint(0)), CDbl(CentrePoint(1)), CDbl (CentrePoint(2)), CircleRadius End Sub ' end the macro Sub okrag1() DrawACircle 50, 50, 7, 8 DrawACircle 80, 50, 7, 8 DrawACircle 110, 50, 7, 8 Dim pkt1(0 To 2) As Double Dim pkt2(0 To 2) As Double pkt1(0) = 10: pkt1(1) = 10: pkt1(2) = 0
73
pkt2(0) = 160: pkt2(1) = 90: pkt2(2) = 0 ThisDrawing.Application.ZoomWindow pkt1, pkt2 End Sub Sub okrag2() DrawCircle End Sub
18 - Widoki
Widoki
Widok jest graficznym przedstawieniem przestrzeni modelu widzianego z danego punktu w przestrzeni.
Rys. 1 Widok płaski
Rys. 2 Widok 3D
Widok jest obiektem AutoCAD-a (AcadView). Nowy widok tworzymy korzystając z metody Add (Views.Add ) Z poziomu VBA uzyskujemy dostęp korzystając ze składni Views.Item Definiowanie nowego widoku Sub view1() 'Rozpoczynamy pisanie nowej procedury ' od zdefiniowania jej nazwy. Dim ptLd(0 To 1) As Double 'definiujemy zmienn ą ptLd jako zmienn ą typu double Dim ptPg(0 To 1) As Double 'definiujemy zmienn ą ptPg jako zmienn ą typu double ptLd(0) = 0 'przypisujemy warto ść współrz ędnej x lewego 'dolnego rogu definiowanego widoku
74
ptLd(1) = 0 'przypisujemy warto ść współrz ędnej y lewego 'dolnego rogu definiowanego widoku ptPg(0) = 100 'przypisujemy warto ść współrz ędnej x prawego 'górnego rogu definiowanego widoku ptPg(1) = 100 'przypisujemy warto ść współrz ędnej y prawego 'górnego rogu definiowanego widoku Dim ptCtr(0 To 1) As Double 'definiujemy zmienn ą ptCtr jako zmienn ą typu double. 'Zmienna ta posłu Ŝy do przechowywania informacji 'o współrz ędnych punktu centralnego widoku. 'Wyliczamy współrz ędne X i Y punktu centralnego. ptCtr(0) = ptLd(0) + ((ptPg(0) - ptLd(0)) / 2) ptCtr(1) = ptLl(1) + ((ptPg(1) - ptLd(1)) / 2) 'Definiujemy zmienn ą objView jako nowy 'obiekt AutoCAD-a (AcadView) Dim objview As AcadView 'Ustalamy aktualn ą przestrze ń na przestrze ń modelu ThisDrawing.ActiveSpace = acModelSpace 'Umieszczamy obsług ę bł ędów On Error Resume Next 'Tworzymy nowy widok o nazwie "test" Set objview = ThisDrawing.Views.Add("test") 'Obliczamy szeroko ść widoku objview.Width = ptPg(0) - ptLd(0) 'Obliczamy wysoko ść widoku objview.Height = ptPg(1) - ptLd(1) 'Podajemy punkt środkowy widoku objview.Center = ptCtr End Sub 'ko ńczymy procedur ę
Przechodzimy teraz do testowania naszej procedury. Przechodzimy do AutoCAD-a przy pomocy kombinacji klawiszy Alt + F11 i uruchamiamy makro view1. Sprawdzamy efekt działania naszego makra. Z menu górnego wybieramy : [Widok]->[Nazwane Widoki...]
75
Rys. 3 Okno dialogowe Widok z umieszczonym w nim widokiem o nazwie test
Wyświetlenie wszystkich nazw widoków w rysunku Sub wyswietl_widoki() 'definiujemy now ą procedur ę Dim objView As AcadView 'deklarujemy zmienn ą objView jako 'nowy obiekt AutoCAD-a Dim strViewNames As String 'deklarujemy zmienn ą strViewNames jako 'ła ńcuch tekstowy If ThisDrawing.Views.Count > 0 Then 'je Ŝeli w rysunku znajduje si ę chocia Ŝ jeden widok 'dla ka Ŝdego widoku znajduj ącego si ę w rysunku For Each objView In ThisDrawing.Views 'Przypisujemy zmiennej strViewNames nazw ę tego widoku strViewNames = strViewNames & objView.Name & vbCrLf Next 'zwi ększamy licznik ; licznik jest równy 'liczbie widoków w rysunku (p ętla logiczna FOR) 'Wy świetlamy nazwy widoków w oknie informacyjnym. MsgBox "Nazwane widoki w bie Ŝącym rysunku:" & vbCrLf _ & strViewNames Else 'w przeciwnym razie zostanie wy świetlone 'okno informacyjne, mówi ące o tym, Ŝe 'w bie Ŝącym rysunku nie znajduj ą si ę Ŝadne 'nazwane widoki. MsgBox "W bie Ŝącym rysunku nie ma Ŝadnych nazwanych widoków." End If 'koniec instrukcji warunkowej if End Sub 'ko ńczymy nasz ą procedur ę
Efekt działania procedury jest widoczny na rysunku poniŜej.
76
Rys. 4 Lista nazwanych widoków występujących w bieŜącym rysunku
Ustalanie aktualnego widoku Widok raz stworzony przez uŜytkownika moŜna ustalić jako aktualny. W "czystym" AutoCAD-zie korzystamy z okna dialogowego (rysunek 3) lub wpisujemy z klawiatury: View i potwierdzamy Enterem. dla wersji PL jest to polecenie Widok
Rys. 5
Wybieramy z okna dialogowego nazwę widoku i klikamy myszą przycisk Ustal aktualny. Gdy chcemy osiągnąć ten sam efekt z poziomu VBA, wówczas korzystamy z metody SetView obiektu Viewport. Public Sub UstalWidok() 'ustalamy nazw ę nowej procedury Dim objView As AcadView 'definiujemy zmienn ą objView jako widok AutoCAD-a Dim objActViewPort As AcadViewport 'definiujemy zmienn ą objAcViewPort jako aktywn ą rzutni ę Dim strViewName As String 'definiujemy zmienn ą strViewName jako ła ńcuch tekstu 'Ustalamy bie Ŝącą przestrze ń jako przestrze ń modelu ThisDrawing.ActiveSpace = acModelSpace 'Ustawienie bie Ŝącej rzutni Set objActViewPort = ThisDrawing.ActiveViewport 'Przedefiniowanie bie Ŝącej rzutni w oparciu 'o informacje o widoku 'Pro śba o wpisanie w oknie InputBox nazwy widoku strViewName = InputBox("Podaj nazw ę widoku:") 'Je Ŝeli zmienna strViewName ma przypisan ą warto ść ' pust ą, opuszczamy procedur ę If strViewName = "" Then Exit Sub 'Je Ŝeli zwrócona zostanie warto ść bł ędu, przejd ź dalej On Error Resume Next 'Ustal jako widok aktualny widok o nazwie 'wpisanej przez u Ŝytkownika w oknie InputBox Set objView = ThisDrawing.Views(strViewName) 'Je Ŝeli widok nie jest warto ści ą pust ą, to: If Not objView Is Nothing Then 'Ustal go aktualnym objActViewPort.SetView objView
77
'Ustal jako aktywn ą rzutni ę bie Ŝącą rzutni ę ThisDrawing.ActiveViewport = objActViewPort Else 'w przeciwnym wypadku 'Wy świetl okno informacyjne MsgBox "Widok nie został znaleziony" End If 'koniec instrukcji warunkowej if End Sub 'koniec procedury
19 - Bloki
Bloki
W AutoCAD-zie moŜemy utworzyć dowolną ilość bloków (jeśli oczywiście zachodzi takowa potrzeba). Najczęściej tworzymy nowy blok, korzystając z okna dialogowego Definicja bloku .
Rys. 1 . Okno dialogowe Definicja Bloku
Istnieją dwa sposoby tworzenia bloków z poziomu VBA. Pierwszy sposób to tworzenie bloku z wykorzystaniem metody Add obiektu Blok w celu stworzenia pustego bloku, a następnie dodanie elementów rysunku do definicji bloku. Drugi sposób wykorzystuje metodę Insert do tworzenia definicji bloku, jak teŜ odwołuje się do zewnętrznego pliku rysunku. Tworzenie bloku i wstawianie go do rysunku W poniŜszym przykładzie zostanie stworzony nowy blok, a następnie do definicji tego bloku zostanie dodany okrąg. Na koniec blok ten zostanie wstawiony do rysunku. Przejdźmy teraz do omówienia poszczególnych linii programu.
Sub wstawianie_bloku() Tworzymy nową procedurę. Deklarujemy zmienną blockObj jako nowy obiekt AutoCAD-a
(AcadBlock).
78
Dim blockObj As AcadBlock Deklarujemy zmienną insertionPnt jako zmienną typu double. Zmienna ta posłuŜy nam do przechowywania współrzędnych punktu wstawienia bloku.
Dim insertionPnt(0 To 2) As Double Przypisujemy wartości poszczególnym współrzędnym punktu wstawienia. insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0
Za pomocą instrukcji set tworzymy definicję nowego bloku o punkcie wstawienia inserionPnt i nazwie CircleBlock. Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "CircleBlock")
Zdefiniowaliśmy nowy blok. Teraz musimy dodać obiekty do tego bloku (w naszym przypadku będzie to pojedynczy okrąg). Na początku musimy zadeklarować potrzebne zmienne.
Dim circleObj As AcadCircle Deklarujemy zmienną circleObj jako obiekt AutoCAD-a, deklarujemy zmienne center oraz radius jako zmienną typu double Dim center(0 To 2) As Double Dim radius As Double
Przypisujemy wartości poszczególnym współrzędnym punktu wstawienia. center(0) = 0 center(1) = 0 center(2) = 0
Przypisujemy wartość promieniowi okręgu.
radius = 1 Tworzymy okrąg o środku w punkcie center i promieniu w punkcie radius.
Set circleObj = blockObj.AddCircle(center, radius) Wstawiamy blok
Dim blockRefObj As AcadBlockReference Deklarujemy zmienną blockRefObj jako nowy obiekt AutoCAD-a. Przypisujemy wartości poszczególnym współrzędnym wstawienia bloku. insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0
Wstawiamy blok (tworzymy odwołanie obiektu do zmiennej za pomocą instrukcji SET) Set blockRefObj = ThisDrawing.ModelSpace.InsertBloc k _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
Powiększamy (Zoom Wszystko)
ZoomAll Wyświetlamy okno informacyjne. MsgBox "Ten okr ąg nale Ŝy do " & blockRefObj.ObjectName End Sub
koniec procedury
79
Testujemy naszą procedurę. Po uruchomieniu jej w AutoCAD-zie okrąg został narysowany i dodany do definicji bloku. Klikamy w obszarze okręgu, a następnie po wciśnięciu prawego klawisza myszy z listy rozwijanej wybieramy Cechy
Rys. 2 Widok zaznaczonego okręgu w oknie AutoCAD-a oraz wyświetlonego okna cechy Zmiana definicji obiektu w bloku W tym przykładzie zostanie stworzony blok i zostanie dodany do niego okrąg. Następnie blok zostanie wstawiony do rysunku jako odwołanie do bloku. Na koniec zostanie zaktualizowana definicja okręgu w bloku, co spowoduje automatyczne przedefiniowanie bloku. Sub przedefiniowanie_bloku() 'Definiowanie nowego bloku Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add _ (insertionPnt, "CircleBlock") 'Dodanie okr ęgu do definicji bloku Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 radius = 1 Set circleObj = blockObj.AddCircle (center, radius) 'Wstawienie bloku do rysunku Dim blockRefObj As AcadBlockReference insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBloc k _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)
80
ZoomAll 'Przedefiniowanie okr ęgu nale Ŝącego do bloku, 'a nast ępnie zaktualizowanie odwołania do bloku circleObj.radius = 3 blockRefObj.Update End Sub 'Koniec procedury
20 - Menu w VBA w AutoCAD-zie
Menu w VBA w AutoCAD-zie
Z poziomu VBA moŜemy tworzyć i edytować dwa rodzaje menu: listę rozwijaną oraz menu kursora. Do listy rozwijanej mamy dostęp poprzez menu górne w AutoCAD-zie. Do menu kursora z kolei uzyskujemy dostęp poprzez jednoczesne wciśnięcie klawisza SHIFT oraz prawego klawisza myszy. Struktura listy rozwijanej jest ograniczona do 999 elementów. Struktura menu kursora jest ograniczona do 499 elementów. Po przekroczeniu tych wielkości następne elementy menu są ignorowane. PoniŜszy rysunek obrazuje, w jaki sposób są numerowane elementy w menu. Indeksy menu są liczone od 0 do n. Proszę równieŜ zwrócić uwagę, Ŝe separator jest takŜe liczony jako osobny element menu.
Rys. 1 Struktura listy rozwijanej
PoniŜszy przykład ilustruje, w jaki sposób za pomocą VBA moŜna stworzyć w AutoCAD-zie nowe menu i dodać to menu do istniejącej listy rozwijanej. 'Definiujemy nazw ę nowej procedury. Public Sub HelionMenu() 'Deklarujemy zmienn ą objMenus 'jako now ą list ę rozwijan ą AutoCAD-a. Dim objMenus As AcadPopupMenus 'Deklarujemy zmienn ą 'objHelionMenu jako now ą list ę Dim objHelionMenu As AcadPopupMenu 'Deklarujemy zmienn ą strNewMenuName 'jako zmienn ą typu string Dim strNewMenuName As String 'Tworzymy za pomoc ą instrukcji Set 'skojarzenie nazwy ze zmienn ą (tworzymy now ą list ę) Set objMenus = ThisDrawing.Application. MenuGroups.Item(0).Menus
81
'Je Ŝeli AutoCAD zwróci bł ąd, to przechodzimy dalej On Error Resume Next 'Tworzymy list ę rozwijan ą o nazwie Helion. Set objHelionMenu = objMenus("&Helion") 'Sprawdzamy warunek logiczny. 'Je Ŝeli obiekt menu o tej nazwie ju Ŝ istnieje, to: If Not objHelionMenu Is Nothing Then 'Wy świetlamy okno informacyjne MsgBox "Menu already exists" 'I opuszczamy bie Ŝącą procedur ę Exit Sub 'Koniec instrukcji warunkowej IF End If 'Dodajemy element menu Set objHelionMenu = objMenus.Add("&Helion") objHelionMenu.InsertInMenuBar ThisDrawing.Application.MenuBar.Count 'Ko ńczymy procedur ę End Sub
PoniŜszy przykład ilustruje sposób dodawania elementów do stworzonego przez nas menu. Dodany przez nas element menu ma za zadanie uruchomienie makra napisanego w VBA, korzystając z polecenia AutoCAD-a -VBARUN. 'Definiujemy now ą nazw ę procedury. Public Sub HelionMenu2() 'Deklarujemy zmienn ą objMenus 'jako list ę rozwijan ą AutoCAD-a. Dim objMenus As AcadPopupMenus 'Deklarujemy zmienn ą objHelionMenu 'jako now ą list ę rozwijan ą AutoCAD-a. Dim objHelionMenu As AcadPopupMenu 'Deklarujemy zmienn ą strNewMenuName 'jako zmienn ą typu string. Dim strNewMenuName As String 'Deklarujemy zmienn ą objHelionMenuItem 'jako nowy element listy rozwijanej. Dim objHelionMenuItem As AcadPopupMenuItem 'Za pomoc ą instrukcji Set dokonujemy 'skojarzenia obiektu ze zmienn ą. Set objMenus = ThisDrawing.Application.MenuGroups.I tem(0).Menus 'W wypadku zwrócenia bł ędu 'przechodzimy do nast ępnej linii. On Error Resume Next 'Tworzymy nowy obiekt listy o nazwie Helion. Set objHelionMenu = objMenus("&Helion") 'Sprawdzamy warunek logiczny: 'Je Ŝeli obiekt listy o danej nazwie nie istnieje to: If objHelionMenu Is Nothing Then 'Dodajemy go.
82
Set objHelionMenu = objMenus.Add("&Helion") 'Koniec instrukcji warunkowej IF End If 'Sprawdzamy, czy utworzony przez nas element 'menu został wy świetlony w menu górnym. If Not objHelionMenu.OnMenuBar Then 'Je Ŝeli nie, to go wy świetlamy objHelionMenu.InsertInMenuBar ThisDrawing.Application.MenuBar.Count 'Koniec instrukcji warunkowej IF End If 'Umieszczamy w naszym menu 'wywołanie makra AddCircle. Set objHelionMenuItem = objHelionMenu.AddMenuItem(0, "Add &Circle", _ "-vbarun AddCircle ") 'Tworzymy podpowied ź dla 'tego elementu menu. objHelionMenuItem.HelpString = "This adds a circle at the origin" 'Koniec procedury End Sub Sub rysOkr ąg2() Dim ObOkrag As AcadCircle 'Deklaracja zmiennej jako obiekt AutoCAD-a Dim PtSrodek(0 To 2) As Double 'Deklaracja zmiennej dla punktu środka okr ęgu Dim dblPromien As Double 'Deklaracja zmiennej dla promienia 'Dane okr ęgu: PtSrodek(0) = 100# 'Współrz ędna X środka okr ęgu PtSrodek(1) = 200# 'Współrz ędna Y środka okr ęgu PtSrodek(2) = 0# 'Współrz ędna Z środka okr ęgu dblPromien = 50# 'Warto ść promienia 'Tworzenie okr ęgu w przestrzeni modelu Set ObOkrag = ThisDrawing.ModelSpace.AddCircle (PtSrodek, dblPromien) End Sub
Rys. 2 Efekt działania procedury HelionMenu2
83
Rys. 3 Helpstring widoczny, gdy zatrzymamy kursor myszy na elemencie menu Rys
Okrąg Przy umieszczaniu elementów w menu stworzonym przy pomocy VBA musimy zwrócić uwagę na jeszcze jedną waŜną róŜnicę: zamiast znaków sterujących w menu np. ; musimy uŜywać ich odpowiedników ASCII chr(59) 'przypisanie makra otwórz (Odpowiednik VBA dla wpisania: "ESC ESC _open ") openMacro = Chr(3) & Chr(3) & Chr(95) & "open" & Chr(32)
PoniŜej umieściłem tabelę, zawierającą najczęściej uŜywane w menu znaki sterujące oraz ich odpowiedniki w ASCII.
Rys. 4