VBA-Einstig 
für AutoCAD Teil 3
Startseite
VBA Einführung für
BricsCad und AutoCAD

Häufig steht man vor der Aufgabe, Koordinatendateien aus ASCII-Dateien oder auch EXCEL-Listen in AutoCAD zu importieren. Die können beispielsweise in der Vermessung oder bei Berechnungen entstanden sein.
Der erste Teil unserer heutigen VBA-Einführung beschäftigt sich damit, an den Koordinaten solcher Listen Blöcke, oder genauer gesagt Blockreferenzen einzufügen. Im zweiten Teil wird außerdem eine Möglichkeit aufgezeigt, wie Sie VBA dazu veranlassen, automatisch Polylinien zu erzeugen.
Das Blockobjekt beinhaltet einen Namen und eine Reihe von AutoCAD-Elementen, mindestens aber den Einfügepunkt. Zu unterscheiden sind drei verschiedene Arten, der gewöhnliche Block, die externe Referenz und der Layoutblock. Um später diese Arten zu identifizieren können übrigens die Eigenschaften „IsLayout“ oder „IsXRef“ abgefragt werden. Für unsere Zwecke wird nachfolgend lediglich der gewöhnliche Block verwendet. Im folgenden Beispiel definieren Sie einen Block, der einen Kreis enthält. Dabei sind die Blockeinfügepunkt und das Zentrums des Kreises der Einfachheit halber identisch:

Public Sub Blockdefinition()
   Dim Blo As AcadBlock 'AutoCAD-Bockobjekt
   Dim Epkt(0 To 2) As Double 'Basispunkt
   Dim Kreis As AcadCircle 'AutoCAD-Kreisobjekt

   Epkt(0) = 0: Epkt(1) = 0: Epkt(2) = 0
   Set Blo = ThisDrawing.Blocks.Add(Epkt, "Baum")
   Set Kreis = Blo.AddCircle(Epkt, 3) ‘Radius=3

End Sub

Ähnlich wie im vorigenen Teil bei den Auswahlsätzen, fügen Sie hier zunächst der Blockliste Ihrer Zeichnung (“ThisDrawing.Blocks”) die Definition des Blocks mittels „Add“ hinzu. Damit ist der Block angelegt, aber erst in der nächsten Zeile („Set Kreis = Blo. …) wird er mit Elementen gefüllt. Analog dazu könnten Sie mit „AddXXX“ alle anderen Zeichnungsobjekte dieser Blockdefinition zuordnen.

Public Sub BlöckeListen()
   Dim Blo As AcadBlock
   Dim Liste As String

   For Each Blo In ThisDrawing.Blocks
       Liste = Liste & vbCr & Blo.Name
   Next
   MsgBox Liste

End Sub

Wie bei allen anderen Collection-Objekten bzw. Auflistungen ist es einfach möglich, mittels der For-Each-Schleife, auf jedes einzelne Element davon zu zu greifen:

Im nebenstehenden Bild sehen Sie die in der Message-Box angezeigten Blöcke, darunter auch den von Ihnen definierten Baum. Wurde so ein Block erst einmal definiert und ist damit Bestandteil der Zeichnung, können Sie ihn nun wie jeden anderen Block in AutoCAD verwenden. Natürlich können Sie dafür auch VBA nutzen, indem sie eine Referenz auf den Block beliebig oft in ihre Zeichnung einfügen. Das erfolgt mittels der Methode „InsertBlock“ nach folgender allgemeiner Syntax:

RetVal = object.InsertBlock(Einfügepunkt, Name, Xskalierung, Yskalierung, Zskalierung, Drehung [, Password])

Dabei ist der Einfügepunkt ein Datenfeld vom Typ Double für die Koordinaten der drei Achsen. X-, Y- und Z-Scale sind die Skalierfaktoren der jeweiligen Richtungen, die Drehung gibt den Einfügewinkel an und das Password kann optional angegeben werden.
Der Programmablauf für unser kleines Beispiel ist schnell erklärt. Nach der Variablendeklaration wird zunächst die Textdatei mit den Koordinaten geöffnet. Sie soll ein einfaches Format haben. In jeder Zeile steht erst der X-Wert, dann ein Semikolon als Trennzeichen, gefolgt von dem Y-Wert. Natürlich könnte man hier auch beispielsweise noch eine Kodierung (der Blockname) und andere Informationen aufnehmen. In der folgenden While-Wend-Schleife wird nun diese Datei zeilenweise in die Zeichenkettenvariable „Zeile“ gelesen. Darin wird mittels des VBA-Befehls InStr die Position ermittelt, auf der das Trennzeichen steht. In den folgenden beiden Zeilen wird der darauf basierende X- und Y-Wert aus der Zeichenkette extrahiert und gleich noch mittels CDbl von einem String in einen Double-Wert konvertiert. Nun haben Sie alle Werte zusammen und können die Blockreferenz in den Modellbereich einfügen.
Übrigens liegt es in der Natur der Programmierung, dass man auf vielen Wegen zur Lösung kommt. Beispielsweise hätte man statt der Konstruktion mit InStr auch die Split-Anweisung verwenden können. Insbesondere wenn man mehr als nur 2 Spalten hat, bietet sich das an. Dazu aber mehr in einem der folgenden Teile.
Hier der Beispielcode:

