You are on page 1of 83

Podstawy programowania w VBA dla AutoCAD-a

Opracowano na podstawie VBA dla AutoCAD-a, Wyd. Helion, 2001 I. Cz I -- Pobieranie danych Lekcja 1 -- Pobieranie danych od uytkownika (metody Getxxx) -- cz 1 1. 2. Lekcja 2 -- Pobieranie danych od uytkownika (metody Getxxx) -- cz 2 Cz II -- Rysowanie obiektw paskich 1. Lekcja 3 -- Linia Lekcja 4 -- Polylinia 2. 3. Lekcja 5 -- Okrg, Elipsa, uk Lekcja 6 -- Kreskowanie 4. 5. Lekcja 7 -- Tekst Cz III -- Paskie elementy zoone 1. Lekcja 8 -- Obliczanie odlegoci pomidzy dwoma punktami 2. Lekcja 9 -- Rysowanie trjkta 3. Lekcja 10 -- Rysowanie prostokta 4. Lekcja 11 -- Rysowanie stopy fundamentowej Lekcja 12 -- Modyfikacje obiektw AutoCAD-a 5. 6. Lekcja 13 -- Warstwy 7. Lekcja 14 -- Zbiory wskaza 8. Lekcja 15 -- Wymiarowanie Lekcja 16 -- Instrukcje warunkowe 9. 10. Lekcja 17 -- Tworzenie wasnych funkcji Lekcja 18 -- Widoki 11. 12. Lekcja 19 -- Bloki 13. Lekcja 20 -- Menu w VBA w AutoCAD-zie

II.

III.

1 - Pobieranie danych od uytkownika


cz 1 (metody Getxxx) - kontrola wprowadzonych danych
Wszystkie metody pobierania danych przez AutoCAD-a wymagaj od uytkownika interakcji z wykorzystaniem rysunku lub linii polece. Jeeli chcemy korzysta z tych metod w trakcie pracy z programem w VBA, ktry 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 ktrym formularze s tzw. modalne, co oznacza, e podczas gdy s one aktywne, nie ma moliwoci korzystania w Autocad-zie z ekranu graficznego ani linii polece (modalne s rwnie okna dialogowe DCL). Wszystkie funkcje do pobierania informacji nosz potoczn nazw

Getxxx.
Przykad ukrywania formularza VBA na czas pobrania od uytkownika informacji:
Private Sub cmdGetReal_click () Dim dblinput As Double Me.Hide DblInput = ThisDrawing.Utility.GetReal("Podaj warto typu Real: ") Me.Show End Sub

Naley pamita o tym, aby po ukryciu formularza VBA na czas pobierania od nas danych, ponownie go wywietli, poniewa w przeciwnym przypadku moe si okaza, e w tym formularzu znajduje si jeszcze kod programu, ktry nie zostanie wykonany, poniewa program zakoczy przedwczenie swoje dziaanie.

Metoda Prompt
Metoda Prompt suy do wywietlania informacji w linii polece AutoCAD-a. Metoda ta nie zwraca wartoci. Skadnia tej funkcji wyglda nastpujco: object.Prompt Message

Powysze przykady ilustruj sposb wykorzystania metody Prompt: Przykad nr 1:


Public Sub Przykad_Prompt() ' funkcja sub deklaruje nazw, argumenty i kod, ' ktry tworzy procedur SUB ThisDrawing.Utility.Prompt VbCr & "To jest przykadowa wiadomo" ' wywietlenie informacji w linii polece AutoCAD-a, ' VbCr - znak powrotu karetki End Sub ' zakoczenie procedury sub

Rys. 1 Dziaanie metody Prompt Przykad nr 2:


Sub Przykad_Prompt() ThisDrawing.Utility.Prompt vbCr & "Wcinij dowolny End Sub klawisz..."

GetKeyword
Metoda GetKeyword suy do pobierania od uytkownika sowa kluczowego. Skadnia tej funkcji wyglda nastpujco: object.GetKeyword([Prompt]) AutoCAD zatrzymuje si w oczekiwaniu na wybr uytkownika. Parametr prompt okrela acuch tekstowy, jaki zostaje wywietlony w linii polece AutoCAD-a przed tym, jak zatrzyma si on w oczekiwaniu na wybr sowa kluczowego. Parametr Prompt jest parametrem opcjonalnym. Wprowadzony przez uytkownika acuch tekstowy nie moe by duszy ni 511 znakw. Jeeli nic nie zostanie wpisane i bdzie wcinity klawisz Enter, jako warto zwrotna zostanie zwrcony acuch pusty "". Mona tego unikn poprzez wywoanie metody InitializeUserInput z parametrem 1, ktry na to nie pozwala.

InitializeUserInput 1, "[Opcja1] [Opcja2] [Opcja3]"


List akceptowanych sw kluczowych uzyskujemy poprzez wywoanie metody InitializeUserInput . Jeeli uytkownik wpisze wyraz nie bdcy sowem kluczowym, AutoCAD wywietla komunikat o bdzie i prbuje jeszcze raz, ponownie wywietlajc zacht (jeli takowa zostaa okrelona).
Sub Przykad_GetKeyword1() 'Deklaracja nazwy nowej procedury 'Deklaracja zmiennej ListaSwKluczowych jako zmienna 'typu String zmienna ta bdzie przechowywaa list sw 'kluczowych Dim ListaSwKluczowych As String 'Przypisanie zmiennej ListaSwKluczowych listy trzech 'dostpnych opcji ListaSwKluczowych = "Szeroko Wysoko Gboko" 'ustalenie akceptowalnych sw kluczowych poprzez wywoanie 'metody InitializeUserInput Bits[, Keyword] gdzie: 'Bit = 1 = nie zezwala na wprowadzenie pustego acucha "" ThisDrawing.Utility.InitializeUserInput 1, ListaSwKluczowych 'Zachta do wybrania sowa kluczowego, 'sowa kluczowe mona wybra rwnie poprzez wybr 'mnemonika.

'W tym wypadku s

to litery S W G

Dim ZwrconaWarto As String ZwrconaWarto = ThisDrawing.Utility.GetKeyword _ ("Wybierz opcj (Wysoko)(Szeroko)(Gboko): ") MsgBox "Wybra " & ZwrconaWarto, , "Przykad GetKeyword 1" End Sub

Wskazwka: Aby program sta si bardziej przyjazny uytkownikowi, w linii polece mona umieci warto domyln, ktra zostanie wybrana, jeeli uytkownik wcinie Enter.
Sub Przykad_GetKeyword2() 'nazwy nowej procedury Dim ListaSwKluczowych As String 'ustalenie akceptowalnych sw kluczowych poprzez 'wywoanie metody InitializeUserInput Bits[, Keyword] 'gdzie: 'Bit = 1 = nie zezwala na wprowadzenie pustego acucha "" ThisDrawing.Utility.InitializeUserInput 0, "Linia Okrg uk" ZwrconaWarto = ThisDrawing.Utility.GetKeyword _ (vbCrLf & "Enter an option (Linia/Okrg/): ") If keyWord = "" Then ZwrconaWarto = "uk" MsgBox "Wybrae " & ZwrconaWarto, , "Przykad GetKeyword 2" End Sub

GetString
Metoda GetString suy do pobierania od uytkownika danych w postaci tekstu. Skadnia tej funkcji wyglda nastpujco: object.GetString (HasSpaces[, Prompt]) AutoCAD zatrzymuje si w oczekiwaniu na wprowadzenie przez uytkownika danych w postaci tekstu (string). Parametr HasSpaces okrela, czy wprowadzany tekst moe zawiera spacje. Jeeli parametr HasSpaces ma warto Prawda, acuch tekstowy moe zawiera spacje i aby zakoczy wprowadzanie tekstu, musimy wcisn klawisz Enter. Jeeli parametr HasSpaces ma warto False, to wprowadzanie tekstu koczy wcinicie zarwno klawisza Enter, jak i klawisza Spacja. Jeeli uytkownik wpisze wicej ni 132 znaki, wprowadzanie tekstu bdzie kontynuowane a do wcinicia Entera lub Spacji (jeli parametr HasSpaces ma warto Prawda), ale jako wynik zwracane s tylko 132 znaki. Parametr Prompt jest parametrem opcjonalnym i suy do wywietlenia zachty do wprowadzenia danych. Przykad obrazujcy rne sposoby pobierania od uytkownika wartoci tekstowych.
Sub Przykad_GetString() 'Deklaracja nazwy procedury Dim returnString As String 'returnString sucej do 'przechowywania acucha znakw returnString = ThisDrawing.Utility.GetString _ (False, "Wpisz tekst (spacja lub koczy wprowadzanie danych): ") 'przypisanie zmiennej returnString wartoci ' bdcej wynikiem dziaania metody GetString MsgBox "Wpisano tekst:'" & returnString & "'", , "Przykad metody GetString " 'wykorzystanie okna informacyjnego do 'wywietlenia pobranego tekstu. Tekst

'zachty i wprowadzony tekst moe zawiera spacje returnString = ThisDrawing.Utility.GetString _ (True, "Wisz tekst ( koczy wprowadzanie danych):") MsgBox "Wpisano tekst'" & returnString & "'", , " Przykad metody GetString " 'Tekst zachty i wprowadzony tekst moe 'zawiera spacje ale nie moe zawiera 'pustego acucha znakw Dim NieZero As Integer 'Deklaracja zmiennej nie zero jako Integer NieZero = 1 'przypisanie zmiennej NieZero wartoci 1 ThisDrawing.Utility.InitializeUserInput NieZero 'uycie metody InitializeUserInput do okrelenia, 'e acuch pusty nie zostanie zaakceptowany poniewa 'ThisDrawing.Utility.InitializeUserInput = NieZero = 1 returnString = ThisDrawing.Utility.GetString _ (True, " Wpisz tekst ( koczy wprowadzanie danych): ") 'przypisanie zmiennej returnString wartoci 'bdcej wynikiem dziaania metody GetString MsgBox "The string entered was '" & returnString & "'", , "GetString Example" 'wykorzystanie okna informacyjnego do wywietlenia 'pobranego tekstu. 'Tekst zachty End Sub 'zakoczenie procedury Przykad_GetString

GetInteger
Metoda GetInteger suy do pobierania od uytkownika liczby cakowitej z zakresu 32,768 to +32,767. Skadnia tej funkcji wyglda nastpujco: object.GetInteger([Prompt]) AutoCAD zatrzymuje si w oczekiwaniu na podanie przez uytkownika liczby cakowitej. Parametr prompt jest parametrem opcjonalnym i okrela tekst zachty wywietlanej w linii polece AutoCAD-a. Jeli zamiast liczby cakowitej zostanie zwrcone sowo kluczowe, AutoCAD wygeneruje informacje o bdzie. Przykad
Sub Przykad_GetInteger1() 'W tym przykadzie wywietlona zostanie liczba 'cakowita pobrana od uytkownika 'Deklaracja zmiennej returnInt jako zmienna typu 'integer, bdzie ona wykorzystywana do 'przechowywania wartoci liczby cakowitej pobranej 'od uytkownika Dim returnInt As Integer 'Zwrcenie wartoci pobranej od uytkownika. 'Prompt jest parametrem opcjonalnym. 'Wywietla zacht w linii polece AutoCAD-a. 'Skadnia: object.GetInteger([Prompt])

returnInt = ThisDrawing.Utility.GetInteger ("Podaj liczb cakowit: ") MsgBox "Podana liczb cakowita to: " & returnInt & vbCrLf & _ "(Podaj nastpn liczb bez zachty.)", , "Przykad GetInteger" 'Zwrcenie wartoci pobranej od uytkownika. returnInt = ThisDrawing.Utility.GetInteger() MsgBox " Podana liczb cakowita to: " & returnInt, , "Przykad GetInteger" End Sub

GetReal
Mtoda GetReal jest uywana do pobierania od uytkownika danych typu Double. Skadnia tej metody wyglda nastpujco: UtilityObject.GetReal([Prompt]) Jeeli pobrana od uytkownika warto jest liczb typu Real, AutoCAD zwraca jej warto, jeeli za ni nie jest, to AutoCAD wygeneruje informacje o bdzie Requires numeric values.
Sub Przykad_GetReal() 'Ten przykad zwraca liczb rzeczywist p 'obran od uytkownika 'Deklaracja zmiennej, ktra bdzie przechowywa 'pobran warto Dim returnReal As Double 'Zwraca warto podan przez uytkownika. 'Prompt, acuch tekstowy w 'cudzysowie stanowicy zacht do podania 'liczby rzeczywistej. returnReal = ThisDrawing.Utility.GetReal ("Wpisz liczb rzeczywist: ") MsgBox "Wpisae liczb " & returnReal & vbCrLf & _ "(Nastpn warto wprowad bez zachty.)", , "Przykad metody GetReal" 'Zwrcenie wartoci pobranej od uytkownika. returnReal = ThisDrawing.Utility.GetReal( "Wpisz liczb rzeczywist: ") MsgBox "Wpisae liczb " & returnReal & vbCrLf, , "Przykad metody GetReal" End Sub

GetPoint
Skadnia: UtilityObject.GetPoint([Point][, Prompt]) Zwraca warto typu Variant. Parametr Point jest parametrem opcjonalnym. AutoCAD zatrzymuje si w oczekiwaniu na podanie punktu przez uytkownika, jako warto zwrotn zwraca warto tego punktu. Parametr Point okrela wzgldny punkt bazowy w globalnym ukadzie wsprzdnych. Parametr Point okrela acuch tekstowy, ktry zosta wywietlony przed zatrzymaniem si AutoCAD-a Uytkownik moe okreli punkt, podajc wsprzdne w biecym ukadzie wsprzdnych. GetPoint treats the Point parameter and the return value as three-dimensional points. Uytkownik moe rwnie wskaza punkt okrelajc jego pooenie na ekranie graficznym. Jeeli parametr Point jest okrelony, AutoCAD rysuje lini tymczasow od niego do biecego pooenia kursora.
Sub Przykad_GetPoint()

'Ten przykad zwraca punkt podany przez uytkownika. 'Deklaracja zmiennej do przechowywania wartoci 'punktu zwrconego przez AutoCAD-a. Dim returnPnt As Variant 'Zwrot wartoci Point returnPnt = ThisDrawing.Utility.GetPoint (, "Wska punkt: ") MsgBox "WCS punkt: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2) & vbCrLf & _"(nastpna warto bez zachty.)", , "Przykad GetPoint" 'zwraca punkt returnPnt = ThisDrawing.Utility.GetPoint MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "Przykad 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 uytkownika Dim lineObj As AcadLine Set lineObj = ThisDrawing.ModelSpace.AddLine (basePnt, returnPnt) ZoomAll End Sub

2 - Pobieranie danych od uytkownika cz 2 (metody Getxxx) GetCorner


Metoda GetCorner suy do pobierania od uytkownika naronikw prostokta Skadnia tej funkcji wyglda nastpujco: object.GetCorner(Point[, Prompt]) AutoCAD zatrzymuje dziaanie w oczekiwaniu na wskazanie przez uytkownika naronika prostokta poprzez wybranie dowolnego punktu w globalnym ukadzie wsprzdnych. Uytkownik moe rwnie wskaza lokalizacj tego punktu bazowego poprzez wybranie dowolnego punktu na ekranie graficznym. AutoCAD rysuje wtedy dynamiczny prostokt, zaczepiony we wskazanym punkcie bazowym i w miejscu, gdzie w danej chwili znajduje si kursor programu, aby uatwi uytkownikowi wskazanie drugiego naronika. Prostokt jest rysowany w Globalnym ukadzie wsprzdnych w paszczynie XY. Gdy do wskazania punktw zostao wykorzystane urzdzenie wskazujce (np. mysz ), wsprzdna Z obu punktw jest ignorowana, a wsprzdnej Z zostaje przypisana bieca warto zmiennej systemowej poziom (elevation). Parametr Point okrela pooenie punktu bazowego prostokta w przestrzeni 3D w globalnym ukadzie wsprzdnych. Parametr ten jest wymagany. Parametr Prompt okrela acuch tekstowy, jaki AutoCAD wywietla w linii polece jako zacht dla uytkownika do wprowadzenia danych. Parametr Prompt jest opcjonalny. Przykad dziaania metody GetCorner

