VBA - selectionset, tworzenie nowej warstwy


Rekomendowane odpowiedzi

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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie