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

Visual Basic programozás AutoCAD-ben III. rész
Jelkulcs készítés a blokkokból

dr. Siki Zoltán

Ebben a cikkben szereplő példában egy jelkulcs táblázatot készítünk az aktuális rajz blokkjaiból és azok neveiből. Amennyiben az egyes blokk nevek jól kifejezik a tartalmat, akkor egy jelmagyarázatnak is megfelel a bemutatott makró eredménye. A jelmagyarázat helyét és elemei közötti távolságot a felhasználó jelölheti ki az AutoCAD-ben megszokott módszerekkel.

Tervezzük meg a párbeszédablakot

A VBA makróink elkészítéséhez az AutoCAD 2000 elindítása után a Visual Basic szerkesztőt kell elindítanunk. Hozzunk létre egy új UserForm-ot, a menüből válasszuk a Beszúrás>UserForm (Insert>UserForm az angol változatban) menüpontot. Az 1. ábrán látható párbeszéd ablakot alakítsuk ki. A megfelelő vezérlőelemeket az eszközkészletből (ToolBox) választhatjuk ki. Az aktuális vezérlőelem tulajdonságait a tulajdonságok (Properties) ablakban állíthatjuk be. Az 1. táblázat tartalmazza a vezérlőelemek beállítandó tulajdonságait. A különböző típusú vezérlőelemek számos tulajdonsággal rendelkeznek, de ezek közül a legtöbbnek az alapértelmezés szerinti értéke általában megfelelő. A táblázat csak módosítandó tulajdonságokat tartalmazza.


1. Ábra A párbeszédablak elemei

 ControlNameCaptionLeftTopWidthHeightEnabled
 UserFormBlokkokBlokk tartalomjegyzék0028684True
1LabelLabel1Beillesztési pont:347812True
2LabelLabel2Oszlop, sor távolság:3277812True
3TextBoxx-8137214.4True
4TextBoxy-16037214.4True
5TextBoxdx-81267214.4True
6TextBoxdy-160267214.4True
7Command-ButtonPickButtonKijelöl23704218True
8Command-ButtonPick1ButtonKijelöl237244218False
9Command-ButtonCancelButtonMégsem150486018True
10Command-ButtonOKButtonOK219486018False
11ImageImage1-9452121True

1. táblázat a párbeszédablak vezérlőelemeinek beállításai

Az egyes vezérlőelemek pozícióját és méretét a legegyszerűbben az egérrel állíthatjuk be, azonban, ha azonos méretű, pontosan egymás alatt vagy mellett elhelyezkedő elemeket szeretnénk létrehozni, akkor az egér használatával ez nehezen valósítható meg. A Left, Top, Width, Height (balszél, felsőszél, szélesség, magasság) értékek közvetlen beállítása mellett a Formátum>Igazítás és Formátum>Egyenlő méret (Format>Align, Format>Make Same Size) menüpontok segítségével is összerendezhetjük az egérrel bedobált vezérlőelemeket. Az igazítás és egyenlő méret menüpontokat akkor tudjuk használni, ha több vezérlőelemet is kijelölünk. Az első vezérlőelem kiválasztása után további elemeket a Shift billentyű nyomvatartása mellett kell kijelölni. Az Image vezérlőelem még egy, a táblázatban nem szereplő tulajdonságát is be kell állítanunk. Ez a Picture tulajdonság. A tulajdonság cellájába kattintás után egy nyomógomb jelenik meg. A "…" (három pont) feliratú gomb megnyomása után kiválaszthatjuk a megjelenítendő kép fájl nevét. Én az AutoCAD Map ikonját választottam.

Ezzel befejeztük a felhasználói felület tervezését és kialakítását. A párbeszédablakot ki is próbálhatja, nyomja meg az F5 billentyűt, amikor a párbeszédablak tervező ablaka aktív. A párbeszédablak megjelenik, a szövegmezőket ki tudja tölteni. A nyomógombok viszont még nem működnek, kilépni csak a jobb felső sarokban levő "x" megnyomásával tud. A második Kijelöl és az OK gomb felirata szürke, nem lehet őket megnyomni, kiválasztani. Ez az Enabled tulajdonság False állapotából következik. Az oszlop és sor távolság kijelölése a beillesztési ponthoz viszonyítva történet meg. Úgy fogjuk kialakítani a párbeszédablak működését, hogy a második kijelöl gomb csak akkor válik aktívvá, ha a beillesztési pont koordinátáit már kitöltötte a felhasználó. Hasonlóképpen az OK gomb is csak akkor lesz aktív, ha mind a beillesztési pontot, mind az oszlop, sor távolságot kitöltötték. Ez a megoldás a felhasználó szempontjából teremt tiszta képet, csak azok a vezérlőelemek aktívak, melyek az adott helyzetben működtethetők.

