Bezieht sich auf | |||
Produkt(e): | MicroStation | ||
Version(en): | 08.11.09.578 | ||
Umgebung: | N\A | ||
Produktbereich: | Programmierung | ||
Produktunterbereich: | VBA | ||
Ursprünglicher Autor: | Artur Goldsweer, Bentley Technical Support Group | ||
Es gibt verschiedene Möglichkeiten, um Elemente in einer Zeichnung mit zusätzlichen Informationen zu versehen. Häufig verwendet werden dafür Sachdaten, für die eigene Funktionen zum Erstellen, Anhängen und auch Auswerten zur Verfügung stehen.
Allerdings haben Sachdaten auch Nachteile, denn die Sachdaten selber sind auch Elemente ähnlich wie Texte und sind mit den Basiselementen über Links verknüpft.
Diese Links kann man aber trennen und auch bei der Konvertierung z.B. in das DWG Format können diese verloren gehen, denn das DWG Format unterstützt Sachdaten nur bei Zellen (in DWG Blöcke).
Es gibt auch die Möglichkeit Daten direkt mit Elementen zu verknüpfen, diese werden als Attribute oder Verknüpfungen bzw. Linkages bezeichnet. Der Vorteil hier ist die enge Verknüpfung mit dem Element selber, diese Linkages sind keine eigenständigen Elemente und können auch beim Speichenr in das DWG Format erhalten bleiben - dazu muss beim Speichern zu DWG in den Optionen ausgewählt werden, dass Applikationsdaten erhalten bleiben.
Hier ein einfaches Beipiel, das hängt an alle im aktiven Modell gefundenen Linien einen Text als Attribut an:
' Beispiel aus der VBA Hilfe, um Strings als Attribute an Elemente anzuhängen: Const myID As Long = 22526 ' nur Beispiel aus Hilfe Sub AddStringAttribute(ele As element, str As String) Dim dblk As New DataBlock dblk.CopyString str, True ele.AddUserAttributeData myID, dblk ele.Rewrite End Sub Sub Attribute_anhaengen() Dim Ee As ElementEnumerator Dim Db As DataBlock Set Ee = ActiveModelReference.GraphicalElementCache.Scan Do While Ee.MoveNext If Ee.Current.Type = msdElementTypeLine Then AddStringAttribute Ee.Current, "Dies ist ein Beispieltext" End If Loop End Sub
Wenn nun diese Routine Attribute_anhaengen gestartet wird, werden zunächst alle Elemente des aktiven Modells gewählt und geprüft, ob es sich jeweils um eine Linie handelt.
Wenn es eine Linie ist, dann wird der Text "Dies ist ein Beispieltext" als benutzerdefiniertes Attribut an die Linie angehängt.
Nach dem Durchlauf der Routine kann dies überprüft werden, indem man das alte Analyze Tool mit dem Keyin Befehl "analyze element" startet und eine Linie auswählt.
Unter dem Reiter Attribute werden dann diese Daten angezeigt, wie hier in diesem Beispiel:
Auch wenn die Daten binär gespeichert werden, läßt sich aus der Textanzeige der Text erkennen. Mit dem neuen Elementinformationstool werden diese Daten auch angezeigt, allerdings nur binär und nicht im Textmodus.
Es schließt sich natürlich sofort die Frage an, wie kann man solche Daten wieder auslesen, dazu folgendes kleines Beipiel, das überprüft jede Linie auf das Vorhandensein dieser Daten und gibt dann diese aus:
Sub attribute_auslesen() Dim Ee As ElementEnumerator Dim Db() As DataBlock Dim sText As String Set Ee = ActiveModelReference.GraphicalElementCache.Scan Do While Ee.MoveNext If Ee.Current.Type = msdElementTypeLine Then Db = Ee.Current.GetUserAttributeData(myID) sText = "" If UBound(Db) >= 0 Then Db(0).CopyString sText, False If Len(sText) > 0 Then Debug.Print sText, Ee.Current.AsLineElement.startPoint.x, Ee.Current.AsLineElement.startPoint.y End If End If End If Loop End Sub
Es zeigt hier beispielsweise den gefundenen Text und die xy Koordinaten des Anfangspunktes der Linie, die Ausgabe im VBA Editor kann vielleicht so aussehen, wenn 2 Linien gefunden wurden: