VBA-Einstig 
für BricsCad (NUR bis V7) Teil4
Startseite
VBA Einführung für
BricsCad und AutoCAD

 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!!!

Eine der wichtigsten Methoden zur Organisation von BricsCad-Zeichnungen ist die Verwendung von Layern (Zeichnungsebenen). Jeder Layer verfügt über Eigenschaften, die auf das mit ihm verbundene Zeichnungsobjekt übertragen werden können. Darum beschäftigt sich der vorliegende Teil unseres VBA-Kurses mit Möglichkeiten des Zugriffs auf Layer, deren Eigenschaften und Möglichkeiten zu deren Manipulation.

Das BricsCad-Objektmodell kennt die Layers-Collection als „Obermenge“ aller darin enthaltenen einzelnen Layer. Um einen einzelnen Layer im Programm zu verwenden, kommt die Item-Methode zum Einsatz. Wie in Listing 1 dargestellt, kann als Parameter entweder der Name des Layers oder eine Integer-Zahl verwendet werden.
Interessant ist übrigens, dass nach den Erfahrungen des Autors der Index bei 1 beginnt. Interessant darum, weil üblicherweise Collection-Objekte sonst bei 0 zu zählen beginnen.
Bei der Verwendung des Namens wird keine Groß- und Kleinschreibung unterschieden. Da die Item-Methode wie bei allen anderen Collection-Objekten die Standardmethode des Zugriffs auf ihre Einzelelemente ist, muß sie nicht zwingend im Quelltext ausgeschrieben werden. Somit können alle Verfahren in Listing 1 gleichwertig verwendet werden.

Listing1:

Dim Ebenen As IntelliCAD.Layers
Dim Ebene As IntelliCAD.Layer
Dim Obj As Object

Set Doku = IntelliCAD.ActiveDocument
Set Ebenen = Doku.Layers
Set Ebene = Ebenen.Item("testlayer")
Set Ebene = Ebenen.Item(1)
Set Ebene = Ebenen("Testlayer")
Set Ebene = Ebenen(2)

Bitte beachten Sie, dass dieses Beispiel natürlich nur funktionieren kann, wenn Sie zuvor eine Zeichnungsebene “testlayer” angelegt haben.

Listing 2:

Dim Ebene As IntelliCAD.Layer
Dim Namen As String

Set Doku = IntelliCAD.ActiveDocument
For Each Ebene In Doku.Layers
   Namen = Namen & vbCr & Ebene.Name
Next
MsgBox Namen

Oftmals kommt es vor, dass man alle Ebenen der Zeichung bearbeiten möchte. Beispielsweise um bestimmte Eigenschaften zu setzen, oder nach ihnen zu suchen. Für derartige Iterationen kann wie bei allen anderen Collection-Objekten die For-Each-Schleife verwendet werden. Listing 2 zeigt dieses Verfahren an einem einfachen Programm, das die Namen aller in der Zeichnung enthaltenen Layer in eine Message-Box schreibt.

Das selbe Ergebnis können Sie auch mit einer Zählschleife erreichen. Dabei wird die Count-Eigenschaft des Collection-Objektes genutzt. Listing 3 liefert das einfache Beispiel.

Listing 3:

Dim Ebenen As IntelliCAD.Layers
Dim Ebene As IntelliCAD.Layer
Dim Namen As String
Dim Zaehler As Integer

Set Doku = IntelliCAD.ActiveDocument
Set Ebenen = Doku.Layers
For Zaehler = 1 To Ebenen.Count
   Set Ebene = Ebenen(Zaehler)
   Namen = Namen & vbCr & Ebene.Name
Next
MsgBox Namen