Zostaje pobrany od uytkownika punkt bazowy, a nastpnie zostaje wywietlona zachta (opcjonalna) do wskazania drugiego punktu.
Sub Example_GetCorner() 'zmienna zostanie wykorzystana do 'przechowywania wartoci '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# 'Zachta dla uytkownika do 'wskazania drugiego punktu. returnPnt = ThisDrawing.Utility.GetCorner (basePnt, "Wska naronik: ") 'Wywietlamy drugi punkt wskazany 'przez uytkownika. MsgBox "Wskazano punkt " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "Przykad GetCorner" End Sub

GetDistance
Pobiera odlego pomidzy dwoma punktami. Skadnia: Object.GetDistance([Point][, Prompt]) AutoCAD zatrzymuje si w oczekiwaniu na wprowadzenie danych przez uytkownika liniowej odlegoci i zwraca jej warto. Parametr Point okrela punkt bazowy w Globalnym Ukadzie Wsprzdnych. Parametr Prompt okrela acuch tekstowy, jaki AutoCAD wywietla w linii polece jako zacht dla uytkownika do wprowadzenia danych. Oba Parametry Point i Prompt s opcjonalne. Uytkownik moe okreli odlego, wpisujc jej warto w biecym formacie jednostek, jak te poprzez wskazanie dwch punktw na ekranie graficznym. AutoCAD tworzy tymczasow lini od pierwszego punktu do pozycji, w jakiej znajduje si kursor. Jeeli parametr Point jest okrelony, AutoCAD traktuje go jako pierwszy z dwch wskazywanych punktw. Parametry Point i Prompt nie s wymagane. Niezalenie od metody wykorzystanej do okrelenia odlegoci, zawsze zwracana jest warto typu Double. Przykad
Sub Przykad_GetDistance() 'Przyad dziaania 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 uytkownika. returnDist = ThisDrawing.Utility.GetDistance (, "Enter distance: ") MsgBox "Podana odlego " & returnDist & vbCrLf & _"(Podaj odlego bez zachty.)", , "Przykad GetDistance" 'zwraca warto podan podan przez uytkownika. returnDist = ThisDrawing.Utility.GetDistance() MsgBox "Podana odlego " & returnDist, , "Przykad GetDistance" 'zwraca warto podan podan przez uytkownika. returnDist = ThisDrawing.Utility.GetDistance (basePnt, "Podaj odlego: ") MsgBox "Podana odlego " & returnDist, , "Przykad GetDistance" End Sub

GetAngle
Metoda GetAngle suy do pobierania od uytkownika wartoci kta. Skadnia tej funkcji wyglda nastpujco: Object.GetAngle([Point][, Prompt]) AutoCAD zatrzymuje si na czas pobrania od uytkownika wartoci kta i przypisuje j jako warto zwrotn do tego kta. Parametr Point okrela punkt bazowy kta w trjwymiarowym globalnym ukadzie wsprzdnych. Parametr Prompt okrela acuch tekstowy, jaki AutoCAD wywietla w linii polece jako zacht dla uytkownika do wprowadzenia danych. Oba Parametry Point i Prompt s opcjonalne. Uytkownik moe okreli kt poprzez wpisanie wartoci w biecym formacie pomiaru ktw. Kt mona jeszcze okreli, wskazujc na ekranie graficznym dwa punkty. Po wskazaniu pierwszego AutoCAD prowadzi z niego tymczasow lini do miejsca, w ktrym znajduje si kursor. Jeeli podany jest parametr Point, AutoCAD traktuje go jako jeden z punktw do wskazania. Kt mierzony jest w paszczynie XY globalnego ukadu wsprzdnych (GetAngle ignoruje wsprzdn Z). Niezalenie od metody uytej do podania kta, GetAngle zwraca warto powrotn do wartoci kta wyraonego w radianach. Kierunek mierzenia kta jest zawsze kierunkiem przeciwnym do ruchu wskazwek zegara. Kierunek zerowy kta jest zaleny od biecych ustawie zmiennej systemowej ANGBASE.

Rys. 1 Przykad
Sub Przykad_GetAngle() 'Przykad ten demonstruje cztery rne sposoby na 'zmierzenie kta przy pomocy metody GetAngle Dim retAngle As Double 'Deklaracja zmiennej retAngle 'Zwraca kt w radianach, w cudzysowie 'zachta do wpisania kta retAngle = ThisDrawing.Utility. GetAngle(, "Podaj kt: ") MsgBox "Podany kt wynosi " & retAngle, , "Przykad metody GetAngle " 'Zwraca kt w radianach, brak zachty retAngle = ThisDrawing.Utility.GetAngle() MsgBox " Podany kt wynosi " & retAngle, , " Przykad GetAngle " 'Zwraca kt w radianach, z tekstem zachty '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 kt: ") MsgBox " Podany kt wynosi " & retAngle, , "Przykad GetAngle" 'Zwraca kt w radianach, retAngle = ThisDrawing.Utility.GetAngle(basePnt) MsgBox " Podany kt wynosi " & retAngle, , "Przykad GetAngle " End Sub

GetOrientation
Metoda GetOrientation suy do pobierania od uytkownika wartoci kta. Skadnia:

GetOrientation([Point][, Prompt])
AutoCAD zatrzymuje si na czas pobrania od uytkownika wartoci kta i przypisuje j jako warto zwrotn do tego kta. Parametr Point okrela punkt bazowy kta w trjwymiarowym globalnym ukadzie wsprzdnych. Parametr Prompt okrela acuch tekstowy, jaki AutoCAD wywietla w linii polece jako zacht dla uytkownika do wprowadzenia danych. Oba Parametry Point i Prompt s opcjonalne. Niezalenie od metody uytej do podania kta, GetOrientation zwraca warto powrotn do wartoci kta wyraonego w radianach. Kierunek mierzenia kta jest zawsze kierunkiem przeciwnym do ruchu wskazwek zegara. Kierunek zerowy kta jest niezaleny od biecych ustawie zmiennej systemowej ANGBASE. Tym samym kt zerowy jest zawsze "na godzinie trzeciej". Przykad
Sub Przykad_GetOrientation1() 'Przykad ilustruje pobieranie kierunku od 'uytkownika trzema rnymi sposobami Dim retOrientation As Double 'Zwrcona zostaje warto kierunku 'w radianach retOrientation = ThisDrawing.Utility.GetOrientation _ (, "Wska kierunek: ") MsgBox "Kierunek to " & retOrientation & vbCrLf & _ "(wska nastpny ju bez zachty.)", , "Przykad GetOrientation " End Sub Sub Przykad_GetOrientation2() Dim retOrientation As Double ' Zwrcona zostaje warto kierunku w radianach retOrientation = ThisDrawing.Utility.GetOrientation() MsgBox "Kierunek to " & retOrientation, , "Przykad GetOrientation" End Sub Sub Przykad_GetOrientation3() Dim retOrientation As Double 'Zwraca kierunek w radianach z zacht 'i punktem bazowym Dim basePnt(0 To 2) As Double basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0# retOrientation = ThisDrawing.Utility.GetOrientation (basePnt, "Wska kierunek: ") MsgBox "Kierunek to " & retOrientation, , "Przykad GetOrientation" End Sub

GetEntity
Metoda GetEntity suy do pobierania przez uytkownika obiektu AutoCAD-a poprzez wskazania na ekranie graficznym. Skadnia tej funkcji wyglda nastpujco: Object.GetEntity Object, PickedPoint[, Prompt] Jeeli obiekt zostanie wskazany, to w pierwszym parametrze zostaje zwrcona jego warto, a drugi parametr bdzie zawiera punkt wskazany w Globalnym Ukadzie wsprzdnych. Dziki metodzie GetEntity mona uzyskiwa dostp do obiektw, ktre nie s widoczne na ekranie, gdy znajduj si na zamroonej warstwie. Przykad

Sub Przykad_GetEntity() 'Przykad ten tworzy kilkanacie obiektw 'w przestrzeni modelu. 'Nastpnie uytkownik jest proszony 'o wskazanie ktrego z nich 'Dziaanie przykadu zostaje przerwane, 'gdy uytkownik wskae 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 okrg 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 obiektw Dim returnObj As AcadObject Dim basePnt As Variant On Error Resume Next ' oczekiwanie na wybr obiektu przez uytkownika RETRY: ThisDrawing.Utility.GetEntity returnObj, basePnt, "Wska obiekt" If Err <> 0 Then Err.Clear MsgBox "Good Bye.", , "Przykad GetEntity" Exit Sub Else returnObj.Color = acRed returnObj.Update MsgBox "The object type is: " & returnObj.EntityName, ,

10

"Przykad GetEntity" returnObj.Color = acByLayer returnObj.Update End If GoTo RETRY End Sub

GetSubEntity
Skadnia tej funkcji wyglda nastpujco: object.GetSubEntity Object, PickedPoint,

TransMatrix, ContextData[, Prompt]


Jeeli obiekt zostanie wskazany, to w pierwszym parametrze zostaje zwrcona jego warto, a drugi parametr bdzie zawiera punkt wskazany w Globalnym Ukadzie wsprzdnych. Dziki metodzie GetEntity mona uzyskiwa dostp do obiektw, ktre nie s widoczne na ekranie, gdy znajduj si na zamroonej warstwie. Parametr prompt jest opcjonalny. Parametr okrela wsprzdne punktu wskazanego przez uytkownika w globalnym ukadzie wsprzdnych. Parametr TransMatrix jest to macierz opisujca wskazany obiekt. Parametr ContexData to tablica identyfikatorw podobiektw w wybranym obiekcie.

Przykad
Sub Przykad_GetSubEntity() 'Uytkownik 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 zamkniciu tego okna _ dialogowego." 'Pobranie informacji o wybranym obiekcie ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData 'Przetwarzanie I wywietlenie informacji HasContextData = IIf(VarType(ContextData) = vbEmpty, " nie ma ", " ma ") MsgBox "Wskazae obiekt: " & TypeName(Object) & vbCrLf & _ "Wskazany punkt : " & PickedPoint(0) & ", " & _ PickedPoint(1) & ", " & _ PickedPoint(2) & vbCrLf & _ "Ten obiekt" & HasContextData & "zawiera podobiekty." Exit Sub NOT_ENTITY: 'jeeli wskaesz puste miejsce na rysunku 'lub nie wskaesz obiektu, 'zostanie wywietlony nastpujcy 'komunikat bdu If MsgBox("Nie wskazae obiektu. Wcinij Ok aby sprbowa ponownie.", _ vbOKCancel & vbInformation) = vbOK Then Resume TRYAGAIN End If End Sub

11

3 - Linia
Dzisiejsza lekcja bdzie powicona tworzeniu linii w AutoCAD-zie z wykorzystaniem VBA. W pierwszej czci stworzymy program rysujcy prosty odcinek linii pomidzy dwoma dowolnymi punktami wskazanymi przez uytkownika na ekranie. W drugiej czci stworzymy program rysujcy prosty odcinek linii pomidzy dwoma punktami o znanych wsprzdnych. W lekcji tej zapoznamy si bliej z:

menaderem VBA edytorem VBA instrukcj Set

Wykorzystamy poznan na wczeniejszych lekcjach metod GetPoint do pobrania od uytkownika punktw pocztku i koca linii Cz pierwsza - rysowanie linii midzy dwoma punktami wskazanymi przez uytkownika. Na pocztek kilka oglnych informacji na temat tworzenia nowego programu w VBA. Kady program lub podprogram musi si zawiera pomidzy dwoma liniami: Sub

[nazwa_programu] ([lista_argumentw]) - jest to linia definiujca pocztek nowej


procedury oraz End Sub, ktra oznacza koniec biecej procedury. Moim zdaniem, najszybciej mona 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 menadera VBA.

Rys. 1 Okno dialogowe menadera programw Nowy projekt tworzymy klikajc przycisk Nowy. W oknie menadera na licie dostpnych projektw pojawi si nowy projekt o nazwie ACADproject i pooeniu Global. Teraz moemy zapisa nasz projekt. W tym celu klikamy przycisk Zapisz jako ... i zapisujemy nasz projekt w dowolnym katalogu, nadajc mu dowoln nazw np. rys_linii1.dvb.

12

Rys. 2 Okno menadera projektw VBA z nowym projektem widocznym w polu Projekty Po zapisaniu pliku projektu klikamy przycisk Edytor Visual Basic w menaderze VBA, co powoduje wywietlenie okna edytora.

Rys. 3 . Okno edytora VBA w AutoCAD-zie A wic nasza procedura rysujca lini w AutoCAD-zie rozpocznie si od zdefiniowania jej nazwy: Sub rysowanie_linii (). Nastpn rzecz, na ktr musimy zwrci szczegln uwag, jest zdefiniowanie zmiennych, jakie bd wystpoway w danej procedurze. Linia Dim Linia As AcadLine jest deklaracj nowego obiektu jako nowego obiektu AutoCAD-a. Nastpnie przechodzimy do zadeklarowania zmiennych, ktre bd przechowyway wsprzdne pocztku i koca linii. Dim Pt1 As Variant - deklaracja zmiennej, ktra bdzie przechowywaa pocztek linii. Dim Pt2 As Variant - deklaracja zmiennej, ktra bdzie przechowywaa wsprzdn punktu kocowego linii. Majc zadeklarowane zmienne, przystpujemy do pobrania punktw pocztku i koca linii od uytkownika za pomoc metody GetPoint, ktr poznalimy w poprzednich lekcjach patrz: metody pobierania danych). I tak dla pierwszego punktu bdzie to: Pt1 =

13

ThisDrawing.Utility.GetPoint(, "Wskaz pierwszy punkt [Pt1]:"). Linia ta powoduje, e


AutoCAD zgosi zacht do wskazania pierwszego punktu (tektst znajdujcy si w cudzysowie). Analogicznie dla punktu drugiego: Pt2 = ThisDrawing.Utility.GetPoint(,

"Wskaz drugi punkt [Pt2]:") Mamy ju pobrane i przypisane do zmiennych Pt1 i Pt2
wsprzdne punktu pocztku i koca linii, moemy wic przystpi do jej narysowania. Aby narysowa lini wykorzystamy instrukcj Set do skojarzenia odwoania 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, ktra koczy nasz procedur. Zapisujemy nasz projekt, wybierajc z menu grnego 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. Wywietli si okno dialogowe Makra, w ktrym wybieramy wrd makr dostpnych na licie nazw naszego makra, po czym klikamy przycisk Uruchom.

Rys. 5 Okno dialogowe Makra z widocznym plikiem projektu

14

Po uruchomieniu procedury rysowania linii, w linii polece AutoCAD-a zostanie wywietlona zachta do wskazania na ekranie punktu pocztkowego rysowanej linii.

Rys. 6 Linia polece AutoCAD-a z zacht do wskazania punktu Po wskazaniu pierwszego punktu w linii polece pojawi si zachta do wskazania na ekranie punktu kocowego.

Rys. 7 Linia polece AutoCAD-a z zacht do wskazania na ekranie drugiego punktu Po wskazaniu obu punktw zostanie narysowany midzy nimi prosty odcinek linii. Cz druga - rysowanie linii pomidzy dwoma punktami o zadanych wsprzdnych Przyjmijmy zaoenia zgodne z tym, co widzimy na poniszym rysunku. Mamy za zadanie narysowa lini czc te punkty.

Rys. 8 Wsprzdne punktw: Pt1 (10,10,0) Pt2(20,30,0) Zwrcie Pastwo uwag na to, e wypisaem wszystkie trzy wsprzdne, czyli

Pt1(x1,y1,z1) oraz Pt2(x2,y2,z2), pomimo tego, e korzystajc ze standardowych


narzdzi rysunkowych pominlibymy wsprzdn Z obu punktw. Na potrzeby Visual Basica musimy si przyzwyczai do troch odmiennej pracy ze wsprzdnymi

pt1(0) pt1(1) pt1(2) pt2(0) pt2(1)

= = = = =

10# 'x wsprzdna pt1 10# 'y wsprzdna pt1 0# 'z wsprzdna pt1 20# 'x wsprzdna pt2 30# 'y wsprzdna pt2

15

pt2(2) = 0# 'z wsprzdna pt2

