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

ADN Club => AutoCAD .NET API => Тема начата: avc от 09-11-2015, 12:49:43

Название: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 12:49:43
Хочу поднять старую тему: добавление пользовательских свойств к объектам чертежа и отображение их в панели свойств (OPM) и диалоге QSelect. По всему интернету на эту тему есть только одна статья Kean Walmsley от 2009 года http://through-the-interface.typepad.com/through_the_interface/2009/03/exposing-autocads-properties-palette-functionality-to-net---part-1.html (http://through-the-interface.typepad.com/through_the_interface/2009/03/exposing-autocads-properties-palette-functionality-to-net---part-1.html). На тот момент никакого доступа к OPM из кода на C# не было и надо было писать отдельный плагин на C++. Хотелось бы узнать у знатоков:
1.   Не изменилась ли ситуация к лучшему за последние 6 лет? Может уже появилось API под .Net ?
2.   Я смог, в конце концов, откомпилировать пример из той статьи, но свойства, добавляемые этим способом, появляются только в OPM, но не появляются в диалоге QSelect. Почему так? Я попробовал компилировать другие примеры на чистом ObjectARX (например, вот этот http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html (http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html)) и в результате получил полноценные свойства, которые видны и там и там. К сожалению, я не могу использовать эти примеры для своего проекта – моих знаний в C++ не хватает даже для замены свойства double на строковое :(

Спасибо.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 13:18:04
1.   Не изменилась ли ситуация к лучшему за последние 6 лет? Может уже появилось API под .Net ?
Нет. И вряд ли когда-то появится.
 
добавляемые этим способом, появляются только в OPM, но не появляются в диалоге QSelect. Почему так?
Сложно сказать. Откуда берутся свойства в QSELECT нигде не документировано. Думаю что в него попадают только статические свойства собственных примитивов (Custom Entity), а не динамические (как например сделано в моём GeomProps), которые в статье Kean Walmsley описаны.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F4205%2F7842324.4%2F0_10f937_60b246f7_orig.png&hash=a86bb7bea0b6bec54cc827f56a6d33e0)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F15595%2F7842324.4%2F0_10f938_4382b9f7_orig.png&hash=3577bd9a2d8ce60efad644ae9814aedf)

Мне совершенно непонятно зачем вообще добавлять в QSELECT свои свойства. Если бы мне нужно было бы отбирать примитивы по своим критериям, то я бы написал свою команду, которая это делает.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Андрей Бушман от 09-11-2015, 13:32:12
Средствами AutoCAD .NET API можно создать свою, специализированную панель свойств (либо целый набор различных вкладок) и наполнять её произвольным контентом (хоть WinForms, хоть WPF, хоть обеими сразу), каким душа пожелает. Делается это достаточно просто и работает надёжно.