Auf die vorgenannte Weise erreichen Sie alle Zeichnungsebenen oder Teile davon. Wird gezielt nach genau einem Layer gesucht, können wahlweise diese beiden Methoden angewandt werden. Meistens wird dabei nach einem Layernamen gesucht. Bitte beachten Sie in diesem Fall, dass BricsCad bei der Namensgebung zwar keinen Unterschied zwischen Groß- und Kleinschreibung macht. Dafür aber der Zeichenkettenvergleich in VBA. Unter anderem aus diesem Grund empfiehlt sich die Verwendung eines anderen Verfahrens. Nämlich die Auswertung von Laufzeitfehlern, die beim Zugriff auf einen unbekannten Layernamen auftreten. In Listing 4 wird im Anschluß an die Variablendeklarationen der gesuchte Layername abgefragt und danach die „Resume Next“ Anweisung eingefügt. Sie veranlasst die weitere Programmabarbeitung, auch wenn ein Fehler auftritt. Wenn das der Fall ist, enthält die Variable Ebene den Wert „Nothing“. Genau das testet die abschließende If-Then-Eelse-Funktion. Für beide möglichen Fälle ist eine entsprechende Message vorgesehen.

Listing 4:

Dim Ebene As IntelliCAD.Layer
Dim Name As String
  
Set Doku = IntelliCAD.ActiveDocument
Name = InputBox("Gib den gesuchten Layernamen ein:")
On Error Resume Next
Set Ebene = Doku.Layers(Name)
If Ebene Is Nothing Then
   MsgBox "Layer nicht gefunden"
Else
   MsgBox "Layer vorhanden"
End If

Sie haben bis hier hin gesehen, wie ein Layer angesprochen wird. Nun kommen wir zu den mittels VBA beeinflussbaren Eigenschaften. Eine Übersicht dazu finden Sie in Tabelle 1. Das in der letzten Spalte enthaltene Beispiel setzt die Deklaration „Dim Ebene As IntelliCAD.Layer“ voraus. Bitte beachten Sie bei der Color-Eigenschaft, dass die Farbe „byLayer“ nicht zugelassen ist.

Tabelle 1:

Eigenschaft

VBA-Property

Typ

Beispiel

Layer ein-/ausschalten

LayerOjekt.Layeron

Boolean

Ebene.LayerOn = True (ein)
Ebene.LayerOn = False (aus)

Layer frieren/tauen

LayerObjekt.Freeze

Boolean

Ebene.Freeze = True (gefroren)
Ebene.Freeze = True (gefroren)

Layer sperren/entsperren

LayerObjekt.Lock

Boolean

Ebene.Lock = True (gesperrt)
Ebene.Lock = True (entsperrt)

Layername

LayerObjekt.Name

String

Ebene.Name = „XYZ“

Layerfarbe

LayerObjekt.Color

acColor

Ebene.Color= acGreen (grün)
Ebene.Color= 233 (Farbnummer)

Linientyp für den Layer

LayerObjekt.Linetype

String

Ebene.Linetype = „Continuous“

Eine Besonderheit stellt in diesem Zusammenhang die Festlegung des aktuellen Layers dar. Er ist eine Eigenschaft des Document-Objektes. Die beiden folgenden Seiten zeigen, wie er gesetzt bzw. abgefragt werden kann:

Set Doku = IntelliCAD.ActiveDocument
Doku.ActiveLayer = Doku.Layers("Testlayer")
MsgBox Doku.ActiveLayer.Name

Übrigens kann ein gefrorener Layer nicht aktiv gesetzt werden. Sie sollten also in Ihrem Programm erst testen, ob die Eigenschaft Freeze wahr oder falsch ist und gegebenenfalls auf True setzen, oder dem Anwender eine entsprechende Message zukommen lassen.

Listing 5:

Dim Ebene As IntelliCAD.Layer
Dim Name As String

Set Doku = IntelliCAD.ActiveDocument
Name = InputBox("Name des neuen Layers:")
On Error Resume Next
Set Ebene = Doku.Layers(Name)
If Ebene Is Nothing Then
   Set Ebene = Doku.Layers.Add(Name)
   Ebene.Delete
Else
   MsgBox "Layer existiert schon"
End If
 

