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

  [42] Obiekty niegraficzne (3)

index  

  Kolejna część o obiektach niegraficznych. (Zobacz: Obiekty niegraficzne [1] oraz Obiekty niegraficzne [2] - XRECORD). Teraz omówię sposoby dostępu do pewnych obiektów niegraficznych AutoCAD-a. Poprzednio wspomniane było o głównym słowniku do którego uzyskujemy dostęp uzywając funkcji namedobjdict. Ten słownik stanowi kontener w którym przechowywane są odwołania do wszystkich obiektów niegraficznych mu podległych. Bedą to słowniki, obiekty typu XRECORD, FIELDLIST itp. Przegladając zawartość (przez entget) tego słownika widać w jaki sposób te dane są zachowane. Każdy obiekt reprezentowany jest przez dwa kody: 3 i 350. Kod 3 to łańcuch tekstowy określający nazwę obiektu (w danych obiektu ta wartość nie występuje). Natomiast wartość kodu 350 to nazwa entycji (ename) tego słownika. Jest to tzw. zmienny identyfikator właściciela.
Nie da się pominąć konieczności wyjaśnienia co to są właśnie zmienne i sztywne identyfikatory obiektów. Określają one połączenia z innymi obiektami w rysunkowej bazie AutoCAD-a. Rozróżnia się dwa rodzaje odniesień: identyfikator właściciela i identyfikator wskaźnika, przy czym każdy z nich może być zmiennym albo sztywnym. Wskaźnik jest odniesieniem określającym użycie ale nie własność innego obiektu. Wskaźnik oznacza że obiekt posiada dostęp do innego obiektu (i może się nim dzielić). Natomiast odnośnik własności oznacza że obiekt odpowiada za obiekty do których posiada identyfikator właściciela. Wynika z tego ogólna zasada że, obiekt może mieć dowolną liczbę związanych z nim odniesień do wskaźników, ale tylko jednego właściciela. Różnica pomiędzy sztywnym a zmiennym identyfikatorem polega na zabezpieczeniu obiektu. Sztywne identyfikatory zabezpieczają obiekt przed skasowaniem. Większość identyfikatorów (choć nie wszystkie) są "tłumaczone" przez polecenia WSTAW (_INSERT) i ODNOSNIK (_XREF).

