<<Elöző rész Tartalom Következő rész>>

Visual Basic programozás AutoCAD-ben I. rész
Ismerkedés a Visual Basic for Application használatával az AutoCAD környezetben

dr. Siki Zoltán

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.

Készítsük el a felhasználói felületet

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

Töltsük meg tartalommal

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

Epilógus

Egy mintapélda nem lehet elegendő egy programozói környezet elsajátításához, de a kezdeti nehézségek leküzdésében sokat segíthet. Felbátoríthat további feladatok megoldására, melyek a saját vagy mások munkájának megkönnyítik. A mintapéldát tartalmazó projekt (pontok.dvb) innen is letölthető.

dr. Siki Zoltán

<<Elöző rész Tartalom Következő rész>>