Несомненно, модернизировать уже существующую "родную" панель свойств - это заманчиво, но в виду сложности сего действа я бы не стал испытывать судьбу в этом направлении.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 13:39:51
Как все печально... Мало того, что пользователям не дали самим добавлять свойства, так и программистам усложнили жизнь как могли.. Политика Автодеска?
Цитировать
в него попадают только статические свойства
В коде http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html создаются именно динамические свойства. И они работаю как надо.
Цитировать
зачем вообще добавлять в QSELECT свои свойства
Диалог поиска объектов по свойствам - одно из самых удобных изобретений автокада. Вряд ли пользователь обрадуется, если ему скажут, что искать окружности по радиусам надо одной командой, а по площади - другой.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Андрей Бушман от 09-11-2015, 13:42:45
Диалог поиска объектов по свойствам - одно из самых удобных изобретений автокада. Вряд ли пользователь обрадуется, если ему скажут, что искать окружности по радиусам надо одной командой, а по площади - другой.
Ты можешь подменить эту команду [QSELECT] своей. GUI реализовать по подобию оригинала, добавив в него тот функционал, который ты планировал. Т.о. для пользователя это будет работать прозрачно, как будто это родная команда автокада.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 13:47:13
Цитировать
можно создать свою, специализированную панель свойств
Так и работаем последние 10 лет, с двумя панелями свойств на одном экране. Случайно увидел, что люди как-то заталкивают новые свойства в стандартную панель - обрадовался. Но увы...
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 13:57:14
Мало того, что пользователям не дали самим добавлять свойства, так и программистам усложнили жизнь как могли.. Политика Автодеска?
Это мы не обсуждаем на форуме: п. 3.9 Правил.
В коде http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html создаются именно динамические свойства. И они работаю как надо.
Там совершенно другая логика подключения свойств. Ну и эти свойства доступны только в последних версиях AutoCAD.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 14:07:51
Цитировать
Это мы не обсуждаем на форуме
Извиняюсь, наболело...
Цитировать
эти свойства доступны только в последних версиях AutoCAD
А нет ли где нибудь примерчика на C++ с подключением строкового свойства старым способом, через COM ?
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 14:18:28
А нет ли где нибудь примерчика на C++ с подключением строкового свойства старым способом, через COM ?
Это свойство будет только в Панели Свойств, но его не будет в QSELECT. Это тебя устроит?
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Андрей Бушман от 09-11-2015, 14:19:09
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid (http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&referringTitle=Home). Написать обёртки для представления свойств базового класса - Entity, а так же для его конкретных реализаций (линии, окружности, полилинии и т.п.). Несомненно, придётся потратить на это некоторое время, однако в результате может получиться портируемое, расширяемое решение, пригодное для многократного повторного использования.

В принципе это можно было бы даже выполнить в виде отдельного проекта, результат которого можно было бы предоставить в тот же онлайновый AppStore by Autodesk (или как он там называется). предоставление API  и документация могли бы сделать это решение интересным не только для пользователя, но и для .net-разработчиков, пишущих код под акад (дабы они могли программно работать с этим). А если дополнительно предоставить для работы с ним API для лиспописателей, то интерес к нему может оказаться ещё выше (не балованы они DCL'ом) :).
имхо.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 14:52:03
Я к примеру НЕ-COM-свойств добавил строчное свойство. Выглядит так:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9748%2F7842324.4%2F0_10f941_29cf0d52_orig.png&hash=ea6fed10bd0cba88f4b494b92f215cf9)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9%2F7842324.4%2F0_10f942_37da24c7_orig.png&hash=c41cfb65bb58bdec84592360af19dbeb)

Исходники (для AutoCAD 2015) приложил.