Pisanie programu, tak jak w czci pierwszej, rozpoczynamy od zdefiniowania za pomoc instrukcji Sub nowej procedury Sub RysLinii_1 () Nastpnie 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 pocztkowy linii) Dim Pt2 (0 To 2) As Double 'Deklaracja zmiennej Pt2 (kocowy linii) 'Punkty Pt1(0) = 10# ' Wsprzdne X pierwszego punktu Pt1(1) = 10# ' Wsprzdne Y pierwszego punktu Pt1(2) = 0# ' Wsprzdne Z pierwszego punktu Pt2(0) = 20# ' Wsprzdne X drugiego punktu Pt2(1) = 30# ' Wsprzdne Y drugiego punktu Pt2(2) = 0# ' Wsprzdne Z drugiego punktu
Po czym moemy uy instrukcji, ktra narysuje w przestrzeni modelu lini czc oba punkty.

Set Linia = ThisDrawing.ModelSpace.AddLine(Pt1, Pt2) End Sub 'koczy procedur.


Obie metody rysowania linii lub jakiegokolwiek obiektu AutoCAD-a wykorzystuje si w troch innych sytuacjach. Np. rysowanie pomidzy punktami wskazanymi na ekranie wykorzystuje si w AutoCAD-zie podczas pisania programw wymagajcych duej interakcji z uytkownikiem. Rysowanie linii pomidzy dwoma punktami o zadanych wsprzdnych najczciej wykorzystujemy w programach, gdzie punkty te uzyskalimy w toku wczeniejszych oblicze w tym programie.

4 - Polilinia Rysowanie polilinii


Celem dzisiejszej lekcji jest napisanie programu, rysujcego ktownik nierwnoramienny w postaci zamknitej polilinii. W lekcji tej zapoznamy si bliej z:

rysowaniem polilinii z poziomu VBA wykorzystaniem metody SetBulgle do zaokrglania wierzchokw polilinii

Wykorzystamy poznan we wczeniejszych lekcjach metod GetPoint do pobrania od uytkownika punktu pocztkowego polilinii

16

Rys. 1 Dane tego ktownika: H = 60 S = 40 t = 6 g = 6 r = 6 r1 = 3 Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. Moemy te uruchomi go z menu grnego: Narzdzia -> Makro-> Makra. W oknie dialogowym wpisujemy nazw nowego makra: ZmierzOdlego i klikamy przycisk Utwrz.

Rys. 2 Wywietli si kolejne okno dialogowe, ktre pozwala nam na doczenie naszego makra do istniejcego rysunku lub Projektu.

17

