Praca z warstwami

(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))

(defun PobierzWarstwy ( / Warstwy IleWarstw WarstwaX NazwaWarstwy Wynik i )
;----------------------------------------------------------
;Funkcja wynkcja czyta wszystkie nazwy wartstwy z aktulnego rysunku
;Argumenty: brak
;Wynik: lista nazw wszystkich warstw z rysunku
;----------------------------------------------------------

(setq *Rysunek* (vla-get-activedocument *ZWCAD*)) ; *Rysunek* jest od teraz zmienną globalną ponieważ nie jest wymieniony w liście zmiennych lokalnych
(setq Warstwy(vlax-get-property *Rysunek* 'Layers)) ; funkcja ta zwraca kolekcję* warstw z rysunku.
(setq IleWarstw (vlax-get-property Warstwy 'Count )); pobranie ilości elementów kolekcji
(setq i 0)
(repeat IleWarstw
(setq WarstwaX(vlax-invoke-method Warstwy 'Item i)) ; pobranie elementu z kolekcji
(setq NazwaWarstwy(vlax-get-property WarstwaX 'Name)); pobranie nazwy elementu
(setq i (+ i 1))
(setq Wynik (append Wynik (list NazwaWarstwy ))); dołączenie do listy zwracanej przez funkcje
)
Wynik
)


(defun C:Przypiszwarstwe ( / Wzorzec DoZmiany WzorzecObj DoZmianyObj )
;----------------------------------------------------------
;funkcja prosi Użytkownika o wskazanie elementu wzorcowego
; a następnie prosi o wskazanie następnego elementu,
; który przeniesiony zostanie na warstwę elementu wzorcowego
;Argumenty: brak
;Wynik: brak
;----------------------------------------------------------

(setq Wzorzec (entsel "Wskaż element wzorcowy")) ;entsel prosi użytkownika o wskazanie jednego elementu i zwraca listę: ( identyfikator klikniętego elementu i kliknięty punkt)
(setq DoZmiany (entsel "Wskaż element do zmiany"))
(setq WzorzecObj (vlax-ename->vla-object(car Wzorzec)))
(setq DoZmianyObj (vlax-ename->vla-object(car DoZmiany)))
(vlax-put-property DoZmianyObj 'Layer (vlax-get-property WzorzecObj 'Layer))
)

(defun PobierzWarstwe (Nazwa / Warstwy Warstwa )
;----------------------------------------------------------
;funkcja pobiera obiekt warstwy na podstawie jej nazwy
;Argumenty: Nazwa warstwy
;Wynik: Obiekt warstwy, lub nil jeśli warstwa o danej nazwie nie istnieje w rysunku
;----------------------------------------------------------
(setq Warstwy (PobierzWarstwy))
(if (member Nazwa Warstwy )
(progn
(setq Warstwy(vlax-get-property *Rysunek* 'Layers)) ; możemy użyć zmiennej, *Rysunek* ponieważ jej wartość została ustalona wewnątrz funkcji (PobierzWarstwy). Oczywiście nie jest to zalecane rozwiązanie ponieważ wartość zmiennej mogłaby być zmieniona w innej funkcji i konieczne byłoby pamiętanie o wszystkich zmianach wartości. Natomiast w celach prezentacyjnych oczywiście możemy posłużyć się taką konstrukcją.
(setq Warstwa (vla-item Warstwy Nazwa))
)
(setq Warstwa nil )
)
Warstwa ; wartość zwracana
)

(defun C:Przypiszwarstwe2 ( / Wzorzec DoZmiany WzorzecObj DoZmianyObj )
;----------------------------------------------------------
;funkcja zmodyfikowana wersja funkcji Przypiszwarstwe
;zakres modyfikacji: Obsługa sytuacji, gdy element do zmiany jest na warstwie zablokowanej lub zamrożonej
;Argumenty: brak
;Wynik: brak
;----------------------------------------------------------

(setq Wzorzec (entsel "Wskaż element wzorcowy")) ;entsel prosi użytkownika o wskazanie jednego elementu i zwraca listę: ( identyfikator klikniętego elementu i kliknięty punkt)
(setq DoZmiany (entsel "Wskaż element do zmiany"))
(setq WzorzecObj (vlax-ename->vla-object(car Wzorzec)))
(setq DoZmianyObj (vlax-ename->vla-object(car DoZmiany)))
(setq WarstwaWzoru (vlax-get-property WzorzecObj 'Layer))
(setq WarstwaDoZmiany (vlax-get-property DoZmianyObj 'Layer))
(setq WarstwaDoZmianyObj (PobierzWarstwe WarstwaDoZmiany))

(if (and
(= (vlax-get-property WarstwaDoZmianyObj 'freeze ) :vlax-false)
(= (vlax-get-property WarstwaDoZmianyObj 'lock ) :vlax-false)
)
(vlax-put-property DoZmianyObj 'Layer WarstwaWzoru)
(alert (strcat "Warstwa " WarstwaDoZmiany " jest zablokowana lub zamrożona"))
)

)



; KOLEKCJA*
; kolekcja to zbiór obiektów tego samego określonego typu.
; Jest to coś podobnego do listy z tą różnicą, że listy mogą zawierać obiekty różnych typów, W jednej liście mogą być zawarte wartości liczbowe, teksty, identyfikatory plików i wszystko inne. Kolekcja może zawierać obiekty tylko jednego typu np bloki, warstwy, style tekstu.
;Elementy kolekcji są identyfikowane podobnie jak listy PRZEZ INDEKS, ale w odróżnieniu od list elementy kolekcji moga być identyfikowane PRZEZ NAZWĘ.
;Kolekcja jest obiektem, więc można się odwoływac do jej właściwości, np ilość elementów zwracana jest przez właściwość Count

Wykonanie w ZWCAD 2015+LISP PrzypiszWarstwe 2015

LISP PrzypiszWarstwe2 2015

Wykonanie w ZWCAD ClassicLISP PrzypiszWarstwe Classic

LISP PrzypiszWarstwe2 Classic