W tym skrypcie LISP odczytamy stan warstw oraz przeniesiemy obiekty pomiędzy warstwami.

 

Operacje na warstwach

 

Polecenie do uruchomienia skryptu LISP: Przypiszwarstwe i Przypiszwarstwe2

 

Kod źródłowy z opisem

 

;;; Operacje na warstwach
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: Przypiszwarstwe i Przypiszwarstwe2
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/117-warstwy.html
(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 2023

 operacje na warstwach

 

Wykonanie w ZWCAD 2015

LISP PrzypiszWarstwe 2015

 

LISP PrzypiszWarstwe2 2015

 

Wykonanie w ZWCAD Classic

LISP PrzypiszWarstwe Classic

LISP PrzypiszWarstwe2 Classic