Rys. 3 Z listy wybieramy Rysunek (nasze makro bdzie dziki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostao doczone do biecego rysunku i zosta uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien si znajdowa kod naszego makra. Jak dotychczas, skada si on zaledwie z dwch linijek - pocztkowej i kocowej. Teraz musimy pomidzy tymi dwoma liniami umieci 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 poszczeglnych wymiarw ktownika.
Dim Dim Dim Dim Dim Dim h As Double s As Double t As Double g As Double r As Double r1 As Double

Deklarujemy zmienn pt1, ktr wykorzystamy do przechowywania wsprzdnych punktu pocztkowego.

Dim pt1 As Variant


Deklarujemy zmienn pkt, ktra posuy nam do przechowywania wsprzdnych wierzchokw polilinii.

Dim pkt(0 To 17) As Double


Korzystajc z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujcy si w cudzysowie pojawi si w linii polece jako zachta do wskazania pierwszego punktu.

Punkt1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Punkt wstawienia: ")


Przypisanie wartoci do zmiennych:
h = 60 s = 40

18

t = 6 g = 6 r = 6 r1 = 3

Deklarujemy zmienn newPline jako nowy obiekt AutoCAD-a (polilinia, ktr bdziemy tworzy w oparciu o podane wczeniej dane).

Dim newPline As AcadLWPolyline


Przypisanie wartoci wsprzdnych punktu pocztkowego (uzyskalimy go wczeniej korzystajc z metody GetPoint) do wsprzdnych pierwszego wierzchoka polilinii.
pkt(0) = punkt1(0) 'X1 pkt(1) = punkt1(1) 'Y1

Obliczamy teraz pozostae wierzchoki 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 wierzchokw naszego ktownika przechodzimy do rysowania polilinii pomidzy tymi wierzchokami.
Set newPline = ThisDrawing. ModelSpace.AddLightWeightPolyline(pkt) newPline.Closed = True 'zamknicie polilinii

19

newPline.update 'odwieenie ekranu End Sub 'linia koczca nasz procedur

Aby przetestowa dziaanie naszego makra, wciskamy kombinacj klawiszy Alt + Q, co powoduje zamknicie edytora Visual Basic i powrt do AutoCAD-a. W linii polece wpisujemy VBARUN i wciskamy Enter. Pojawio si nam okno dialogowe Makra z widoczn w nim nazw makra Rysunek1.dwg!Module1.katownik. Klikamy przycisk Uruchom. W lini polece pojawia si zachta do wskazania punktu na ekranie. Po wskazaniu tego punktu zostanie narysowany obiekt, widoczny na rysunku poniej.

Rys. 6 Mamy narysowany ktownik w postaci zamknitej polilinii. Kolejnym krokiem jest zaokrglenie niektrych segmentw polilinii. Wykorzystamy w tym celu metode SetBulgle.

Rys. 7

20

Wypuko (Bulge) jest to tangens 1 kta zawartego pomidzy dwoma ssiednimi wierzchokami uku (polilinii). Ujemna warto oznacza, e uk biegnie zgodnie ze wskazwkami zegara od wybranego wierzchoka do nastpnego wierzchoka na licie. Jeeli wypuko jest rwna 0, oznacza to, e segment jest paski. Jeeli wypuko jest rwna 1, oznacza to, e segment jest pkolem. Wykorzystamy wzr:

Kt zawarty = 90 stopni. Zamieniamy stopnie na radiany: 90 stopni = PI/2 radianw = 1,57076327 radianw
Dim newBulge As Double newBulge = (Tan(1.570796327 / 4)) Call newPline.SetBulge(2, newBulge) 'promie wierzchoka numer 2 Call newPline.SetBulge(4, - newBulge) 'promie wierzchoka numer 4 Call newPline.SetBulge(6, newBulge) 'promie wierzchoka numer 6 newPline.update 'ponowne odwieenie ekranu End Sub

Po uruchomieniu naszego makra i podaniu punktu pocztkowego powinien zosta narysowany ktownik nierwnoramienny widoczny na poniszym rysunku.

Rys. 9 Na tym koczymy nasz lekcj, ktrej tematem byo rysowanie polilinii w AutoCAD-zie z poziomu VBA.

5 - Okrg, Elipsa, uk Rysowanie okrgu


Okrgi mona rysowa za pomoc kilku sposobw. Standardow metod jest okrelenie rodka i promienia okrgu. Mona rwnie okreli rodek i rednic, lub sam rednic poprzez podanie dwch punktw. Innym sposobem jest podanie trzech punktw, ktre wyznaczaj obwd okrgu. Okrg mona rwnie narysowa poprzez wskazanie trzech obiektw, do ktrych ma by on styczny, lub przez podanie promienia i wskazanie dwch obiektw, do ktrych ma by on styczny.

21

Przykad 1 - Okrg w oparciu o dane pobrane od uytkownika Poniszy przykad rysuje okrg w oparciu o dane pobrane od uytkownika (rodek i promie).

Rys. 1 Tworzenie programu rozpoczynamy od zdefiniowania nazwy nowej procedury Sub

rys_okrg1(). Kolejnym krokiem jest zadeklarowanie zmiennych. Deklarujemy zmienne,


ktre bd przechowyway dane rodka i promienia okrgu.
Dim varSrodek As Variant Dim dblPromien As Double

Oraz deklarujemy zmienn objEnt jako nowy obiekt AutoCAD-a

Dim objEnt As AcadCircle


Pobranie danych od uytkownika za pomoc GetPoint i GetDistance
With ThisDrawing.Utility varSrodek = .GetPoint(, vbCr & "Wska rodek okrgu: ") dblPromien = .GetDistance(varSrodek, vbCr & "Podaj promie: ") End With

Mamy ju zadeklarowane zmienne i przypisane do nich wartoci, moemy wic przystpi do narysowania okrgu. Aby narysowa okrg, wykorzystamy instrukcj Set do skojarzenia odwoania do obiektu ze zmienn. Rysowany jest okrg o promieniu dblPromien i rodku varSrodek.

Set objEnt = ThisDrawing.ModelSpace.AddCircle(varSrodek, dblPromien)


Na koniec odwieamy ekran objEnt.Update i koczymy nasz procedur End Sub. Przykad 2 - Okrg w oparciu o istniejce dane Poniszy przykad rysuje okrg w oparciu o podane dane (rodek i promie). Przykad
Sub rysOkrg2() Dim ObOkrag As AcadCircle 'Deklaracja zmiennej jako obiekt AutoCAD-a Dim PtSrodek(0 To 2) As Double ' 'Deklaracja zmiennej dla punktu rodka okrgu Dim dblPromien As Double 'Deklaracja zmiennej dla promienia 'Dane okrgu: PtSrodek(0) = 100# 'Wsprzdna X rodka okrgu

22

PtSrodek(1) = 200# 'Wsprzdna Y rodka okrgu PtSrodek(2) = 0# 'Wsprzdna Z rodka okrgu dblPromien = 50# 'Warto promienia 'Tworzenie okrgu w przestrzeni modelu Set ObOkrag = ThisDrawing.ModelSpace.AddCircle (PtSrodek, dblPromien) 'Koniec procedury rysowania okrgu. End Sub

Rysowanie elipsy
Celem dzisiejszej lekcji jest stworzenie procedury rysujcej elips w przestrzeni modelu w Autocad-zie. Na pocztek, dla przypomnienia kilka podstawowych danych na temat elipsy. Elipsa, zamknita krzywa paska, miejsce geometryczne punktw paszczyzny, ktrych suma odlegoci do dwch wybranych punktw (tzw. ognisk elipsy) jest staa, dana jest rwnaniem (x/a)2+(y/b)2=1, gdzie a2- b2=c2, 2c - odlego midzy ogniskami, a dugo wikszej posi elipsy, b - dugo mniejszej posi elipsy, c/a = e i nazywa si mimorodem elipsy. Pole elipsy wynosi S = (ab)PI

Rys. 2 Pisanie procedury jak zwykle rozpoczniemy od zdefiniowania nazwy procedury Sub rys_elips () Nastpnie 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, ktra posuy nam do
przechowywania informacji o wikszej osi elipsy.

Dim center(0 To 2) As Double - deklarujemy zmienn, ktra posuy nam do


przechowywania wsprzdnej rodka elipsy.

Dim radRatio As Double - deklarujemy zmienn, ktra posuy nam do przechowywania


informacji o stosunku wikszej i mniejszej posi. Gdy mamy ju zadeklarowane dane, moemy do nich przypisa wartoci.
center(0) = 5#: center(1) = 5#: center(2) = 0#

23

majAxis(0) = 10: majAxis(1) = 20#: majAxis(2) = 0# radRatio = 0.3

Aby narysowa elips, wykorzystamy instrukcj Set do skojarzenia odwoania do obiektu ze zmienn.

Set ellObj = ThisDrawing.ModelSpace.AddEllipse(center, majAxis, radRatio) End Sub koczy nasz procedur.

Rysowanie uku
uki mona rysowa na kilka sposobw. Standardow metod jest okrelenie trzech punktw - punktu pocztkowego, dowolnego punktu lecego na uku i punktu kocowego. Mona okrela rwnie kt rozwarcia, promie, kierunek i dugo ciciwy uku. Ciciwa to linia prosta czca koce uku. AutoCAD, standardowo, rysuje uki w kierunku przeciwnym do ruchu wskazwek zegara. W poniszych przykadach uk zostanie narysowany w oparciu o punkt rodkowy, promie, kt pocztkowy oraz kt kocowy. Przykad 1 - rysowanie uku o zadanych parametrach. rodek uku = (200,100,0) Promie = 80 Kt pocztkowy = 30 stopni Kt kocowy = 180 stopni

Rys. 3 Przechodzimy do tworzenia procedury rysujcej 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

24

'Deklaracja zmiennych kat w pkt kocowym w stopniach Dim KatKoniecRad As Double 'Deklaracja zmiennych kat wpkt kocowym w radianach

Przypisanie danych do zadeklarowanych zmiennych


PtSrodek(0) = 200# 'Wsprzdna X rodka uku PtSrodek(1) = 100# 'Wsprzdna Y rodka uku PtSrodek(2) = 0# 'Wsprzdna Z rodka uku dblPromien = 80# 'Promie uku KatStartDeg = 30# 'Kt 30 stopni (kt pocztkowy uku) KatKoniecDeg = 180# 'Kt 180 stopni (kt kocowy uku)

Aby narysowa uk, potrzebne s nam wartoci kta pocztkowego i kocowego wyraone w radianach, a nie w stopniach. Zamieniamy stopnie na radiany korzystajc ze wzoru: Kt w radianach = (Kt w stopniach * PI / 180)
KatStartRad = KatStartDeg * 3.141592 / 180# 'Zamiana stopni na radiany KatKoniecRad = KatKoniecDeg * 3.141592 / 180# 'Zamiana stopni na radiany

Majc zadeklarowane dane oraz przypisane do nich wartoci, a take wartoci ktw zamienione ze stopni na radiany, moemy przystpi do rysowania uku w oparciu o te dane.

Set objArc = ThisDrawing.ModelSpace.AddArc(PtSrodek, dblPromien, KatStartRad, KatKoniecRad) End Sub koczy nasz procedur
Rysowanie uku przy wykorzystaniu danych pobranych od uytkownika W poniszym przykadzie potrzebne dane zostan uzyskane za pomoc funkcji:

rodek uku za pomoc funkcji GetPoint promie za pomoc funkcji GetDistance (punktem odniesienia jest tu rodek uku) kt pocztkowy i kocowy 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 wartoci promienia uku Dim dblStart As Double 'Deklaracja zmiennej dla kta pocztkowego Dim dblKoniec As Double 'Deklaracja zmiennej dla kta kocowego Dim objEnt As AcadArc 'Deklaracja zmiennej jako nowy obiekt AutoCAD-a

Po dokonaniu deklaracji zmiennych przechodzimy do pobrania danych od uytkownika:

With ThisDrawing.Utility
Pobranie za pomoc metody GetPoint wsprzdnych rodka uku

25

varCenter = .GetPoint(, vbCr & "Wska rodek uku: ")


Pobranie za pomoc metody GetDistance wielkoci promienia uku.

dblRadius = .GetDistance(varCenter, vbCr & "Podaj promie: ")


Pobranie za pomoc metody GetAngle kta pocztkowego uku

dblStart = .GetAngle(varCenter, vbCr & "Podaj kt pocztkowy: ")


Pobranie za pomoc metody GetAngle kta kocowego uku

dblKoniec = .GetAngle(varCenter, vbCr & "Podaj kt kocowy: ") End With


Po przypisaniu wartoci do zmiennych przystpujemy do rysowania uku w przestrzeni modelu

Set objEnt = ThisDrawing.ModelSpace.AddArc(varCenter, dblRadius, _ dblStart, dblKoniec)


Odwieamy ekran objEnt.Update i koczymy procedur End Sub

6 - Kreskowanie Kreskowanie
Kreskowanie to wypenianie wskazanych obszarw rysunku wzorami kreskowania. Skadnia: object.HatchStyle Rodzaje stylw kreskowania Styl Normalny - kreskuje wntrze obszaru wyznaczonego przez obwiedni. Kreskowanie rozpoczyna si od obwiedni zewntrznej do rodka obszaru przeznaczonego do zakreskowania. Jeeli wewntrz obszaru przeznaczonego do zakreskowania zostanie zlokalizowana obwiednia wewntrznej wyspy, to kreskowanie zostanie przerwane. Jeeli wewntrz wyspy bdzie dodatkowa wyspa, to od obwiedni tej wyspy do nastpnej obwiedni wewntrznej, kreskowanie zostanie wznowione

AcHatchStyleNormal

Rys. 1 Przykad stylu normalnego Styl Skrajny - kreskuje tylko obszar ograniczony obwiedni zewntrzn caego obszaru i pierwsz napotkan obwiedni wewntrzn.

acHatchStyleOuter

26

Rys. 2 Przykad stylu skrajnego Styl Cakowity kreskuje cay obszar, ignorujc wszystkie obwiednie wewntrzne.

AcHatchStyleIgnore

Rys. 3 Przykad stylu cakowitego Tworzenie nowej procedury rozpoczynamy, jak w poprzednich przykadach, od zdefiniowania nowej procedury: Sub kreskowanie() Po jej zdefiniowaniu przystpujemy do deklarowania zmiennych. Deklarujemy obiekt hatchObj jako nowy obiekt AutoCAD-a.

Dim hatchObj As AcadHatch


Deklarujemy zmienn patterName jako acuch tekstowy

Dim patternName As String


Deklarujemy typ kreskowania jako zmienn typu Long

Dim PatternType As Long


Deklarujemy zmienn bAssociativity jako zmienn typu boolean

27

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 okrg o promieniu 50 i rodku w punkcie (5,3,0), ktry bdzie nasz zewntrzn granic kreskowania.

Dim outerLoop(0) As AcadEntity


Deklaracja zmiennej jako nowego obiektu AutoCAD-a

Dim center(0 To 2) As Double


Deklaracja zmiennej rodka okrgu jako Double

Dim radius As Double


Deklaracja zmiennej promienia okrgu jako Double Przypisanie zadeklarowanej zmiennej rodka okrgu wartoci ( wsprzdne rodka = (5,3,0)

center(0) = 5: center(1) = 3: center(2) = 0


Przypisanie zmiennej promienia o wartoci 50

radius = 50
Aby narysowa okrg, bdcy zewntrzn granic kreskowania, wykorzystamy instrukcj Set do skojarzenia odwoania do obiektu ze zmienn. Rysowany jest okrg o promieniu radius i rodku center.
Set outerLoop(0) = ThisDrawing.ModelSpace.AddCircle(center, radius) With outerLoop(0)

Ustalenie gruboci okrgu, ktry definiuje nam zewntrzn granic kreskowania na rwn 35

outerLoop(0).Lineweight = acLnWt035
Ustalenie koloru okrgu bdcego zewntrzn granic kreskowania jako czerwony
outerLoop(0).Color = acRed End With

Rys. 4 Zewntrzna granica kreskowania Dodanie granicy kreskowania do kreskowania

hatchObj.AppendOuterLoop (outerLoop)
Ustalenie koloru kreskowania na kolor zielony

hatchObj.Color = acGreen

28

Rys. 5 Zewntrzna granica kreskowania wraz z kreskowaniem Tworzymy teraz kwadrat wewntrz okrgu, ktry bdzie pierwsz wewntrzn granic kreskowania. Deklarujemy zmienne dla wewntrznej granicy kreskowania.
Dim innerLoop1(0) As AcadEntity Dim innerLoop(0) As AcadEntity

Deklarujemy zmienn plineObj, jako obiekt AutoCAD-a - polilinia ta bdzie wyznaczaa pierwsz wewntrzn granic kreskowania (wysp).

Dim plineObj As AcadLWPolyline


Deklarujemy zmienn, ktra bdzie przechowywa wartoci wsprzdnych wierzchokw polilini.

Dim points(0 To 9) As Double


Wsprzdna x i y pierwszego wierzchoka polilinii

points(0) = 35: points(1) = 33


Wsprzdna x i y drugiego wierzchoka polilinii

points(2) = -25: points(3) = 33


Wsprzdna x i y trzeciego wierzchoka polilinii

points(4) = -25: points(5) = -27


Wsprzdna x i y czwartego wierzchoka polilinii

points(6) = 35: points(7) = -27


Wsprzdna x i y pierwszego wierzchoka polilinii

points(8) = 35: points(9) = 33


Przypisanie polilinii do wewnrznej granicy kreskowania

Set innerLoop(0) = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)

29

Rys. 6 Polilinia wewntrz okrgu, tworzca wewntrzn granic kreskowania

With innerLoop(0)
Ustalenie gruboci polilinii, ktra definiuje nam wewntrzn granic kreskowania na rwn 35

innerLoop(0).Lineweight = acLnWt035
Ustalenie koloru polilinii, bdcego wewntrzn granic kreskowania, jako czerwony
innerLoop(0).Color = acRed End With

Dodanie obiektu do kreskowania

hatchObj.AppendInnerLoop (innerLoop)
Tworzymy teraz okrg wewntrz kwadratu, ktry bdzie drug wewntrzn granic kreskowania Deklarujemy zmienne dla drugiej wewntrznej granicy kreskowania.Deklaracja zmiennej drugiej wewntrznej granicy kreskowania jako obiektu AutoCAD-a

Dim innerLoop2(0) As AcadEntity


Przypisanie zmiennej promienia o wartoci 20 (zmienna dla wsprzdnej rodka okrgu nie zmienia si)

radius = 20
Przypisanie okrgu jako drugiej wewntrznej granicy kreskowania

Set innerLoop2(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)

30

Rys. 7 Okrg (druga wewntrzna granica kreskowania) wewntrz kwadratu

With innerLoop2(0)
Ustawienie wartoci gruboci na 35

innerLoop2(0).Lineweight = acLnWt035
oraz ustalenie koloru na czerwony
innerLoop2(0).Color = acRed End With

Dodanie drugiej zewntrznej granicy kreskowania do kreskowania.

hatchObj.AppendInnerLoop (innerLoop2)
Ustawienie stylu kreskowania na Normal

hatchObj.HatchStyle = acHatchStyleNormal
Przetwarzanie kreskowania

hatchObj.Evaluate
Regeneracja rysunku

ThisDrawing.Regen True

31

Rys. 7 Obiekt z wyspami z kreskowaniem styl Normal Aby obiekt kreskowany by lepiej widoczny, wykonujemy przyblienie (zoom okno). Deklarujemy zmienn point1, ktra bdzie przechowywa wsprzdne pierwszego punktu okna

Dim point1(0 To 2) As Double


Deklarujemy zmienn point2, ktra bdzie przechowywa wsprzdne drugiego punktu okna

Dim point2(0 To 2) As Double


Przypisanie zmiennej point1 wartoci wsprzdnej (-60,60,0)

point1(0) = -60: point1(1) = -60: point1(2) = 0


Przypisanie zmiennej point2 wartoci wsprzdnej (60,60,0)

point2(0) = 60: point2(1) = 60: point2(2) = 0


Wykonywanie przyblienia zdefiniowanego oknem od punktu point1 do point2

ThisDrawing.Application.ZoomWindow point1, point2


Wywietlenie okna informacyjnego

MsgBox "To jest styl kreskowania Normal", , "przykad stylu Normal"

Rys. 9 Okno informacyjne AutoCAD-a Koniec procedury kreskowania

End Sub

7 - Tekst Tworzenie tekstu


Podczas tworzenia tekstu w AutoCAD-zie kada indywidualna linia tekstu jest odmiennym obiektem. Do tworzenia obiektu tekstowego wykorzystujemy metod AddText. Metoda ta wymaga podania na wejciu trzech wartoci: acucha tekstu (zmienna typu string), punktu wstawienia tekstu i wysokoci tworzonego tekstu. Punkt wstawienia jest punktem w przestrzeni 3D AutoCAD-a, zdefiniowanym w globalnym ukadzie wsprzdnych. Parametr wysokoci tekstu jest liczb dodatni i jest mierzony w aktualnych jednostkach rysunkowych. Tekst jednowierszowy. Ten przykad tworzy lini tekstu w przestrzeni modelu, w punkcie wstawienia o wsprzdnych ( 2 , 2 , 0 ). Skadnia: Set TextObject =

Object.AddText(TextString, InsertionPoint, Height)


Przykadowa procedura tworzca tekst w przestrzeni modelu w oparciu o podane wartoci
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 acuch 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 wartoci do zmiennych textString = "Kurs VBA - www.cad.pl"

32

' przypisanie acucha tekstu do zmiennej tekstString insertionPoint(0) = 100 ' Przypisanie wartoci wsprzdnej X punktu wstawienia tekstu insertionPoint(1) = 100 ' Przypisanie wartoci wsprzdnej Y punktu wstawienia tekstu insertionPoint(2) = 0 'Przypisanie wartoci wsprzdnej Z punktu wstawienia tekstu height = 2 'Przypisanie wartoci zmiennej height

Aby stworzy tekst, wykorzystamy instrukcj Set do skojarzenia odwoania do obiektu ze zmienn.
Set textObj = ThisDrawing.ModelSpace.AddText (textString, insertionPoint, height) textObj.Update 'odwieamy obiekt tekst End Sub 'koczymy tworzenie procedury tworzenia tekstu

Rys. 1 Przykadowa procedura tworzca tekst w przestrzeni modelu w oparciu o wartoci pobrane od uytkownika.
Public Sub Tekst2() 'Definiujemy nazw procedury Dim varStart As Variant 'Deklarujemy zmienn varStart jako zmienn typu variant 'zmienna ta zostanie wykorzystana przechowywania 'wsprzdnych punktu wstawienia tekstu Dim dblHeight As Double 'Deklarujemy zmienn dblHeight jako zmienn typu double Dim strText As String 'Deklarujemy zmienn strText jako acuch Dim objEnt As AcadText 'Deklarujemy zmienn objEnt jako obiekt AutoCAD-a ' Pobranie informacji od uytkownika With ThisDrawing.Utility 'Pobranie od uytkownika punktu wstawienia tekstu varStart = .GetPoint(, vbCr & "Wska punkt wstawienia: ") 'Pobranie od uytkownika wysokoci tekstu dblHeight = .GetDistance (varStart, vbCr & "Podaj wysoko: ") 'Pobranie od uytkownika acucha znakw 'tekstu, ktry 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 'Odwieenie obiektu End Sub 'Koniec procedury

Efekt dziaania tej procedury widoczny jest na poniszym rysunku.

Rys. 2 Tekst utworzony za pomoc procedury tekst1 Przykadowa procedura tworzca tekst wielowierszowy w przestrzeni modelu

33

w oparciu o podane wartoci Skadnia: Set MtextObject = Object.AddMText(InsertionPoint, Width, TextString) Kady tekst w rysunku w AutoCAD-zie posiada stowarzyszony z nim styl. Podczas tworzenia tekstu, AutoCAD wykorzystuje aktualny styl tekstu do okrelenia rodzaju czcionki, rozmiaru, kta pochylenia, orientacji i innych cech nowego stylu. Formatowanie tekstu moemy zmieni poprzez zmian lub edycj stylu, w oparciu o ktry zosta on stworzony. Nie mona zmieni pojedynczych wyrazw lub znakw. Mona 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 acuch, zmienna 'ta posuy nam do przechowywania informacji o tekcie, 'ktry ma zosta utworzony. insertPoint(0) = 2 'przypisujemy warto wsprzdnej X punktu wstawienia insertPoint(1) = 2 'przypisujemy warto wsprzdnej Y punktu wstawienia insertPoint(2) = 0 'przypisujemy warto wsprzdnej Z punktu wstawienia width = 4 'podajemy wysoko tekstu textString = "Wydawnictwo Helion www.helion.pl." 'Pobranie od uytkownika acucha 'znakw - tekstu, ktry ma by utworzony 'tworzenie tekstu wielowierszowego w przestrzeni modelu Set mtextObj = ThisDrawing.ModelSpace.AddMText (insertPoint, width, textString) End Sub

Rys. 3 Przykadowa procedura tworzca tekst wielowierszowy w przestrzeni modelu w oparciu o podane wartoci
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 acuch, zmienna 'ta posuy nam do przechowywania informacji o tekcie, 'ktry ma zosta utworzony. Dim objEnt As AcadMText 'deklarujemy zmienn objEnt jako obiekt AutoCAD-a 'przystpujemy do pobierania informacji od uytkownika

34

With ThisDrawing.Utility 'przypisujemy zmiennej varStart wsprzdne punktu 'wstawienia tekstu pobranego od 'uytkownika za pomoc metody GetPoint. varStart = .GetPoint(, vbCr & "Wska punkt wstawienia: ") 'przypisujemy zmiennej dblWidth warto szerokoci 'tekstu wielowierszowego pobranego od 'uytkownika za pomoc funkcji GetDistance dblWidth = .GetDistance(varStart, vbCr & "Podaj szeroko tekstu: ") 'przypisujemy zmiennej strText warto w postaci 'tekstu, ktry 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 odlegoci pomidzy dwoma punktami Obliczanie odlegoci pomidzy dwoma punktami
Celem dzisiejszej lekcji jest napisanie programu, obliczajcego odlego pomidzy dwoma wskazanymi przez nas punktami. W naszym przypadku s to punkty Pt1, Pt2 o wsprzdnych Pt1 = (x1,y1,z1) Pt2 = (x2,y2,z2). W VBA wsprzdne kadego punktu reprezentowane s poprzez indeksy liczone od 0 do 2. A wic dla naszych dwch punktw bd miay posta Pt1 = (Pt1(0), Pt1(1), Pt1(2)) Pt2 = (Pt2(0), Pt2(1), Pt2(2)). Ilustruje to rysunek zamieszczony poniej.

35

Rys. 1 Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. Moemy te uruchomi go z menu grnego: Narzdzia -> Makro -> Makra. W oknie dialogowym wpisujemy nazw nowego makra: ZmierzOdlego i klikamy przycisk Utwrz.

Rys. 2 Wywietli si kolejne okno dialogowe, ktre pozwala nam na doczenie naszego makra do istniejcego rysunku lub Projektu.

36

Rys. 3 Z listy wybieramy Rysunek (nasze makro bdzie dziki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostao doczone do biecego rysunku i zosta uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien si znajdowa kod naszego makra. Jak dotychczas skada si on zaledwie z dwch linijek - pocztkowej i kocowej. Teraz musimy pomidzy tymi dwoma liniami umieci kod naszego makra.

Rys. 4 Okno interfejsu VBA w AutoCAD-zie z widocznym kodem makra ZmierzOdlego


Sub ZmierzOdlego() 'Pocztek makra ZmierzOdlego bez argumentw. 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: ")

Korzystajc z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujcy si w cudzysowie pojawi si w linii polece jako zachta do wskazania pierwszego punktu.

Rys. 5

37

pt2 = ThisDrawing.Utility.GetPoint _ (Pt1, vbCrLf & "Drugi punkt: ")

Korzystajc z funkcji GetPoint przypisujemy zmiennej pt1 punkt wskazany przez nas na rysunku. Tekst znajdujcy si w cudzysowie pojawi si w linii polece jako zachta do wskazania pierwszego punktu. Obie linie kodu s bardzo podobne, rnica midzy nimi (pomijajc zamknity w cudzysw tekst zachty do wskazania punktu na rysunku) to umieszczenie w drugim przypadku przed znakiem powrotu karetki (VbCrLf) przed przecinkiem Pt1. Mamy ju dwa punkty, ktre zostay przypisane do zmiennych pt1, pt2. Moemy przystpi do tworzenia procedury obliczajcej odlego midzy nimi. Najpierw musimy obliczy odlegoci pomidzy tymi punktami wzdu osi X, Y, Z. W tym celu deklarujemy trzy nowe zmienne, ktre bd nam przechowywa te odlegoci.
Dim x As Double, y As Double, Dim Dist As Double z As Double

Deklarujemy zmienn Dist jako Double. Posuy nam ona do przechowywania obliczonej odlegoci pomidzy punktami.

x = pt1(0) - pt2(0)
Zmiennej x przypisujemy warto uzyskan w wyniku odjcia wsprzdnej x pierwszego punktu od wsprzdnej x drugiego punktu.

y = pt1(1) - pt2(1)
Zmiennej y przypisujemy warto uzyskan w wyniku odjcia wsprzdnej y pierwszego punktu od wsprzdnej y drugiego punktu.

z = pt1(2) - pt2(2)
Zmiennej z przypisujemy warto uzyskan w wyniku odjcia wsprzdnej z pierwszego punktu od wsprzdnej z drugiego punktu. Do wyliczenia odlegoci wykorzystamy znany ze szkoy wzr, ktry 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 odlegoci wyliczonej z powyszego wzoru wywietlamy w oknie typu MsgBox. Aby poprawnie sformatowa komunikat w oknie MsgBox czymy tekst "Odlego pomidzy punktami wynosi: " i warto zmiennej dist. Na kocu znajduje si zamknity w cudzysw tekst, ktry pojawi si w nagwku - w naszym przypadku jest to Obliczanie odlegoci.
MsgBox " Odlego pomidzy punktami wynosi: " _ & dist, , "Obliczanie odlegoci" End Sub

Rys. 6 Program wywietli sformatowany tekst w oknie Msgbox.

9 - Rysowanie trjkta Rysowanie trjkta


Mamy za zadanie narysowanie trjkta. W tym celu pobierzemy od uytkownika punkt bazowy (punkt, z ktrego rozpoczniemy rysowanie naszego trjkta), Szeroko i Wysoko trjkta.

38

Rys. 1 Przy tworzeniu tego programu wykorzystywane bd funkcje GetPoint do wskazania punktu bazowego, GetDistance do podania wysokoci i szerokoci trjkta oraz funkcja PolarPoint do wyznaczenia na podstawie punktu bazowego, wysokoci i szerokoci pozostaych wierzchokw trjkta. Przy pomocy kombinacji klawiszy ALT + F8 uruchamiamy edytor makr w AutoCAD-zie. Moemy te uruchomi go z menu grnego: Narzdzia -> Makro -> Makra. W oknie dialogowym wpisujemy nazw nowego makra: RysujTrjkt i klikamy przycisk Utwrz.

Rys. 2 Wywietli si kolejne okno dialogowe, ktre pozwala nam na doczenie naszego makra do istniejcego rysunku lub Projektu.

39

Rys. 3 Z listy wybieramy Rysunek (nasze makro bdzie dziki temu przechowywane w rysunku) i klikamy lewym klawiszem myszy przycisk OK. Nasze makro zostao doczone do biecego rysunku i zosta uruchomiony interfejs programowania VBA tzw. VBA IDE. W oknie tym powinien si znajdowa kod naszego makra. Jak dotychczas skada si on zaledwie z dwch linijek - pocztkowej i kocowej. Teraz musimy pomidzy tymi dwoma liniami umieci kod naszego makra.

Public Const dblcPI As Double = 3.1415923


Deklarujemy sta PI, ktra potrzebna jest do wyznaczenia wartoci kta. Deklaracja staych musi si znajdowa przed definicj procedury, ktr piszemy.

Rys. 4 Widok szablonu procedury RysujTrjkt z zadeklarowan sta PI


Public Const dblcPI As Double = 3.1415923 Sub RysujTrjkat() End Sub

End Sub Mamy szablon procedury rysujcej trjkt oraz zadeklarowan sta PI. Musimy jeszcze zadeklarowa pozostae zmienne: VarPtBazowy, varSzerPt oraz varWysPt jako Variant, natomiast dblSzerokosc oraz dblWysokosc jako zmienne typu double.
Public Const dblcPI As Double = 3.1415923 Sub RysujTrjkat() Dim dblSzerokosc As Double Dim dblWysokosc As Double Dim VarPtBazowy As Variant Dim varSzerPt As Variant Dim varWysPt As Variant

Zmiennej varPtBazowy przypisujemy warto dziaania funkcji GetPoint. Zostaniemy poproszeni przez AutoCAD-a poprzez zacht w linii polece o wskazanie punktu bazowego (punktu, z ktrego rozpoczniemy rysowanie trjkta).

VarPtBazowy = ThisDrawing.Utility.GetPoint(, "Wska punkt wstawienia:")


Zmiennej dblSzerokosc przypisujemy warto dziaania funkcji GetDistance. Zostaniemy poproszeni przez AutoCAD-a poprzez zacht w linii polece o podanie szerokoci trjkta. Moemy wskaza drugi punkt na rysunku, gdzie punkt bazowy jest punktem odniesienia, a odlego midzy nimi jest szerokoci trjkta. Moemy rwnie wpisa dowoln liczb w linii polece AutoCAD-a, ktra bdzie szerokoci.

dblSzerokosc = ThisDrawing.Utility.GetDistance(VarPtBazowy, "Podaj szeroko:")


Zmiennej dblWysokosc przypisujemy warto dziaania funkcji GetDistance. Zostaniemy poproszeni przez AutoCAD-a poprzez zacht w linii polece o podanie wysokoci trjkta. Moemy wskaza drugi punkt na rysunku, gdzie punkt bazowy jest punktem odniesienia, a odlego midzy nimi jest wysokoci trjkta. Moemy rwnie wpisa dowoln liczb w linii polece AutoCAD-a, ktra bdzie wysokoci.

dblwysokosc = ThisDrawing.Utility.GetDistance(VarPtBazowy, "Podaj wysoko:")


Znamy ju punkt bazowy, szeroko i wysoko trjkta. Na tej podstawie moemy wyznaczy pozostae wierzchoki trjkta. Wykorzystamy do tego celu metod PolarPoint. Metoda PolarPoint jest uywana do uzyskania nowego punktu, przy znanym kcie i odlegoci od danego punktu. W wyniku otrzymujemy zmienn typu Variant trjelementow tablic zmiennych typu double.

40

Skadnia: Function PolarPoint(Punkt, Kt As Double, Odlego As Double) Zwraca punkt w podanej odlegoci i kcie od podanego punktu. Wyznaczamy punkt P2.

Rys. 5 Widok szablonu procedury RysujTrjkt z zadeklarowan sta PI

varSzerPt = ThisDrawing.Utility.PolarPoint(VarPtBazowy, 0, dblSzerokosc)


Naszym punktem odniesienia jest P1, kt jest rwny 0, a odlego punktu P1 od P2 jest rwna dblSzerokosc. Wyznaczamy punkt P3.

varWysPt = ThisDrawing.Utility.PolarPoint(VarPtBazowy, dblcPI / 2, dblWysokosc)


Naszym punktem odniesienia jest P1, kt jest rwny PI/2 = 90, a odlego punktu P1 od P3 jest rwna dblWysokosc.

Rys. 6 Rysowanie linii midzy punktami P1 i P2


Call ThisDrawing.ModelSpace.AddLine(VarPtBazowy, varSzerPt) With ThisDrawing.ModelSpace

Rysowanie linii midzy punktami P1 i P3

Call .AddLine(VarPtBazowy, varWysPt)


Rysowanie linii midzy punktami P3 i P2
Call .AddLine(varWysPt, varSzerPt) End With End Sub

41

10 - Rysowanie prostokta Rysowanie prostokta


Prostokt w AutoCAD-zie rysowany jest standardowo poprzez podanie lewego dolnego oraz prawego dolnego punktu prostokta. W poniszym przykadzie prostokt zostanie narysowany w oparciu o pobrany od uytkownika za pomoc funkcji GetPoint lewy dolny punkt prostokta oraz szeroko i wysoko prostokta.

Rys. 1
Option Explicit 'Zadeklarowanie staej publicznej Pi Public Const dblcPI As Double = 3.1415923 Public Sub Bas1() 'Zadeklarowanie zmiennych, ktre bd przechowywa 'wsprzdne wierzchokw prostokta Dim varPt1, varPt2, varPt3, varPt4 As Variant 'Zadeklarowanie zmiennych, ktre bd 'przechowywa wysoko i szeroko prostokta Dim dblHeight As Double Dim dblWidth As Double 'Pobranie od uytkownika punktu wstawienia i 'przypisanie go do zmiennej varPt1 varPt1 = ThisDrawing.Utility.GetPoint(, "Punkt wstawienia:") 'Pt1 'Pobranie od uytkownika szerokoci prostokta i 'przypisanie go do zmiennej dblWidth dblWidth = ThisDrawing.Utility.GetReal("Szer:") 'dblWidth 'Pobranie od uytkownika wysokoci prostokta i 'przypisanie go do zmiennej dblHeight dblHeight = ThisDrawing.Utility.GetReal("Wys:") 'dblHeight 'Wyliczenie pozostaych wsprzdnych prostokta i 'przypisanie ich wartoci zmiennym With ThisDrawing.Utility varPt2 = .PolarPoint(varPt1, 0, dblWidth) ' Pt2 varPt3 = .PolarPoint(varPt2, dblcPI / 2, dblHeight) varPt4 = .PolarPoint(varPt3, dblcPI, dblWidth) End With 'Rysowanie prostokta With ThisDrawing.ModelSpace Call .AddLine(varPt1, varPt2) Call .AddLine(varPt2, varPt3) Call .AddLine(varPt3, varPt4)

'Pt3 'Pt4

42

Call .AddLine(varPt4, varPt1) 'Rysowanie linii czcych wierzchoki prostokta. Call .AddLine(varPt1, varPt3) Call .AddLine(varPt2, varPt4) End With End Sub

Do wyznaczenia brakujcych wierzchokw wykorzystalimy metod PolarPoint.

Rys. 2 Metoda PolarPoint jest uywana do uzyskania nowego punktu, przy znanym kcie i odlegoci od danego punktu. W wyniku otrzymujemy zmienn typu Variant trjelementow tablic zmiennych typu double. Skadnia: Function PolarPoint(Punkt, Kt As Double, Odlego As Double) Zwraca ona punkt w podanej odlegoci i kcie od podanego punktu. Wyznaczanie punktu Pt2 Znane nam s wszystkie wartoci potrzebne do wyznaczenia punktu Pt2 (patrz rys) : Punkt = punkt pocztkowy (lewy dolny rg prostokta Pt1) Kt = 0 stopni (kt mierzony jest od osi X a obydwa punkty Pt1, Pt2 le na osi X) Odlego = Szerokoci prostokta Wyznaczanie punktu Pt3 Po wyznaczeniu punktu Pt2 znane nam s wszystkie wartoci potrzebne do wyznaczenia punktu Pt3 (patrz rys) : Punkt = Pt2 (prawy dolny rg prostokta) Kt = 90 stopni = PI/2 radianw (kt mierzony jest od osi X ) Odlego = Wysoko prostokta Wyznaczanie punktu Pt4 Po wyznaczeniu punktu Pt3 znane nam s wszystkie wartoci potrzebne do wyznaczenia punktu Pt4 (patrz rys) : Punkt = Pt3 (prawy grny rg prostokta) Kt = 180 stopni = PI radianw (kt mierzony jest od osi X ) Odlego = szeroko prostokta Prosz zwrci uwag, e rwnie dobrze przy wyznaczaniu punktu Pt4 jako punkt bazowy moglimy wykorzysta punkt Pt1. Wtedy Punkt = Pt1, Kt = PI/2 a odlego = wysokoci prostokta. Efekt byby identyczny. Jeeli z jakich powodw nie chcielibymy korzysta z metody PolarPoint, moglibymy wyznaczy brakujce punkty w sposb tradycyjny. Jeli Pt1 jest znany i ma wsprzdne (X1, Y1, Z1) to:
Pt2 X2 Y2 = Z2 = Pt3 X3 Y3 = Z3 = Pt4 X4 Y4 = = X1 + szeroko Y1 Z1 = X2 Y2 + wysoko Z2 = X3 - szeroko lub X4 = X1 Y3 lub Y4 = X1+wysoko

43

Z4 = Z3

Na pocztku listingu umieszczona zostaa zadeklarowana staa PI, poniewa kt musimy zawsze podawa w radianach, np. 90 stopni = PI/2, 180 stopni = PI itd. Stopnie na radiany konwertujemy korzystajc ze wzoru X stopni = (X * PI) /180 radianw np. 35 stopni = (35 * PI) / 180 radianw. Do procedury rysujcej nasz prostokt dodaem rysowanie linii czcych Pt1 z Pt3 i Pt2 z Pt4. Zrobiem to celowo, aby uprzedzi pytania, po co to wszystko, skoro w AutoCAD-zie mamy standardowe polecenie rysujce prostokt. Celem tego i innych wicze jest poznanie przez Was zasad programowania w VBA w AutoCAD-zie i jeli tak si stanie, to prosz mi wierzy, e nie bd Pastwo narzeka na brak jakiej funkcji w programie. Jeeli bdzie Wam jaka potrzebna, to sobie j po prostu napiszecie, a ogranicza Was bdzie jedynie Wasza wyobrania.

11 - Rysowanie stopy fundamentowej Metoda PROMPT - rysowanie stopy (linia)


Lekcja ta obrazuje, jak za pomoc kilku danych pobranych od uytkownika narysowa zoony obiekt rysunkowy. Funkcje wykorzystane w biecym wiczeniu: GetPoint do pobrania punktu pocztkowego -> varPtBazowy GetDistance do pobrania szerokoci rysowanego elementu (dblSzerokosc) oraz jego wysokoci (dblWysokosc) PolarPoint do wyliczenia wsprzdnych punktw P1, P2, P3, P4, P5, P6, P7. Pozostae wymiary oraz punkty wyznaczymy, korzystajc ze zwymiarowanego rysunku zamieszczonego poniej.

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 szerokoci Dim dblHeight As Double 'Deklaracja zmiennej do przechowywania wysokoci Dim varBasePoint As Variant 'Deklaracja zmiennej do przechowywania pkt bazowego Dim varPoints(0 To 7) As Variant 'Deklaracja zmiennych pozostaych punktw varBasePoint = ThisDrawing.Utility.GetPoint (, "Punkt wstawienia:") 'Pobranie od uytkownika punktu wstawienia, 'w linii polece zostaje wywietlona 'zachta do wskazania punktu na rysunku varPoints(0) = varBasePoint

44

'Przypisanie pkt bazowego do zmiennej VarPoints(0) dblWidth = ThisDrawing.Utility.GetDistance (varBasePoint, "Podaj szerokosc:") 'Pobranie od uytkownika szerokoci, 'w linii polece zostaje wywietlona 'zachta 'do podania szerokoci dblHeight = ThisDrawing.Utility.GetDistance (varBasePoint, "podaj wysokosc:") 'Pobranie od uytkownika wysokoci, 'w linii polece zostaje wywietlona 'zachta 'do podania wysokoci

Wyliczenie pozostaych punktw przy pomocy metody PolarPoints Skadnia: Function PolarPoint(Punkt, Kt As Double, Odlego As Double)

With ThisDrawing.Utility

Rys. 2
varPoints(1) = .PolarPoint(varPoints(0), 0, dblWidth) 'Pkt odniesienia = varPoints(0), kt = 0, 'odlego = dblSzeroko

Rys. 3
varPoints(2) = .PolarPoint(varPoints(1), dblcPI / 2, dblHeight) 'Pkt odniesienia = varPoints(1), kt = PI/2 , 'odlego = dblWysokosc

45

Rys. 4
varPoints(3) = .PolarPoint(varPoints(2), dblcPI, dblWidth / 3) 'Pkt odniesienia = varPoints(2), kt = PI (180), 'odlego = dblSzeroko / 3

Rys. 5
varPoints(4) = .PolarPoint(varPoints(3), dblcPI * 3 / 2, dblHeight / 2) 'Pkt odniesienia = varPoints(3), kt = (PI * 3) / 2, 'odlego = dblWysoko / 2

Rys. 6
varPoints(5) = .PolarPoint(varPoints(4), dblcPI, dblWidth / 3) 'Pkt odniesienia = varPoints(4), kt = PI , 'odlego = dblSzeroko / 3

46

Rys. 7
varPoints(6) = .PolarPoint(varPoints(5), dblcPI / 2, dblHeight / 2) 'Pkt odniesienia = varPoints(5), kt = PI / 2, 'odlego = dblWysoko / 2

Rys. 8
varPoints(7) = .PolarPoint(varPoints(0), dblcPI / 2, dblHeight) 'Pkt odniesienia = varPoints(0), kt = PI / 2, 'odlego = 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))

