AutoCAD... AutoLISP... VisualLISP...

  [67] znowu warstwy...

index  

  Od wersji 2004 AutoCAD-a, użytkownicy mają możliwość dodawania opisu do warstwy. Cecha ta umożliwia dodawanie rozszerzeń tekstowych dla każdej warstwy, w sytuacji kiedy nazwa warstwy może być niezrozumiała, lub niewystarczająca. Pomysłów na wykorzystywanie opisów warstw może być więcej. Dodawanie opisów możliwe jest w oknie dialogowym Menadżera warstw, lub też w linii poleceń, jako opcja polecenia _LAYER
Poniżej fragment okna dialogowego Menadżera warstw z zazaczoną kolumną opisów warstw:
Istnienie opisów warstw, jest przykładem elastyczności AutoCAD-a, ponieważ mogą one istnieć w każdej wersji programu. Opis nie jest jakąś nową cechą - wykorzystuje się tutaj możliwość dodawania danych dodatkowych (XDATA) do dowolnego obiektu (tutaj warstwy). Możliwość ta istnieje w AutoCAD-zie od wersji 10.
Opisy związane są z aplikacją o nazwie "AcAecLayerStandard", oraz "zajmują" dwa kody 1000, jeden to ciąg pusty, drugi wartość opisu warstwy. Jeżeli obiekt (warstwa) ma tak zdefiniowane dane dodatkowe, opis warstwy widoczny jest w oknie dialogowym menadżera warstw.

Poniżej prezentuję trzy funkcje LISP-owe, manipulujące na opisach warstw, umożliwiają one sprawdzenie czy warstwa posiada opis, a także dodawanie, zmianę i usunięcie opisu wartwy. Funkcje wygladają tak:
;;; -----------------------------------------------------------;;;
; Funkcja sprawdza czy warstwa ma dane dodatkowe, jezeli         ;
; nazwa alikacji to "AcAecLayerStandard" zwraca dane             ;
(defun jk:LAY_GetXDataDescript (Lay / el d)
  (if
    (setq el (tblobjname "LAYER" Lay))
    (if
      (setq d (cdr (assoc -3 (entget el '("*")))))
      (if
        (= (caar d) "AcAecLayerStandard")
        d
        nil
      )
      nil
    )
    nil
  )
)
;;; ----------------------------------------------------------;;;
; Funkcja dodaje opis dla warstwy, jesli nie istnieje, oraz     ;
; zmienia go gdy istnieje                                       ;
(defun jk:LAY_PutXDataDescript (Lay Val / ap el xd d)
  (if
    (setq el (tblobjname "LAYER" Lay))
    (progn
      (setq ap "AcAecLayerStandard")
      (if
        (not (setq xd (jk:LAY_GetXDataDescript Lay)))
        (if
          (not (tblsearch "APPID" ap))
          (regapp ap)
        )
      )
      (if
        (not xd)
        (jk:LAY_PutXData Lay
          (cons ap (list (cons 1000 "")(cons 1000 Val)))
        )
        (progn
          (jk:LAY_PutXData Lay
            (cons ap (list (cons 1000 "")(cons 1000 "")))
          )
          (jk:LAY_PutXData Lay
            (cons ap (list (cons 1000 "")(cons 1000 Val)))
          )
        )
      )
    )
    nil
  )
)
;;; ----------------------------------------------------------;;;
; Funkcja dodaje dane dodatkowe do obiektu                      ;
(defun jk:LAY_PutXData (Lay LData / d)
  (setq d (entget (tblobjname "LAYER" Lay)))
  (entmod (append d (list (list -3 LData))))
)
Przykładowe wywołania:
(jk:LAY_PutXDataDescript "Layer1" "To jest 1 warstwa")
dodaje opis "To jest 1 warstwa" do warstwy "Layer1" w przypadku gdy opis nie istnie, lub istnieje o innej treści.
z kolei:
(jk:LAY_PutXDataDescript "Layer1" "")
usuwa opis (przypisuje pusty łańcuch) warstwie "Layer1".

Zobacz również: [70] XDATA - dane dodatkowe
      aktualizacja: 01-08-2010