Daten in einer Zeichnung mit VBA suchen und auswerten, Teil 2 – Eigenschaften von Elementen auslesen


Als erste konkrete Aufgabe wollen wir Eigenschaften von Linien auslesen.
Zeichnen Sie dazu im momentan aktiven Modell Ihrer geöffneten Zeichnungsdatei ein paar einzelne Linien. Diese wollen wir ein wenig auswerten.

Geben Sie in das Eingabefeld für Programmtexte folgende Zeilen ein:


Sub elementinfo()
Dim ele As LineElement
Dim Ee As ElementEnumerator
Dim startpunkt, endpunkt As Point3d
Set Ee = ActiveModelReference.GetSelectedElements
Do While Ee.MoveNext
    If Ee.Current.Type = msdElementTypeLine Then
        Set ele = Ee.Current.AsLineElement
        startpunkt = ele.startPoint
        endpunkt = ele.EndPoint
        Debug.Print "Startpunkt ist (xyz): " & startpunkt.X, startpunkt.Y, startpunkt.Z
        Debug.Print "Endpunkt ist (xyz): " & endpunkt.X, endpunkt.Y, endpunkt.Z
    End If
Loop
End Sub


Es sind also nur einige wenige Zeilen notwendig, um die Endpunkte aller gewählten (Methode .GetSelectedElements) Linien (Typ msdElementTypeLine) aus dem aktiven Modell (ActiveModelReference) auszulesen.
Wesentlicher Bestandteil ist das Objekt Ee vom Typ Enumerator. Einen Enumerator kann man sich vorstellen als Topf, der eine unbestimmte Anzahl von Elementen enthält, auf die man durch verschiedene Methoden zugreifen kann.
Durch ein wiederholtes Anwenden der Methode .MoveNext kann man nacheinander auf jedes Element dieser Menge zugreifen. Das geht solange, bis keins mehr übrig ist. Dieses Zugreifen machen wir über die Do while...Loop Schleife, in der wir jedes Element über die Methode .Current zugreifen können, um es herauszupicken und konkret zu untersuchen. Jede Linie verfügt über einen Anfangs- und einen Endpunkt, dessen x,y und z Koordinaten wir auslesen, um sie dann im Direktbereich mit einer debug.print auszugeben.

Sie können sich die Fenstergrößen im Editor etwas anpassen, damit Sie die Ausgabe vollständig erkennen können, etwa so:

 
In dem obigen Beispiel habe ich also 2 Linien gewählt, bevor ich diese Subroutine gestartet habe. Die Koodinaten der Anfangs- und Endpunkte sind im Fenster des Direktbereichs ausgegeben worden.
Bei einer größeren Menge von Elementen kann die vorige Auswahl aller gewünschter Elemente schon etwas mühsam sein, da könnte es also durchaus hilfreich sein, stattdessen einen Zaun zu definieren und nur den Inhalt des Zaunes auszuwerten. Dies könnte mit einer kleinen Änderung gemacht werden, die neuen Zeilen sind rot gekennzeichnet, die nicht mehr benötigte Zeile ist auskommentiert und grün dargestellt:

Sub elementinfo()
Dim ele As LineElement
Dim Ee As ElementEnumerator
Dim startpunkt, endpunkt As Point3d
Dim fnc As Fence
Set fnc = ActiveDesignFile.Fence
If Not fnc.IsDefined Then
 MsgBox "Es wurde kein Zaun definiert", vbCritical
 Exit Sub
End If
Set Ee = fnc.GetContents
'Set Ee = ActiveModelReference.GetSelectedElements
Do While Ee.MoveNext
    If Ee.Current.Type = msdElementTypeLine Then
        Set ele = Ee.Current.AsLineElement
        startpunkt = ele.startPoint
        endpunkt = ele.EndPoint
        Debug.Print "Startpunkt ist (xyz): " & startpunkt.X, startpunkt.Y, startpunkt.Z
        Debug.Print "Endpunkt ist (xyz): " & endpunkt.X, endpunkt.Y, endpunkt.Z
    End If
Loop
End Sub

Ein Element vom Typ fence wird benutzt, um die Inhalte eines Zaunes auszuwerten, dabei wird vorab erst einmal geprüft, ob ein Zaum überhaupt definiert wurde. Falls nicht, bekommt man eine Meldung (MsgBox) am Bildschirm und die Verarbeitung wird abgebrochen (exit sub).

Im nächsten Teil werden wir die Elementauswahl verallgemeinern durch Festlegung von Filterkriterien und die Ausgabe der Auswertung in eine Datei umlenken.