Kezeljük az eseményeket

A feladat megoldását a vezérlőelemekhez kapcsolódó események elkészítésével folytatjuk. A VBA minden vezérlőelemhez kapcsolódó eseményhez hozzárendel egy kezelő eljárást. Ezért tudtuk kipróbálni a megszerkesztett párbeszédablakot anélkül, hogy egy sor programot is írtunk volna. Csak azoknak az eseményeknek a kezelő eljárását kell megírnunk, ahol a VBA által nyújtott alapértelmezett kezelés nem felel meg az igényeinknek. Kezdjük a legegyszerűbbel, a Mégsem gomb megnyomására válaszoló eljárással. Nyomja meg az F7 gombot a kód ablak megjelenítéséhez. A kódablak fejlécében bal oldalon a vezérlőelemeket, a jobb oldalon az eseményeket tartalmazó legördülő listák jelennek meg (2.ábra). Válassza ki a CancelButton vezérlőelemet és a Click eseményt. A VBA automatikusan elkészíti az egérkattintás (click) eseményre reagáló eljárás fejlécét. Az eljárás neve a vezérlőelem és az esemény nevéből áll. Az eljárásban a párbeszédablak "etüntetéséről" kell gondoskodnunk az Unload eljárás meghívásával.


2. Ábra Vezérlőelemek és események kiválasztása (vba3_2.clp)

Private Sub CancelButton_Click()
  Unload Me
End Sub

Az Unload eljárás egy objektum által lefoglalt memória területet felszabadítja. A Me paraméterei az aktuális objektumra utal, ez egy UserForm modul esetén maga a párbeszédablak objektum. Az eljárás elkészítése után rögtön kipróbálhatjuk, hogy működik-e a Mégsem nyomógomb (F5-futtatás).

Folytassuk a munkát a kezdőpont és a sor oszlop távolság megadására szolgáló szövegdobozokkal. Ezek a vezérlőelemek már szinte minden eseményre jól reagálnak, tudunk beírni, törölni stb. Problémát jelent az, hogy nemcsak számokat, hanem tetszőleges szöveget is beírhatunk,. Egy szövegdoboz tartalmának ellenőrzésére kétféle megoldás képzelhető el. A szövegdoboz Change eseményét kezelő eljárást a tartalom minden egyes módosítása után meghívja a rendszer. Minden egyes billentyűnyomás után megvizsgálhatjuk a tartalmat. Másik megoldás lehet a tartalom ellenőrzésre az Exit eseményhez írt eljárás. Ezt akkor hívja meg a rendszer, amikor kilépünk a szövegdobozból. Emellett arról is kell gondoskodnunk, hogy a második Kijelöl és az OK gomb aktív/inaktív állapotát módosítsuk. Használjuk az x és y vezérlőelemek Exit eseményét a fenti célok elérésére. Külön függvényt készítünk arra, hogy a szövegdoboz tartalma számmá alakítható-e. Ennek a függvénynek a neve legyen "szam_e", és a visszaadott értéke -1, ha nem alakítható számmá, 0, ha üres és 1, ha számot tartalmaz a függvény paramétere.

Private Function szam_e(ByVal s As String) As Integer
  ' az s string valós számértéket tartalmaz?
  Dim w As Double
  szam_e = 1
  If Len(Trim(s)) = 0 Then
    szam_e = 0 ' üres string
  Else
    On Error Resume Next
    w = CDbl(x.Text)
    If Err Then
      szam_e = -1 ' hiba
      MsgBox "Hibás érték"
    End If
  End If
End Function
Private Sub x_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Dim w As Double
  
  If szam_e(x.Text) = 1 And szam_e(y.Text) = 1 Then
    Pick1Button.Enabled = True
    If szam_e(dx.Text) = 1 And szam_e(dy.Text) = 1 Then
      OKButton.Enabled = True
    End If
  Else
    Pick1Button.Enabled = False
    OKButton.Enabled = False
  End If
