Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Sergey_K от 15-08-2019, 11:49:36

Название: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 11:49:36
Поиск ничего не дал. Возможно ли при выборе примитива, содержащего xData, добавить их(его) в окно свойств?
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 11:53:20
добавить их(его) в окно свойств?
Их (его) это о чем? Что должно быть в окне свойств?
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 11:58:41
Александр Ривилис,  xData примитива. int, double, string, enum tag, string list
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 12:10:01
Александр Ривилис,  xData примитива. int, double, string
Понятно. Не самое простое приложение будет. Нужно создавать COM-сервер, который добавляет динамические свойства в Панель свойств (OPM). Если установлен ObjectARX Wizard, то создать заготовку можно так:

(https://live.staticflickr.com/65535/48542289036_4a04c7a100_o.png)
Сразу скажу, что это будет очень не просто.

Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 12:25:47
Александр Ривилис, ObjectARX Wizard установлен. Но там всего 3 пункта.

(https://i.postimg.cc/jCdC2cvc/2019-08-15-122056.jpg) (https://postimg.cc/jCdC2cvc)

А без COM никак?
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 12:33:20
А без COM никак?
Есть еще НЕ-COM API, но оно недоделанное. Наверняка на проблемы нарвешься:
https://adn-cis.org/search.html?query=%D0%9D%D0%95-COM
Александр Ривилис, ObjectARX Wizard установлен. Но там всего 3 пункта.

Не там. После создания проекта через ObjectARX Wizard (обязательно выбрать режим "Implement COM-server..."):

(https://live.staticflickr.com/65535/48542380596_a7ed6c24ff_o.png)

А вот после этого Project->Add New item...:

(https://live.staticflickr.com/65535/48542537207_157805e78a_o.png)
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 12:50:36
Есть еще НЕ-COM API, но оно недоделанное
Не-COM уже обсуждалось https://adn-cis.org/forum/index.php?topic=9213.0 (https://adn-cis.org/forum/index.php?topic=9213.0)
C COM не общался и рыбу толковую не нашёл. Как я понимаю, кроме геморроя с кодом там ещё будет геволт с регистрацией com-сервера и админправами. Очень не хотелось бы вляпаться в это удовольствие...

Не COM на custom entity работает (int, double, string). Крайне не хватает string list (enum). И как прикрутить xData к не-com ума не приложу )
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 12:52:09
И как прикрутить xData к не-com ума не приложу )
Так же как и любые другие данные. Сам должен придумать логику работы.
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 12:58:30
Так же как и любые другие данные. Сам должен придумать логику работы

Логику придумать - дело третье. Первое - как активировать без custom entity эти проперти в выбранном примитиве(примитивах)
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 13:03:27
Пример отсюда смотрел: https://adn-cis.org/perezentacziya-(devtv)-ne-com-sistema-svojstv.html ?

P.S.: Всё-таки рекомендую через COM-сервер. В админских правах необходимости нет. Здесь уже обсуждалось.
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 13:12:29
Смотрел. Оттуда и взял. Enum там не рабочий
В админских правах необходимости нет
А как же регистрация com-сервера?
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 15-08-2019, 13:24:26
А как же регистрация com-сервера?
То что нужно, регистрируется под обычным пользователем: https://adn-cis.org/forum/index.php?topic=7087.msg21074#msg21074

Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 15-08-2019, 13:34:29
Александр Ривилис,  буду пробовать )
Хотя не-com бы прикрутил, даже недоделанный... Если получится активировать
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 29-08-2019, 13:28:08
Соорудил с помощью Wizard COMserver + EnumDynamicProperties
Регистрация сервера проходит, свойство отображается.
Но при выгрузке модуля и попадании курсора на примитив, которому было задано COMсвойство Autocad слетает с fatal error.

Похоже, что COM-properties некорректно выгружается... ?? Код оригинальный, ничего своего - только wizard
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 29-08-2019, 13:29:35
Но при выгрузке модуля и попадании курсора на примитив, которому было задано COMсвойство Autocad слетает с fatal error.

Похоже, что COM-properties некорректно выгружается... ?? Код оригинальный, ничего своего - только wizard
Модули с COM-объектом нельзя выгружать. Если быть точным, то можно, но тогда нужно создавать не с помощью wizard. Но это очень громоздко получается. Я в своё время на это плюнул, так как выгрузка нужна только для отладки...
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 29-08-2019, 13:44:19
Александр, ясно.
Ещё один вопрос:
Два свойства. Одно зависит от другого. При изменении ведущего возникает необходимость сообщить зависимому, что оно изменено и список нужно обновить. Как это сделать? Не могу найти

Если быть точным, то можно, но тогда нужно создавать не с помощью wizard

Можно и руками, если понять схему выгрузки, а ещё лучше + пример
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 29-08-2019, 14:33:47
При изменении ведущего возникает необходимость сообщить зависимому, что оно изменено и список нужно обновить. Как это сделать? Не могу найти
В XXX::SetCurrentValueData вызываешь:
Код - C++ [Выбрать]
  1. if (m_pNotify) m_pNotify->OnChanged(pUnk);
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 29-08-2019, 14:45:01
if (m_pNotify) m_pNotify->OnChanged(pUnk);

Дело не в этом, а в том что нужно вызвать метод одного класса из другого класса...
Из одного пропертия обновить другое.
При том что переменные динамические, ещё и поймать момент, когда значения действительны
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 29-08-2019, 14:54:49
Из одного пропертия обновить другое.
Так не получится. Изменение какого-то динамического свойства (через SetCurrentValueData) приводит к вызову GetCurrentValueData для других свойств ассоциированных с этим объектом (объектами). Так, например, работает у меня в GeomProps, когда меняют "Линейный масштабный коэффициент". При этом все ассоциированные свойства (периметр, площадь, объем) пересчитываются.
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 29-08-2019, 15:07:06
Так не получится. Изменение какого-то динамического свойства (через SetCurrentValueData) приводит к вызову GetCurrentValueData для других свойств ассоциированных с этим объектом

У меня не приводит... Имеются 2 enuma. Изменение одного, должно вызывать изменение списка второго. Но список обновляется только при сбросе набора и повторном выборе.
По идее, если в момент между connect и disconnect передать два указателя *m_pNotify и this, то из SetCurrentValueData одного свойства можно вызвать m_pNotify->OnChanged(this) другого...
Название: Re: xData примитива в окно Properties
Отправлено: Александр Ривилис от 29-08-2019, 15:13:22
По идее, если в момент между connect и disconnect передать два указателя *m_pNotify и this, то из SetCurrentValueData одного свойства можно вызвать m_pNotify->OnChanged(this) другого...
Очень сильно сомневаюсь. В COM такие вещи не делают. Почитай в Autodesk ObjectARX for AutoCAD 20XX: Developer's Guide > Using COM for ObjectARX Development > Property Inspector and Properties Palette APIs > Property Inspector Notification Framework >
Setting Up Property Event Notifications
. Может что-то полезное раскопаешь.
Название: Re: xData примитива в окно Properties
Отправлено: Sergey_K от 30-08-2019, 11:30:52
Решилось гораздо проще, без хитромудрых интерфейсов COM:
1. сохранить указатель на объект класса свойства
2. из другого свойства через указатель - установка нужных значений локальных переменных класса, например    m_enumLenght,  *m_enumType, m_readOnly и т.д.
И не трогать динамические переменные COM интерфейса