Wir haben bislang eine Reihe von Eigenschaften von graphischen Elementen ausgelesen, dabei immer direkt auf die je nach Elementtyp vorhandenen Eigenschaften des DGN Objektkatalogs zugegriffen.Jetzt möchte ich eine alternative Möglichkeit 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 allgemeinen 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 jeweiligen 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 gibt eine Reihe von Informationen, die nicht unbedingt direkt als Eigenschaft ausgelesen werden können, insbesondere 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 vorhandener 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:
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 erweitert:
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:
Im folgenden Teil beschäftigen wir uns ausschließlich mit Auslesen von Sachdaten.