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

Visual Basic programozás AutoCAD-ben II. rész
AutoCAD Rajzok tartalmának felfedezése Visual Basic-kel

dr. Siki Zoltán

Az előző részben a Visual Basic for Application-nal való ismerkedés során zömében a felhasználói felület kialakításával foglalkoztunk egy mintapélda alapján. Most szintén egy példán keresztül az AutoCAD-hez kapcsolódó Visual Basic objektumokkal foglalkozunk.

Gyakran kerültem olyan helyzetbe amikor egy rajzi állomány tartalmát, struktúráját kellett ellenőriznem. Az AutoCAD MAP rajztisztítási és topológia létrehozó funkciói sokat segítenek a rajz vagy térkép szerkesztése során elkövetett hibák megtalálásában. Tapasztalataim szerint sokszor fordul elő, hogy egy-egy rajzelem nem a megfelelő rétegre kerül. Az ilyen hibák kimutatásához készítsünk egy Visual Basic Makrót, mely leltárt készít a rajzunkról. A leltár tartalmazza, hogy milyen rétegek szerepelnek a rajzban és, hogy az egyes rétegeken a különböző típusú rajzi elemből hány darab szerepel. Az eredményeket a rajz nevével egyező ".OUT" kiterjesztésű fájlba írjuk ki.

A munka megkezdése előtt indítsuk el az AutoCAD 2000-t (vagy az AutoCAD 2000 alapú alkalmazását). Majd a Visual Basic szerkesztőbe lépjünk be az ALT-F11 billentyűk megnyomásával, vagy a menüből a Tools>Macro>Visual Basic Editor kiválasztásával. A megjelenő ablakot használhatjuk Visual Basic programok létrehozására és módosítására.

A munkánkat a Visual Basic projektekbe szervezi, egy projekt AutoCAD objektumokból és modulokból áll. A projekt valamennyi modulját egy .DVB kiterjesztésű fájl tartalmazza, bináris formátumban (azaz egy szövegszerkesztő, pl. Notepad segítségével nem tudjuk megnézni a tartalmát). Minden projekthez automatikusan létrejön egy "ThisDrawing" nevű AutoCAD specifikus objektum, melynek segítségével az aktuális rajz tartalmával dolgozhatunk. Három típusú modult adhatunk a projektünkhöz, párbeszéd ablakot (UserForm), kód modult (Module), osztály modult (Class Module). A párbeszéd ablak modul a párbeszéd ablak grafikus elemeit és a hozzájuk kapcsolódó Visual Basic kódot tartalmazza, ilyen modult készítettünk az előző részben szereplő "Pontok felrakása" című részben. A kód modul csak Visual Basic eljárásokat és függvényeket tartalmaz, ilyen modult fogunk létrehozni ebben a példában. Az osztály modul segítségével saját objektum osztályt hozhatunk létre, az objektum osztályhoz tulajdonságokat és metódusokat adhatunk hozzá. Az új projekt neve ACADProject lesz automatikusan. Már létező projektet a Tools>Macro>Load Project vagy VBA Manager menüpontjának segítségével tölthetünk be. Egyszerre több projektet is nyitva tarthatunk.

Változtassuk meg a projektünk nevét "ACADProject"-ről "Leltár"-ra. Először kattintsunk a projekt ablakban az ACADProjekt szövegre, ezután a Properties (Tulajdonságok) ablakban módosíthatjuk a projekt nevét, a projektnek csak ez az egy tulajdonsága (adata) van.

Mielőtt tovább mennék a makró elkészítésében ismerkedjünk meg a projekthez tartozó további beállítási lehetőségekkel. A Tools>Options menüpont kiválasztása után az 1. Ábrán látható többfüles párbeszéd ablak jelenik meg. Az Editor fülön a makró írás közbeni segítő, ellenőrző funkciókat, az Editor Format fülön a szövegszerkesztő ablakban megjelenő betűtípusokat és színeket, a General fülön további, a párbeszéd ablak szerkesztőre és fordításra vonatkozó paramétereket, a Docking fülön pedig a Visual Basic fejlesztőkörnyezet ablakainak dokkolt vagy szabadon mozgatható állapotát állíthatjuk be.


1 ábra Projekt beállítások