47

Call .AddLine(varPoints(3), Call .AddLine(varPoints(4), Call .AddLine(varPoints(5), Call .AddLine(varPoints(6), Call .AddLine(varPoints(7), End With End Sub

varPoints(4)) varPoints(5)) varPoints(6)) varPoints(7)) varBasePoint)

12 - Modyfikacje obiektw AutoCAD-a Modyfikowanie obiektw


Public Sub rys_logo() 'definiujemy nazw nowej procedury

FAZA 1 - rysowanie logo skadajcego si z dwch polilinii Deklarujemy zmienne objEnt1 i objEnt2 jako obiekt polilinia
Dim objEnt1 As AcadLWPolyline Dim objEnt2 As AcadLWPolyline

Deklarujemy zmienn dbl Verticles. Zmienna ta bdzie przechowywaa wartoci wsprzdnych wierzchokw polilinii stanowicych grn 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 biec (aktywn)

ThisDrawing.ActiveLayer = newlayer1
Ustawiamy kolor warstwy na czerwony

newlayer1.Color = acRed
przypisujemy wartoci wsprzdnych wierzchokw polilini do zmiennych (s to wsprzdne grnej polilinii)
dblVertices(0) = 17.1446: dblVertices(1) = dblVertices(2) = 21.4243: dblVertices(3) = dblVertices(4) = 21.4243: dblVertices(5) = dblVertices(6) = 10.2008: dblVertices(7) = dblVertices(8) = 4.1794: dblVertices(9) = dblVertices(10) = 17.1446: dblVertices(11) 19.2585: 25.2029: 35.2017: 35.2017: 27.3974: = 27.3974:

