Тема: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?
Имеется ввиду аналог entget (например, (entget obj '("ext_data")) ).

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

А зачем же из Lisp добираться к расширенным данным через ActiveX? Надо работать напрямую.

Работа с расширенными данными из Lisp разжевана подробно и в help и в книжках.

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Расширенные данные в LISP и ActiveX - организованы по разному и считать расширенные данные записынные обычными средствами LISP из ActiveX - нельзя.
В ActiveX у всех объектов есть свои расширенные данные, которые управляются методами GetXData и SetXData. Но в качестве расширенных данных здесь может быть только массив (SafeArray) из данных одного типа. Это не в большинстве случаев очень удобно. С моей точки зрения единственное достоинство (по сравнению с Lisp) это то что можно приписывать данные к таким объектам, к которым нельзя приписать с помощью LISP. Наример слоям, стилям, видам, Layout - чему угодно.

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Выше хотел написать "Это  в большинстве случаев НЕ очень удобно"

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

На самом деле это просто разное представление данных.
Список лиспа газвертывается в два массива ActiveX
В первом массиве CAR во втором CDR
И расширенные данные из лиспа приписываются ко всему, а не только к примитивам. Например текстовый стиль с TTF хранит в расширенных данных имя TTF файла.(Имя приложения "ACAD")

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Для всех ответивших.
Как написано в книгах, при создании реакторов нужно ипользовать VLA-объекты и аналоги (entget,например) для ActivX, а не сами эти функции. А мне во время выполнения реактора надо получить расширенные данные. Так как мне посоветуете поступить?

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Не знаю, что написано в книгах, но entget работает изнутри реактора, ведь эта функция никак не изменяет содержимое базы данных примитивов Автокада, а только считывает из нее.

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Понимаю, что речь идет об "аналоге" функции  entget для LISP, а не самой entget, и Вам необходимо получить список с расширенными данными примитива. Для этого возможно преобразование объекта в vla-объект помощью vlax-ename->vla-object (примитив). Перед этим необходимо, конечно, загрузить функции расширения AutoLISP для ActiveX:
(vl-load-com)
;В качестве выбора объекта (примитива) используйте, например,
(setq pt_per (entsel "\nChoice object:   "))
(setq ent_name (car pt_per))
(setq vla-obj(vlax-ename->vla-object ent_name))
;Далее можно "вытаскивать" свойства, в зависимости от типа примитива, например,
(setq length_obj(vlax-get-property vla-obj 'length)) ; Это может быть длиной линии, если примитив - линия.
(setq char_object (entget (car pt_per)))
(setq type_object (cdr (assoc 0 char_object))); = "LINE"
;Все свойства VLA объекта можно посмотреть в перечне:
(vlax-dump-object vla-obj)
;При создании реактора объектов, используется функция vlr-object-reactor, для которой необходимо определить "владельца" (owners) VLA объекта или объектов, здесь - это vla-obj, данные LISP (data), ассоциированные с реактором объекта, здесь - это длина линии length_obj и реакции (callbacks), здесь - это вывод новой длины.
(vlr-object-reactor (list vla-obj) length_obj '((:vlr-modified . print-length)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun print-length ()
(vlax-get-property vla-obj 'length)
)
После изменения длины применяем функцию:
(print-length)
Здесь показан только принцип доступа к расширенным данным объектов и построение на их базе реактора.
Успехов!

Re: Как получить доступ к расширенным данным объектов с помощью ActivX в Lispе?

Shura-Alex, вы путаете расширенные данные примитивов и обычные свойства примитивов, пример работы с которыми Вы описали.