Az Editor fülön található beállítások jelentése a következő.

Ebben a példánkban csak egy kód modult kell hozzáadni a projektünkhöz. Új kód modult az Insert>Module menüpont vagy a projekt ablak jobb egérgomb menü Insert>Module menüpontjának segítségével adhatunk az aktuális projekthez. A kód modulnak szintén csak egy tulajdonsága van, a neve. A modul nevét a projekt nevéhez hasonlóan változtathatjuk meg. Jelöljük ki a projekt ablakban az egérrel a modulunkat, majd a projekt ablakban megjelenő név (Name) mellett megjelenő Module1 nevet módosíthatjuk. Az új modulhoz egy szövegszerkesztő ablak is megnyílik, melyben az Option Explicit utasítás is megjelenik, ha a kötelező változó deklarációt (Require Variable Declaration) beállítottuk a projekt beállításai között.

Mivel csak egy Basic eljárásból áll a programunk, a forráskód sorszámozott listáját közöljük és a sorszámokra hivatkozom a magyarázatok során. A mellékelt Basic kódot közvetlenül be lehet gépelni a sorszámok nélkül, de a innen is letölthető a leltar.dvb projekt.

A második sor tartalmazza a dwg_list nevű eljárás fejlécét. A Public kulcsszó azt jelenti, hogy ezt az eljárást más modulokból is meg lehet hívni. A Public ellentettje a Private kulcsszó, a privát eljárásokat csak azok a függvények, eljárások hívhatják meg, melyek ugyanabban a modulban találhatók. Az eljárás neve után álló nyitó és záró zárójel pár azt jelenti, hogy nincsenek paraméterei az eljárásnak. Csak ilyen eljárások hajthatók végre közvetlenül az AutoCAD-ből a makró futtatás paranccsal (Tools>Macro>Macros a menüből vagy Alt-F8 a billentyűzetről), ezeket rendelhetjük hozzá egy menüponthoz vagy az eszköztár egy eleméhez. A 4. sorban található feltétel megvizsgálja, hogy van-e nyitott dokumentum (AutoCAD rajz), ha nincs akkor egy üzenet kiírása után befejeződik az eljárás végrehajtása (Exit Sub). A nyolcadik és harminckettedik sor között a változók deklarációja szerepel. Az "Option Explicit" utasítás miatt valamennyi változót deklarálnunk kell. A nyolcadik sorban szereplő AcadObject típusú változó bármelyik AutoCAD rajzelemet tartalmazhatja, ebből származtatott objektumok az egyes konkrét rajzelemekhez tartozó objektumok, mint például a AcadLine, AcadArc, stb. A 12. sor végén levő aláhúzás karakter azt jelenti, hogy az utasítás a következő sorban folytatódik. A 14-32 sorok közötti ReDim utasításokkal az aktuális rajz rétegeinek számával egyező méretű tömböket hozunk létre, a különböző típusú rajzelemek rétegenkénti számának a tárolásához. Erre a célra a Dim utasítás közvetlenül nem alkalmas, mert ott csak konstans érték szerepelhet a tömb maximális indexének a helyén. A tömbök deklarációjában a zárójelben a legnagyobb tömbindex értéke szerepel, a tömbindexek pedig nullától kezdődnek. Ezért szerepel a rétegek számánál eggyel kisebb érték a deklarációkban.

A ThisDrawing egy AcadDocument típusú objektum, ennek eleme a Layers, mely az aktív rajz valamennyi rétegét tartalmazza. A VBA AutoCAD objektumai között több, a Layers-hez hasonló gyűjtemény (collection) található. A 2. Ábra mutatja be az AutoCAD objektum modell példánk szempontjából lényeges elemeit.


2. ábra AutoCAD objektum modell (részlet)

A 34. sorban szereplő feltétel azt vizsgálja, hogy az aktív rajzunknak van-e már neve. Erre azért van szükség, mert a rajzról összegyűjtött adatokat a rajz nevével egyező .OUT kiterjesztésű fájlba írjuk ki, ha még nem mentettük el a rajzunkat akkor a név helyén üres sztring szerepel, ami hibához vezetne.