Rysujemy polilini, ktra bdzie stanowi grn cz logo


Set objEnt1 = ThisDrawing.ModelSpace. AddLightWeightPolyline(dblVertices)

Zamykamy polilini objEnt1.Closed = True i odwieamy ekran objEnt1.Update przypisujemy wartoci wsprzdnych wierzchokw polilini do zmiennych (s to wsprzdne dolnej polilinii )
dblVertices2(0) dblVertices2(2) dblVertices2(4) dblVertices2(6) = = = = 17.1446: 47.2736: 36.7349: 17.1446: dblVertices2(1) dblVertices2(3) dblVertices2(5) dblVertices2(7) = = = = 3.4776 45.3275 45.3275 18.1161

Rysujemy polilini, ktra bdzie 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,

48

zmienna ta bdzie przechowywa wsprzdne lewego dolnego rogu okna zoom

Dim pkt1(0 To 2) As Double


deklarujemy zmienn pkt2 jako double, zmienna ta bdzie przechowywa wsprzdne prawego grnego rogu okna zoom

Dim pkt2(0 To 2) As Double


Przypisujemy wartoci do zmiennych pkt1 i pkt2 ( punkty te wyznaczaj nam okno przyblienia)
pkt1(0) = -10: pkt1(1) = -10: pkt1(2) = -10 pkt2(0) = 60: pkt2(1) = 50: pkt2(2) = 0

Wykonujemy przyblienie

ThisDrawing.Application.ZoomWindow pkt1, pkt2


FAZA2 - wykorzystanie metody offset do modyfikowania obiektu (odsunicie) Skadnia: Object.Offset Definiujemy zmienne offsetObj1 I offsetObj2 jako zmienne typu Variant
Dim offsetObj1 As Variant Dim offsetObj2 As Variant

