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