A 41-58 sorokban a teljes rajzra vonatkozó különböző típusú elemek számát tároló változókat inicializáljuk. A 60-79 sorok közötti ciklusban beszerezzük valamennyi réteg nevét és a rétegenkénti különböző típusú rajzelemek számát inicializáljuk. A Layers gyűjtemény Item tulajdonságán keresztül szerezzük be a rajzban szereplő rétegek nevét. Minden gyűjtemény (collection) tartalmaz Count és Item tulajdonságokat. Az Item egy tömb, melyben az indexek nullától kezdődnek. Rétegek esetén az Item paramétereként nem csak egy egész értéket használhatunk, hanem a réteg nevét is, például ThisDrawing.Layers.Item("0").Color a nullás réteg színe.

A 80-89 sorokban szereplő egymásba ágyazott ciklusok a names tömbben összegyűjtött rétegnevek ABC sorrendbe rendezését szolgálják. Nem állítom, hogy a leghatékonyabb rendezési módszert alkalmaztam, de pár tíz rétegnév esetén ez is kielégítő.

A kilencvenedik sorban kezdődő és a 143. sorban befejeződő ciklus végzi el a rajzi elemek rétegenkénti megszámlálását. A ModelSpace a Layers-hez hasonló objektum gyűjtemény. A gyűjtemény elemeinek végigjárásához itt nem az Item tömböt használjuk (vö 61. sor). A "For Each" ciklus ent változója a modelltérben lévő elemek értékeit veszi fel a ciklus végrehajtása során. Ez egy biztonságosabb megoldás a gyűjtemény elemeinek végigjárására, a Count és Item tulajdonságokra épülő ciklus csak akkor működik helyesen, ha a ciklus végrehajtása során nem változik meg az objektum gyűjtemény tartalma. Azaz, ha új elemeket adunk a gyűjteményhez vagy elemeket törlünk, akkor muszáj a For Each ciklust használnunk. Bár ebben a ciklusban szereplő utasítások nem változtatják meg a modelltér gyűjtemény tartalmát, didaktikai okokból használtam ezt a megoldást.

A 92-96 sorokban szereplő utasítások az aktuális rajzelem rétegének (ent.Layer) a sorszámát keresik ki. A Select utasítás pedig a rajzelem típusa (ent.EntityType) alapján megnöveli az i. rétegen szereplő megfelelő elemek számát. Az ac3dFace, ac3dSolid stb. konstansokat a VBA szolgáltatja. A számlálás során bizonyos egyszerűsítéseket alkalmaztam, a különböző 3D-s elemeket és a különböző méretezéseket együtt számlálom, néhány objektum típust kihagyok a leltárból (acAttribute, acGroup, acPViewport, acRay, acTrace, acXline).

Valamennyi rajzelem figyelembe vétele után nem marad más mint az eredmények fájlba írása. Az eredmény fájl neve megegyezik a rajz nevével, csak a kiterjesztést cserélem .DWG-ről .OUT-ra (145.,146. sor). A kiírás során a szép táblázatos formátum kialakítása érdekében a Space és Len függvényeket használtam. A Utility objektum RealToString metódusát használtam a számok szöveggé alakítására, erre azért volt szükség, hogy egységesen négy tizedes jegyre jelenjenek meg a rajzi határok értékei. Emellett a Utility objektum az interaktív parancsok kialakításhoz szükséges metódusokat tartalmazza. Az eredmény listában az üres rétegeket a név után megjelenő "*" karakterrel jelölöm meg. Ezt a 174. sorban állítom be.

Az elkészített vagy a letöltött leltar.dvb projektet be kell töltenünk, csak utána használható a dwg_list makró. A Tools>Macro>Load project menüpont segítségével tölthetünk be egy már létező projektet. A megjelenő fájl kiválasztó ablakban kell kiválasztanunk a betöltendő projektet. Az AutoCAD-ben alapértelmezésben a projektek önálló fájlba (.DVB) kerülnek, de a DWG fájlba is beágyazhatunk egy projektet. Ebben az esetben maga a rajz tartalmazza makrókat, nem kell külön betölteni őket. A projekt rajzba ágyazását a VBA Manager segítségével hajthatjuk végre (Embed). A most elkészített leltár projektet nem célszerű rajzba ágyazni, mert ez általános funkciót valósít meg, melyet minden rajz esetén használhatunk. A beágyazás mellett további két módszert használhatunk a Visual Basic projektek automatikus betöltésére. A megnyitott rajzzal azonos könyvtárban levő ACAD.DVB nevű fájlt automatikusan betölti az AutoCAD. Az AutoCAD Support alkönyvtárában elhelyezett ACAD.DVB fájlt az AutoCAD indításakor automatikusan betöltésre kerül. A program letölthető innen.

