Autocad 2017 Извлечение Xdata excel lisp

Я знаю, что должен быть способ извлечь пользовательские Xdata из чертежа Autocad.

Может ли кто-нибудь указать мне в правильном направлении, где искать?

Я ищу метод или AutoLISP, который будет собирать/извлекать пользовательские добавленные Xdata из набора полилиний. Эти полилинии будут иметь следующие пользовательские Xdata;

  • Имя
  • Число
  • Площадь (учитывая, что они закрыты)

Стандартный метод «Извлечь данные» в Autocad не извлекает никаких имен или других ссылок на извлеченные данные. Таким образом, невозможно сказать, какие данные взяты из какой полилинии.

Любая помощь будет принята с благодарностью.


person Michel85    schedule 31.01.2018    source источник


Ответы (2)


Чтобы получить 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

Самый простой способ получить XData из объекта с помощью LISP:

(assoc -3 (entget entity (list "*")))

Пример кода попросит вас выбрать объект и отобразит его XData.

(assoc -3 (entget (car(entsel )) (list "*")))

Теперь Вам нужно решить, что делать с этой информацией. Например, вы можете сохранить его в файл CSV, где каждая строка будет одной сущностью, а в первом столбце написать дескриптор объекта (чтобы получить связь между сущностью и данными), а затем извлечь данные.

person CAD Developer    schedule 31.01.2018