End Sub

Az x_Exit eljárásban megvizsgáljuk mind az x, mind az y mezők tartalmát, ha mindkettő számmá alakítható akkor aktívvá tehetjük a második kijelöl gombot. Amennyiben mind a négy szövegdoboz számot tartalmaz, akkor az OK gombot is aktívvá tehetjük. Az y_Exit eljárás tartalma azonos az x_Exit eljáráséval.
Az oszlop és sor távolság mező kitöltését szintén az Exit eseményre válaszoló eljárásban vizsgáljuk meg. Itt már elegendő az OK gomb állapotát állítani.

Private Sub dx_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Dim w As Double
  
  If szam_e(dx.Text) = 1 And szam_e(dy.Text) = 1 And _
     szam_e(x.Text) = 1 And szam_e(y.Text) = 1 Then
    OKButton.Enabled = True
  Else
    OKButton.Enabled = False
  End If
End Sub

A dy_Exit eseményre válaszoló eljárás tartalma megegyezik a dx_Exit eljárással.

A Kijelöl gombok megnyomása esetén azt szeretnénk, hogy a felhasználó az AutoCAD-ben megszokott módszerekkel jelölhessen ki egy pontot. Az ilyen típusú adatbevitelre a Utility objektum által kínált függvényeket használhatjuk (2. Táblázat). A VBA 5.0 úgynevezett modális párbeszédablakokat használ. Ez azt jelenti, hogy amíg a párbeszédablak látható addig az AutoCAD egyéb funkciói nem érhetők el. Ezért a Getxxx függvények használata előtt a párbeszéd ablakunkat el kell "tüntetnünk" a képernyőről, majd a pont megadása után újra meg kell jeleníteni.

FüggvényLeírás
InitializeUserInputA következő Getxxx függvény esetén használható kulcsszavak megadása
GetKeywordKulcsszó beolvasás
GetStringSzöveg beolvasás
GetIntegerEgész szám beolvasás
GetRealValós szám beolvasás
GetPointEgy pont koordinátái (2D vagy 3D)
GetCornerTéglalap kijelölés második pontja
GetDistanceTávolság beolvasás
GetAngleSzög beolvasás
GetOrientationSzög beolvasás (keleti iránytól)
GetEntityEgy rajzelem kiválasztása
GetSubEntityEgy rajzelem (pl. blokk) részének kiválasztása

2. Táblázat AutoCAD adatbeviteli függvények

Private Sub PickButton_Click()
  Dim p As Variant
  
  Me.Hide ' párbeszédablak elrejtése
  ' pont bekerese prompttal
  On Error Resume Next
  p = ThisDrawing.Utility.GetPoint(, "Beillesztési pont: ")
  If Err Then Exit Sub ' hiba esetén kilépés
  x.Text = ThisDrawing.Utility.RealToString(p(0), acDecimal, 2)
  y.Text = ThisDrawing.Utility.RealToString(p(1), acDecimal, 2)
  Pick1Button.Enabled = True
  If szam_e(dx.Text) = 1 And szam_e(dy.Text) = 1 Then
    OKButton.Enabled = True
  End If
  Me.Show
End Sub

A PickButton_Click eljárásban a párbeszéd ablak elrejtésére a Hide, újbóli megjelenítésére a Show metódust használjuk. Az Unload és Load eljárásokat itt nem használhatjuk, mert akkor elveszítenénk a vezérlőelemek tartalmát, állapotát. A GetPoint függvény egy háromelemű valós számokat tartalmazó tömböt ad vissza. A hibakezelésre (On Error …) azért van szükség, mert a felhasználó megszakíthatja az adatbevitelt (pl. Esc billentyű). A Utility objektum adatkonverziós függvényeket is tartalmaz, ezek közé tartozik az eljárásunkban használt RealToString. Ennek segítségével töltjük ki a szövegdobozok tartalmát. A VBA-ban közvetlenül is értékül adhattuk volna az egyes valós koordinátaértékeket a szövegdoboznak (x.Text = p(0)), de ebben az esetben nem tudtuk volna szabályozni a megjelenített tizedesjegyek számát. Az eljárás még beállítja a nyomógombok állapotát és újra megjeleníti a párbeszédablakot.

