Чтобы получить xdata, связанные с определенным идентификатором приложения или несколькими идентификаторами приложения, просто укажите entget с необязательным аргументом applist
, следующим за аргументом имени объекта.
Этот аргумент представляет собой список идентификаторов приложений, для которых должны быть возвращены xdata (если они присутствуют в данных DXF, связанных с предоставленным объектом).
Например, если идентификатор вашего приложения равен "MyAppID"
, вы должны оценить функцию entget
следующим образом:
(entget <entity-name> '("MYAPPID"))
(Обратите внимание, что в этом примере я предоставил литеральный список в кавычках — для получения дополнительной информации об этом соглашении см. мои учебник по этому вопросу).
Чтобы помочь вам проверить все данные DXF (включая xdata), связанные с определенным объектом, я разработал Список объектов. программа.
При выборе полилинии из вашего чертежа с помощью этой программы или путем оценки entget
с аргументом списка приложений ("MYAPPID")
вы можете получить данные DXF, такие как:
(
(-1 . <Entity name: 7ffff706880>) ;; Pointer to self
(0 . "LWPOLYLINE") ;; Entity Type
(330 . <Entity name: 7ffff7039f0>) ;; Point to parent
(5 . "FFF") ;; Handle
(100 . "AcDbEntity") ;; Class
(67 . 0) ;; Tilemode
(410 . "Model") ;; Layout
(8 . "0") ;; Layer
(100 . "AcDbPolyline") ;; Subclass
(90 . 4) ;; Vertices
(70 . 1) ;; Bitwise flag (1=Closed)
(43 . 0.0) ;; Constant width
(38 . 0.0) ;; Elevation
(39 . 0.0) ;; Thickness
(10 18.9133 17.6315) ;; Vertex coordinate (OCS)
< ... additional vertex data ... >
(10 18.9133 12.7863) ;; Vertex coordinate (OCS)
(40 . 0.0) ;; Segment starting width
(41 . 0.0) ;; Segment ending width
(42 . 0.0) ;; Segment bulge
(91 . 0) ;; Vertex identifier
(210 0.0 0.0 1.0) ;; Extrusion (normal) vector
;; xData starts here:
(-3
(
"MYAPPID" ;; Application ID
(1002 . "{") ;; Data grouping opening brace
(1040 . 1.2345) ;; Real-valued (Double) data (your area value)
(1070 . 123) ;; Int-valued data (your polyline number)
(1000 . "MyPolyline") ;; String-valued data (your polyline name)
(1002 . "}") ;; Data grouping closing brace
)
)
)
Следовательно, доступ к списку xdata можно получить, получив группу DXF -3 из этого списка:
(assoc -3 (entget <entity-name> '("MYAPPID")))
Что вернет:
(-3
(
"MYAPPID" ;; Application ID
(1002 . "{") ;; Data grouping opening brace
(1040 . 1.2345) ;; Real-valued (Double) data (your area value)
(1070 . 123) ;; Int-valued data (your polyline number)
(1000 . "MyPolyline") ;; String-valued data (your polyline name)
(1002 . "}") ;; Data grouping closing brace
)
)
Если вы запрашиваете более одного идентификатора приложения, вы можете получить данные, связанные с вашим целевым идентификатором приложения, используя:
(cdr (assoc "MYAPPID" (cdr (assoc -3 (entget <entity-name> '("MYAPPID"))))))
Или, если вы возвращаете только xdata, связанные с одним идентификатором приложения, вы можете просто использовать:
(cdadr (assoc -3 (entget <entity-name> '("MYAPPID"))))
Здесь cdadr
является сокращением (cdr (car (cdr)))
.
Затем это вернет:
(
(1002 . "{") ;; Data grouping opening brace
(1040 . 1.2345) ;; Real-valued (Double) data (your area value)
(1070 . 123) ;; Int-valued data (your polyline number)
(1000 . "MyPolyline") ;; String-valued data (your polyline name)
(1002 . "}") ;; Data grouping closing brace
)
Из которого вы можете получить соответствующие значения либо с помощью assoc
, если групповые коды уникальны, либо выполнить итерацию по списку и полагаться на позиционирование пары ассоциаций.
Вот тестовая программа, которую вы можете попробовать:
(defun c:test ( / ent )
(if (setq ent (car (entsel)))
(print (cdadr (assoc -3 (entget ent '("MYAPPID")))))
)
(princ)
)
person
Lee Mac
schedule
01.02.2018