Nachdem Sie nun auch noch wissen, wie die Eigenschaften der Layer manipuliert werden können, bleibt zu klären, wie man programmtechnisch einen neuen Layer erzeugt, bzw. einen vorhandenen löscht. Die Erzeugung erfolgt mittels der Add-Methode. Um abzusichern, dass kein neuer Layer mit einem schon vorhandenen Namen eingefügt wird empfiehlt es sich wieder, die bereits bekannte On Error Methode zu verwenden. Wie bei fast allen anderen BricsCad-Objekten erfolgt das Löschen von Layern unter Verwendung der Delete-Methode. Listing 5 zeigt zusammenhängend, wie ein Layer neu in die Zeichnungsstruktur eingefügt und anschließend wieder gelöscht werden kann.

Um das gerade erworbene Wissen praktisch an zu wenden, hier noch ein überschaubares Beispiel. Allerdings setzt es auch Kenntnisse aus einem vorangegangenen Kursteil voraus. Listing 6 enthält eine Prozedur, mit der interaktiv gewählte Layer ausgeschaltet werden können. Das Programm beginnt wie immer mit dem Deklarationsteil. Anschließend wird ein Selectionset angelegt und mittels SelectOnScreen im Modellbereich gefüllt. Im nächsten Schritt ermittelt die Routine den aktiven Layer, denn der darf nicht ausgeschaltet werden. In der folgenden For-Next-Schleife wird aus jedem gewählten BricsCad-Element der Layername bestimmt, dann die jeweilige Ebene gesetzt und schließlich deren Eigenschaft auf LayerOn=False geschaltet. Allerdings nur, wenn es sich nicht um den aktiven Layer handelt, dann gibt es nur eine Mitteilung auf dem Bildschirm. Zum Ende sollten Sie nicht vergessen den Auswahlsatz wieder zu löschen, sonst kommt es beim erneuten Aufruf des Programms zu einer Fehlermeldung (SelectionSet ist bereits vorhanden).
!!! In BircsCad Version 7.0.0011 stellten sich übrigens zwei eher ungewollte Effekte heraus:

  1. Nach Ablauf der Routine sind noch alle Elemente am Bildschirm markiert sichtbar. Das läßt sich umgehen, indem abschließend die Zeichnung regeneriert wird.
  2. Rufen Sie nach Abarbeitung des Programms den BricsCad-Explorer auf, können Sie bei den Layer-Einstellungen sehen, dass die entsprechenden Ebenen wirklich ausgeschaltet wurden. Sie stehen auf “AUS”. Nicht so im Menü. Ob das ein Bug ist?

Listing 6:

Dim EbSet As IntelliCAD.SelectionSet
Dim SelOb As Object
Dim AktLay As IntelliCAD.Layer
Dim Ebene As IntelliCAD.Layer

Set Doku = IntelliCAD.ActiveDocument
Set EbSet = Doku.SelectionSets.Add("Auswahl")
EbSet.SelectOnScreen
Set AktLay = Doku.ActiveLayer
For Each SelOb In EbSet
   LayNam = SelOb.Layer
   Set Ebene = Doku.Layers(LayNam)
   If LayNam <> AktLay.Name Then
       Ebene.LayerOn = False
   Else
       MsgBox ("Der aktuelle Layer kann nicht ausgeschaltet werden!!")
   End If
Next
EbSet.Delete
Doku.Regen
 

Viel Spaß beim ausprobieren ;-).

!!! Dieser Teil wird nicht mehr fortgesetzt, da VBA von BricsCad seit V8 kompatibel zu AutoCAD ist !!!

IBB INGENIEURBÜRO BATTEFELD  Bochum Nöckerstraße 37c
44879 Bochum
Tel: 0234-94172-0

 Mit Fragen oder Hinweisen wenden Sie sich bitte an
  

IBB INGENIEURBÜRO BATTEFELD  Leipzig Brahestraße 17
04347 Leipzig
Tel: 0341-2330465

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
 ---------------------------------------------------------------------------------------------------------------------------