Public Sub BaumImport()
'Einlesen einer zweispaltigen Koordinatenliste (Textdatei)
'Und Darstellung von AutoCad-Blöcken an den Koordinatenpositionen

Dim Blo As AcadBlockReference ' !!! Blockreferenz, d.h. der Block
                                                               ' !!! muss bereits in der Zeichnung
                                                               ' !!! definiert sein
Dim EPunkt(0 To 2) As Double 'Basispunkt auf dem der Blck eingefügt wird
Dim Zeile As String 'nimmt die jeweils aktuelle Zeile der Textdatei auf
Dim ZeiPos As Integer 'nimmt die Position des Trennzeichens auf

Open "C:\koorddemo.txt" For Input As #1 'Text-Datei zum Lesen öffnen
While Not EOF(1)
   Line Input #1, Zeile 'zeilenweise einlesen
   ZeiPos = InStr(1, Zeile, ";") 'Ermittlung des Trennzeichens
   EPunkt(0) = CDbl(Mid(Zeile, 1, ZeiPos - 1)) 'Extraktion der X-Koordinate
   EPunkt(1) = CDbl(Mid(Zeile, ZeiPos + 1)) 'Extraktion der Y-Koordinate
   'Abschließend wird der Block eingefügt:
   Set Blo = ThisDrawing.ModelSpace.InsertBlock(EPunkt, "Baum", 1, 1, 1, 0)
Wend
Close #1
'Schließen der Textdatei nicht vergessen!
End Sub

Zum Löschen von Blockreferenzen und Blöcken verwenden Sie die Delete-Methode. Wenn Sie also die vorherigen Definitionen benutzen geht das mit folgenden Beiden Zeilen:

Set Blo = ThisDrawing.Blocks("Baum")
Blo.Delete

Sollten Sie das Beispiel abarbeiten, nachdem Sie bereits die Koordinatendatei importiert haben, werden Sie vermutlich eine Fehlermeldung bekommen. Denn ähnlich wie bei der AutoCAD-Bereinigungsfunktion kann er nur gelöscht werden, wenn er nicht in der Zeichnung verwendet wird.
Sehr häufig wird Ihnen der Fall begegnen, dass Sie solche Daten nicht nur in ASCII-Dateien vorfinden, sondern Koordinaten beispielsweise in EXCEL-Tabellen sind. Auch damit ist der Umgang relativ simpel, wenn man erst mal das Prinzip verstanden hat. Hier eine kleine Hilfestellung.
Um EXCEL- oder auch ACCESS-Daten zu verarbeiten, müssen Sie sich erst mal Zugang dazu verschaffen. Dazu gehen Sie zunächst in der VBA-Umgebung in das

Menü ---> Extras ---> Verweise…

Es öffnet sich ein Fenster mit Verweisen auf alle eingebundenen Objektbibliotheken. Um auf Excel zuzugreifen, markieren Sie den entsprechenden Verweis in der Liste. Voraussetzung dafür ist natürlich, dass MS-EXCEL überhaupt auf Ihrem Rechner installiert ist. Der Verweis könnte bei Ihnen z.B. „Microsoft EXCEL 10.0 Object Library“ heißen. Die konkrete Versionsnummer hängt von der installierten Version ab.

Das folgende Beispiel zeigt Ihnen, wie sie die Koordinaten aus so einer EXCEL-Tabelle auslesen. Die ersten beiden Zeilen der Deklaration kennen Sie bereits. Dann definieren Sie die EXCEL-Datei und die darin zu verwendende Tabelle. Nach der Deklaration ist mit “Set WB = Excel.Workbooks.Open(C:\mappe1)“ Ihre Datei zu öffnen. In der folgenden Zeile weisen Sie VBA an, die „Tabelle1“ zu verwenden. Nun endlich können Sie in der For-Next-Schleife auf die gespeicherten Daten zugreifen. „Wtab.Cells(Zeile, Spalte)“ liefert ihnen den jeweiligen Wert. Im Beispiel übernehmen Sie die Informationen in die entsprechenden Felder der Einfügepunkt-Variablen, wobei der Z-Wert hier auf Null gesetzt ist. Das Einfügen der Blockreferenz geschieht dann, wie Sie es bereits kennen gelernt haben.

