Professional Documents
Culture Documents
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.
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
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.
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
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,
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:
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
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
"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.
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
= = = = =
10# 'x wsprzdna pt1 10# 'y wsprzdna pt1 0# 'z wsprzdna pt1 20# 'x wsprzdna pt2 30# 'y wsprzdna pt2
15
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.
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.
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).
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
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.
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).
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.
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.
23
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
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
With ThisDrawing.Utility
Pobranie za pomoc metody GetPoint wsprzdnych rodka uku
25
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.
27
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
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).
29
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
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
radius = 20
Przypisanie okrgu jako drugiej wewntrznej granicy kreskowania
30
With innerLoop2(0)
Ustawienie wartoci gruboci na 35
innerLoop2(0).Lineweight = acLnWt035
oraz ustalenie koloru na czerwony
innerLoop2(0).Color = acRed End With
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
End Sub
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
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.
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
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:
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.
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).
40
Skadnia: Function PolarPoint(Punkt, Kt As Double, Odlego As Double) Zwraca punkt w podanej odlegoci i kcie od podanego punktu. Wyznaczamy punkt P2.
41
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
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.
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
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
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:
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
Zoom okno od pkt (-10,-10) do pkt (60,50) deklarujemy zmienn pkt1 jako double,
48
Wykonujemy przyblienie
Wywietlamy okno MsgBox, ( informuje nas, e grna polilinia zostanie odsunita o jedn jednostk do wewntrz rysunku
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
ThisDrawing.Regen acActiveViewport
Przeprowadzamy regeneracj biecej rzutni
offsetObj1(0).Delete
Usuwamy obiekt powstay z odsunicia grnej polilinii
ThisDrawing.Regen acActiveViewport
Przeprowadzamy regeneracj biecej rzutni FAZA 4 - Lustro (metoda mirror)
49
mirrorObj2.Update
odwieamy obiekt Wywietlamy okno informacyjne
FAZA 6 - wykorzystanie metody Rotate do obracania obiektu Skadnia: Object.Rotate Wywietlamy okno informacyjne
50
koniec procedury
Sub nowa_warstwa1()
Deklarujemy zmienn layerObj jako nowy obiekt AutoCAD-a
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
circleObj.Color = acByLayer
Deklarujemy zmienn layerObj jako nowy obiekt AutoCAD-a.
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
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:
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
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.
55
ss.Highlight True
Wywietlenie informacji w oknie MsgBox o tym, e obiekty znajdujce si w zbiorze wskaza zostay podwietlone.
ThisDrawing.Regen True
Wywietlenie informacji w oknie MsgBox o tym, e zostanie usunite podwietlenie obiektw.
ss.Highlight False
Wywietlenie informacji w oknie MsgBox o tym, e zostanie usunity zbir 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
56
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.
57
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
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
60
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
dimObj1.Update
61
Rys. 3 Wymiar liniowy od punktu dpt1 do punktu dpt3 Deklarujemy zmienn dimrad jako nowy obiekt AutoCAD-a
Rys. 4 Rysunek pomocniczy do stworzenia wymiaru ktowego Deklarujemy zmienn center jako zmienn typu double.
62
= 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
Odwieenie obiektu
dimrad.Update
Rys. 5 Wymiar ktowy (zwymiarowanie promienia zaokrglenia) Wywietlenie w oknie typu MsgBox informacji.
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. 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
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
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.
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
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.
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. 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
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
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.
radius = 1
Tworzymy okrg o rodku w punkcie center i promieniu w punkcie radius.
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
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
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