VBA-Einstig 
für BricsCad (NUR bis V7) Teil2
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!!!

Im ersten Teil unserer VBA-Einführung haben Sie ein wenig von der Entwicklungsumgebung kennen gelernt, einen Kreis vom Programm in BricsCad zeichnen lassen und sogar ein erstes kleines Formular entwickelt. Wer sich etwas ernsthafter mit der VBA-Programmierung beschäftigt, wird immer wieder vor der Aufgabe stehen, bereits vorhandene CAD-Elemente zu bearbeiten. Dafür gibt es verschiedene Möglichkeiten. Nachfolgend sollen zwei Wege beschrieben werden, nämlich die Klassen Utility und Selectionset.
Sie haben bereits das Utility-Objekt zur interaktiven Koordinatenabfrage kennen gelernt. Neben verschiedenen anderen Methoden stellt es auch die GetEntity-Funktion zur Verfügung. Sie wird benutzt, um den Anwender ein Zeichnungsobjekt auswählen zu lassen. Allerdings wirklich nur genau ein Element. Sollen mehrere Zeichnungsobjekte selektiert werden, gibt es dafür das anschließend etwas näher besprochene Selectionset. Um GetEntity zu testen, starten Sie BricsCad, zeichnen einige Elemente (z.B. Kreise, Linien, Polylinien etc.) und rufen anschließend VBA mittels der Tastenkombination „Alt-F11“ auf.

Jetzt können Sie folgende kleine Prozedur schreiben, die Sie auffordert, ein Zeichnungselement zu selektieren und anschließend dessen Namen ausgibt.

Public Sub VBA_2_getentity()
Dim Auswahl As IntelliCAD.Entity
Dim Punkt As IntelliCAD.Point
Set Doku = IntelliCAD.ActiveDocument
Doku.Utility.GetEntity Auswahl, Punkt, "Wählen Sie ein Element"
MsgBox Auswahl.EntityName
End Sub

In vielen Fällen ist allerdings mehr als ein Element in der Zeichnung auszuwählen. In der Klasse SelectionSets werden Ihnen vielfältig einsetzbare Methoden an die Hand gegeben, um Zeichnungselemente interaktiv oder auch im Hintergrund zu selektieren. Um einen solchen Auswahlsatz anzulegen, sollte er zunächst mit einer Dim- oder Public-Anweisung deklariert werden.

Dim SSET As IntelliCAD.SelectionSet

Angelegt wird der Auswahlsatz mit folgender Programmzeile.

Set SSET = Doku.SelectionSets.Add("Auswahl1")

Nun können Sie Ihrem Auswahlsatz verschiedenste Elemente hinzufügen. Hier die dafür am häufigsten gebrauchten Methoden:

Select

Filtern von BricsCad-Elementen im Hintergrund (also ohne Nutzereingabe).

SelectAtPoint

Auswahl eines Elements an einem bestimmten Punkt (Koordinate). Diese Anweisung ähnelt (!) der GetEntity-Methode, allerdings ohne Abtasten einer Koordinate durch den Nutzer.

SelectByPolygon

Auswahl von Elementen die innerhalb eins Polygons liegen

SelectOnSrceen

Auswahl von Elementen durch den Anwender

Neben den Besonderheiten jeder einzelnen Methode, haben alle eines gemeinsam. Die Elemente können auch noch nach verschiedenen Eigenschaften gefiltert werden. So ist es beispielsweise möglich, alle Polylinien der Zeichnung zu ermitteln, die auf einem bestimmten Layer liegen, oder alle bestimmte Blöcke zu selektieren, die einen ganz bestimmten Einfügepunkt haben.

Zur Verdeutlichung ein erstes Beispiel, in dem Sie interaktiv mehrere Zeichnungselemente auswählen und deren Objektnamen in einer Message-Box zur Anzeige bringen. Zum Einstieg verzichten wir zunächst auf die genannte Filtermöglichkeit. Bevor Sie die Prozedur starten, sollten Sie natürlich erst verschiedene Elemente zeichnen.

Public Sub vba2_sset1()
Dim SSET As IntelliCAD.SelectionSet
Dim Element As IntelliCAD.Entity
Dim Liste As String

Set Doku = IntelliCAD.ActiveDocument
Set SSET = Doku.SelectionSets.Add("Auswahl1")
SSET.SelectOnScreen
For Each Element In SSET
    Liste = Liste & vbCrLf & Element.EntityName
Next
MsgBox Liste
SSET.Clear
End Sub

Eingangs werden die erforderlichen Variablen deklariert. Mit „Set Sset=…“ erzeugen Sie einen zunächst noch leeren Auswahlsatz. Die Zeile „Sset.SelectOnScreen” führt dann dazu, dass Sie in der AutoCAD-Kommandozeile aufgefordert werden, Objekte am Bildschirm auszuwählen. Bitte beachten Sie, dass diese Anweisung noch mit Filter-Parametern ergänzt werden kann, dazu gleich mehr.

Wenn Sie Ihre Auswahl am Bildschirm mit der rechten Maustaste oder der Eingabetaste abgeschlossen haben, wird in der folgenden For-Next-Schleife der Auswahlsatz Element für Element durchsucht. Mit jedem Schleifendurchlauf füllt sich die Liste um ein weiteres Element. Wenn die Schleife abgearbeitet ist, wird die gefüllte Liste in einer Messagebox zur Anzeige gebracht. Vor dem Abschluß der Prozedur erzwingt „Sset.Claer“ das Löschen des Auswahlsatzes aus der Menge der SelectionSets. Das heißt, aus der Menge aller Selectionsets wird ihre „Auswahl1“ gelöscht und kann neu angelegt werden. Erfolgt das nicht, würde beim nächsten Aufruf Ihres Programms eine Fehlermeldung erscheinen, die sagt, dass der Auswahlsatz bereits existiert.

