Daten in einer Zeichnung mit VBA suchen und auswerten, Teil 10 – Sachdaten auslesen


Die Sachdaten stellen unter den graphischen Elementen einer Zeichnung eine gewisse Besonderheit dar, denn diese Elemente vom Typ 37 treten optisch genauso auf wie Textelemente, sie  werden aber zunächst einmal als Sachdatendefinitionen in einer Zeichnung definiert und in Sachdatensätze in Gruppen zusammengefasst. In einer Zeichnung kann es nun beliebig vieler solcher Sachdatensätze geben mit jeweils wiederum beliebigen Sachdaten definitionen.
Wenn Sachdaten dann platziert werden, können diese assoziativ platziert werden, d.h. sie werden dann mit einem anderen Element verlinkt  oder sind nicht assoziativ und dann unabhängig in einem Modell platziert.

Nicht assoziativ platzierte Sachdaten sind oft in Zellbibliotheken zu finden. Wird eine Zelle mit freien Sachdaten aus einer solchen Zellbibliothek platziert, sind die Sachdaten dann anschließend mit der Zelle verlinkt.
Die Sachdaten entsprechen den Attributen eines AutoCAD Blocks, wobei aufgrund der Einschränkung im DWG Format, diese im DWG nur mit Blöcken (Pseudozellen) verlinkt sein können - im DGN Format besteht diese Einschränkung nicht, aber die hier behandelten Funktionen zum Auslesen von Sachdaten können sowohl im DGN als auch im DWG Bereich angewendet werden. 

Lassen wir uns bei den Bespielen von häufig genutzen Einsatzgebieten leiten und beginnen Sachdaten zu definieren, die wir in einem Zeichnungskopf verwenden möchten.

Erstellen wir in einer Zellbibliothek ein neues Modell und definieren dort einen Sachdatensatz mit ein paar Sachdaten, das könnte beispielsweise so aussehen:

Der Zeichnungskopf sei dabei nur durch ein paar Linien angedeutet. Die Sachdaten werden mit ihrem Namen in der Zeichnung dargestellt, daran ist zu erkennen, dass sie nicht assoziativ platziert wrurden, ansonsten würden sie den Wert anzeigen.

Als Nächstes erstellen wir eine Zeichnung und platzieren diese Zelle innerhalb der Zeichnung. Die Sachdaten sind jetzt zunächst einmal leer und müssen mit den Werten für diese Zeichnung gefüllt werden, Das geschieht mit dem Befehl "Sachdaten bearbeiten", wir hier mit einem Kreis gekennzeichnet:

Um die Sachdaten in einer Zeichnung zu suchen, kann man verschiedene Strategien anwenden.  Wir haben in den ersten Teilen Auswahlsätze definiert, in denen bestimmte vorher ausgewählte Elemente oder bestimmte Elementtypen gefilter wurden.
Bei der Suche nach Sachdaten können wir auch diese Wege gehen, allerdings sollten wir vorher überlegen, wie wir die gefundenen Sachdaten benötigen.
Dies wird klar, wenn ich die Strategien einmal vorstelle.

Zunächst einmal möchte ich ein ganz bestimmtes Sachdatum suchen, das nur in der Zeichnung vorhanden sein kann, wenn die Zelle mit dem Zeichnungskopf platziert ist  Nehmen wir als Beispiel das Sachdatum mit der Bezeichnung "Projekt". In meinem Beispiel habe ich folgende Daten eingegeben, so dass ich praktisch als Suchergebnis den Wert "BE Community" erhalten sollte:

  

Hier dazu einmal ein Beipiel, wie die Suche aussehen könnte:

Sub elementinfo()
Dim ele As TagElement
Dim ee As ElementEnumerator
Dim kopfZeile, zeile As String
Dim datei As String
Dim Sc As New ElementScanCriteria
Sc.ExcludeAllTypes
Sc.IncludeType msdElementTypeTag
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(Sc)
Do While ee.MoveNext
     Set ele = ee.Current.AsTagElement
     If ele.TagDefinitionName = "Projekt" Then
          Print #1, "Projekt" & ";" & ele.Value
     End If
Loop
Close #1
End Sub

Als Ergebnis finde ich inder .csv folgende letzte Zeile:

Projekt

BE Community

Die Suche war erfolgreich, wir haben also genau ein Sachdatum mit dem Wert "BE Community" gefunden.

Diese Art der Suche dient nicht nur zum Auslesen von bestimmten Sachdaten, sondern kann auch zur Überprüfung von Zeichnungen auf Korrektheit dienen. Diese Prüfung könnte also auch vorgenommen werden, um das Vorhandensein des Zeichnungskopfes zu testen, also Prüfung der Zeichnung auf Vollständigkeit.

Ein Sachdatum wird durch folgende 3 Eigenschaften gekennzeichnet, da ist der Wert .Value, die Bezeichnung des Sachdatums mit .TagDefinitionName und der Sachdatensatz mit .TagSetName, den wir bislang noch nicht beachtet haben, aber im nächsten Beispiel auch einbringen werden.

Die vorige Methode zur Suche von Sachdaten berücksichtigt nicht die Zusammengehörigkeit der Daten, aber oft werden Sachdaten gesucht, die zusammen gehören wie beispielsweise alle Sachdaten des Zeichnungskopfes.
Da kann es leichter sein, wenn man nicht nach den Sachdaten sucht, sondern nach den Elementen, an denen die Sachdaten angehängt sind.

Deshalb hier einmal ein Vorschlag, wie man die Sachdaten des Zeichnungskopfes ausliest, indem man die Zelle sucht und dann dessen Sachdaten ausliest:

 

Sub elementinfo()
Dim ele As CellElement
Dim ee As ElementEnumerator
Dim kopfZeile, zeile As String
Dim datei As String
Dim oTags() As TagElement
Dim Sc As New ElementScanCriteria
Sc.ExcludeAllTypes
Sc.IncludeOnlyCell ("Default")
Sc.IncludeType msdElementTypeCellHeader
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.Scan(Sc)
Do While ee.MoveNext
     Set ele = ee.Current.AsCellElement
     If ele.HasAnyTags Then
          Print #1, "Zelle: " & ";" & ele.Name
          oTags = ele.GetTags
          For i = LBound(oTags) To UBound(oTags)
               zeile = oTags(i).TagSetName & ";" & oTags(i).TagDefinitionName
               zeile = zeile & ";" & oTags(i).Value
               Print #1, zeile
          Next
     End If
Loop
Close #1
End Sub

Der Durchlauf dieser Routine hat bei meinem Beispiel folgende Zeilen generiert:

Zelle: Default
ZeichnungskopfZeichnerAdministrator
Zeichnungskopfgeprüft01.01.1970
ZeichnungskopfFormatDin A1
ZeichnungskopfMassstab0,180555556
ZeichnungskopfProjektBE Community

Die Ausgabe des Namens des Sachdatums erscheint vielleicht zunächst überflüssig, jedoch im allgemeinen Fall kann an einer Zelle eine größere Anzahl von Sachdatensätzen angehängt sein und nur die Kombination aus Satzname und Definitionsname ist eindeutig, da genau diese Kombination nur 1x an ein Element angehängt werden kann.