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

  [22] Obiekty niegraficzne (2) - XRECORD

index  

  Jak wcześniej wspomniano (Obiekty niegraficzne [1]) słownik zawiera informacje tylko o występowaniu obiektów, w których dopiero znajdują się właściwe dane. AutoCAD zachowuje elementy takie jak style multilinii definicje grup, zakładki itd. jako obiekty w słownikach. Są to różnego rodzaju obiekty przystosowane do przechowywania pewnych danych. Obiektami takimi są np. GROUP (dla słownika ACAD_GROUP), LAYOUT (dla słownika ACAD_LAYOUT), MLINESTYLE (dla ACAD_MLINESTYLE) itd. Obiekty te złożone są z odpowiednich kodów grup DXF tak aby odpowiednio przechowywać informacje. Z punktu widzenia programującego w AutoLISP-ie, najważniejszym w tej chwili obiektem będzie obiekt o nazwie XRECORD. Obiekty XRECORD są używane do zapamiętywania i zarządzania dowolnymi danymi. Są złożone z kodów grup DXF z grupami "zwykłych obiektów" (nie dotyczą jednak kodów grup danych dodatkowych). Obejmują zakres od 1 do 369. Obiekt ten jest pomyślany jak dane dodatkowe, ale nie jest ograniczony co do rozmiaru lub porządku. Utworzenie obiektu XRECORD nie wymaga również rejestracji aplikacji (tak jak ma to miejsce przy danych dodatkowych). XRECORD możemy dopisać do dowolnego słownika (również bezpośrednio do słownika nazwanych obiektów). Struktura DXF danych obiektu XRECORD jest (podobnie jak wszystkich pozycji rysunkowej bazy danych) listą par kropkowych. Nazwą obiektu (kod 0) jest łańcuch "XRECORD", a podklasą obiektu (kod 100 jest łańcuch "AcDbXrecord"). Następnie występują dowolne kody grup DXF z zakresu od 1 do 369 (z wyjątkiem kodu 5 i 105). Warto zaznaczyć że poszczególne kody mogą się powtarzać. Proces utworzenia XRECORD sprowadza się do sformatowania listy DXF i przekazania jej do funkcji entmakex. Podobnie jak dla obiektów DICTIONARY, funkcja dictadd dodaje tak utworzony obiekt XRECORD do wskazanego słownika.

Zdefiniujmy teraz funkcję tworzącą obiekt typu XRECORD:
;;; -------------------------------------------------------------;;;
;;; Funkcja tworząca obiekt typu XRECORD w słowniku [Root] o na- ;;;
;;; zwie [XRECNAME] z danymi [XRECDATA].                         ;;;
;;;                                                              ;;;
(defun jk:DCT_MakeXRec (Root XrecName XRecData Msg?
		              / Lst Test NewXRec
		             )
  (setq Lst (list (cons 0 "XRECORD")
		  (cons 100  "AcDbXrecord")
	    )
  )
  (setq Test (jk:DCT_isDict? Root XrecName))
  (if
    (not Test)
    (progn
      (setq XRecData (append Lst XrecData))
      (setq NewXRec (entmakex XrecData))
      (dictadd Root XRecName NewXRec)
    )
    (if Msg?
      (alert
	    (strcat "Obiekt o nazwie "
		        XrecName
                    " już istnieje."
	    )
      )
    )
  )
)

;;; -------------------------------------------------------------;;;
;;; Funkcja sprawdza czy w rysunku istnieje słownik o nazwie     ;;;
;;; [DictName]. Argument [Root] określa wskaznik słownika wlaści-;;;
;;; ciela. Zwraca T lub Nil                                      ;;;
;;;                                                              ;;;
(defun jk:DCT_isDict? (Root DictName)
  (if (dictsearch Root DictName) T nil)
)
Po załadowaniu programu, można w linii poleceń AutoCAD-a wywołać funkcję:
(setq X 
  (jk:DCT_MakeXRec                       ; <- twórz XRECORD
    (namedobjdict)                       ; <- w glownym slowniku
    "JK_DANE"                            ; <- o nazwie
    '((1 . "ABC")(2 . "XYZ")(10 0 0 0))  ; <- z danymi
    T                                    ; <- alert jesli juz jest
  )
)
funkcja zwraca np: <Nazwa elementu: 2369798>
Sprawdzmy zawartość XRECORD. Zatem wywołanie:(entget X) zwraca listę:
((-1 . <Nazwa elementu: 2369798>)(0 . "XRECORD")(5 . "21C3") 
(102 . "{ACAD_REACTORS")(330 . <Nazwa elementu: 234a060>)(102 . "}")
(330 . <Nazwa elementu: 234a060>)(100 . "AcDbXrecord")(280 . 1) 
(1 . "ABC")(2 . "XYZ")(10 0.0 0.0 0.0))
Jak widać obiekt został utworzony, AutoCAD automatycznie dodał swoje kody z wartościami domyślnymi (kody -1, 5, 102, 330, 280).
     
Powyżej: Obiekt typu XRECORD został dodany do słownika nazwanych obiektów, co potwierdza przeglądarka rysunkowej bazy danych AutoCAD-a.
Zobacz także: Własny XRECORD, Obiekty niegraficzne (1)