Bitte die „Clear-Anweisung“ nicht mit der „Delete-Anweisung“ verwechseln. Letztere löscht in BricsCad erstens den Auswahlsatz und zweitens auch die darin befindlichen Elemente. Übrigens ist das in VBA für AutoCAD umgekehrt.

Wie eingangs angedeutet, bietet das Selectionset die Möglichkeit, Elemente bei der Auswahl zu filtern, was ähnlich wie der FILTER-Befehehl von BricsCad zu verstehen ist. Die folgende Prozedur wird das verdeutlichen. Die Aufgabe des Programms besteht grundsätzlich darin, die Gesamtlänge aller in der Zeichnung befindlichen Linien und Polylinien zu bestimmen. Zunächst einmal das Listing:

Public Sub VBA2_Lanegen()
Dim Sset As IntelliCAD.SelectionSet

Dim fCode() As Integer
Dim fWert As Variant
Dim Element As IntelliCAD.Entity
Dim EName As String
Dim Laenge As Double
Dim PoLin As IntelliCAD.Polyline
Dim Linie As IntelliCAD.Line

Set Doku = IntelliCAD.ActiveDocument
Set Sset = Doku.SelectionSets.Add("Linien")
ReDim fCode(3): ReDim fWert(3)
fCode(0) = -4: fWert(0) = "<or"
fCode(1) = 0: fWert(1) = "Polyline"
fCode(2) = 0: fWert(2) = "Line"
fCode(3) = -4: fWert(3) = "or>"
Sset.Select vicSelectionSetAll, , , fCode, fWert
Laenge = 0
For Each Element In Sset
    If Element.EntityName = "Polyline" Then
        Set PoLin = Element
        Laenge = Laenge + PoLin.Length
    End If
    If Element.EntityName = "Line" Then
        Set Linie = Element
        Laenge = Laenge + Linie.Length
    End If
Next
MsgBox (Laenge)
Sset.Clear
End Sub

Hier nun die Erklärung einiger Besonderheiten. Nach der schon bekannten Erzeugung eines Auswahlsatzes mit „Set Sset = ThisDrawing.SelectionSets.Add("Auswahl")“ erfolgt die Definition des Filters. Er besteht immer aus zwei Komponenten. Erstens dem so genannten DXF-Gruppencode und zweitens dem eigentlichen Filterwert. Der Gruppencode ist vom Typ Integer und der Filterwert vom Typ Variant (siehe Deklarationen). In jedem Fall müssen es Arrays sein, deren Dimensionierung mit der Anzahl der Parameter identisch ist. Bitte beachten Sie, dass die Zählung üblicherweise bei 0 beginnt. Zum hoffentlich besseren Verständnis sei die Filterdefinition hier erst mal in einer logischen Operation dargestellt:

Auswahl = (Objekttyp=“Polyline“ ODER Objekttyp=“Line)

Dementsprechend sieht Ihr Programm aus. Mit : „fWert(0) = "<OR"“ öffnen Sie die ODER-Verknüpfung. Der DXF-Code für logische Verknüpfungen ist „-4“. Die beiden nächsten Zeilen geben die Filterbedingungen für die Linientypen an. Hier ist der Gruppencode „0“ (für die Bezeichnung des Elementtyps). Danach wird die ODER-Verknüpfung geschlossen.

Eine Übersicht über alle Gruppencodes finden Sie in entsprechenden DXF-Beschreibungen.

Nachdem Sie die Filterbedingung definiert haben, können Sie endlich alle Objekte auswählen. Das erfolgt mit

Sset.Select vicSelectionSetAll, , , fCode, fWert

Die allgemeine Syntax lautet

object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]

Nach der Select-Anweisung folgt als erster Parameter der Filtermodus, also der Mechanismus, nach dem Objekte ausgewählt werden. „vicSelectionSetAll“ sagt, dass alle Elemente der Zeichung einbezogen werden sollen. Alternativ könnten Sie den Bereich auch mit „vicSelectionSetCrossing“ oder mit „vicSelectionSetWindow“ auf einen durch die Punkte Point1 und Point2 definierten Bereich einschränken. In unserem Beispiel allerdings werden diese (optionalen) Parameter nicht angegeben, denn es sollen ja alle Elemente in der Zeichnung untersucht werden. Die letzten beiden Parameter verweisen nun auf die vorstehend definierten Filterbedingungen.

Analog dazu hätten Sie übrigens auch im vorstehenden Beispiel die Bildschirmauswahl („SelectOnScreen“) noch mit einem Filter einschränken können.

Was nun folgt, ist die Auswertung des Selektionsergebnisses. In der For-Next-Schleife wird jedes im Auswahlsatz enthaltene Objekt weiter verarbeitet. Genauer gesagt, werden in einem Selectionset nicht die Elemente selbst gespeichert, sondern nur Verweise auf diese Objekte.

Linien, wie auch Polylinien speichern in der Eigenschaft „Object.Length“ die Länge des jeweiligen Elementes. In Abhängigkeit vom Elemente-Namen wird dann mit

Set PoLin = Element Oder Set Linie = Element

ein Objekt geschaffen, dessen Länge dann mittels

PoLin.Length oder Linie.Length

ausgewertet werden kann.

Nachdem Sie das Ergebnis in einer Messagebox zur Anzeige gebracht haben, wird zum Schluss der Auswahlsatz wieder gelöscht. Viel Spaß beim ausprobieren.
Zu Teil 3

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