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

  [41] DXF 100

index  

  Każdy programujący w AutoLISP, prędzej czy pózniej sptka się z funkcją entmake. Gdy to nastąpi, prędzej czy pózniej napotka na kłopoty... Jednym z tych kłopotów będzie szczególny kod DXF, mianowicie kod 100. Za jego sprawą (czy też za sprawą jego braku) w pewnych sytuacjach entmake może odmówić posłuszeństwa...
Kody 100 DXF pojawiły się w AutoCAD-zie w wersji 13 (listopad 1994, wersja polska - czerwiec 1995). Wersja 13 była pod wieloma względami wersją przełomową. Jedną z bardzo znaczących zmian była przebudowa struktury rysunkowej bazy danych AutoCAD-a. Jedną z konsekwencji tych zmian jest pojawienie się kodów 100 w danych DXF obiektów.
Kod 100 to tzw. znacznik danych podklasy (subclass data marker), a związana z nim wartość to łańcuch tekstowy będący nazwą klasy pochodnej. Wymagany jest dla wszystkich obiektów i klas elementów, które pochodzą od innej konkretnej klasy. Potrzebne jest to w celu uporządkowania danych (określonych przez różne klasy) w łańcuchu dziedziczenia dla tego samego obiektu. Występowanie kodów 100 ilustruje hierarchiczną budowę bazy danych. Przykładowo dla łuku występują następujące kody 100:
(100 . "AcDbEntity")(100 . "AcDbCircle")(100 . "AcDbArc")
Należy zwrócić uwagę że wartości kodu 100 nie są powtórzeniem informacji zawartych w kodzie 0 (entity type: tutaj "ARC"), ponieważ kod 0 występuje tylko w formacie DXF, natomiast informacja zawarta w kodzie 100 odpowiada właściwości "ObjectName" modelu ActiveX.

Pomimo tego że dla wielu obiektów wywołanie entmake z listą na której nie znajdują się dane kodów 100, kończy się powodzeniem (obiekt jest tworzony a AutoCAD sam dodaje kody 100), należy jednak pamiętać że w większości przypadków, obecność tych kodów jest obowiązkowa. Dotyczy to wszystkich obiektów niegraficznych (tablic: ltype, layer, style etc), oraz większej części obiektów graficznych. Na swoje potrzeby przy wykorzystywaniu entmake zawsze podaję na liście kody 100, obiektów - w ten sposób unikam niemiłych niespodzianek.

(defun C:GET100 (/ s l)
  (while
    (setq s (entsel))
    (setq l (mapcar 'cdr
                    (vl-remove-if
                      '(lambda (%)(/= 100 (car %)))
                      (entget (car s))
                    )
            )
          l (mapcar '(lambda (%)(strcat % " ")) l)
    )
    (mapcar 'prompt l)
  )
  (princ)
)
Powyżej prezentowana definicja polecenia GET100, wyświetla w linii poleceń wartości kodów 100 wskazywanych obiektów (dotyczy pierwszego stopnia zagnieżdżenia - dla wskazanych atrybutów bloków, podane zostaną wartości odpowiednich bloków).