vba dla autocad

83
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 wartość typu Real: ") Me.Show End Sub NaleŜy pamiętać o tym, aby po ukryciu formularza VBA na czas pobierania od nas danych, ponownie go wyświetlić, poniewaŜ w przeciwnym przypadku moŜe się okazać, Ŝe w tym formularzu znajduje się jeszcze kod programu, który nie zostanie wykonany, poniewaŜ program zakończył przedwcześnie swoje działanie. Metoda Prompt 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

Upload: mateusz-witkowski

Post on 30-Dec-2014

311 views

Category:

Documents


20 download

TRANSCRIPT

Page 1: 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

Page 2: Vba Dla Autocad

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.

Page 3: Vba Dla Autocad

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

Page 4: Vba Dla Autocad

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])

Page 5: Vba Dla Autocad

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()

Page 6: Vba Dla Autocad

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

Page 7: Vba Dla Autocad

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

Page 8: Vba Dla Autocad

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

Page 9: Vba Dla Autocad

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

Page 10: Vba Dla Autocad

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, ,

Page 11: Vba Dla Autocad

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

Page 12: Vba Dla Autocad

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.

Page 13: Vba Dla Autocad

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 =

Page 14: Vba Dla Autocad

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

Page 15: Vba Dla Autocad

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

Page 16: Vba Dla Autocad

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

Page 17: Vba Dla Autocad

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.

Page 18: Vba Dla Autocad

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

Page 19: Vba Dla Autocad

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

Page 20: Vba Dla Autocad

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

Page 21: Vba Dla Autocad

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.

Page 22: Vba Dla Autocad

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

Page 23: Vba Dla Autocad

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#

Page 24: Vba Dla Autocad

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

Page 25: Vba Dla Autocad

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

Page 26: Vba Dla Autocad

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

Page 27: Vba Dla Autocad

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

Page 28: Vba Dla Autocad

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

Page 29: Vba Dla Autocad

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)

Page 30: Vba Dla Autocad

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)

Page 31: Vba Dla Autocad

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

Page 32: Vba Dla Autocad

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"

Page 33: Vba Dla Autocad

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

Page 34: Vba Dla Autocad

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

Page 35: Vba Dla Autocad

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.

Page 36: Vba Dla Autocad

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.

Page 37: Vba Dla Autocad

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

Page 38: Vba Dla Autocad

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.

Page 39: Vba Dla Autocad

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.

Page 40: Vba Dla Autocad

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.

Page 41: Vba Dla Autocad

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

Page 42: Vba Dla Autocad

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)

Page 43: Vba Dla Autocad

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 ść

Page 44: Vba Dla Autocad

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

Page 45: Vba Dla Autocad

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

Page 46: Vba Dla Autocad

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

Page 47: Vba Dla Autocad

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))

Page 48: Vba Dla Autocad

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,

Page 49: Vba Dla Autocad

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

Page 50: Vba Dla Autocad

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

Page 51: Vba Dla Autocad

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

Page 52: Vba Dla Autocad

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

Page 53: Vba Dla Autocad

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ą

Page 54: Vba Dla Autocad

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.

Page 55: Vba Dla Autocad

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.

Page 56: Vba Dla Autocad

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

Page 57: Vba Dla Autocad

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

Page 58: Vba Dla Autocad

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

Page 59: Vba Dla Autocad

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

Page 60: Vba Dla Autocad

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)

Page 61: Vba Dla Autocad

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

Page 62: Vba Dla Autocad

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

Page 63: Vba Dla Autocad

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.

Page 64: Vba Dla Autocad

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 ()

Page 65: Vba Dla Autocad

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

Page 66: Vba Dla Autocad

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

Page 67: Vba Dla Autocad

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.

Page 68: Vba Dla Autocad

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

Page 69: Vba Dla Autocad

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

Page 70: Vba Dla Autocad

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

Page 71: Vba Dla Autocad

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

Page 72: Vba Dla Autocad

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

Page 73: Vba Dla Autocad

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

Page 74: Vba Dla Autocad

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...]

Page 75: Vba Dla Autocad

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.

Page 76: Vba Dla Autocad

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

Page 77: Vba Dla Autocad

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).

Page 78: Vba Dla Autocad

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

Page 79: Vba Dla Autocad

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)

Page 80: Vba Dla Autocad

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

Page 81: Vba Dla Autocad

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.

Page 82: Vba Dla Autocad

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

Page 83: Vba Dla Autocad

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