Mit VBA Elemente mit Benutzerattributen verknüpfen


  
 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
  

  

Hintergrundinformation

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. 

 

Erforderliche Schritte

 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:

Sehen Sie hierzu auch