| <<Elöző rész | Tartalom | Következő rész>> |
Az AutoCAD tradicionális Lisp alkalmazásfejlesztő nyelve
mellett a Windows-os verziókkal párhuzamosan elindult a Visual
Basic alapú fejlesztőkörnyezet kialakítása
is. Az AutoCAD 2000 alapú rendszerekben nagykorúvá és
a Lisp nyelvvel egyenértékű alkalmazásfejlesztő
környezeté nőtte ki magát. Valószínűleg
a tapasztalt AutoLisp programozók csak legyintenek a Basic említésére
(egy igazi programozó nem dolgozik Basicben). Az új és
a kevésbé vaskalapos régi AutoCAD felhasználók
mérlegelhetik, hogy melyik környezet felel meg jobban a céljaiknak.
álljon itt néhány érv a Visual Basic környezet
mellett
Egy programozói környezet elsajátítását célszerű egyszerűbb problémák megoldásával kezdeni. Egy egyszerű példán keresztül szeretnénk ízelítőt adni a Visual Basic for Application (VBA) használatából. A megoldandó feladat - a térképezéssel, térinformatikával kapcsolatosan gyakran előforduló probléma - egy fájlban tárolt koordinátáikkal adott pontok felrakása a térképre. A elkészülő makro segítségével a felhasználó az egér segítségével választhatja ki a feldolgozandó fájl nevét. A fájl szöveges formában soronként egy pont adatait tartalmazza pontszám, x, y sorrendben. Az adatokat a fájlban vessző választja el egymástól. A pontszám nem csak számjegy karaktereket, hanem betűket is tartalmazhat, a következő három sor egy adat fájl mintát mutat be.
45,1033.58,11187.5 47,958.245,11405.5 11-35,937.609,11868.5
A bemutatott példa minden AutoCAD 2000 illetve AutoCAD R14 alapú környezetben futtatható, ha az AutoCAd Visual Basic for Application környezetét telepítették.
A Visual Basic programok készítéséhez a Visual Basic szerkesztőt kell elindítanunk, ezt legegyszerűbben az Alt-F11 billentyű kombináció megnyomásával érhetjük el. A menüből a Tools>Macro>Visual Basic Editor parancsot használhatjuk. Ezután az 1. ábrán látható ablak jelenik meg.

1. ábra A Visual Basic fejlesztőkörnyezet
Első lépésben tervezzük meg a programunk grafikus felületét. Manapság a felhasználók elvárják, hogy a néhány egérkattintással elintézhessenek mindent. Ennek megfelelően, a pontok felrakásához készítsünk egy párbeszédablakot, melyek segítségével kiválaszthatjuk a feldolgozandó fájl nevét és beállíthatjuk, hogy a pontszámok (nevek) felírását is kérjük-e. A párbeszédablak létrehozásához kattintsunk jobb egérgombbal a Project ablakba és a felbukkanó menüből válasszuk az Insert>UserForm menüpontot. A 2. ábrának megfelelően további két ablak jelenik meg.

2. ábra
új párbeszédablak létrehozása
A UserForm1 fejlécű ablakban készíthetjük
el a saját grafikus felhasználói felületünket.
Rögtön módosítsuk az ablak fejlécét. A
Properties ablakban a kiválasztott elem tulajdonságait
állíthatjuk be. írjuk át a Caption (felirat)
tulajdonságot "Pontok felrakása fájlból"
szövegre, ezzel az ablak fejlécét módosítottuk.
Adjunk egy könnyebben memorizálható és kifejezőbb
nevet a párbeszédablaknak, A Name tulajdonságot
módosítsuk PntDlg-re. Ezzel egy új UserForm típusú
objektumot hoztunk létre. A project ablakban a projekt elemei között
megjelenik a párbeszédablakunk neve. Egy Visual Basic objektum
metódusokat (függvényeket, eljárásokat) és
tulajdonságokat (adatokat) foglal össze. A Visual Basic a Windows
standard elemeit (párbeszédablak, nyomógomb, stb.) mint
kész objektumokat kínálja.
A Toolbox ablak a párbeszédablakunk kialakításához
felhasználható kontrolokat tartalmazza. A Toolbox csak akkor látszik,
ha a párbeszédablakunkat tartalmazó ablak az aktív.
Hozzunk létre egy lista dobozt (ListBox), válasszuk ki
az egérrel a megfelelő nyomógombot a Toolbox ablakban,
majd a párbeszéd ablakunkba kattintva jelöljük ki a
helyét. A ListBox1 nevű objektumot hoztunk létre, módosítsuk
a nevét FileList-ra. Ebben a listában fogjuk megjeleníteni
az egy könyvtárban található fájlok neveit.
Helyezzünk el egy választó dobozt (CheckBox) a lista
alatt. Ennek feliratát (Caption) CheckBox1-ről módisítsuk
"Pontszámok felírása"-ra, nevét pedig
PszCheck-re. Végül helyezzünk el két parancsgombot (CommandButton)
a párbeszéd ablakunk alján egymás mellett. A baloldali
neve (Name) legyen CancelButton és a felirata (Caption)
legyen "Mégsem". A jobboldali gomb neve (Name) pedig
OkButton, a felirata (Caption) "OK" legyen. Az OK gomb "default"
tulajdonságát módosítsuk "true"-ra. Ez
azt jelenti, hogy ha az Enter billenyűt megnyomjuk ugyanaz a hatása,
mintha az egérrel az OK gombot megnyomtuk volna. A párbeszédablak
és a benne található elemek nevét nem kötelező
megváltoztatni, de könnyebb olyan elemekkel dolgozni, melyeknek
a nevét nem csak egy sorszám különbözteti meg.
A kialakított párbeszédablakot a 3. ábra mutatja.

