VBA-Einstig 
für BricsCad (NUR bis V7) Teil3
Startseite
VBA Einführung für
BricsCad und AutoCAD

 Download einer kostenlosen BricsCad-Demoversion (Vollversion für 30 Tage ab Installation)

!!! Bitte beachten: Nachfolgende Ausführungen gelten nur für BricsCad bis V7. Seit V8 VBA weitestgehend kompatibel zu AutoCAD!!!

Häufig steht man vor der Aufgabe, Koordinatendateien aus ASCII-Dateien oder auch EXCEL-Listen in BricsCad 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 BricsCad-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 IntelliCAD.Block
'BricsCad-Blockobjekt
   Dim BPunkt As Point
'Basispunkt
   Dim Kreis As IntelliCAD.Circle
'BricsCad-Kreis
  
   Set Doku = IntelliCAD.ActiveDocument
   Set BPunkt = Library.CreatePoint(0, 0, 0)
   Set Blo = Doku.Blocks.Add(BPunkt, "Baum")
   Set Kreis = Blo.AddCircle(BPunkt, 3)
End Sub

Ähnlich wie im vorigenen Teil bei den Auswahlsätzen, fügen Sie hier zunächst der Blockliste Ihrer Zeichnung (“Doku.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 IntelliCAD.Block
   Dim Liste As String
   For Each Blo In Doku.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, in unserem Fall nur den gerade neu 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 BricsCad 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 [, PW])

Dabei ist der Einfügepunkt ein Datenfeld vom Typ Point 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 (PW) kann optional angegeben werden.

Nun zum Datenimport. Ausgangspunkt soll eine einfache ASCII-Datei sein. Um das Beispiel einfach zu halten, besteht sie aus lediglich zwei Spalten mit der X- und Y-Koordinate des Einfügepunkts. Die beiden Werte trennen Sie mit einem Semikolon.
Nach der Variablendeklaration öffnet
Open "C:\koorddemo.txt" For Input As #1 zunächst die Textdatei. In der folgenden While-Wend-Schleife wird die Datei zeilenweise in die Zeichenkettenvariable „Zeile“ bis zum Ende EOF(1) gelesen. Die “(1)” verweist dabei auf die in der Open-Anweisung definierte Dateinummer. Mittels InStr wird die Position des Trennzeichens festgestellt. Damit können Sie in den folgenden beiden Zeilen die X- und Y-Werte 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(!) mit Set Blo = Doku.ModelSpace.InsertBlock(BPunkt, "Baum", 1, 1, 1, 0) in den Modellbereich einfügen. Selbstverständlich muß der Block in der Zeichnung definiert worden sein.
Ü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 IntelliCAD.BlockInsert 
' !!! Blockreferenz
Dim BPunkt As Point 
'Basispunkt auf dem der Blck eingefügt wird
Dim X As Double '
X-Koordinate
Dim Y As Double '
Y-Koordinate
Dim Zeile As String
'nimmt die jeweils aktuelle Zeile der Textdatei auf
Dim ZeiPos As Integer
'nimmt die Position des Trennzeichens auf

   Set Doku = IntelliCAD.ActiveDocument
   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 Pos. des Trennzeichens
       X = CDbl(Mid(Zeile, 1, ZeiPos - 1))
'Extraktion der X-Koordinate
       Y = CDbl(Mid(Zeile, ZeiPos + 1))
'Extraktion der Y-Koordinate
       Set BPunkt = Library.CreatePoint(X, Y, 0)
'Einfügepunkt erzeugen
      
'Abschließend wird der Block eingefügt:
       Set Blo = Doku.ModelSpace.InsertBlock(BPunkt, "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 = Doku.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 BricsCad-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) die 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 IntelliCAD.BlockInsert
   Dim X As Double
   Dim Y As Double
   Dim BPunkt As Point
   Dim WB As Excel.Workbook
   Dim Wtab As Excel.Worksheet
   Set Doku = IntelliCAD.ActiveDocument
   Set WB = Excel.Workbooks.Open("C:\mappe1.xls")
   Set Wtab = WB.Worksheets("Tabelle1")
   For I = 1 To 10
       X = Wtab.Cells(I, 1): Y = Wtab.Cells(I, 2)
       Set BPunkt = Library.CreatePoint(X, Y, 0)
       Set Blo = Doku.ModelSpace.InsertBlock(BPunkt, "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. Zur Definition der Vertexliste kennt BricsCad das Objekt Points. Bitte beachten Sie die Mehrzahl. Im Gegensatz zu Einfügepunkten beispielsweise von Kreisen oder Blockreferenzen mit Point (hier wird jeweils ein Koordinatentripel gespeichert), nimmt Points eine Liste von Kordinatenwerten auf. Punkte.Add definiert zunächst einen weiteren Punkt in der Liste. Anschließend werden die entsprechenden Werte hinzugefügt. Nach dem Durchlauf der Schleife kann endlich mit
Set PoLin = Doku.ModelSpace.AddPolyline(Punkt)

die Polylinie erzeugt werden. In BricsCad ist sie erst nach einem Regen zu sehen. Das läßt sich mit PoLin.Update umgehen.Hier der komplette Code:

Public Sub Polin_aus_EXCEL()
   Dim PoLin As IntelliCAD.Polyline
   Dim Punkte As Points
   Dim WB As Excel.Workbook
   Dim Wtab As Excel.Worksheet
  
   Set Doku = IntelliCAD.ActiveDocument
   Set WB = Excel.Workbooks.Open("C:\mappe1.xls")
   Set Wtab = WB.Worksheets("Tabelle1")
   Set Punkte = Library.CreatePoints
   For I = 2 To 10 'in der 3. Zeile beginnen
     Punkte.Add
     Punkte(Punkte.Count).X = Wtab.Cells(I, 1)
     Punkte(Punkte.Count).Y = Wtab.Cells(I, 2)
     Punkte(Punkte.Count).z = 0
   Next
   Set PoLin = Doku.ModelSpace.AddPolyline(Punkte)
   PoLin.Update
   WB.Close
End Sub

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

Zu Teil 4

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