dr. Siki Zoltán


db_samp.dwg
Terjedelem
   xmin=    843.0000   ymin=    843.0000   zmin=      0.0000
   xmax=   3431.4502   ymax=   3384.0049   zmax=     97.5000
 
Réteg                             pont vonal vonal könnyü  3D szöveg shape  kör  körív splin blokk attri ellip sraff régió solid    3D Méret
                                              lánc  lánc  lánc
--------------------------------------------------------------------------------------------------------------------------------------------
0                                    0     2     0     0     0     0     0     0     0     0    99     0     0     0     0     0     0     0
A-DOOR-TRIM-3D                       0     2     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
CHAIRS                               0     0     0     0     0     0     0     0     0     0    66     0     0     0     0     0     0     0
CPU                                  0     0     0     0     0     0     0     0     0     0    54     0     0     0     0     0     0     0
E-B-CORE                             0   318     0     6     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-B-ELEV                             0     4     0     4     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-B-FURR                             0   349     0    44     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-B-GLAZ                             0   129     0    14     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-B-MULL                             0     0     0   168     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-B-SHEL                             0   174     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-C-HEAD                             0    96     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-F-CASE                             0     6     0     0     0     0     0     0     0     0     2     0     0     0     0     0     0     0
E-F-DOOR                             0     0     0     0     0     0     0     0     0     0    39     0     0     0     0     0     0     0
E-F-PLMB                             0     4     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-F-SILL                             0     0     0     6     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-F-STAIR                            0   211     0     6     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-F-TERR                             0   303     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
E-S-COLM                             0     2     0    31     0     0     0     0     0     0     0     0     0     0     0     0     0     0
EMPLOYEE                             0     0     0     0     0    53     0     0     0     0     0     0     0     0     0     0     0     0
FILE_CABINETS                        0     6     0     2     0     0     0     0     0     0     0     0     0     0     0     0     0     0
FURNITURE                            0     0     0     0     0     0     0     0     0     0   102     0     0     0     0     0     0     0
GRID-08                              0     0     0     0     0     0     0     0     0     0    20     0     0     0     0     0     0     0
GRIDLN                               0    21     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
IDOORE                               0     0     0     0     0     0     0     0     0     0     4     0     0     0     0     0     0     0
IWALLE                               0     2     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
PANELS_201                           0   108     0  1910     0     0     0     0     0     0     0     0     0     0     0     0     0     0
PHONES                               0     0     0     0     0     0     0     0     0     0    51     0     0     0     0     0     0     0
PRINTER_ISLAND                       0     0     0     2     0     2     0     0     0     0     0     0     0     0     0     0     0     0
RMNUM                          *     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
--------------------------------------------------------------------------------------------------------------------------------------------
  29 rétegen összesen                0  1737     0  2193     0    55     0     0     0     0   437     0     0     0     0     0     0     0

A bemutatott eljárás eredmény fájlja