3.ábra
A párbeszédablak elemei
Ezzel már egy futtatható programot is létrehoztunk, az F5 (Run>Run Sub/UserForm a menüből) gomb megnyomásával futtathatjuk is. Természetesen most még nem működik a végcélunknak megfelelően, de a Pontszámok felírása dobozba kattintva be- és kikapcsolhatjuk az opciót, a parancsgombokat meg tudjuk nyomni (de nem történik semmi), a párbeszédablakot le tudjuk zárni a jobbfelső sarokban található "x" megnyomásával. Anélkül, hogy egyetlen programsort is leírtunk volna elkészítettük a programunk grafikus felületét. Ezt megmutathatjuk a végfelhasználónak, a megrendelőnek. Az igényeknek megfelelően módosíthatjuk az elemek méretét és elhelyezését. A Visual Basic párbeszédablak szerkesztőjében az aktív elem körül keret jelenik meg, egy elemet egérkattintással tehetünk aktívvá. A 3. ábrán az OK gomb a kijelölt elem. A keret helyzetét és méretét az egér segítségével (vagy a Left, Top, Width és Height tulajdonságok átírásával) módosíthatjuk. A Properties ablakban mindig az aktuális elem tulajdonságai jelennek meg. Az eddigi munkánk során még nem használtuk fel az AutoCAD funkcióit. Ugyanezt megtehettük volna az MS Office programjaiban (MS Word, MS Access, MS Excel).
A következőkben lépésenként
működővé tesszük a felhasználói
felület elemeit. Amint már szó volt róla ezek a fejlesztő
környezet (és a Windows) által felkínált objektumok,
melyek meghatározott tulajdonságokkal (adatok/Properties)
és metódusokkal (eljárások és függvények)
rendelkeznek. Az egyes objektumok metódusait a céljainknak megfelelően
módosítani fogjuk. A metódusok többségének
végrehajtását események váltják ki,
ezek főleg egér műveletek.
Először készítsük el a Mégsem gombhoz
megnyomását kezelő eljárásunkat. Ennek a
gombnak csak az a funkciója, hogy lezárja a párbeszédablakot.
A párbeszédablakhoz tartozó metódusok létrehozásához,
módosításához meg kell jeleníteni a programunk
kódját. Válasszuk ki a Mégsem nyomógombot
a párbeszédablak tervezőben és nyomjuk meg az F7
gombot. A program szöveg megjelenítését a View menüből
is elérhetjük (View>Code). Ezután egy újabb
ablakban megjelenik a programunk szövege, a következő három
sor:
Private Sub CancelButton_Click() End Sub
A fenti sorokat a Visual Basic szerkesztő automatikusan
hozta létre. Ez olyan eljárása a PntDlg (ezt a nevet adtuk
a párbeszédablak objektumunknak), melyet a Mégsem feliratú
gomb megnyomására hajtódik végre. A CancelButton
a Mégsem feliratú nyomógomb neve, a Click pedig
az egérkattintásra utal. A Private alapszó az eljárás
előtt arra utal, hogy ezt az eljárást csak az aktuális
objektumhoz (PntDlg) tartozó eljárások és függvények
hívhatják meg. Az End Sub (eljárás vége)
előtti üres sorba írjuk be a következő utasítást:
Unload Me. Ez az utasítás lezárja a párbeszédablakot,
a Me az aktuális objektumra hivatkozás egyszerű alakja.
Rögtön próbáljuk ki, hogy működik-e a programunk.
Az F5 megnyomásával elindíthatjuk a programunkat. Nyomjuk
meg a Mégsem gombot, ezzel kilépünk a makró futtatásából.
Az OK nyomógombhoz tartózó kód elkészítése
előtt készítsük el a fájlneveket tartalmazó
lista kezelését. A párbeszédablak megjelenítése
előtt a listát fel kell tölteni az aktuális könyvtárban
található fájlok és könyvtárak neveivel.
Ezt a kódrészt a párbeszédablak inicializálásakor
kell végrehajtani, azaz a UserForm Initialize eljárásában
kell elhelyezni. A fájl lista feltöltéséhez készítsünk
egy saját eljárást, mivel ezt nem csak a párbeszédablak
inicializálásakor kell végrehajtani, hanem minden egyes
könyvtárváltás esetén is. A saját eljárásunkat
közvetlenül gépeljük be az utolsó End Sub
után:
Private Sub lista()
Dim fajl_nev As String
' fájl és könyvtárnevek lista tartalmának törlése
FileList.Clear
' normal fájlok és könyvtárak nevei
fajl_nev = Dir("*", vbDirectory)
Do While fajl_nev <> ""
' elem hozzáadása a listához
FileList.AddItem (fajl_nev)
' következo könyvtár bejegyzés
fajl_nev = Dir
Loop
' legyen az első név a kiválasztott
FileList.ListIndex = 0
End Sub
A szimpla aposztrófok utáni szöveg megjegyzés,
mely a program értelmezését könnyíti meg az
olvasójának. Az eljáráson belül a FileList
objektum két metódusát használjuk, a Clear
a lista összes elemét kitörli, az AddItem egy újabb
elemet helyez el a listában. A könyvtár és fájlnevek
beszerzéséhez a Visual Basic Dir eljárását
használjuk, melynek első hívásakor beállítottuk
a keresett neveket, és fájl típusokat. Esetünkben
ez minden normál fájl és könyvtár név
visszaadását jelenti, az aktuális könyvtárból.
A Dir függvény minden újabb meghívása
a következő nevet adja vissza, vagy üres sztringet, ha már
nincs több a feltételeknek megfelelő név.
A Lista eljárást automatikusan nem hajtja végre a Visual
Basic, ezért a meghívását el kell helyeznünk
a párbeszédablak inicializáló eljárásában.
A program kódot tartalmazó ablak felső részén
két legördülő lista található. A baloldali
az objektumok listáját tartalmazza, ebből válasszuk
ki a UserForm-ot. A jobboldali lista a kiválasztott objektumhoz
tartozó metódusokat tartalmazza. Ebből válasszuk
ki az Initialize-t. Az eljárás fejléce automatikusan
bekerül a programunkba. Utána már csak a lista eljárás
meghívását kell beírnunk.
Private Sub UserForm_Initialize() ' a fájl lista elso kitöltése Call lista End Sub
Most érdemes ismét kipróbálni az eddig elkészített
kódunkat az F5 billentyű megnyomásával. A listában
megjelenik az aktuális könyvtár tartalma, az egérrel
ki tudunk jelölni közülük egyet, görgetni tudjuk a
listát.
Munkánk következő lépésében oldjuk meg
a könyvtárváltást, ha egy könyvtár nevét
választjuk a listából és megnyomjuk az OK gombot,
akkor a kiválasztott könyvtár tartalma jelenjen meg a listában.
Ezt a kódot az OK gomb megnyomása esetén kell majd végrehajtani.
Hozzunk létre az eljárást, az objektumok közül
válasszuk az OKButton-t (baloldali legördülő lista),
a metódusok közül a Click-et (jobboldali lista), és
írjuk be az eljárás többi részét
Private Sub OkButton_Click() On Error GoTo betolt ' könytár váltás, ha sikertelen, akkor felrakja a fájl tartalmát ChDir (FileList.Value) On Error GoTo 0 ' fájl lista tartalmának frissítése Call lista Exit Sub betolt: ' pontok felrakása Call Felrak(FileList.Value, PszCheck.Value) ' párbeszéd ablak lezárása Unload Me End Sub
Az eljáráson belül először megpróbálunk
a kiválasztott nevű könyvtárba átlépni
(ChDir), ha ez sikerül, akkor a lista tartalmát aktualizálni
kell (Call lista), és kiléphetünk az eljárásból
(Exit Sub). Az On Error Goto utasítás után
egy címke áll, hiba estén azzal az utasítással
folytatódik a program végrehajtása, amely előtt
a megadott címke áll. Tehát, ha nem sikerül a könyvtárváltás,
akkor egy normál fájlról van szó, melyben szereplő
pontokat meg kell jeleníteni az AutoCAD-ben. Ezt a felrak nevű
eljárásban fogjuk megoldani, melynek két paramétere
van, a feldolgozandó fájl neve és, hogy kérjük-e
a pontszámok felírását. Ezt a két értéket
a megfelelő objektumok tulajdonságaival adjuk meg.
Bővítsük még a felhasználói felület
funkcióit. A fájl vagy könytár névre duplán
kattintva történjen ugyanaz, mintha a név kiválasztása
után az OK gombot nyomtuk volna meg. A legtöbb Windows környezetben
futó program hasonlóan működik. Ezt az eljárást
a FileList objektum DblClick eseményéhez kell kapcsolnunk.
Private Sub FileList_DblClick(ByVal Cancel As MSForms.ReturnBoolean) ' dupla kattintás esetén csinálja ugyanazt mint az OK gomb megnyomásánál Call OkButton_Click End Sub
Már csak a Felrak eljárást kell elkészítenünk. Itt már szükségünk lesz az AutoCAD funkcióinak elérésére. Az AutoCAD több mint száz speciális objektumokat ad hozzá a Visual Basic környezethez. Ezeknek az objektumoknak ugyanúgy, mint a standard Windows objektumoknak, saját tulajdonságai és metódusai vannak. Az aktuális AutoCAD rajzzal kapcsolatos műveleteket az automatikusan létrehozott ThisDrawing változó segítségével érhetjük el.
Public Sub Felrak(ByVal fn As String, ByVal pszOn As Boolean)
' pontok felrakása fájlból
Dim f, snap As Integer
Dim psz As String
Dim pnt(0 To 2) As Double
Dim pntObj As AcadPoint
Dim txtObj As AcadText
On Error GoTo hiba
' input fájl megnyitása
f = FreeFile
Open fn For Input As f
' z koordináta nullázása (2D pont)
pnt(2) = 0#
' pont szimbólum típusának beállítása
ThisDrawing.SetVariable "PDMODE", 2
' pont szimbólum méretének beállítása
ThisDrawing.SetVariable "PDSIZE", 1
' tárgyraszter beállítás mentése
snap = ThisDrawing.GetVariable("OSMODE")
' tárgyraszter kikapcsolása
ThisDrawing.SetVariable "OSMODE", 0
Do While Not EOF(f)
Input #f, psz, pnt(0), pnt(1)
If pszOn = True Then ' pontszám felírása
Set txtObj = ThisDrawing.ModelSpace.AddText(psz, pnt, 2#)
End If
' pont elhelyezése
Set pntObj = ThisDrawing.ModelSpace.AddPoint(pnt)
Loop
veg:
' tárgyraszter visszaállítása
ThisDrawing.SetVariable "OSMODE", snap
Set pntObj = Nothing
Set txtObj = Nothing
Close f
Exit Sub
hiba:
MsgBox "Hibás sor az input fájlban"
Resume veg
End Sub
A Felrak eljárásban a feldolgozandó fájl megnyitása után az AutoCAD környezeti változók értékeit állítjuk be. Az aktuális rajzhoz tartozó AutoCAD változókat a ThisDrawing objektum GetVariable és SetVariable metódusaival manipulálhatjuk. A pont szimbólum alakja + jel (PDMODE 2) legyen, és 1 rajzi egység méretű (PDSIZE 1). A tárgyraszter beállítás elmentése után kikapcsoljuk (OSMODE 0), hogy a meglévő rajzelemek ne befolyásolják a fájlból beolvasott koordináták értékét. A fájlból olvasást addig ismételjük, amíg a fájl végére nem értünk, vagy hiba nem következik be. A hibakezelésre a már ismertetett On Error Goto utasítást használjuk. A fájlból az Input utasítással olvasunk, ezt a sor kell kicserélni, ha a pontok adatait más szerkezetben tartalmazza az adatfájlunk. Például, ha minden pontszám után x, y, z koordináta szerepel, akkor a pontok háromdimenziós felrakásához a beolvasás sorát a következőre kell módosítani:
Input #f, psz, pnt(0), pnt(1), pnt(2)
A ModelSpace objektum AddPoint és AddText
metódusait használtuk az AutoCAD rajzi adatbázisának
bővítésére. Ezek a függvények egy AutoCAD
objektumot hoznak létre az aktuális rétegen. A ModelSpace
objektumon keresztül érhetük el a modell tér egyes rajzi
objektumait is.
A Felrak eljárás végrehajtása közben fellépő
hiba esetén, például nem megfelelő fájl formátum,
a "hiba" címke utáni sorra kerül a vezérlés.
Az MsgBox egy üzenet ablakban jeleníti meg a megadott szöveget.
A fájl további feldolgozása félbeszakad és
a Resume Basic utasítás segítségével
visszatérünk a "veg" címkére.
Az eddig elkészített programunkat csak a Visual Basic szerkesztő
ablakból tudjuk elindítani. Ahhoz, hogy egy AutoCAD menüponthoz
hozzá tudjuk rendelni, vagy az AutoCAD-ből közvetlenül
futtatni tudjuk, még egy kis kiegészítésre van szükség.
Hozzunk létre egy új modult a Visual Basic szerkesztő Insert>Module
menüpontjával. Majd adjuk hozzá a következő mindenhonnal
meghívható (Public) eljárást, mely nem csinál
mást, mint megjeleníti a párbeszédablakunkat a képernyőn.
Public Sub PontFelrakas() ' párbeszéd ablak megjelenítése PntDlg.Show End Sub
A PontFelrakas makró már hozzárendelhető egy menüponthoz, vagy az AutoCAD-ből közvetlenül futtatható. Bármelyik rajzban használhatjuk az elkészített makrót, csak be kell töltenünk a projektünket a Tools>Macro>Load Project menüpont segítségével. Az AutoCAD-ből közvetlenül futtatható makrók közül az Alt F8 megnyomása után (vagy a Tools>Macro>Macros menüponttal) tudunk választani.

4. ábra A program futás közben
dr. Siki Zoltán
| <<Elöző rész | Tartalom | Következő rész>> |