Wywietlamy okno MsgBox, ( informuje nas, e grna polilinia zostanie odsunita o jedn jednostk do wewntrz rysunku

MsgBox "Offset grnej czci logo ", , " Info"


Wykonujemy odsunicie offsetObj1 = objEnt1.Offset(-1) Przypisujemy powstaemu obiektowi kolor biay offsetObj1(0).Color = acWhite

offsetObj1(0).Update i odwieamy ekran


Wywietlamy okno typu MsgBox, informujce o tym, e nastpi odsunicie dolnej polilini
MsgBox "Offset dolnej czci logo ", , "Info" offsetObj2 = objEnt2.Offset(-1)

Odsuwamy polilini (objEnt2) o jeden punkt do rodka

offsetObj2(0).Color = acWhite
Przypisujemy do obiektu kolor biay

offsetObj2(0).Update
Odwieamy obiekt FAZA 3 - usuwanie obiektw (metoda delete) Skadnia: Object.Delete Wywietlamy okno informacyjne

MsgBox "Kasowanie dolnej czci logo", , " Info" offsetObj2(0).Delete


Usuwamy obiekt powstay z odsunicia dolnej polilini

ThisDrawing.Regen acActiveViewport
Przeprowadzamy regeneracj biecej rzutni

MsgBox "Kasowanie grnej czci logo", , " Info"


Wywietlamy informacj

offsetObj1(0).Delete
Usuwamy obiekt powstay z odsunicia grnej polilinii

ThisDrawing.Regen acActiveViewport
Przeprowadzamy regeneracj biecej 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, ktra bdzie przechowywa wsprzdne pierwszego punktu lecego na osi odbicia

49

Dim point2(0 To 2) As Double


deklarujemy zmienn, ktra bdzie przechowywa wsprzdne pierwszego punktu lecego na osi odbicia Przypisujemy wartoci do zmiennych
point1(0) = 0: point1(1) = 1: point1(2) = 0 point2(0) = 4: point2(1) = 1: point2(2) = 0

Wywietlamy okno informacyjne.

MsgBox "Zoom window", , " Info"


Wywietlamy okno informacyjne

pkt1(0) = -10: pkt1(1) = -60: pkt1(2) = 0


Przypisujemy wartoci do zmiennych, ktre bd nam wyznacza okno zoom.

pkt2(0) = 60: pkt2(1) = 50: pkt2(2) = 0


Wykonujemy przyblienie oknem zdefiniowanym punktami pkt1 i pkt2

ThisDrawing.Application.ZoomWindow pkt1, pkt2


Wywietlamy okno z informacj
MsgBox "Lustro grnej czci 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 (grna cz logo) wzgldem osi wyznaczonej przez punkty point1 i point2

Set mirrorObj1 = objEnt1.Mirror(point1, point2)


Przypisujemy do obiektu powstaego w wyniku odbicia kolor czerwony
mirrorObj1.Color = acRed mirrorObj1.Update

odwieamy obiekt. Wywietlamy okno informacyjne

MsgBox "Lustro dolnej czci logo ", , " Info"


Odbijamy obiekt objEnt2 (dolna cz logo) wzgldem osi wyznaczonej przez punkty point1 i point2
Set mirrorObj2 = objEnt2.Mirror(point1, point2) mirrorObj2.Color = acRed

Przypisujemy do obiektu powstaego w wyniku odbicia kolor czerwony

mirrorObj2.Update
odwieamy obiekt Wywietlamy okno informacyjne

MsgBox "Przesuwanie dolnej czci logo ", , " Info"


FAZA 5 - wykorzystanie metody Move do przesunicia obiektu Skadnia: Object.Move Przesuwamy obiekt powstay z odbicia grnej czci logo. Punkt bazowy i przesunicie wyznaczaj nam punkty point1, point2 o wsprzdnych (0,1) (4,1) punkty te zadeklarowane zostay przez nas przy odbijaniu obiektw
mirrorObj1.Move point1, point2 mirrorObj1.Update 'odwieamy przesunity obiekt

FAZA 6 - wykorzystanie metody Rotate do obracania obiektu Skadnia: Object.Rotate Wywietlamy okno informacyjne

MsgBox "Obrt dolnej czci logo ", , " Info"


Definiujemy kt obrotu obiektu (45 stopni) i punkt bazowy (4, 4.25, 0). Deklarujemy

50

zmienn basePoint jako

Dim basePoint(0 To 2) As Double


Deklarujemy zmienn rotationAngle jako zmienn typu double

Dim rotationAngle As Double


Przypisujemy wartoci do zmiennych
basePoint(0) = 4: basePoint(1) = 4.25: basePoint(2) = 0 rotationAngle = 0.7853981 ' 45 degrees

Obracamy pierwsz polilini (mirrorObj1) wzgldem punktu bazowego o kt 45 stopni


mirrorObj1.Rotate basePoint, rotationAngle mirrorObj1.Update 'odwieamy obiekt

obracamy drug polilini (mirrorObj2) wzgldem punktu bazowego o kt 45 stopni


mirrorObj2.Rotate basePoint, rotationAngle mirrorObj2.Update ' odwieamy obiekt

Wywietlamy okno informacyjne

MsgBox "Zoom window", , " Info"


Wykonujemy przyblienie (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

Wywietlamy okno informacyjne

MsgBox "Oczko ", , " Info"


Rysujemy okrg o rodku w punkcie (11,33,0) i promieniu rwnym 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, ktra jest warstw standardow lub warstw utworzon i nazwan przez uytkownika. Z kad warstw jest skojarzony kolor i rodzaj linii. Przykadowa procedura tworzca w AutoCAD-zie now warstw o nazwie Wymiary i kolorze niebieskim Pisanie procedury tworzcej 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 odwoania 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

51

Rys. 1 Lista rozwijana warstwy z now warstw o nazwie Wymiary i kolorze niebieskim Umieszczanie obiektw na wybranej warstwie W drugim przykadzie 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 nastpnie przypiszemy do niej wczeniej utworzony okrg. Definiujemy nazw nowej procedury Sub nowa_warstwa2() Rysujemy okrg o rodku lecym 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 wartoci wsprzdnych punktu rodkowego okrgu.

Dim center(0 To 2) As Double


Deklarujemy zmienn radius jako double, zostanie ona wykorzystana do przechowywania wartoci promienia okrgu.
Dim radius As Double 'Przypisujemy do zmienej center wartoci 'wsprzdnych punktu rodkowego center(0) = 2: center(1) = 2: center(2) = 0 Przypisujemy do zmiennej promie warto 1 radius = 1

Tworzymy okrg o rodku w punkcie center i promieniu radius

Set circleObj = ThisDrawing.ModelSpace.AddCircle(center, radius)


Przypisujemy do okrgu kolor ByLayer. W ten sposb okrg automatycznie przejmie kolor warstwy, na ktrej 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 okrg do warstwy Opisy

52

circleObj.Layer = "opisy"
Przerysowujemy ekran

circleObj.Update End Sub koczymy procedur

Rys. 3 Okrg umieszczony na warstwie Opisy Przykadowy program wywietlajcy nazwy wszystkich warstw wystpujcych 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 ' odwoania obiektu ze zmian. Set objLayers = ThisDrawing.Layers 'Dla kadej 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 'Wywietl nazwy wszystkich warstw dostpnych 'na rysunku MsgBox strLayers, vbInformation, "Warstwy w rysunku:" End Sub 'Koniec procedury.

Rys. 4 Okno informacyjne AutoCAD-a z list dostpnych warstw na rysunku Ustawianie biecej warstwy Rysujemy zawsze na warstwie biecej. Jeeli ustawimy dan warstw jako biec, moemy rysowa na tej warstwie nowe obiekty. Jeeli uczynimy warstw biec

53

jakkolwiek inn warstw, to wszystkie nowo tworzone obiekty umieszczone zostan na tej warstwie, a take kolor oraz typ linii obiektw bdzie 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.

Zamraanie warstw Przykadowa procedura zamraajca warstw o nazwie Opisy, ktra zostaa stworzona w przykadzie 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 'odwoania do obiektu ze zmienn objLayer.Freeze = True 'zamraamy warstw End Sub

Rys. 5 Widok paska rozwijalnego warstwy z zamroon warstw Opisy Zamrozilimy warstw Opisy. Zostaa ona utworzona we wczeniejszym przykadzie. Jeeli nie jestemy pewni, czy dana warstwa zostaa utworzona, naley dokona sprawdzenia, czy warstwa o danej nazwie wystpuje w naszym rysunku. Moemy wykorzysta w tym celu nastpujc skadni:

If objLayer is Nothing Then


Jeeli zamiast podawa nazw warstwy do zamroenia chcemy np. zamrozi wszystkie warstwy w rysunku, moemy w tym celu wykorzysta ptl 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 biec warstw For Each objLayer In This.Drawing.Layers 'wchodzimy w ptl jak dugo objLayer.Freeze = True 'zamraamy warstw Next objLayer 'przechodzimy do nastpnej warstwy End Sub 'koniec procedury

Posugujc si metod GetEntity, ktra bya omawiana na drugiej lekcji, mona take poprosi uytkownika o wskazanie obiektu na ekranie AutoCAD-a i zamrozi warstw, na ktrej ten obiekt si znajduje.

54

Sub zamraanie_wskazanej() 'definiujemy nazw nowej procedury Dim WskazanyObiekt As AcadObject 'deklarujemy zmienn WskazanyObiekt jako obiekt 'AutoCAD-a Dim Warstwa_do_zamroenia As AcadLayer 'deklarujemy zmienn Warstwa_do_zamroenia 'jako warstwa AutoCAD-a Dim WskazanyPunkt As Variant 'deklarujemy zmienn WskazanyPunkt jako Variant On Error Resume Next 'pomijamy przypadek, gdy zostanie wskazana warstwa bieca With ThisDrawing.Utility 'Pobranie danych od uytkownika GetEntity WskazanyObiekt, WskazanyPunkt, vbCr & "Wska obiekt lecy na warstwie do zamroenia " End With If WskazanyObiekt Is Nothing Then 'jeli zmienna wskazany obiekt ma warto 'pust ( gdy warstwa nie zostaa wskazana) MsgBox "Nie wybrano obiektu" ' wywietlenie komunikatu Exit Sub 'i zakoczenie procedury End If 'w przeciwnym razie 'Korzystamy z instrukcji Set do 'skojarzenia odwoania do obiektu ze zmienn Set Warstwa_do_zamroenia = ThisDrawing.Layers(WskazanyObiekt.Layer) 'Zamraamy warstw na ktrej ley wskazany obiekt Warstwa_do_zamroenia.Freeze = True End Sub 'koniec procedury

14 - Zbiory wskaza Zbiory wskaza w VBA


AutoCAD pozwala na wykonywanie operacji na grupach obiektw znajdujcych si w tzw. "zbiorze wskaza". Na dzisiejszej lekcji nauczymy si, jak tworzy zbiory wskaza, jak dodawa do nich elementy oraz jak przeprowadza rne operacje na tak zgrupowanych obiektach. Przykadowa procedura tworzca w AutoCAD-zie nowy zbir wskaza o nazwie KursVBA. Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy

Sub ss_onscreen()
Deklarujemy zmienn ss jako nowy zbir 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
Wywietlenie informacji w oknie MsgBox o tym, ile obiektw zostao dodanych do zbioru wskaza.

MsgBox ss.Count & " obiekty zostay dodane do zbioru wskaza"


Podwietlamy obiekty wskazane przez uytkownika.

55

ss.Highlight True
Wywietlenie informacji w oknie MsgBox o tym, e obiekty znajdujce si w zbiorze wskaza zostay podwietlone.

MsgBox " obiekty zostay podwietlone"


Regeneracja rysunku.

ThisDrawing.Regen True
Wywietlenie informacji w oknie MsgBox o tym, e zostanie usunite podwietlenie obiektw.

MsgBox " usuwamy podwietlenie obiektw"


Usunicie podwietlenia obiektw znajdujcych si w zbiorze wskaza.

ss.Highlight False
Wywietlenie informacji w oknie MsgBox o tym, e zostanie usunity zbir wskaza.

MsgBox " usuwamy zbr wskaza"


Usunicie zbioru wskaza.

ss.Delete
Koniec procedury ss_onscreen.

End Sub
Jeszcze zanim przejdziemy do testowania powyszej procedury, musimy narysowa kilka obiektw, ktre bdziemy nastpnie dodawa do zbioru wskaza. Ewentualnie moemy wczyta projekt ss_rys.dvb, ktry narysuje obiekty widoczne na poniszym rysunku.

Rys. 1 Polilinia i dwa okrgi stworzone za pomoc procedury ss_rys worzenie polilini i okrgw za pomc VBA zostao szerzej wytumaczone w lekcji 4 i 5. W linii polece wpisujemy: Polecenie: - vbaload Otwrz projekt VBA: ss_rys Po zaadowaniu pliku projektu uruchamiamy nasze makro. Polecenie: -vbarun Nazwa makra: ss_rys.dvb!Module1.Rys_ss Nastpnie przechodzimy do testowania naszej procedury. Uruchamiamy makro wpisujc w linii polece: Polecenie: -vbarun Nazwa makra: ss_rys.dvb!Module1.ss_onscreen

Rys. 2 Po uruchomieniu makra w linii polece pojawia si zachta do wskazania obiektw

56

Wskazujemy zielony okrg oraz prostokt.

Rys. 3 Wskazany okrg i prostokt widoczny jako przerywana linia Koczymy wskazywanie obiektw poprzez wcinicie klawisza Enter. W oknie MsgBox nastpuje wywietlenie informacji w oknie o tym, ile obiektw zostao dodanych do zbioru wskaza.

Rys. 4 Okno informacyjne AutoCAD-a Nastpuje podwietlenie tych obiektw.

Rys. 5 Podwietlenie obiektw Nastpnie podwietlenie obiektw zostaje usunite.

Rys. 6 Usunicie podwietlenia obiektw

57

Nastpnie obiekty zostaj usunite ze zbioru wskaza.

Rys. 7 Usunicie obiektw ze zbioru wskaza Moemy korzysta z rnych trybw dodawania obiektw do zbioru wskaza.

Rys. 8 Tryby dodawania obiektw do zbioru wskaza Przykadowa procedura, ktra tworzy w AutoCAD-zie nowy zbir wskaza o nazwie KursVBA oraz umieszcza w tym zbiorze wskaza wszystkie obiekty znajdujce si na rysunku Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy.
Sub ss_All() 'Deklarujemy zmienn ss jako nowy zbir 'wskaza AutoCAD-a. Dim ss As AcadSelectionSet 'Tworzenie nowego zbioru wskaza o nazwie KursVBA. Set ss = ThisDrawing.SelectionSets.Add("KursVBa") 'Wybieramy wszystkie obiekty znajdujce si 'na ekranie AutoCAD-a. ss.Select acSelectionSetAll 'Podwietlamy wybrane obiekty. ss.Highlight True 'Wywietlenie informacji w oknie MsgBox o tym, 'ile obiektw zostao dodane do zbioru wskaza. MsgBox ss.Count & " obiekty(-w) zostay dodane do zbioru wskaza" 'Wywietlenie informacji w oknie MsgBox o tym, 'e obiekty znajdujce si w zbiorze wskaza 'zostay podwietlone. MsgBox " obiekty zostay podwietlone" 'Przeprowadzamy regeneracj rysunku ThisDrawing.Regen True 'Wywietlenie informacji w oknie MsgBox o tym, 'e zostanie usunite podwietlenie obiektw. MsgBox " usuwamy podwietlenie obiektw" 'Usunicie podwietlenia obiektw znajdujcych

58

'si w zbiorze wskaza. ss.Highlight False 'Wywietlenie informacji w oknie MsgBox 'o tym, e zostanie usunity zbir wskaza. MsgBox " usuwamy zbr wskaza" 'Usunicie zbioru wskaza. ss.Delete 'Koniec procedury ss_All. End Sub

Z dowiadczenia wiem, e nawet najbardziej logiczny wywd teoretyczny na nic si zda, jeeli nie idzie za nim praktyczny przykad, ilustrujcy zastosowanie omawianej metody. Dlatego te poniej opisana jest procedura, ktra ma za zadanie przesunicie obiektw dodanych do zbioru wskaza. Punktem bazowym przesunicia jest punkt spt o wsprzdnych (0,0,0), a drugim punktem przesunicia jest punkt ept o wsprzdnych (200,100,0). Pisanie procedury rozpoczynamy od zdefiniowania jej nazwy.
Sub ss_move() 'Definiujemy potrzebne zmienne: 'Deklarujemy zmienn ss jako nowy 'zbir wskaza AutoCAD-a. Dim ss As AcadSelectionSet 'Deklarujemy zmienn spt i ept 'zmienn typu double.

jako

Dim sPt(0 To 2) As Double Dim ePt(0 To 2) As Double 'Deklarujemy zmienn I jako liczb 'cakowit. Zmiennej tej przypiszemy 'warto licznika. Dim I As Integer 'Przypisujemy wartoci do zmiennych 'wsprzdnych punktw spt i ept. sPt(0) = 0# 'wsprzdna X punktu bazowego sPt(1) = 0# 'wsprzdna Y punktu bazowego sPt(2) = 0# 'wsprzdna Z punktu bazowego ePt(0) = 200# 'wsprzdna X drugiego punktu ePt(1) = 100# 'wsprzdna Y drugiego punktu ePt(2) = 0# 'wsprzdna Z drugiego punktu 'Tworzymy nowy zbir wskaza o nazwie ss. Set ss = ThisDrawing.SelectionSets.Add("ss") 'Dodajemy obiekty do zbioru wskaza 'poprzez wskazanie tych obiektw na 'ekranie AutoCAD-a. Call ss.SelectOnScreen 'Przesuwamy obiekty znajdujce si w zbiorze 'wskaza o wektor wyznaczony 'przez punkty sPt i ePt. 'Wchodzimy w ptl For I = 1 To ss.Count 'Przesuwamy pierwszy obiekt ze 'zbioru wskaza ss.Item(I - 1).Move sPt, ePt 'Odwieamy obiekt ss.Item(I - 1).Update

59

'Zwikszamy licznik Next I 'Po wyjci z ptli FOR usuwamy 'zbir wskaza ss.Delete 'Koczymy procedur End Sub

15 - Wymiarowanie Wymiarowanie w VBA w AutoCAD-zie


Tematem dzisiejszej lekcji jest wymiarowanie obiektw rysunkowych w AutoCAD-zie z poziomu VBA. Nie bdziemy tworzy nowego obiektu od podstaw. Wykorzystamy w tym wiczeniu funkcj rysujc ktownik nierwnoramienny z lekcji 4. dotyczcej rysowania polilinii. Funkcja ta, jak Pastwo pamitaj, rysuje ktownik o wymiarach jak na rysunku poniej.

Rys. 1 Rysunek ktownika Pisanie procedury tworzcej 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, ktra okrela pocztek pierwszej linii wymiarowej.


dpt1(0) = punkt1(0) 'X1 dpt1(1) = punkt1(1)

60

Przypisujemy warto do zmiennej, ktra okrela koniec pierwszej linii wymiarowej.


dpt2(0) = punkt1(0) + s 'X2 dpt2(1) = punkt1(1)

Przypisujemy warto do zmiennej okrelajcej pooenie 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 = <>"


Odwieamy obiekt

dimObj1.Update

Rys. 2 Wymiar liniowy od punktu dpt1 do punktu dpt2 Przypisujemy warto do zmiennej dpt3, ktra okrela koniec drugiej linii wymiarowej. dpt3(0) = punkt1(0) 'X2 dpt3(1) = punkt1(1) + h Przypisujemy warto do zmiennej okrelajcej pooenie 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 = <>"


Odwieamy obiekt.

dimObj1.Update

61

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 ktowego 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 wartoci wsprzdnych punktu pocztku wymiaru ktowego.
center(0) = punkt1(0) + s - r1 'punkt1(0) + 40 - 3 = 37 center(1) = punkt1(1) + r1 - wsp. X

62

'punkt1(1) + 3 center(2) = 0 'wsp. Z

= 3

- wsp. Y

Przypisujemy warto do zmiennej chordPoint. Zmienna ta jest potrzebna do przechowywania wartoci wsprzdnych punktu rodka wymiaru ktowego. Wiemy, e kt pomidzy osi X a prost wyznaczon przez punkty center oraz chordpoint wynosi 45 stopni. Znamy take (lub moemy sobie wyliczy ) odlego pomidzy tymi dwoma punktami. Do wyznaczenia wsprzdnych punktu chordpoint moemy wic uy metody PolarPoint. Musimy pamita, e kty podajemy w radianach 90 stopni = PI / 4 (funkcja obliczajca PI znajduje si na samym pocztku procedury).
chordPoint = ThisDrawing.Utility.PolarPoint (center, PI / 4, r1) leaderLen = 5

Tworzenie wymiaru ktowego


Set dimrad = ThisDrawing.ModelSpace. _ AddDimRadial(center, chordPoint, leaderLen)

Odwieenie obiektu

dimrad.Update

Rys. 5 Wymiar ktowy (zwymiarowanie promienia zaokrglenia) Wywietlenie w oknie typu MsgBox informacji.

MsgBox " Zmieniamy grot wymiaru ktowego na strzak"


Zmiana typu grota wymiaru ktowego na strzak.

dimrad.ArrowheadType = acArrowClosed
Odwieenie obiektu

dimrad.Update
Koniec procedury

End Sub
Efekt dziaania procedury stworzonej przez nas na dzisiejszej lekcji widoczny jest na rysunku poniej.

63

Rys. 6 Zwymiarowany rysunek ktownika

16 - Instrukcje warunkowe Instrukcje warunkowe


Instrukcje warunkowe i ptle logiczne w Visual Basicu daj nam do rki potne narzdzie do sterowania przepywem programu. Omawiajc poszczeglne instrukcje na podstawie przykadw chciabym gorco zachci do testowania w pocztkowej fazie programowania ptli i instrukcji logicznych w tzw. Oknie Immediate (Ctr + G).

Rys. 1 If...Then Instrukcji warunkowej IF uywamy wtedy, gdy chcemy wykona jedn lub wicej instrukcji warunkowo. IF moe wystpowa pojedynczo lub te moe by pogrupowane w blok instrukcji.
Sub test_if_then ()

64

Licznik = 3 If licznik < 10 Then licznik = licznik + 1 'jeeli warunek jest speniony, wykonywana jest 'pojedyncza instrukcja If licznik < 10 Then licznik = licznik + 1 End If End Sub

Oba przykady s rwnoznaczne.

Rys. 2 Wynik dziaania funkcji test_if_then w oknie immediate

Rys. 3 Zmienilimy warto licznika z 1 na 11. Wynikiem dziaania jest zwrcenie w oknie immediate liczby 11. Dzieje si tak dlatego, e warunek: licznik < 10 nie jest speniony, a wic nie jest wykonywane wyraenie licznik = licznik + 1 If...Then...Else Instrukcji warunkowej If...Then...Else uywamy, gdy chcemy zdefiniowa kilka blokw wyrae, z ktrych tylko jedno wyraenie zostanie wykonane.
If warunek1 Then [wyraenie-1] [ElseIf warunek2 Then [wyraenie-2]] ... [Else [wyraenie -n]] End If

Visual Basic testuje warunek-1. Jeeli ten warunek zwraca FASZ, Visual Basic przechodzi do sprawdzenia warunku-2, i tak dalej, a zwrci PRAWDA

65

If Index = 0 Then ObjLayer.color ElseIf Index = 1 ObjLayer.color ElseIf Index = 2 ObjLayer.color Else ObjLayer.color End If End Sub

= acRed Then = acGreen Then = acYellow = acWhite

Rys. 4 Testowanie instrukcji warunkowej if...then...else w oknie immediate Select Case Instrukcja warunkowa Select Case jest instrukcj alternatywn do If ... Then ... Else, ktra posiada te same moliwoci sterowania kodem programu. Rnica na korzy instrukcji Select Case jest bardzo widoczna, gdy mamy do czynienia z kilkunastoma moliwociami. Mwic w skrcie, kod jest bardziej "czytelny". Instrukcja Select Case przetwarza Test i porwnuje warto z kadym kolejnym wyraeniem Case. Jeeli s zgodne, wykonywany jest blok instrukcji powizany z danym wyraeniem Case.
Select Case Test [Case warunek1 [blok wyrae-1]] [Case warunek2 [blok wyrae-2]] [Case Else [blok wyrae-n]] End Select

Przykad wykorzystania Select Case w procedurze sprawdzajcej, 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 midzy 1 a 5. Debug.Print "Pomiedzy 1 and 5" Case 6, 7, 8 'liczba midzy 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

66

Rys. 5 Testowanie instrukcji warunkowej select case w oknie immediate Number = 3 -> Pomidzy 1 a 5 Number = 7 -> Pomidzy 6 a 8 Number = 9 -> Wiksza ni 8 Number = 11 -> Nie z pomidzy 1 a 10 While...Wend Statement Example Instrukcja logiczna While...Wend jest wykorzystywana do wykonywania zestawu instrukcji tak dugo, jak dugo warto logiczna test zwraca PRAWDA. Poniszy przykad podnosi warto licznika o jeden. Wyraenia w ptli s wykonywane tak dugo, jak dugo 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 Immediate window. End Sub

Rys. 6 Testowanie instrukcji warunkowej While...wend w oknie immediate Licznik mamy ustawiony na 0. Uruchamiamy nasz procedur klikajc ikon

Rys. 7 Instrukcje wewntrz ptli (counter = counter + 1) s przetwarzane tak dugo, jak dugo prawdziwy jest warunek counter < 20. Gdy licznik (counter) przyjmie warto 20, ptla zostanie przerwana. Wyjcie z ptli powoduje przetwarzanie linii kodu znajdujcych si za lini WEND, tzn. wywietlenie w oknie immediate wartoci zmiennej counter.

67

Zmienna ta ma warto 20 (musi mie tyle, poniewa gdyby miaa mniej, nie opucia by ptli While). Aby zobaczy, co dzieje si wewntrz 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 ptli gdy licznik > 19 End Sub

Rys. 8 Widok okna immediate po zmianie miejsca umieszczenia linii odpowiedzialnej za wywietlanie wartoci zmiennej counter w oknie immediate Na kocu linii Debug.Print Counter umieciem rednik. Nie spenia on adnego zadania w procedurze test_while_wend2, a powoduje jedynie wywietlenie wartoci licznika w jednej linii. For...Next Ptla For ... Next jest wykorzystywana wtedy, kiedy znana jest liczba wymaganych iteracji. W poniszym przykadzie instrukcje w ptli s przetwarzane 6 razy. Podczas kolejnych przebiegw ptli dodawany jest kolejny znak do zmiennej Mystring, po czym jej warto jest wywietlana w oknie immediate.
Sub test_for_next1() Dim Chars, MyString For Chars = 0 To 5 'Ustawiamy 6 powtrze. MyString = MyString & Chars 'dodajemy znak. Debug.Print MyString 'wyswietlenie w oknie immediate Next Chars 'zwiekszenie licznika End Sub

68

Rys. 9 Pojedyncza ptla for ... next W poniszym przykadzie instrukcje w ptli For Words s umieszczone w kolejnej ptli for, tzw. "Ptla w ptli". W pierwszej ptli 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

69

Rys. 10 Podwjna ptla for ... next Ptla For Each jest wykorzystywana, gdy nie jest znana liczba powtrze. Ptla jest wykonywana tak dugo, jak dugo Test logiczny ma warto PRAWDA. Klasycznym przykadem ptli for next jest procedura wywietlajca nazwy wszystkich warstw wystpujcych w rysunku.

Rys. 11 Testowanie instrukcji warunkowej For Each...Next w oknie immediate

17 - Tworzenie wasnych funkcji Tworzenie wasnych funkcji


Prawdopodobnie nie mieli Pastwo problemw ze zrozumieniem lekcji 5., w ktrej zostay wytumaczone sposoby tworzenia prostych obiektw rysunkowych tj. okrgu, elipsy, uku. Niemniej jednak tworzenie od podstaw kilkunastu okrgw o rnych punktach wstawienia i rednicy jest bardzo czasochonne, a ponadto plik projektu osiga monstrualne rozmiary. Aby temu zaradzi, programici pisz funkcje automatyzujce najczciej spotykane zadania projektowe. VBA nie jest tu wyjtkiem. Myl, e ludzie piszcy w AutoLispie doskonale wiedz, o czym mwi. 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

70

polecenia. Ale zarczam, e po przerobieniu tej lekcji nie bd Pastwo mieli kopotw ze stworzeniem swojej wasnej funkcji. Wemy na pocztek zagadnienie rysowania okrgu. W lekcji 5. jeden z przykadw ilustruje tworzenie okrgu w oparciu o dane pobrane od uytkownika (wska punkt rodkowy, wska rodek okrgu). Cech tego rozwizania jest pena "interaktywno" uytkownika z AutoCAD-em. Drugi przykad rysuje okrg w oparciu o znane dane (rodek, promie). To rozwizanie jest wykorzystywane, gdy te dwie wielkoci pochodz z wczeniejszych oblicze w ramach programu lub s przekazywane jako parametry przez inn funkcj. Na pocztek wyodrbnijmy z naszej procedury cz "gwn" .Bdzie ona miaa za zadanie pobranie informacji od uytkownika i przekazanie jej do funkcji. Cz pierwsza : Procedura Gwna
Public Sub RysujOkrag() Dim PromienOkregu As Double Dim SrodekOkregu As Variant SrodekOkregu = ThisDrawing.Utility.GetPoint (, "Wska rodek okrgu:") CircleRadius = ThisDrawing.Utility.GetReal ("Podaj promie:") DrawACircle CDbl(CentrePoint(0)), CDbl(CentrePoint(1)),_ CDbl(CentrePoint(2)), CircleRadius End Sub

Stworzylimy procedur o nazwie RysujOkrag.

Public Sub RysujOkrag()


Zmienne lokalne w tej procedurze : PromienOkregu, SrodekOkregu Skadnia Dim suy do deklaracji zmiennych (ustala typ zmiennych). W VBA mamy do czynienia z wieloma rnymi typami danych. Dla zmiennej lokalnej PromienOkregu typ zmiennej deklarujemy jako double tzw. "podwjnej precyzji".

Dim PromienOkregu As Double


Dla zmiennej lokalnej SrodekOkregu typ zmiennej deklarujemy jako Variant. Ten typ pozwala zmiennej przyjmowa rne typy danych wejciowych. Jest to wane, poniewa dziki temu nie musimy obawia si wystpienia bdu z uwagi na rne jednostki uywane w AutoCAD-zie np. imperial, metric, itd.

Dim SrodekOkregu As Variant


Do pobrania punktu SrodekOkregu wykorzystamy metode GetPoint

SrodekOkregu = ThisDrawing.Utility.GetPoint(, "Wska rodek okrgu:")


Mamy rodek okrgu wskazany przez uytkownika. Jego wsprzdne przechowuje zmienna SrodekOkregu. Nastpnie musimy uzyska od uytkownika wielko promienia naszego okrgu. Drobna uwaga - promie okrgu nie moe by rwny 0. Aby upewni si, e uytkownik wpisze w linii polece warto wiksz od zera, do pobrania wielkoci promienia wykorzystamy metod GetReal (metoda ta zwraca tylko liczby rzeczywiste).

CircleRadius = ThisDrawing.Utility.GetReal("Podaj promie:")


Nastpna linia "zaatwia" nam spraw rysowania okrgu.
RysOkrag CDbl(CentrePoint(0)), CDbl(CentrePoint(1)),_ CDbl(CentrePoint(2)), CircleRadius

Linia powysza wywouje funkcj RysOkrag z dwoma argumentami (SrodekOkregu, PromienOkregu). CDbl (wbudowana funkcja VBA) konwertuje dane typu Variant na dane typu Double. Zmienna SrodekOkregu ma wsprzdne (SrodekOkregu(0), SrodekOkregu(1), SrodekOkregu(2)) Gdzie: SrodekOkregu(0) = X

71

SrodekOkregu(1) = Y SrodekOkregu(2) = Z Przykadowe wywoanie procedury: RysOkrag 4,5,6,7 4,5,6 -> rodek okrgu 7 -> promie okrgu Cz druga : Funkcja rysujca Nazwa funkcji: RysOkrg Zmienne lokalne: CenX, CenY, CenZ, Rad, CircleCentre Funkcja RysOkrag wymaga podania dwch parametrw, bez ktrych nie moe by uruchomiona. Parametrami tymi s: rodek okrgu oraz promie okrgu. Prametry te s przechowywane w zmiennych lokalnych CenX, CenY, CenZ, Rad, CircleCentre i s zadeklarowane jako obiekt AutoCAD-a (okrg).
Public Function RysOkrag(CenX As Double , CenY As Double, CenZ As Double, _ Rad As Double) As AcadCircle

W nastpnej linii deklarujemy zmienn SrodekOkregu jako zmienn typu double. Zmienna ta posuy nam do przechowywania informacji o wsprzdnych rodka okrgu.

Dim SrodekOkregu (0 To 2) As Double


Przypisujemy zmiennym X, Y i Z wartoci wyodrbnione ze zmiennej SrodekOkrgu.

SrodekOkregu (0) = CenX: SrodekOkregu (1) = CenY: SrodekOkregu (2) = CenZ


Zmienne z procedury RysujOkrag przekazywane s do procedury RysOkrag do zmiennej SrodekOkrgu oraz promie okrgu do zmiennej Rad. Teraz moemy przej ju do dodania linii kodu do naszej funkcji, ktra spowoduje narysowanie okrgu w AutoCADzie.

Set RysOkrag = ThisDrawing.ModelSpace.AddCircle(SrodekOkregu, Rad)


Koniec funkcji RysOkrag

End Function
Funkcja RysOkrag rysuje nam okrg w przestrzeni modelu w AutoCAD-zie. Nastpnie funkcja koczy swoje dziaanie, po czym powraca do procedury, z ktrej zostaa wywoana. Poniej zamieszczony zosta kompletny listing zawierajcy przykady rysowania okrgw.
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

72

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 paski

Rys. 2 Widok 3D Widok jest obiektem AutoCAD-a (AcadView). Nowy widok tworzymy korzystajc z metody Add (Views.Add ) Z poziomu VBA uzyskujemy dostp korzystajc ze skadni 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 wsprzdnej x lewego 'dolnego rogu definiowanego widoku

73

ptLd(1) = 0 'przypisujemy warto wsprzdnej y lewego 'dolnego rogu definiowanego widoku ptPg(0) = 100 'przypisujemy warto wsprzdnej x prawego 'grnego rogu definiowanego widoku ptPg(1) = 100 'przypisujemy warto wsprzdnej y prawego 'grnego rogu definiowanego widoku Dim ptCtr(0 To 1) As Double 'definiujemy zmienn ptCtr jako zmienn typu double. 'Zmienna ta posuy do przechowywania informacji 'o wsprzdnych punktu centralnego widoku. 'Wyliczamy wsprzdne 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 obsug bdw 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 'koczymy procedur

Przechodzimy teraz do testowania naszej procedury. Przechodzimy do AutoCAD-a przy pomocy kombinacji klawiszy Alt + F11 i uruchamiamy makro view1. Sprawdzamy efekt dziaania naszego makra. Z menu grnego wybieramy : [Widok]->[Nazwane Widoki...]

74

Rys. 3 Okno dialogowe Widok z umieszczonym w nim widokiem o nazwie test Wywietlenie wszystkich nazw widokw 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 'acuch tekstowy If ThisDrawing.Views.Count > 0 Then 'jeeli w rysunku znajduje si chocia jeden widok 'dla kadego widoku znajdujcego si w rysunku For Each objView In ThisDrawing.Views 'Przypisujemy zmiennej strViewNames nazw tego widoku strViewNames = strViewNames & objView.Name & vbCrLf Next 'zwikszamy licznik ; licznik jest rwny 'liczbie widokw w rysunku (ptla logiczna FOR) 'Wywietlamy nazwy widokw w oknie informacyjnym. MsgBox "Nazwane widoki w biecym rysunku:" & vbCrLf _ & strViewNames Else 'w przeciwnym razie zostanie wywietlone 'okno informacyjne, mwice o tym, e 'w biecym rysunku nie znajduj si adne 'nazwane widoki. MsgBox "W biecym rysunku nie ma adnych nazwanych widokw." End If 'koniec instrukcji warunkowej if End Sub 'koczymy nasz procedur

Efekt dziaania procedury jest widoczny na rysunku poniej.

75

Rys. 4 Lista nazwanych widokw wystpujcych w biecym rysunku Ustalanie aktualnego widoku Widok raz stworzony przez uytkownika mona 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 osign ten sam efekt z poziomu VBA, wwczas 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 acuch tekstu 'Ustalamy biec przestrze jako przestrze modelu ThisDrawing.ActiveSpace = acModelSpace 'Ustawienie biecej rzutni Set objActViewPort = ThisDrawing.ActiveViewport 'Przedefiniowanie biecej rzutni w oparciu 'o informacje o widoku 'Proba o wpisanie w oknie InputBox nazwy widoku strViewName = InputBox("Podaj nazw widoku:") 'Jeeli zmienna strViewName ma przypisan warto ' pust, opuszczamy procedur If strViewName = "" Then Exit Sub 'Jeeli zwrcona zostanie warto bdu, przejd dalej On Error Resume Next 'Ustal jako widok aktualny widok o nazwie 'wpisanej przez uytkownika w oknie InputBox Set objView = ThisDrawing.Views(strViewName) 'Jeeli widok nie jest wartoci pust, to: If Not objView Is Nothing Then 'Ustal go aktualnym objActViewPort.SetView objView

76

'Ustal jako aktywn rzutni biec rzutni ThisDrawing.ActiveViewport = objActViewPort Else 'w przeciwnym wypadku 'Wywietl okno informacyjne MsgBox "Widok nie zosta znaleziony" End If 'koniec instrukcji warunkowej if End Sub 'koniec procedury

19 - Bloki Bloki
W AutoCAD-zie moemy utworzy dowoln ilo blokw (jeli oczywicie zachodzi takowa potrzeba). Najczciej tworzymy nowy blok, korzystajc z okna dialogowego Definicja bloku .

Rys. 1 . Okno dialogowe Definicja Bloku Istniej dwa sposoby tworzenia blokw z poziomu VBA. Pierwszy sposb to tworzenie bloku z wykorzystaniem metody Add obiektu Blok w celu stworzenia pustego bloku, a nastpnie dodanie elementw rysunku do definicji bloku. Drugi sposb wykorzystuje metod Insert do tworzenia definicji bloku, jak te odwouje si do zewntrznego pliku rysunku. Tworzenie bloku i wstawianie go do rysunku W poniszym przykadzie zostanie stworzony nowy blok, a nastpnie do definicji tego bloku zostanie dodany okrg. Na koniec blok ten zostanie wstawiony do rysunku. Przejdmy teraz do omwienia poszczeglnych linii programu.

Sub wstawianie_bloku()
Tworzymy now procedur. Deklarujemy zmienn blockObj jako nowy obiekt AutoCAD-a

(AcadBlock).

77

Dim blockObj As AcadBlock


Deklarujemy zmienn insertionPnt jako zmienn typu double. Zmienna ta posuy nam do przechowywania wsprzdnych punktu wstawienia bloku.

Dim insertionPnt(0 To 2) As Double


Przypisujemy wartoci poszczeglnym wsprzdnym 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")

Zdefiniowalimy nowy blok. Teraz musimy doda obiekty do tego bloku (w naszym przypadku bdzie to pojedynczy okrg). Na pocztku 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 wartoci poszczeglnym wsprzdnym punktu wstawienia.


center(0) = 0 center(1) = 0 center(2) = 0

Przypisujemy warto promieniowi okrgu.

radius = 1
Tworzymy okrg 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 wartoci poszczeglnym wsprzdnym wstawienia bloku.
insertionPnt(0) = 2 insertionPnt(1) = 2 insertionPnt(2) = 0

Wstawiamy blok (tworzymy odwoanie obiektu do zmiennej za pomoc instrukcji SET)


Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)

Powikszamy (Zoom Wszystko)

ZoomAll
Wywietlamy okno informacyjne.
MsgBox "Ten okrg naley do " & blockRefObj.ObjectName End Sub

koniec procedury

78

Testujemy nasz procedur. Po uruchomieniu jej w AutoCAD-zie okrg zosta narysowany i dodany do definicji bloku. Klikamy w obszarze okrgu, a nastpnie po wciniciu prawego klawisza myszy z listy rozwijanej wybieramy Cechy

Rys. 2 Widok zaznaczonego okrgu w oknie AutoCAD-a oraz wywietlonego okna cechy Zmiana definicji obiektu w bloku W tym przykadzie zostanie stworzony blok i zostanie dodany do niego okrg. Nastpnie blok zostanie wstawiony do rysunku jako odwoanie do bloku. Na koniec zostanie zaktualizowana definicja okrgu 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 okrgu 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.InsertBlock _ (insertionPnt, "CircleBlock", 1#, 1#, 1#, 0)

79

ZoomAll 'Przedefiniowanie okrgu nalecego do bloku, 'a nastpnie zaktualizowanie odwoania 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 moemy tworzy i edytowa dwa rodzaje menu: list rozwijan oraz menu kursora. Do listy rozwijanej mamy dostp poprzez menu grne w AutoCAD-zie. Do menu kursora z kolei uzyskujemy dostp poprzez jednoczesne wcinicie klawisza SHIFT oraz prawego klawisza myszy. Struktura listy rozwijanej jest ograniczona do 999 elementw. Struktura menu kursora jest ograniczona do 499 elementw. Po przekroczeniu tych wielkoci nastpne elementy menu s ignorowane. Poniszy rysunek obrazuje, w jaki sposb s numerowane elementy w menu. Indeksy menu s liczone od 0 do n. Prosz rwnie zwrci uwag, e separator jest take liczony jako osobny element menu.

Rys. 1 Struktura listy rozwijanej Poniszy przykad ilustruje, w jaki sposb za pomoc VBA mona stworzy w AutoCADzie nowe menu i doda to menu do istniejcej 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

80

'Jeeli AutoCAD zwrci bd, to przechodzimy dalej On Error Resume Next 'Tworzymy list rozwijan o nazwie Helion. Set objHelionMenu = objMenus("&Helion") 'Sprawdzamy warunek logiczny. 'Jeeli obiekt menu o tej nazwie ju istnieje, to: If Not objHelionMenu Is Nothing Then 'Wywietlamy okno informacyjne MsgBox "Menu already exists" 'I opuszczamy biec procedur Exit Sub 'Koniec instrukcji warunkowej IF End If 'Dodajemy element menu Set objHelionMenu = objMenus.Add("&Helion") objHelionMenu.InsertInMenuBar ThisDrawing.Application.MenuBar.Count 'Koczymy procedur End Sub

Poniszy przykad ilustruje sposb dodawania elementw do stworzonego przez nas menu. Dodany przez nas element menu ma za zadanie uruchomienie makra napisanego w VBA, korzystajc 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.Item(0).Menus 'W wypadku zwrcenia bdu 'przechodzimy do nastpnej linii. On Error Resume Next 'Tworzymy nowy obiekt listy o nazwie Helion. Set objHelionMenu = objMenus("&Helion") 'Sprawdzamy warunek logiczny: 'Jeeli obiekt listy o danej nazwie nie istnieje to: If objHelionMenu Is Nothing Then 'Dodajemy go.

81

Set objHelionMenu = objMenus.Add("&Helion") 'Koniec instrukcji warunkowej IF End If 'Sprawdzamy, czy utworzony przez nas element 'menu zosta wywietlony w menu grnym. If Not objHelionMenu.OnMenuBar Then 'Jeeli nie, to go wywietlamy objHelionMenu.InsertInMenuBar ThisDrawing.Application.MenuBar.Count 'Koniec instrukcji warunkowej IF End If 'Umieszczamy w naszym menu 'wywoanie 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 rysOkrg2() Dim ObOkrag As AcadCircle 'Deklaracja zmiennej jako obiekt AutoCAD-a Dim PtSrodek(0 To 2) As Double 'Deklaracja zmiennej dla punktu rodka okrgu Dim dblPromien As Double 'Deklaracja zmiennej dla promienia 'Dane okrgu: PtSrodek(0) = 100# 'Wsprzdna X rodka okrgu PtSrodek(1) = 200# 'Wsprzdna Y rodka okrgu PtSrodek(2) = 0# 'Wsprzdna Z rodka okrgu dblPromien = 50# 'Warto promienia 'Tworzenie okrgu w przestrzeni modelu Set ObOkrag = ThisDrawing.ModelSpace.AddCircle (PtSrodek, dblPromien) End Sub

Rys. 2 Efekt dziaania procedury HelionMenu2

82

Rys. 3 Helpstring widoczny, gdy zatrzymamy kursor myszy na elemencie menu Rys Okrg Przy umieszczaniu elementw w menu stworzonym przy pomocy VBA musimy zwrci uwag na jeszcze jedn wan rnic: zamiast znakw sterujcych w menu np. ; musimy uywa ich odpowiednikw ASCII chr(59)
'przypisanie makra otwrz (Odpowiednik VBA dla wpisania: "ESC ESC _open ") openMacro = Chr(3) & Chr(3) & Chr(95) & "open" & Chr(32)

Poniej umieciem tabel, zawierajc najczciej uywane w menu znaki sterujce oraz ich odpowiedniki w ASCII.

Rys. 4

83

You might also like