A második Kijelöl gomb megnyomás eseményét kezelő eljárás (Pick1Button_Click) az előzőek alapján már érthető. Itt a GetPoint függvény első paraméterét is használjuk. Ez egy pont koordinátáit adja meg, a kijelölés során ebből a pontból kiinduló szakaszt jelenít meg az AutoCAD.

Private Sub Pick1Button_Click()
  Dim p(2) As Double
  Dim pp As Variant
  
  Me.Hide ' párbeszédablak elrejtése
  p(0) = x.Text
  p(1) = y.Text
  p(2) = 0
  pp = ThisDrawing.Utility.GetPoint(p, "Sor, oszlop távolság: ")
  dx.Text = ThisDrawing.Utility.RealToString(pp(0) - p(0), acDecimal, 2)
  dy.Text = ThisDrawing.Utility.RealToString(pp(1) - p(1), acDecimal, 2)
  OKButton.Enabled = True
  Me.Show
End Sub

Blokkok beillesztése

A makrónk majdnem teljesen elkészült. Már csak a lényeg hiányzik. Mi történjen, ha az OK gombot nyomták meg? Egy külön eljárást készítettem a blokkok beillesztésére (blks), melynek a paraméterei adják meg a táblázat sarokpontját és a sor, oszlop távolságokat. A blokkok kollekcióban helyezkednek el az AutoCAD objektum modellben. Ez a kollekció tartalmazza a rajz valamennyi blokk definícióját, hasonlóan mint ahogy a ModelSpace kollekció tartalmazza a rajzelemeket (lásd I. rész). A Blocks kollekcióból kivesszük az aktuális rajz (ThisDrawing) összes nem speciális blokkjának a nevét és beillesztjük a blokk egy példányát a modell terünkbe és módosítjuk a beillesztési pont koordinátáit.

' blokkok megjelenitese tablazatosan
Private Sub blks(Optional ByVal x0 As Double = 0, Optional ByVal y0 As Double = 0, _
  Optional ByVal dx As Double = 1, Optional ByVal dy As Double = 1)
  Dim b As AcadBlock
  Dim r As AcadBlockReference
  Dim i As Integer
  Dim p2(2) As Double
  Dim p1(2) As Double
  Dim n As String
  
  ' blokk beszúrás kezdopontja
  p1(0) = x0: p1(1) = y0: p1(2) = 0#
  ' blokknév kezdopontja
  p2(0) = x0 + dx: p2(1) = y0: p2(2) = 0#<
  ' minden blokkra
  For i = 0 To ThisDrawing.Blocks.Count - 1
    Set b = ThisDrawing.Blocks.Item(i)
    n = b.Name
    ' specialis blokkok neve * karakterrel kezdodik
    If (Left(n, 1) <> "*") Then ' nem speciális blokk
      ' blokk beillesztés
      ThisDrawing.ModelSpace.InsertBlock p1, n, 1#, 1#, 1#, 0#
      ' blokknév felirat
      ThisDrawing.ModelSpace.AddText n, p2, 1#
      p1(1) = p1(1) + dy ' következo pozició
      p2(1) = p2(1) + dy
    End If
  Next
End Sub

Ezután az OK gomb megnyomását kezelő eljárásunkban már csak a blks eljárást kell meghívnunk a megfelelő paraméterekkel.

Private Sub OKButton_Click()
  ' blokk táblázat elkészítése
  blks x.Text, y.Text, dx.Text, dy.Text
  Unload Me ' párbeszédablak lezárása
End Sub

Végső simítások

A Form modulunkat közvetlenül nem tudjuk végrehajtatni az AutoCAD-ből. Ehhez egy kód modult is létre kell hoznunk. A következő eljárást adjunk hozzá a kód modulunkhoz.

Public Sub blokk_lista()
  Blokkok.Show
  End Sub

A blokk_lista makró az AutoCAD-ből közvetlenül végrehajtható, egy menüponthoz vagy eszköztár elemhez hozzárendelhető. Bár a példát tartalmazó projekt (vba3.dvb) innen is letölthető, azoknak akik meg szeretnék tanulni a VBA használatát, azt javasoljuk, hogy a cikk útmutatása alapján próbálják meg saját maguk bevinni az utasításokat. Jó munkát.


3. Ábra Párbeszédablakunk futtatás közben


4. Ábra A makróval készített jelkulcs

dr. Siki Zoltán

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