Daten in einer Zeichnung mit VBA suchen und auswerten, Teil 4 – 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 die Endpunkte aller Linien eines Zeichnungsmodells ausgelesen und dies in eine Textdatei exportiert. Die resultierende Textdatei ist jedoch ziemlich unübersichtlich und damit auch schwer auszuwerten.
Wir wollen jetzt diese Ausgabe etwas verfeinern, indem wir die Daten einer Linie auf eine Zeile in der Textdatei zusammenfassen und die Daten jeweils durch ein Semikolon (;) trennen.
Dieses Format können wir dann auch direkt als .csv Datei erstellen und damit direkt in Excel öffnen.
Um die Daten identifizieren zu können, wird am Enfang der Datei eine Kopfzeile hinzugefügt, damit die einzelnen Spalten identifiziert werden können.
Ein möglicher Ansatz kann folgendermaßen aussehen.
Die Änderungen gegenüber der vorigen Version sind rot gekennzeichnet:

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

Die bisherigen Ausgaben erfolgen jeweils in eine eigene Text- oder CSV-Datei, bei Anwendung solcher Programme in der Praxis möchte man die Daten mehrerer Zeichnung gerne gesammelt in einer Datei.
Es gibt auch hier verschiedene Wege, um dies zu erzielen, ich möchte hier eine Umgebungsvariable verwenden, in der der Dateiname inklusive Pfad abgespeichert ist.
D.h. anfangs wird diese Konfigurationsvariable abgefragt und verwendet als Ausgabedatei.
Sollte diese Variable nicht gesetzt sein, dann soll diese Routine mit eine entsprechenden Meldung abbrechen.
Die Konfigurationsvariable kann innerhalb von MicroStation als Benutzervariable definiert sein, ein Weg dorthin führt im Menü unter Arbeitsbereich > Konfiguration, dort „Neu", dann erhalten wir folgende Eingabemaske, in der die Variable gesetzt werden kann:

  


Auf die Konfigurationsvariablen können wir mit dem Objekt Activeworkspace zugreifen. Es bietet verschiedene Methoden, ein Ansatz könnte folgendermaßen aussehen:

If ActiveWorkspace.IsConfigurationVariableDefined("MeineAusgabeDatei") Then
    datei = ActiveWorkspace.ConfigurationVariableValue("MeineAusgabeDatei")
Else
    MsgBox "Die Variable MeineAusgabeDatei ist nicht definiert, Verarbeitung abgebrochen", vbCritical
    Exit Sub
End If

In der Kopfzeile fügen ich jetzt noch eine Spalte hinzu, in der kommt bei einem Zeichnungswechsel der vollständige Zeichnungsname mit Pfad und letztlich werden die Daten in die .csv Datei hinzugefügt, also wir die Datei mit „Append“ geöffnet und nicht mehr wie bisher mit „Output“.
Insgesamt führt dies zu folgender Routine:

Sub elementinfo()
Dim ele As LineElement
Dim Ee As ElementEnumerator
Dim startpunkt, endpunkt As Point3d
Dim Sc As New ElementScanCriteria
Dim kopfZeile, Zeile As String
Sc.ExcludeAllTypes
Sc.IncludeType msdElementTypeLine
 Dim datei As String
If ActiveWorkspace.IsConfigurationVariableDefined("MeineAusgabeDatei") Then
    datei = ActiveWorkspace.ConfigurationVariableValue("MeineAusgabeDatei")
Else
    MsgBox "Die Variable MeineAusgabeDatei ist nicht definiert, Verarbeitung abgebrochen", vbCritical
    Exit Sub
End If
'datei = ActiveDesignFile.FullName + "- Daten.csv"
Open datei For Append As #1
kopfZeile = "Anfang X; Anfang Y; Anfang Z; Ebd X; End Y; End Z;" & ActiveDesignFile.FullName
Print #1, kopfZeile
Set Ee = ActiveModelReference.GraphicalElementCache.Scan(Sc)
Do While Ee.MoveNext
        Set ele = Ee.Current.AsLineElement
        startpunkt = ele.startPoint
        endpunkt = ele.EndPoint
        Zeile = startpunkt.X & ";" & startpunkt.Y & ";" & startpunkt.Z & ";"
        Zeile = Zeile & endpunkt.X & ";" & endpunkt.Y & ";" & endpunkt.Z
        Print #1, Zeile
Loop
Close #1
End Sub

Um diese Routine jetzt im Stapelbetrieb anwenden zu können, benötigen wir jetzt nur noch einen Keyin, mit dem diese Routine gestartet werden kann, denn im MicroStation Batchprocess wird eine Textdatei verlangt, in der die Befehle aufgelistet werden müssen, die ausgeführt werden sollen, in unserem Fall der Keyin zum Aufruf dieser VBA Routine.

Man sollte die .MVBA Projektdateien in eines der VBA Verzeichnisse des Workspaces ablegen, die in der Konfigurationsvariablen MS_VBASEARCHDIRECTORIES gelistet sind. Vorgabemäßig ist dort u.a. das ..\workspace\system\vba angegen. Wenn Sie Ihre Dateien dort ablegen, können Sie es mit folgendem Keyin gleichzeitig laden und ausführen:

vba run [default]modul1.elementinfo

Wenn die Subroutine mit dem Namen elementinfo eindeutig ist, können Sie auch auf den Modulnamen verzichten und diese Kurzform benutzen, die eckigen Klammern sollten aber erhalten bleiben:
vba run [default]elementinfo
Diese Befehlszeile leitet sich aus diesem allgemeinen Keyin ab:
vba run [projectname]modulname.subroutine
Wir haben also bislang die Möglichkeiten kennengelernt, Elementinformationen auszulesen und diese auszugeben. So geht es in den nächsten Teilen darum, weitere Informationen aus den Elementen auszulesen.