![]() |
![]() |
||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||
Download einer kostenlosen BricsCad-Demoversion (Vollversion für 30 Tage ab Installation) |
|||||||||||||||||||||||||||||||
|
!!! Bitte beachten: Nachfolgende Ausführungen gelten nur für BricsCad bis V7. Seit V8 VBA weitestgehend kompatibel zu AutoCAD!!! |
|||||||||||||||||||||||||||||||
|
Im ersten Teil unserer VBA-Einführung haben Sie ein wenig von der Entwicklungsumgebung kennen gelernt, einen Kreis vom Programm in BricsCad zeichnen lassen und sogar ein erstes kleines Formular
entwickelt. Wer sich etwas ernsthafter mit der VBA-Programmierung beschäftigt, wird immer wieder vor der Aufgabe stehen, bereits vorhandene CAD-Elemente zu bearbeiten. Dafür gibt es verschiedene Möglichkeiten. Nachfolgend
sollen zwei Wege beschrieben werden, nämlich die Klassen Utility und Selectionset. Jetzt können Sie folgende kleine Prozedur schreiben, die Sie auffordert, ein Zeichnungselement zu selektieren und anschließend dessen Namen ausgibt. Public Sub VBA_2_getentity() In vielen Fällen ist allerdings mehr als ein Element in der Zeichnung auszuwählen. In der Klasse SelectionSets werden Ihnen vielfältig einsetzbare Methoden an die Hand gegeben, um Zeichnungselemente interaktiv oder auch im Hintergrund zu selektieren. Um einen solchen Auswahlsatz anzulegen, sollte er zunächst mit einer Dim- oder Public-Anweisung deklariert werden. Dim SSET As IntelliCAD.SelectionSet Angelegt wird der Auswahlsatz mit folgender Programmzeile. Set SSET = Doku.SelectionSets.Add("Auswahl1") Nun können Sie Ihrem Auswahlsatz verschiedenste Elemente hinzufügen. Hier die dafür am häufigsten gebrauchten Methoden:
Neben den Besonderheiten jeder einzelnen Methode, haben alle eines gemeinsam. Die Elemente können auch noch nach verschiedenen Eigenschaften gefiltert werden. So ist es beispielsweise möglich, alle Polylinien der Zeichnung zu ermitteln, die auf einem bestimmten Layer liegen, oder alle bestimmte Blöcke zu selektieren, die einen ganz bestimmten Einfügepunkt haben. Zur Verdeutlichung ein erstes Beispiel, in dem Sie interaktiv mehrere Zeichnungselemente auswählen und deren Objektnamen in einer Message-Box zur Anzeige bringen. Zum Einstieg verzichten wir zunächst auf die genannte Filtermöglichkeit. Bevor Sie die Prozedur starten, sollten Sie natürlich erst verschiedene Elemente zeichnen. Public Sub vba2_sset1() Set Doku = IntelliCAD.ActiveDocument Eingangs werden die erforderlichen Variablen deklariert. Mit „Set Sset=…“ erzeugen Sie einen zunächst noch leeren Auswahlsatz. Die Zeile „Sset.SelectOnScreen” führt dann dazu, dass Sie in der AutoCAD-Kommandozeile aufgefordert werden, Objekte am Bildschirm auszuwählen. Bitte beachten Sie, dass diese Anweisung noch mit Filter-Parametern ergänzt werden kann, dazu gleich mehr. Wenn Sie Ihre Auswahl am Bildschirm mit der rechten Maustaste oder der Eingabetaste abgeschlossen haben, wird in der folgenden For-Next-Schleife der Auswahlsatz Element für Element durchsucht. Mit jedem Schleifendurchlauf füllt sich die Liste um ein weiteres Element. Wenn die Schleife abgearbeitet ist, wird die gefüllte Liste in einer Messagebox zur Anzeige gebracht. Vor dem Abschluß der Prozedur erzwingt „Sset.Claer“ das Löschen des Auswahlsatzes aus der Menge der SelectionSets. Das heißt, aus der Menge aller Selectionsets wird ihre „Auswahl1“ gelöscht und kann neu angelegt werden. Erfolgt das nicht, würde beim nächsten Aufruf Ihres Programms eine Fehlermeldung erscheinen, die sagt, dass der Auswahlsatz bereits existiert. Bitte die „Clear-Anweisung“ nicht mit der „Delete-Anweisung“ verwechseln. Letztere löscht in BricsCad erstens den Auswahlsatz und zweitens auch die darin befindlichen Elemente. Übrigens ist das in VBA für AutoCAD umgekehrt. Wie eingangs angedeutet, bietet das Selectionset die Möglichkeit, Elemente bei der Auswahl zu filtern, was ähnlich wie der FILTER-Befehehl von BricsCad zu verstehen ist. Die folgende Prozedur wird das verdeutlichen. Die Aufgabe des Programms besteht grundsätzlich darin, die Gesamtlänge aller in der Zeichnung befindlichen Linien und Polylinien zu bestimmen. Zunächst einmal das Listing: Public Sub VBA2_Lanegen() Dim fCode() As Integer Set Doku = IntelliCAD.ActiveDocument Hier nun die Erklärung einiger Besonderheiten. Nach der schon bekannten Erzeugung eines Auswahlsatzes mit „Set Sset = ThisDrawing.SelectionSets.Add("Auswahl")“ erfolgt die Definition des Filters. Er besteht immer aus zwei Komponenten. Erstens dem so genannten DXF-Gruppencode und zweitens dem eigentlichen Filterwert. Der Gruppencode ist vom Typ Integer und der Filterwert vom Typ Variant (siehe Deklarationen). In jedem Fall müssen es Arrays sein, deren Dimensionierung mit der Anzahl der Parameter identisch ist. Bitte beachten Sie, dass die Zählung üblicherweise bei 0 beginnt. Zum hoffentlich besseren Verständnis sei die Filterdefinition hier erst mal in einer logischen Operation dargestellt: Auswahl = (Objekttyp=“Polyline“ ODER Objekttyp=“Line) Dementsprechend sieht Ihr Programm aus. Mit : „fWert(0) = "<OR"“ öffnen Sie die ODER-Verknüpfung. Der DXF-Code für logische Verknüpfungen ist „-4“. Die beiden nächsten Zeilen geben die Filterbedingungen für die Linientypen an. Hier ist der Gruppencode „0“ (für die Bezeichnung des Elementtyps). Danach wird die ODER-Verknüpfung geschlossen. Eine Übersicht über alle Gruppencodes finden Sie in entsprechenden DXF-Beschreibungen. Nachdem Sie die Filterbedingung definiert haben, können Sie endlich alle Objekte auswählen. Das erfolgt mit Sset.Select vicSelectionSetAll, , , fCode, fWert Die allgemeine Syntax lautet object.Select Mode[, Point1][, Point2][, FilterType][, FilterData] Nach der Select-Anweisung folgt als erster Parameter der Filtermodus, also der Mechanismus, nach dem Objekte ausgewählt werden. „vicSelectionSetAll“ sagt, dass alle Elemente der Zeichung einbezogen werden sollen. Alternativ könnten Sie den Bereich auch mit „vicSelectionSetCrossing“ oder mit „vicSelectionSetWindow“ auf einen durch die Punkte Point1 und Point2 definierten Bereich einschränken. In unserem Beispiel allerdings werden diese (optionalen) Parameter nicht angegeben, denn es sollen ja alle Elemente in der Zeichnung untersucht werden. Die letzten beiden Parameter verweisen nun auf die vorstehend definierten Filterbedingungen. Analog dazu hätten Sie übrigens auch im vorstehenden Beispiel die Bildschirmauswahl („SelectOnScreen“) noch mit einem Filter einschränken können. Was nun folgt, ist die Auswertung des Selektionsergebnisses. In der For-Next-Schleife wird jedes im Auswahlsatz enthaltene Objekt weiter verarbeitet. Genauer gesagt, werden in einem Selectionset nicht die Elemente selbst gespeichert, sondern nur Verweise auf diese Objekte. Linien, wie auch Polylinien speichern in der Eigenschaft „Object.Length“ die Länge des jeweiligen Elementes. In Abhängigkeit vom Elemente-Namen wird dann mit Set PoLin = Element Oder Set Linie = Element ein Objekt geschaffen, dessen Länge dann mittels PoLin.Length oder Linie.Length ausgewertet werden kann. Nachdem Sie das Ergebnis in einer Messagebox zur Anzeige gebracht haben, wird zum Schluss der Auswahlsatz wieder gelöscht. Viel Spaß beim ausprobieren. |
|||||||||||||||||||||||||||||||
|
IBB INGENIEURBÜRO BATTEFELD Bochum Nöckerstraße 37c |
|||||||||||||||||||||||||||||||
|
Mit Fragen oder Hinweisen wenden Sie sich bitte an |
|||||||||||||||||||||||||||||||
|
IBB INGENIEURBÜRO BATTEFELD Leipzig Brahestraße 17 |
|||||||||||||||||||||||||||||||
|
Hydraulische Berechnungen - GIS - Vermessung - BricsCad V8 - Kartierung - AutoCAD - Autodesk MAP3D - DVGW - Vermessung - GPS - INTERGEO - Free Download von
BricsCad - IntelliCAD - BricsCad V7 - Programmierung - Energieversorgung - AutoLISP - VB - VBA - SQL - SYBASE SQL Anywhere - Individualprogrammierung - Gas - Wasser -
Strom - Fernwärme - Abwasser - Kanal - Kataster - Indirekteinleiterkataster - relationale Datenbanken - SICAD - Netzberechnung - STANET - AutoSTA - Schnittstellen - SQD - SQS - ALK - ALB - EBDS - ISYBAU - GRADIS - AutoCAD
|
|||||||||||||||||||||||||||||||