Daten in einer Zeichnung mit VBA suchen und auswerten, Teil 3 – Eigenschaften von Elementen auslesen


  
 Bezieht sich auf 
  
 Produkt(e):MicroStation
 Version(en):08.11.09.578
 Umgebung: Windows 7 64 bit
 Produktbereich: Programmierung
 Produktunterbereich: VBA
 Ursprünglicher Autor:Artur Goldsweer, Bentley Technical Support Group
  

 

Im vorigen Teil haben wir Eigenschaften von Elementen ausgelesen, die wir vorher direkt ausgewählt oder per Zaun bestimmt haben.
Dies können wir jedoch noch weiter verallgemeinern, auch ist dies insbesondere dann interessant, wenn wir solche VBA Auswertungsprogramme im Stapelbetrieb über eine ganze Reihe von Zeichnungen laufen lassen wollen und dabei nicht bei jeder Zeichnungsdatei neu die zu untersuchenden Elemente auswählen müssen.
Auch stehen oft  gewisse Kriterien schon fest, nach denen wir Elemente auswählen, sei es hier der Elementtyp wie Linien, Ebeneninformation oder verwendete Fonts bei Texten usw..

Hilfreich dabei sind sogenannte Elementscankriterien, mit denen man die Suche von vorneherein auf die gesuchten Daten filtern kann. Wir führen deshalb die folgende Variable ein für die Festlegung solcher Kriterien:

Dim Sc As New ElementScanCriteria

Dieses Instrument ist sehr mächtig und bietet eine Vielzahl von Möglichkeiten. Der VBA Editor unterstützt uns dabei mit einer Funktionalität, indem es uns mögliche Kriterien vorschlägt. Diese Funktionalität bietet VBA grundsätzlich, an dieser Stelle möchte ich nur konkret darauf hinweisen:

Nach der Festlegung des Elementtyps für Sc geben Sie einfach einmal in der folgenden Zeile Sc gefolgt von einem Punkt an, VBA bietet sofort alle möglichen Optionen auf:


 
Wir sehen eine lange Liste mit Optionen, die gewisse Eigenschaften hinzufügen oder herausnehmen (Include bzw. Exclude). Damit steuern wir die Kriterien, nach denen letztlich die Auswahl erfolgt.
Am besten kann man dies an einem Beispiel verdeutlichen und wir orientieren uns an dem bisherigen Beispiel, dass wir nur Linien auswählen möchten. Das machen wir in 2 Schritten:

1.  Wir schliessen alle Elementtypen aus der Suche aus:
Sc.ExcludeAllTypes

2. Wir fügen nur die Linien für eine Suche hinzu:
Sc.IncludeType msdElementTypeLine

Bei der Auswahl des korrekten Elementtyps hilft uns VBA wieder mit einer Auflistung aller möglichen Typbezeichnungen:


 
 
Generell bietet der VBA Editor bei allen Objekten die Auswahl der möglichen Eigenschaften, Methoden oder zusätzliche Parameter.
Sollten die angebotenen Begriffe nicht ganz klar sein, so hilft dann die Hilfe weiter. Wählt man einen solchen Begriff aus , klickt mit dem Cursor auf das Wort, dann öffnet sich die Hilfe genau zu dem Thema, bei vielen Themen zusätzlich noch mit einem Beispiel.
Durch diese Festlegung beinhaltet Sc jetzt praktisch eine Filterdefinition, die nur Elemente vom Typ „Linie“ zuläßt. Mit diesem Filter „scannen“ wir die Zeichnung und erhalten als Auswahl genau die Elemente, die die Filterkriterien erfüllen.
In der anschließenden Do while ... Schleife können wir uns dann die Abfrage sparen, ob wir gerade eine Linie überprüfen, denn das ist durch die Filteranwendung sichergestellt, d.h. wir können beispielsweise folgende Programmzeilen benutzen:

Sub elementinfo()
Dim ele As LineElement
Dim Ee As ElementEnumerator
Dim startpunkt, endpunkt As Point3d
Dim Sc As New ElementScanCriteria
Sc.ExcludeAllTypes
Sc.IncludeType msdElementTypeLine
Set Ee = ActiveModelReference.GraphicalElementCache.scan(Sc)
Do While Ee.MoveNext
        Set ele = Ee.Current.AsLineElement
        startpunkt = ele.startPoint
        endpunkt = ele.EndPoint
        Debug.Print "Startpunkt ist (xyz): " & startpunkt.X, startpunkt.Y, startpunkt.Z
        Debug.Print "Endpunkt ist (xyz): " & endpunkt.X, endpunkt.Y, endpunkt.Z
Loop
End Sub



Man kann sich jetzt leicht vorstellen, dass die Menge der ausgegebenen Daten immens sein kann und die Ausgabe im Direktbereich nicht mehr ausreichend.
Das kann man nun leicht durch eine Umlenkung der Daten in eine Textdatei ändern.
Dazu öffnen (open) wir am Anfang eine Datei, die wir am Ende schliessen (close).
Zwischendurch leiten wir die Daten dann anstelle von debug.print mit print in die erste geöffnete Datei (#1)
Wir brauchen also beispielweise solche Zeilen hinzu zu fügen:

 

datei = ActiveDesignFile.FullName + "- Daten.txt"
Open datei For Output As #1
……
Print #1, “text”
……
Close #1


Insgesamt könnte der Programmcode dann so aussehen:

Sub elementinfo()
Dim ele As LineElement
Dim Ee As ElementEnumerator
Dim startpunkt, endpunkt As Point3d
Dim Sc As New ElementScanCriteria
Sc.ExcludeAllTypes
Sc.IncludeType msdElementTypeLine
Dim datei As String
datei = ActiveDesignFile.FullName + "- Daten.txt"
Open datei For Output As #1
Set Ee = ActiveModelReference.GraphicalElementCache.Scan(Sc)
Do While Ee.MoveNext
        Set ele = Ee.Current.AsLineElement
        startpunkt = ele.startPoint
        endpunkt = ele.EndPoint
        Print #1, "Startpunkt ist (xyz): " & startpunkt.X, startpunkt.Y, startpunkt.Z
        Print #1, "Endpunkt ist (xyz): " & endpunkt.X, endpunkt.Y, endpunkt.Z
Loop
Close #1
End Sub

Noch kurz zur Erklärung, der Audruck ActiveDesignFile.FullName gibt den vollständigen Pfad + Name der geöffneten Zeichnungsdatei zurück, dahinter wird noch eine neue Extension geschrieben, und schon haben wir eine Textdatei, in die wir die Daten lenken. Die Datei ist leicht zu finden, da sie im selben Ordner wie die Zeichnungsdatei angelegt wird.
Mit dem Ausdruck „For Output as #1“ wird eine neue Datei angelegt, falls noch nicht vorhanden.
Vorsicht, eine bereits bestehende Datei wird überschrieben und neu beschrieben.
Möchte man dagegen dei Inhalt behalten und die neuen Daten praktisch anhängen, dann muß stattdessen mit Append gearbeitet werden, beispielsweise so:

Open datei For Append As #1

Die Hilfe gibt hier eine Reihe weiterer Möglichkeiten und Optionen an. 
Fortsetzung folgt.....