Wracając do obiektów znajdujących się w słowniku rozszerzeń (wiedząc już możemy użyć określenia "których właścicielem jest słownik rozszerzeń"), przedstawiam teraz funkcję dostępu do dowolnego słownika, zwracająca nazwy i/lub nazwy obiektów w słowniku. Funkcja ma dwa argumenty: Root - ename słownika sprawdzanego i Mode - określający typ zwracanej listy (tylko same nazwy czy też nazwy z ename). Funkcja wygląda tak:
; =============================================================================== ;
; zwraca lista słowników w innym słowniku. jezeli Mode=nil lista par kropkowych   ;
; z ename, jezeli =T - tylko sama lista                                           ;
; =============================================================================== ;
(defun jk:DCT_DictList (Root Mode / Tmp Lst)
  (setq Lst
    (mapcar
      '(lambda (%)
         (if
	   (= (type (cdr %)) 'STR)
	   (cons (car %)(strcase (cdr %)))
	   (cons (car %)(cdr %))
	)
      )
      (vl-remove-if
        '(lambda (%)
           (and (/= (car %) 3)(/= (car %) 350))
        )
        (entget Root)
      )
    )
  )
  (setq Tmp
    (mapcar
      '(lambda (%)(cdr %))
      (vl-remove-if
      '(lambda (%)(= (car %) 350))
         Lst
      ) 
    )		
  )
  (if Mode Tmp
    (mapcar
      '(lambda (%)
        (cons % (cdr (assoc 350 (member (cons 3 %) Lst))))
      )
      Tmp
    )
  )
)
; =============================================================================== ;
Po załadowaniu funkcji, można w linii poleceń AutoCAD-a ją wywołać: (jk:DCT_DictList (namedobjdict) T). Wynikiem może być lista podobna do tej:
( "ACAD_BACKGROUND"       "ACAD_COLOR"             "ACAD_FIELDLIST" 
  "ACAD_GROUP"            "ACAD_IMAGE_DICT"        "ACAD_LAYOUT" 
  "ACAD_MATERIAL"         "ACAD_MLEADERSTYLE"      "ACAD_MLINESTYLE" 
  "ACAD_PLOTSETTINGS"     "ACAD_PLOTSTYLENAME"     "ACAD_SCALELIST" 
  "ACAD_TABLESTYLE"       "ACAD_VISUALSTYLE"       "ACAEC" 
  "ACDB_RECOMPOSE_DATA"   "ACDBVARIABLEDICTIONARY" "AEC_DISP_REP_CONFIGURATIONS" 
  "AEC_DISP_REP_SETS"     "AEC_DISP_REPS"          "AEC_DISPLAY_PROPS_DEFAULTS" 
  "AEC_PROPERTY_SET_DEFS" "AEC_VARS"               "ASE_INDEX_DICTIONARY" 
  "BNS_VARIABLES"
)
Wywołanie ze zmienionym argumentem: (jk:DCT_DictList (namedobjdict) nil) zwraca:
( ("ACAD_BACKGROUND" . <Nazwa elementu: 7ed6be48>) 
  ("ACAD_COLOR" . <Nazwa elementu: 7eefbda0>) 
  ("ACAD_FIELDLIST" . <Nazwa elementu: 7ed69258>) 
  ("ACAD_GROUP" . <Nazwa elementu: 7eefbd80>) 
  ("ACAD_IMAGE_DICT" . <Nazwa elementu: 7ed81f00>) 
  ("ACAD_LAYOUT" . <Nazwa elementu: 7eefbc78>) 
  ("ACAD_MATERIAL" . <Nazwa elementu: 7eefbd98>) 
  ("ACAD_MLEADERSTYLE" . <Nazwa elementu: 7ed7ea40>) 
  ("ACAD_MLINESTYLE" . <Nazwa elementu: 7eefbd88>) 
  ("ACAD_PLOTSETTINGS" . <Nazwa elementu: 7eefbd90>) 
  ("ACAD_PLOTSTYLENAME" . <Nazwa elementu: 7eefbc48>) 
  ("ACAD_SCALELIST" . <Nazwa elementu: 7ed7ea30>) 
  ("ACAD_TABLESTYLE" . <Nazwa elementu: 7ed7ea20>) 
  ("ACAD_VISUALSTYLE" . <Nazwa elementu: 7ed7e998>) 
  ("ACAEC" . <Nazwa elementu: 7ed781f8>) 
  ("ACDB_RECOMPOSE_DATA" . <Nazwa elementu: 7ed7ed68>) 
  ("ACDBVARIABLEDICTIONARY" . <Nazwa elementu: 7eeffaf0>) 
  ("AEC_DISP_REP_CONFIGURATIONS" . <Nazwa elementu: 7ed686d0>) 
  ("AEC_DISP_REP_SETS" . <Nazwa elementu: 7ed68688>) 
  ("AEC_DISP_REPS" . <Nazwa elementu: 7ed68108>) 
  ("AEC_DISPLAY_PROPS_DEFAULTS" . <Nazwa elementu: 7ed68118>) 
  ("AEC_PROPERTY_SET_DEFS" . <Nazwa elementu: 7ed7bc40>) 
  ("AEC_VARS" . <Nazwa elementu: 7ed66628>) 
  ("ASE_INDEX_DICTIONARY" . <Nazwa elementu: 7ed6cc80>) 
  ("BNS_VARIABLES" . <Nazwa elementu: 7ed78108>)
)
Ponieważ funkcja została tak zaprojektowana że posiada dostęp do dowolnego słownika (określonego jako argument Root), nic nie stoi na przeszkodzie aby sprawdzić cóż znajduje się w słoniku ACAD_VISUALSTYLE (który znajduje się w głównym słowniku rozszerzeń). Wywołajmy:
(jk:DCT_DictList (cdr (assoc "ACAD_VISUALSTYLE" (jk:DCT_DictList (namedobjdict) nil))) T)
Zwrócona lista może wygladać tak:
( "2DWIREFRAME" "3D HIDDEN" "3DWIREFRAME" "BASIC" "BRIGHTEN" 
  "COLORCHANGE" "CONCEPTUAL" "DIM" "FACEPATTERN" "FLAT" 
  "FLATWITHEDGES" "GOURAUD" "GOURAUDWITHEDGES" "LINEPATTERN" 
  "REALISTIC" "THICKEN"
)
Wyposażeni w niezbędną wiedzę i narzędzia jesteśmy już gotowi do wykonania wielu "misji" w głąb niegraficznych obiektów AutoCAD-a... ;)
Zobacz także: Obiekty niegraficzne (1) , Obiekty niegraficzne (2) , Własny XRECORD,