1       Option Explicit
2       Sub dwg_list()
3       ' informació az aktuális rajz rétegeinek tartalmáról
4           If Documents.Count = 0 Then
5               MsgBox "Nincs nyitott dokumentum"
6               Exit Sub
7           End If
8           Dim ent As AcadObject
9           Dim i, j, f As Integer
10          Dim c, w, fname As String
11          Dim extmi, extma As Variant
12          Dim sli, stx, siv, spl, slw, sbl, sci, sdi, spt, sp3, sd3, _
13              ssh, ssp, sat, sel, sha, sre, sso As Integer
14          ReDim names(ThisDrawing.Layers.Count - 1) As String
15          ReDim li(ThisDrawing.Layers.Count - 1) As Integer ' vonal
16          ReDim tx(ThisDrawing.Layers.Count - 1) As Integer ' szöveg
17          ReDim iv(ThisDrawing.Layers.Count - 1) As Integer ' ív
18          ReDim pl(ThisDrawing.Layers.Count - 1) As Integer ' vonallánc
19          ReDim lw(ThisDrawing.Layers.Count - 1) As Integer ' könnyű vonallánc
20          ReDim bl(ThisDrawing.Layers.Count - 1) As Integer ' blokk
21          ReDim ci(ThisDrawing.Layers.Count - 1) As Integer ' kör
22          ReDim di(ThisDrawing.Layers.Count - 1) As Integer ' méretezés
23          ReDim pt(ThisDrawing.Layers.Count - 1) As Integer ' pont
24          ReDim p3(ThisDrawing.Layers.Count - 1) As Integer ' 3d vonallánc
25          ReDim d3(ThisDrawing.Layers.Count - 1) As Integer ' 3d objektumok
26          ReDim sh(ThisDrawing.Layers.Count - 1) As Integer ' shape
27          ReDim sp(ThisDrawing.Layers.Count - 1) As Integer ' spline
28          ReDim at(ThisDrawing.Layers.Count - 1) As Integer ' attribútum definíció
29          ReDim el(ThisDrawing.Layers.Count - 1) As Integer ' ellipszis
30          ReDim ha(ThisDrawing.Layers.Count - 1) As Integer ' sraffozás
31          ReDim re(ThisDrawing.Layers.Count - 1) As Integer ' régió
32          ReDim so(ThisDrawing.Layers.Count - 1) As Integer ' szolid
33          
34          If ThisDrawing.FullName = "" Then
35          ' meg nincs elmentve igy nem tudunk nevet adni az eredmény fájlnak
36              MsgBox "Mentse el előbb a rajzot és indítsa újra a makrót"
37              Exit Sub
38          End If
40      '   változók inicializálása
41          sli = 0 ' vonalak száma a rajzban
42          stx = 0 ' szövegek száma a rajzban
43          siv = 0 ' körívek száma a rajzban
44          spl = 0 ' vonalláncok száma a rajzban
45          slw = 0 ' könnyű vonalláncok száma a rajzban
46          sbl = 0 ' blokk beillesztések száma a rajzban
47          sci = 0 ' körök száma a rajzban
48          sdi = 0 ' méretvonalak száma a rajzban
49          spt = 0 ' pontok száma a rajzban
50          sp3 = 0 ' 3D-s vonalláncok száma a rajzban
51          sd3 = 0 ' 3D-s objektumok száma a rajzban
52          ssh = 0 ' shape beillesztések száma a rajzban
53          ssp = 0 ' spline görbék száma a rajzban
54          sat = 0 ' blokk attribútumok száma a rajzban
55          sel = 0 ' ellipszisek száma a rajzban
56          sha = 0 ' sraffozások száma a rajzban
57          sre = 0 ' régiók száma a rajzban
58          sso = 0 ' szolidok száma a rajzban
59      '   réteg nevek beszerzése
60          For i = 0 To ThisDrawing.Layers.Count - 1
61              names(i) = ThisDrawing.Layers.Item(i).Name
62              li(i) = 0   ' vonalak száma a rétegen
63              tx(i) = 0   ' szövegek száma a rétegen
64              iv(i) = 0   ' ívek száma a rétegen
65              pl(i) = 0   ' vonalláncok száma a rétegen
66              lw(i) = 0   ' könnyű vonallálncok száma a rétegen
67              bl(i) = 0   ' blokk beillesztések száma a rétegen
68              di(i) = 0   ' méretvonalak száma a rétegen
69              pt(i) = 0   ' pontok száma a rétegen
70              p3(i) = 0   ' 3D-s vonalláncok száma a rétegen
71              d3(i) = 0   ' 3D-s elemek száma a rétegen
72              sh(i) = 0   ' shape beillesztések száma a rétegen
73              sp(i) = 0   ' spline görbék száma a rétegen
74              at(i) = 0   ' blokk attribútumok száma a rétegen
75              el(i) = 0   ' ellipszisek száma a rétegen
76              ha(i) = 0   ' sraffozások száma a rétegen
77              re(i) = 0   ' régiók száma a rétegen
78              so(i) = 0   ' szolidok száma a rétegen
79          Next i
80          ' retegnevek rendezese ABC-be
81          For i = 0 To ThisDrawing.Layers.Count - 1
82              For j = i + 1 To ThisDrawing.Layers.Count - 1
83                  If names(j) < names(i) Then
84                      w = names(j)
85                      names(j) = names(i)
86                      names(i) = w
87                  End If
88              Next j
89          Next i
90          For Each ent In ThisDrawing.ModelSpace ' a modelltér minden elemére
91              ' réteg index kikeresése
92              For i = 0 To ThisDrawing.Layers.Count - 1
93                  If ent.Layer = names(i) Then
94                      Exit For
95                  End If
96              Next
97              Select Case ent.EntityType
98                  Case ac3dFace, ac3dSolid, acPolymesh
99                      d3(i) = d3(i) + 1
100                 Case ac3dPolyline
101                     p3(i) = p3(i) + 1
102                 Case acArc
103                     iv(i) = iv(i) + 1
104                 Case acAttribute
105                 Case acAttributeReference
106                     at(i) = at(i) + 1
107                 Case acBlockReference
108                     bl(i) = bl(i) + 1
109                 Case acCircle
110                     ci(i) = ci(i) + 1
111                 Case acDimAligned, acDimAngular, acDimDiametric, acDimOrdinate, _
112                      acDimRadial, acDimRotated, acLeader, acTolerance
113                     di(i) = di(i) + 1
114                 Case acEllipse
115                     el(i) = el(i) + 1
116                 Case acGroup
117                 Case acHatch
118                     ha(i) = ha(i) + 1
119                 Case acLine
120                     li(i) = li(i) + 1
121                 Case acPoint
122                     pt(i) = pt(i) + 1
123                 Case acPolyline
124                     pl(i) = pl(i) + 1
125                 Case acPolylineLight
126                     lw(i) = lw(i) + 1
127                 Case acRegion
128                     re(i) = re(i) + 1
129                 Case acShape
130                     sh(i) = sh(i) + 1
131                 Case acSolid
132                     so(i) = so(i) + 1
133                 Case acSpline
134                     sp(i) = sp(i) + 1
135                 Case acText, acMtext
136                     tx(i) = tx(i) + 1
137                 Case acPViewport
138                 Case acRaster
139                 Case acRay
140                 Case acTrace
141                 Case acXline
142             End Select
143         Next ent
144         ' output
145         fname = Left(ThisDrawing.FullName, _
146             InStr(UCase(ThisDrawing.FullName), ".DWG") - 1) & ".out"
147         f = FreeFile
148         Open fname For Output As f
149         ' terjedelem
150         extmi = ThisDrawing.GetVariable("EXTMIN")
151         extma = ThisDrawing.GetVariable("EXTMAX")
152         Print #f, ThisDrawing.Name
153         Print #f, "Terjedelem"
154         w = ThisDrawing.Utility.RealToString(extmi(0), acDecimal, 4)
155         Print #f, "   xmin="; Space(12 - Len(w)); w;
156         w = ThisDrawing.Utility.RealToString(extmi(1), acDecimal, 4)
157         Print #f, "   ymin="; Space(12 - Len(w)); w;
158         w = ThisDrawing.Utility.RealToString(extmi(2), acDecimal, 4)
159         Print #f, "   zmin="; Space(12 - Len(w)); w
160         w = ThisDrawing.Utility.RealToString(extma(0), acDecimal, 4)
161         Print #f, "   xmax="; Space(12 - Len(w)); w;
162         w = ThisDrawing.Utility.RealToString(extma(1), acDecimal, 4)
163         Print #f, "   ymax="; Space(12 - Len(w)); w;
164         w = ThisDrawing.Utility.RealToString(extma(2), acDecimal, 4)
165         Print #f, "   zmax="; Space(12 - Len(w)); w
166         Print #f, " "
167         Print #f, "Réteg";
168         ' táblázat fejléc
169         Print #f, Space(27); "  pont vonal vonal könnyü  3D szöveg shape  " & _
170             "kör  körív splin blokk attri ellip sraff régió solid    3D Méret"
171         Print #f, Space(32); "              lánc  lánc  lánc"
172         Print #f, String(140, "-")
173         For i = 0 To ThisDrawing.Layers.Count - 1
174             c = IIf(pt(i) + li(i) + pl(i) + lw(i) + p3(i) + tx(i) + sh(i) + _
175                     ci(i) + iv(i) + sp(i) + bl(i) + at(i) + el(i) + ha(i) + _
176                     re(i) + so(i) + d3(i) + di(i), " ", "*")
177             Print #f, names(i); Space(31 - Len(names(i))); c;
178             Print #f, Space(6 - Len(Str(pt(i)))); Str(pt(i));
179             Print #f, Space(6 - Len(Str(li(i)))); Str(li(i));
180             Print #f, Space(6 - Len(Str(pl(i)))); Str(pl(i));
181             Print #f, Space(6 - Len(Str(lw(i)))); Str(lw(i));
182             Print #f, Space(6 - Len(Str(p3(i)))); Str(p3(i));
183             Print #f, Space(6 - Len(Str(tx(i)))); Str(tx(i));
184             Print #f, Space(6 - Len(Str(sh(i)))); Str(sh(i));
185             Print #f, Space(6 - Len(Str(ci(i)))); Str(ci(i));
186             Print #f, Space(6 - Len(Str(iv(i)))); Str(iv(i));
187             Print #f, Space(6 - Len(Str(sp(i)))); Str(sp(i));
188             Print #f, Space(6 - Len(Str(bl(i)))); Str(bl(i));
189             Print #f, Space(6 - Len(Str(at(i)))); Str(at(i));
190             Print #f, Space(6 - Len(Str(el(i)))); Str(el(i));
191             Print #f, Space(6 - Len(Str(ha(i)))); Str(ha(i));
192             Print #f, Space(6 - Len(Str(re(i)))); Str(re(i));
193             Print #f, Space(6 - Len(Str(so(i)))); Str(so(i));
194             Print #f, Space(6 - Len(Str(d3(i)))); Str(d3(i));
195             Print #f, Space(6 - Len(Str(di(i)))); Str(di(i))
196             sli = sli + li(i)
197             stx = stx + tx(i)
198             siv = siv + iv(i)
199             spl = spl + pl(i)
200             slw = slw + lw(i)
201             sbl = sbl + bl(i)
202             sdi = sdi + di(i)
203             spt = spt + pt(i)
204             sp3 = sp3 + p3(i)
205             sd3 = sd3 + d3(i)
206             ssh = ssh + sh(i)
207             ssp = ssp + sp(i)
208             sat = sat + at(i)
209             sel = sel + el(i)
210             sha = sha + ha(i)
211             sre = sre + re(i)
212             sso = sso + so(i)
213         Next i
214         Print #f, String(140, "-")
215         Print #f, Space(4 - Len(Str(ThisDrawing.Layers.Count))); _
216             Str(ThisDrawing.Layers.Count); " rétegen összesen"; Space(11);
217         Print #f, Space(6 - Len(Str(spt))); Str(spt);
218         Print #f, Space(6 - Len(Str(sli))); Str(sli);
219         Print #f, Space(6 - Len(Str(spl))); Str(spl);
220         Print #f, Space(6 - Len(Str(slw))); Str(slw);
221         Print #f, Space(6 - Len(Str(sd3))); Str(sd3);
222         Print #f, Space(6 - Len(Str(stx))); Str(stx);
223         Print #f, Space(6 - Len(Str(ssh))); Str(ssh);
224         Print #f, Space(6 - Len(Str(sci))); Str(sci);
225         Print #f, Space(6 - Len(Str(siv))); Str(siv);
226         Print #f, Space(6 - Len(Str(ssp))); Str(ssp);
227         Print #f, Space(6 - Len(Str(sbl))); Str(sbl);
228         Print #f, Space(6 - Len(Str(sat))); Str(sat);
229         Print #f, Space(6 - Len(Str(sel))); Str(sel);
230         Print #f, Space(6 - Len(Str(sha))); Str(sha);
231         Print #f, Space(6 - Len(Str(sre))); Str(sre);
232         Print #f, Space(6 - Len(Str(sso))); Str(sso);
233         Print #f, Space(6 - Len(Str(sd3))); Str(sd3);
234         Print #f, Space(6 - Len(Str(sdi))); Str(sdi)
235         Close f
236     End Sub

Az eljárás listája

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