Public Sub EXCEL_Import()
   Dim Blo As AcadBlockReference
   Dim EPunkt(0 To
2) As Double
   Dim WB As Excel.Workbook
   Dim Wtab As Excel.Worksheet

   Set WB = Excel.Workbooks.Open("C:\mappe1.xls")
   Set Wtab = WB.Worksheets("Tabelle1")
   For i = 1 To 10
       EPunkt(0) = Wtab.Cells(i, 1): EPunkt(1) = Wtab.Cells(i, 2)
      
EPunkt(2) = 0
       Set Blo = ThisDrawing.ModelSpace.InsertBlock(EPunkt, "Baum", 1, 1, 1, 0)
   Next
   WB.Close 'Datei schließen nicht vergessen
End Sub

Im zweiten Schritt wenden wir uns der Erzeugung von Polylinien zu. Dabei verwenden wir für unser Beispiel das Objekt „Polyline“. Alternativ könnte man auch die „LWPolyline“ nutzen. Folgende Syntax wird verwendet, um der Zeichnung eine Polylinie hinzuzufügen:

RetVal = object.AddPolyline(Vertexliste)

Das Objekt, dem Sie die Polylinie hinzufügen ist wahlweise der Modellbereich, Papierbereich oder ein Block. Die Methode zum Einfügen ist „AddPolyline“ und die Vertexliste gibt die einzelnen Stützpunktkoordinaten an. Nun könnte man zunächst die Menge der Stützpunkte in Ihrer Koordinatendatei zählen, dann die Koordinaten in einer Zählschleife der Vertexliste zuordnen und zum Schluß mit AddPolyline die Polylinie der Zeichnung hinzufügen. Allerdings gibt es eine elegantere Lösung für diese Aufgabe. Leider steht in dieser Einführung bloß ein begrenzter Platz zur Verfügung, darum soll hier nur die prinzipielle Verfahrensweise erklärt werden. Es beginnt wieder mit der Variablendeklaration. Nun liest Ihr Programm die ersten beiden Koordintenpaare ein, der Z-Wert wird jeweils auf 0 gesetzt. Mit

Set PoLin = ThisDrawing.ModelSpace.AddPolyline(Punkt)

fügen Sie dem Modellbereich diese Polylinie hinzu. Nun können sie in der Schleife die übrigen Werte importieren und Ihrer Polylinie mittels der AppendVertex-Methode hinzufügen. Hier der komplette Code:

Public Sub Polin_aus_EXCEL()
   Dim PoLin As AcadPolyline 'AutoCAD Polylinie
   Dim Punkt(0 To 5) As Double 'Koordinaten des ersten Segments
   Dim NeuPunkt(0 To 2) As Double 'Koordintenfolgepunkte
  
Dim WB As Excel.Workbook
   Dim Wtab As Excel.Worksheet

   Set WB = Excel.Workbooks.Open("C:\mappe1.xls")
   Set Wtab = WB.Worksheets("Tabelle1")
  
Punkt(0) = Wtab.Cells(1, 1): Punkt(1) = Wtab.Cells(1, 2): Punkt(2) = 0
   Punkt(3) = Wtab.Cells(2, 1): Punkt(4) = Wtab.Cells(2, 2): Punkt(5) = 0
   Set PoLin = ThisDrawing.ModelSpace.AddPolyline(Punkt) 'Polylinie erzeugen
    
For i = 3 To 10 'in der 3.
Zeile beginnen
       NeuPunkt(0) = Wtab.Cells(i, 1): NeuPunkt(1) = Wtab.Cells(i, 2)
       NeuPunkt(2) = 0
       PoLin.AppendVertex (NeuPunkt) 'Neues Segment an die Plylinie anhängen
     Next
   WB.Close
End Sub

Viel Spaß beim ausprobieren. Der nächste Teil wird sich ein wenig näher mit den AutoCAD-Layern beschäftigen.

IBB INGENIEURBÜRO BATTEFELD  Bochum Nöckerstraße 37c
44879 Bochum
Tel: 0234-94172-0

 Mit Fragen oder Hinweisen wenden Sie sich bitte an
  

IBB INGENIEURBÜRO BATTEFELD  Leipzig Brahestraße 17
04347 Leipzig
Tel: 0341-2330465

Hydraulische Berechnungen - GIS -  Vermessung - BricsCad V8 - Kartierung - AutoCAD - Autodesk  MAP3D - DVGW - Vermessung - GPS - INTERGEO - Free Download von BricsCad - IntelliCAD - BricsCad V7 - Programmierung - Energieversorgung - AutoLISP - VB -  VBA - SQL - SYBASE SQL Anywhere - Individualprogrammierung - Gas - Wasser - Strom - Fernwärme - Abwasser - Kanal - Kataster - Indirekteinleiterkataster - relationale Datenbanken - SICAD - Netzberechnung - STANET - AutoSTA - Schnittstellen - SQD - SQS - ALK - ALB - EBDS - ISYBAU - GRADIS - AutoCAD
 ---------------------------------------------------------------------------------------------------------------------------