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 | ||
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 | |
Zeichnungskopf | Zeichner | Administrator |
Zeichnungskopf | geprüft | 01.01.1970 |
Zeichnungskopf | Format | Din A1 |
Zeichnungskopf | Massstab | 0,180555556 |
Zeichnungskopf | Projekt | BE 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.