avc
Это то, что ты хотел?
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 15:16:02
Цитировать
Это свойство будет только в Панели Свойств, но его не будет в QSELECT. Это тебя устроит?
А точно не будет? Я пока не понял логики, с какими свойствами дружит QSELECT. Только Не-КОМ ? Тогда не устроит :(
Придется писать для старых версий Автокада через .Net и без поддержки QSELECT. Но хотя бы для новых версий хотелось бы задействовать Не-КОМ свойства.
Пока писал, вы уже пример опубликовали :) AcString значит надо, а я все ACHAR* подставлял... Буду пробовать. Огромное спасибо!
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 15:19:30
Цитировать
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid. Написать обёртки для представления свойств базового класса....
Отличный план! Осталось выкроить пару гигачасов свободного времени :) Но настроение поднялось, спасибо!
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 15:41:35
А точно не будет?
Ну ты же видишь как происходит в моём GeomProps, в котором свойства подключаются динамически к любым примитивам.
Я пока не понял логики, с какими свойствами дружит QSELECT. Только Не-КОМ ?
Еще со статическими свойствами (свойствами Custom Entity).
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Дмитрий Загорулькин от 09-11-2015, 16:07:53
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid.
Андрей, пробовал это использовать? Я пробовал и отказался от его использования. В бесплатной версии у этого контрола нет свойства SelectedObjects. Следовательно, можно вывести свойства только одного объекта. В платной есть, но стоимость довольно существенная, ради одного контрола многовато.
Я недавно пытался найти хотя бы один бесплатный более-менее адекватно работающий WPF PropertyGrid - мои поиски не увенчались успехом.
Правда, если этот котрол очень нужен, можно использовать такой готовый из WinForms, но придется мириться со всеми его недостатками.
Так что, этот вопрос не так просто решается.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Андрей Бушман от 09-11-2015, 16:19:49
Андрей, пробовал это использовать?
Конкретно этот - нет. Я использовал когда-то его аналог из WinForms.
Цитировать
Так что, этот вопрос не так просто решается.
Я и не утверждал, что он [пропертигрид] решается просто. Просто - это создать палитру и наполнить её своими контролами. А настроить проперти грид так, чтобы он работал по аналогии с родным акадовским - это придётся сильно повозиться (но не невозможно).
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 16:26:18
Это то, что ты хотел?
да, это оно. работает!
А еще хотелось бы булеановское поле сделать. Как ObjectARX пишется bool ? Чтоб OPM понял, что надо выбор Да/Нет показывать. Или это уже свойства со списком возможных значений?
p.s. Еще бы нашелся добрый человек, чтоб написал .Net обертку для Не-КОМ свойств по аналогии с СОМ... Тогда бы я таких глупых вопросов не задавал  :)
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 16:42:15
Чтоб OPM понял, что надо выбор Да/Нет показывать. Или это уже свойства со списком возможных значений?
Именно.
P.S.: Я отправил вопрос в ADN DevHelp по поводу динамических (COM) свойств и QSELECT. Нашёл на сайте ADN, что это вроде было возможно. Но во всех версиях до 2009 в QSELECT свойство показывалось, а фильтровать по нему было нельзя. У меня же оно даже не показывается (и в 2015 и в 2016). Пусть объяснят почему.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 20:44:25
А еще хотелось бы булеановское поле сделать. Как ObjectARX пишется bool ? Чтоб OPM понял, что надо выбор Да/Нет показывать. Или это уже свойства со списком возможных значений?
Всё-таки можно без дополнительных сложностей:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9108%2F7842324.4%2F0_10fa79_244a5a73_orig.png&hash=256fb61fa99cae9fea3bd3e3c34d5f67)

Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: avc от 09-11-2015, 21:21:52
Всё-таки можно без дополнительных сложностей
А ларчик просто открывался... И когда в C++ успели добавить тип bool... Посыпаю голову пеплом...
Спасибо!
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 09-11-2015, 22:40:31
И когда в C++ успели добавить тип bool...
В C++ (не путать с C) bool есть очень давно. Другое дело, что OPM интерпретирует его как список с двумя значениями Да/Нет. Этого в документации я не нашёл, но догадался по аналогии с COM. Из обычных свойств в примере еще не хватает Point3d (AcGePoint3d). Нужно поэкспериментировать.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 15-11-2015, 02:19:32
P.S.: Я отправил вопрос в ADN DevHelp по поводу динамических (COM) свойств и QSELECT. Нашёл на сайте ADN, что это вроде было возможно. Но во всех версиях до 2009 в QSELECT свойство показывалось, а фильтровать по нему было нельзя. У меня же оно даже не показывается (и в 2015 и в 2016). Пусть объяснят почему.
Итак получил ответ от ADN DevHelp, что динамические свойства (COM) в QSELECT не видны и это так и было задумано. В каком-то случае в старых версиях AutoCAD динамическое свойство попадало в QSELECT, но фильтровать по нему было невозможно. Команда инженеров Autodesk проанализировала объем работы, необходимый для подключения динамических свойств к QSELECT и забраковала эту идею. А чтобы не возникало никаких вопросов динамические свойства теперь в QSELECT совсем не видны.
Итак. Единственной возможностью использовать свойства в QSELECT остаются Не-COM свойства.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 16-11-2015, 21:47:53
С свойствами типа AcGePoint3d (Point3d) возникла проблема. Пришлось отправить её в ADN DevHelp. Но и им она оказалась сходу не по зубам и вопрос переадресовали команде инженеров.
Как только получу ответ - отпишусь.
Название: Re: Добавление свойств в панель свойств и в диалог QSelect
Отправлено: Александр Ривилис от 24-11-2015, 13:50:49
Получил ответ. Итак на данный момент использовать AcGePoint3d с Не-COM свойствами нельзя. Имеет место баг, который будут исправлять.