VBA - selectionset, tworzenie nowej warstwy


Recommended Posts

Witam.

Mam taki problem z dwoma programikami:

1.Program powinien wybierać okręgi o promieniu 5, niestety tylko je podświetla ale nie utrzymuje zaznaczenia :(. Why?

Sub wybieranie()
Dim ssh As ZwcadSelectionSet
Dim Ftyp(1) As Integer
Dim Fdat(1) As Variant
Dim F1, F2 As Variant
Ftyp(0) = 0: Fdat(0) = "CIRCLE"
Ftyp(1) = 40: Fdat(1) = 5#
Set ssh = Thisdocument.SelectionSets.Add("ssh")
F1 = Ftyp
F2 = Fdat
ssh.Delete
ssh.Select zcSelectionSetAll, , , F1, F2
ssh.Highlight True
End Sub

2. Drugi program miał tworzyć warstwę tak jak normalnie w menadżerze (kopiując style linii, kolor itp.). Kod wygląda następująco:

Sub war()
Dim k As String
Dim gl As String
Dim sl As String
Dim d As String
Dim z As String
Dim zab As String
Dim n As String

Dim zero As ZwcadLayer
Dim jeden As ZwcadLayer

Set zero = Thisdocument.Layers("0")
   k = zero.Color
   gl = zero.LineWeight
   sl = zero.Linetype
   d = zero.Plottable
   z = zero.Freeze
   zab = zero.Lock
   n = zero.LayerOn

Set jeden = Thisdocument.Layers.Add("1")
   jeden.Color = k
   jeden.LineWeight = gl
   jeden.Linetype = sl
   jeden.Plottable = d
   jeden.Freeze = z
   jeden.Lock = zab
   jeden.LayerOn = n

Thisdocument.Regen
End Sub

Czy jest jakiś krótszy sposób odczytania danych z istniejącej warstwy albo innego obiektu? I dlaczego jak mam zablokowaną, zamrożoną lub niewidoczna warstwę to wyskakuje błąd?

Z góry dzięki za pomoc.

Pozdrawiam

Link to comment
Share on other sites

W temacie SelectionSet samo podświetlanie powinno działać właśnie tak jak działa, czyli Highlight nie zmienia aktualnie wybranych obiektów a jedynie je podświetla. Natomiast, żeby selectionset rzeczywiście wybrać, należałoby użyć Thisdocument.ActiveSelectionSet. niestety ZWCAD 2012 jakoś generuje błąd w tym miejscu. Zgłosiliśmy to Producentowi

A czy konieczne ta procedura musi być obsługiwana przez VBA? może mógłby Pan zastąpić ją funkcją w LISP. Tam jest dostępna funkcja sssetfirst, która zmienia wybrane obiekty i działa to dobrze.

W sprawie Warstw jest kilka kwestii.

1. Definiuje Pan zmienne jako String. Niby można ale nie jest to najlepsze rozwiązanie. Zmienne powinny mieć taki typ danych użyty w definicji warstwy. Więc kolor jako Integer, nazwa String, zablokowany czy widoczny Boolean itd.

2. Jeśli warstwa jest zablokowana kolor zmieniany jest na liczbę przeciwną. W tym przypadku wystarczy użyć wartości bezwzględnej.

3. Szybszym sposobem jest przepisanie wartości bezpośrednio z warstwy do warstwy, bez konieczności używania dodatkowych zmiennych. Czyli gotowy kod wyglądałby następująco:

Sub war()
Dim zero As ZwcadLayer
Dim jeden As ZwcadLayer
Set zero = Thisdocument.Layers("0")
Set jeden = Thisdocument.Layers.Add("1")
With jeden
   .Color = Abs(zero.Color)
   .LineWeight = zero.LineWeight
   .Linetype = zero.Linetype
   .Plottable = zero.Plottable
   .Freeze = zero.Freeze
   .Lock = zero.Lock
   .LayerOn = zero.LayerOn
End With
Thisdocument.Regen
End Sub

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share