Im vorigen Teil haben wir Eigenschaften von Elementen ausgelesen, die wir vorher direkt ausgewählt oder per Zaun bestimmt haben.Dies können wir jedoch noch weiter verallgemeinern, auch ist dies insbesondere dann interessant, wenn wir solche VBA Auswertungsprogramme im Stapelbetrieb über eine ganze Reihe von Zeichnungen laufen lassen wollen und dabei nicht bei jeder Zeichnungsdatei neu die zu untersuchenden Elemente auswählen müssen.Auch stehen oft gewisse Kriterien schon fest, nach denen wir Elemente auswählen, sei es hier der Elementtyp wie Linien, Ebeneninformation oder verwendete Fonts bei Texten usw..
Hilfreich dabei sind sogenannte Elementscankriterien, mit denen man die Suche von vorneherein auf die gesuchten Daten filtern kann. Wir führen deshalb die folgende Variable ein für die Festlegung solcher Kriterien:
Dim Sc As New ElementScanCriteria
Dieses Instrument ist sehr mächtig und bietet eine Vielzahl von Möglichkeiten. Der VBA Editor unterstützt uns dabei mit einer Funktionalität, indem es uns mögliche Kriterien vorschlägt. Diese Funktionalität bietet VBA grundsätzlich, an dieser Stelle möchte ich nur konkret darauf hinweisen:
Nach der Festlegung des Elementtyps für Sc geben Sie einfach einmal in der folgenden Zeile Sc gefolgt von einem Punkt an, VBA bietet sofort alle möglichen Optionen auf:
Wir sehen eine lange Liste mit Optionen, die gewisse Eigenschaften hinzufügen oder herausnehmen (Include bzw. Exclude). Damit steuern wir die Kriterien, nach denen letztlich die Auswahl erfolgt.Am besten kann man dies an einem Beispiel verdeutlichen und wir orientieren uns an dem bisherigen Beispiel, dass wir nur Linien auswählen möchten. Das machen wir in 2 Schritten:
1. Wir schliessen alle Elementtypen aus der Suche aus:Sc.ExcludeAllTypes
Sc.ExcludeAllTypes
2. Wir fügen nur die Linien für eine Suche hinzu:Sc.IncludeType msdElementTypeLine
Sc.IncludeType msdElementTypeLine
Bei der Auswahl des korrekten Elementtyps hilft uns VBA wieder mit einer Auflistung aller möglichen Typbezeichnungen:
Generell bietet der VBA Editor bei allen Objekten die Auswahl der möglichen Eigenschaften, Methoden oder zusätzliche Parameter. Sollten die angebotenen Begriffe nicht ganz klar sein, so hilft dann die Hilfe weiter. Wählt man einen solchen Begriff aus , klickt mit dem Cursor auf das Wort, dann öffnet sich die Hilfe genau zu dem Thema, bei vielen Themen zusätzlich noch mit einem Beispiel.Durch diese Festlegung beinhaltet Sc jetzt praktisch eine Filterdefinition, die nur Elemente vom Typ „Linie“ zuläßt. Mit diesem Filter „scannen“ wir die Zeichnung und erhalten als Auswahl genau die Elemente, die die Filterkriterien erfüllen.In der anschließenden Do while ... Schleife können wir uns dann die Abfrage sparen, ob wir gerade eine Linie überprüfen, denn das ist durch die Filteranwendung sichergestellt, d.h. wir können beispielsweise folgende Programmzeilen benutzen:
Sub elementinfo() Dim ele As LineElement Dim Ee As ElementEnumerator Dim startpunkt, endpunkt As Point3d Dim Sc As New ElementScanCriteria Sc.ExcludeAllTypes Sc.IncludeType msdElementTypeLine Set Ee = ActiveModelReference.GraphicalElementCache.scan(Sc) Do While Ee.MoveNext 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 Loop End Sub
Man kann sich jetzt leicht vorstellen, dass die Menge der ausgegebenen Daten immens sein kann und die Ausgabe im Direktbereich nicht mehr ausreichend.Das kann man nun leicht durch eine Umlenkung der Daten in eine Textdatei ändern.Dazu öffnen (open) wir am Anfang eine Datei, die wir am Ende schliessen (close).Zwischendurch leiten wir die Daten dann anstelle von debug.print mit print in die erste geöffnete Datei (#1)Wir brauchen also beispielweise solche Zeilen hinzu zu fügen:
datei = ActiveDesignFile.FullName + "- Daten.txt" Open datei For Output As #1 …… Print #1, “text” …… Close #1
Insgesamt könnte der Programmcode dann so aussehen:
Sub elementinfo() Dim ele As LineElement Dim Ee As ElementEnumerator Dim startpunkt, endpunkt As Point3d Dim Sc As New ElementScanCriteria Sc.ExcludeAllTypes Sc.IncludeType msdElementTypeLine Dim datei As String datei = ActiveDesignFile.FullName + "- Daten.txt" Open datei For Output As #1 Set Ee = ActiveModelReference.GraphicalElementCache.Scan(Sc) Do While Ee.MoveNext Set ele = Ee.Current.AsLineElement startpunkt = ele.startPoint endpunkt = ele.EndPoint Print #1, "Startpunkt ist (xyz): " & startpunkt.X, startpunkt.Y, startpunkt.Z Print #1, "Endpunkt ist (xyz): " & endpunkt.X, endpunkt.Y, endpunkt.Z Loop Close #1 End Sub
Noch kurz zur Erklärung, der Audruck ActiveDesignFile.FullName gibt den vollständigen Pfad + Name der geöffneten Zeichnungsdatei zurück, dahinter wird noch eine neue Extension geschrieben, und schon haben wir eine Textdatei, in die wir die Daten lenken. Die Datei ist leicht zu finden, da sie im selben Ordner wie die Zeichnungsdatei angelegt wird.Mit dem Ausdruck „For Output as #1“ wird eine neue Datei angelegt, falls noch nicht vorhanden. Vorsicht, eine bereits bestehende Datei wird überschrieben und neu beschrieben.Möchte man dagegen dei Inhalt behalten und die neuen Daten praktisch anhängen, dann muß stattdessen mit Append gearbeitet werden, beispielsweise so:
Open datei For Append As #1
Die Hilfe gibt hier eine Reihe weiterer Möglichkeiten und Optionen an. Fortsetzung folgt.....