Daten in einer Zeichnung mit VBA suchen und auswerten, Teil 9 – Property Handler zur Elementauswertu


Wir haben bislang eine Reihe von Eigenschaften von grpahischen Elementen ausgelesen, dabei immer direkt auf die je nach Elementtyp vorhandenen Eigenschaften des DGN Objektkalaogs zugegriffen.

Jetzt möchte ich eine alternative Mölglichkeit aufzeigen, um an diese und teilweise sogar weitere Eigenschaften zuzugreifen, die durch Applikationen generiert werden können.

Diese Möglichkeit basiert auf die bekannte und oft verwendete MicroStation Funktion Elementinfo aus der primären Toolbox, hier das Symbol aus der Toolbox:

Führt man diese Funktion aus und wählt beispielsweise ein Shape, erhält man eine ähnliche Aufstellung mit Elementinformationen:

Die Informationen zu den Elementen sind in Kategorien aufgeteilt, im allgemeinen Bereich findet man die allgemienen Elementattribute wie Ebene, Farbe etc..
Jede dieser Informationen ist mit einer Beschreibung gekennzeichnet, auf die ich hier hinweisen möchte, denn dies sind die Schlüsselwörter, über die wir jetzt auf diese Informationen zugreifen möchten.
Wir benötigen dafür den sogenannten Propertyhandler, hier dazu ein Beispiel, wie man damit beispielsweise den Ebenennamen auslesen kann:

Sub elementinfo()
Dim ele As Element
Dim ee As ElementEnumerator
Dim kopfZeile, zeile As String
Dim oPh As PropertyHandler
Dim datei As String
On Error Resume Next
If ActiveWorkspace.IsConfigurationVariableDefined("MeineAusgabeDatei") Then
     datei = ActiveWorkspace.ConfigurationVariableValue("MeineAusgabeDatei")
Else
     MsgBox "Die Variable MeineAusgabeDatei ist nicht definiert, Verarbeitung abgebrochen", vbCritical
     Exit Sub
End If
Open datei For Append As #1
Set ee = ActiveModelReference.GraphicalElementCache.Scan()
Do While ee.MoveNext
     Set oPh = CreatePropertyHandler(ee.Current)
     If oPh.SelectByAccessString("Level") Then
          Print #1, "Levelname: " & oPh.GetDisplayString
     End If
Loop
Close #1
End Sub

Wir generien aus dem jeweilgen Element ein Objekt mit allen Eigenschaften und greifen gezielt über ein Schlüsselwort auf die konkrete Information zu, hier beispielsweise über das Schlüsselwort "Level" auf den Ebenennamen.
Die Ausgabe erfolgt weiterhin in die .csv Datei, so dass wir dort direkt die Information wiederfinden können.

DIese Information des Ebenennamens kann natürlich auch direkt  aus dem jeweiligen Element ausgelesen werden (Eigenschaft ee.Current.Level.Name),  nur es gubt eine Reihe von Informationen, die nicht unbedingt direkt als Eigenschaft ausgelesen werden können, insbesonder dann, wenn diese EIgenschaften über Applikationen an die Elemente geschrieben werden.

Um zunächst einmal zu erfahren, welche Informationen überhaupt verfügbar sein könnten, gibt es mit  der Methode .GetAccessStrings die Möglichkeit zum Auslesen aller vorhandenen Zugriffsschlüssel.
Hier lasse ich diese einmal ausgeben in eine Liste l() mit Strings, die durchnummeriert  in die CSV geschrieben werden:

 

Sub elementinfo()
Dim ele As Element
Dim ee As ElementEnumerator
Dim kopfZeile, zeile As String
Dim oPh As PropertyHandler
Dim l() As String
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
Open datei For Append As #1
Set ee = ActiveModelReference.GraphicalElementCache.Scan()
Do While ee.MoveNext
     Set oPh = CreatePropertyHandler(ee.Current)
     l = oPh.GetAccessStrings
     Print #1, "Es gibt an diesem Element " & UBound(l) - LBound(l) + 1 & " mögliche Informationen"
     For i = LBound(l) To UBound(l)
          Print #1, i & ";" & l(i)
     Next
Loop
Close #1
End Sub

Die Excelliste beginnt bei mir mit folgenden Zeilen, in der 2. Spalte die Auflistung der exakten Schlüsselwörter, über die auf die Information zugegriffen werden kann:

Es gibt an diesem Element 57 mögliche Informationen
0Description
1Level
2ElementID
3Model
4ModifiedTime
5ElementSize


Zu erwähnen sein sollte, dass nicht immer alle Informationen zur Verfügung stehen, in dem Fall kann es zu Laufzeitfehlern führen, die mit folgender Anweisung "ignoriert werden:

On error resume next

Hier einmal der Versuch alle Daten auszulesen, beachten Sie dabei, dass die On error Zeile vorhanden ist, um Laufzeitfehler zu umgehen. Die Ausgabe ist praktisch zum vorigen Beispiel nur noch um eine 3. Spalte erweiter:

Sub elementinfo()
Dim ele As Element
Dim ee As ElementEnumerator
Dim kopfZeile, zeile As String
Dim oPh As PropertyHandler
Dim l() As String
Dim datei As String
On Error Resume Next
If ActiveWorkspace.IsConfigurationVariableDefined("MeineAusgabeDatei") Then
     datei = ActiveWorkspace.ConfigurationVariableValue("MeineAusgabeDatei")
Else
     MsgBox "Die Variable MeineAusgabeDatei ist nicht definiert, Verarbeitung abgebrochen", vbCritical
     Exit Sub
End If
Open datei For Append As #1
Set ee = ActiveModelReference.GraphicalElementCache.Scan()
Do While ee.MoveNext
     Set oPh = CreatePropertyHandler(ee.Current)
     l = oPh.GetAccessStrings
     Print #1, "Es gibt an diesem Element " & UBound(l) - LBound(l) + 1 & " mögliche Informationen"
     For i = LBound(l) To UBound(l)
          If oPh.SelectByAccessString(l(i)) Then
               Print #1, i & ";" & l(i) & ";" & oPh.GetDisplayString
          End If
     Next
Loop
Close #1
End Sub

Die ersten Zeilen der Ausgabe könnten dann so aussehen:

Es gibt an diesem Element 57 mögliche Informationen
0DescriptionShape
1LevelNewLevel
2ElementID633
3ModelDefault
4ModifiedTime07.07.2014 11:17
5ElementSize140
6FilePos4000001
7Linkages1

Im folgenden Teil beschäftigen wir uns ausschließlich mit Auslesen von Sachdaten.