Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: 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 на строковое :(
Спасибо.
-
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 свои свойства. Если бы мне нужно было бы отбирать примитивы по своим критериям, то я бы написал свою команду, которая это делает.
-
Средствами AutoCAD .NET API можно создать свою, специализированную панель свойств (либо целый набор различных вкладок) и наполнять её произвольным контентом (хоть WinForms, хоть WPF, хоть обеими сразу), каким душа пожелает. Делается это достаточно просто и работает надёжно.
Несомненно, модернизировать уже существующую "родную" панель свойств - это заманчиво, но в виду сложности сего действа я бы не стал испытывать судьбу в этом направлении.
-
Как все печально... Мало того, что пользователям не дали самим добавлять свойства, так и программистам усложнили жизнь как могли.. Политика Автодеска?
в него попадают только статические свойства
В коде http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html создаются именно динамические свойства. И они работаю как надо.
зачем вообще добавлять в QSELECT свои свойства
Диалог поиска объектов по свойствам - одно из самых удобных изобретений автокада. Вряд ли пользователь обрадуется, если ему скажут, что искать окружности по радиусам надо одной командой, а по площади - другой.
-
Диалог поиска объектов по свойствам - одно из самых удобных изобретений автокада. Вряд ли пользователь обрадуется, если ему скажут, что искать окружности по радиусам надо одной командой, а по площади - другой.
Ты можешь подменить эту команду [QSELECT] своей. GUI реализовать по подобию оригинала, добавив в него тот функционал, который ты планировал. Т.о. для пользователя это будет работать прозрачно, как будто это родная команда автокада.
-
можно создать свою, специализированную панель свойств
Так и работаем последние 10 лет, с двумя панелями свойств на одном экране. Случайно увидел, что люди как-то заталкивают новые свойства в стандартную панель - обрадовался. Но увы...
-
Мало того, что пользователям не дали самим добавлять свойства, так и программистам усложнили жизнь как могли.. Политика Автодеска?
Это мы не обсуждаем на форуме: п. 3.9 Правил.В коде http://adndevblog.typepad.com/autocad/2012/04/devtv-non-com-property-system.html создаются именно динамические свойства. И они работаю как надо.
Там совершенно другая логика подключения свойств. Ну и эти свойства доступны только в последних версиях AutoCAD.
-
Это мы не обсуждаем на форуме
Извиняюсь, наболело...
эти свойства доступны только в последних версиях AutoCAD
А нет ли где нибудь примерчика на C++ с подключением строкового свойства старым способом, через COM ?
-
А нет ли где нибудь примерчика на C++ с подключением строкового свойства старым способом, через COM ?
Это свойство будет только в Панели Свойств, но его не будет в QSELECT. Это тебя устроит?
-
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid (http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&referringTitle=Home). Написать обёртки для представления свойств базового класса - Entity, а так же для его конкретных реализаций (линии, окружности, полилинии и т.п.). Несомненно, придётся потратить на это некоторое время, однако в результате может получиться портируемое, расширяемое решение, пригодное для многократного повторного использования.
В принципе это можно было бы даже выполнить в виде отдельного проекта, результат которого можно было бы предоставить в тот же онлайновый AppStore by Autodesk (или как он там называется). предоставление API и документация могли бы сделать это решение интересным не только для пользователя, но и для .net-разработчиков, пишущих код под акад (дабы они могли программно работать с этим). А если дополнительно предоставить для работы с ним API для лиспописателей, то интерес к нему может оказаться ещё выше (не балованы они DCL'ом) :).
имхо.
-
Я к примеру НЕ-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
Это то, что ты хотел?
-
Это свойство будет только в Панели Свойств, но его не будет в QSELECT. Это тебя устроит?
А точно не будет? Я пока не понял логики, с какими свойствами дружит QSELECT. Только Не-КОМ ? Тогда не устроит :(
Придется писать для старых версий Автокада через .Net и без поддержки QSELECT. Но хотя бы для новых версий хотелось бы задействовать Не-КОМ свойства.
Пока писал, вы уже пример опубликовали :) AcString значит надо, а я все ACHAR* подставлял... Буду пробовать. Огромное спасибо!
-
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid. Написать обёртки для представления свойств базового класса....
Отличный план! Осталось выкроить пару гигачасов свободного времени :) Но настроение поднялось, спасибо!
-
А точно не будет?
Ну ты же видишь как происходит в моём GeomProps, в котором свойства подключаются динамически к любым примитивам.Я пока не понял логики, с какими свойствами дружит QSELECT. Только Не-КОМ ?
Еще со статическими свойствами (свойствами Custom Entity).
-
Как вариант, можно было бы посмотреть в сторону WPF PropertyGrid.
Андрей, пробовал это использовать? Я пробовал и отказался от его использования. В бесплатной версии у этого контрола нет свойства SelectedObjects. Следовательно, можно вывести свойства только одного объекта. В платной есть, но стоимость довольно существенная, ради одного контрола многовато.
Я недавно пытался найти хотя бы один бесплатный более-менее адекватно работающий WPF PropertyGrid - мои поиски не увенчались успехом.
Правда, если этот котрол очень нужен, можно использовать такой готовый из WinForms, но придется мириться со всеми его недостатками.
Так что, этот вопрос не так просто решается.
-
Андрей, пробовал это использовать?
Конкретно этот - нет. Я использовал когда-то его аналог из WinForms.
Так что, этот вопрос не так просто решается.
Я и не утверждал, что он [пропертигрид] решается просто. Просто - это создать палитру и наполнить её своими контролами. А настроить проперти грид так, чтобы он работал по аналогии с родным акадовским - это придётся сильно повозиться (но не невозможно).
-
Это то, что ты хотел?
да, это оно. работает!
А еще хотелось бы булеановское поле сделать. Как ObjectARX пишется bool ? Чтоб OPM понял, что надо выбор Да/Нет показывать. Или это уже свойства со списком возможных значений?
p.s. Еще бы нашелся добрый человек, чтоб написал .Net обертку для Не-КОМ свойств по аналогии с СОМ... Тогда бы я таких глупых вопросов не задавал :)
-
Чтоб OPM понял, что надо выбор Да/Нет показывать. Или это уже свойства со списком возможных значений?
Именно.
P.S.: Я отправил вопрос в ADN DevHelp по поводу динамических (COM) свойств и QSELECT. Нашёл на сайте ADN, что это вроде было возможно. Но во всех версиях до 2009 в QSELECT свойство показывалось, а фильтровать по нему было нельзя. У меня же оно даже не показывается (и в 2015 и в 2016). Пусть объяснят почему.
-
А еще хотелось бы булеановское поле сделать. Как 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)
-
Всё-таки можно без дополнительных сложностей
А ларчик просто открывался... И когда в C++ успели добавить тип bool... Посыпаю голову пеплом...
Спасибо!
-
И когда в C++ успели добавить тип bool...
В C++ (не путать с C) bool есть очень давно. Другое дело, что OPM интерпретирует его как список с двумя значениями Да/Нет. Этого в документации я не нашёл, но догадался по аналогии с COM. Из обычных свойств в примере еще не хватает Point3d (AcGePoint3d). Нужно поэкспериментировать.
-
P.S.: Я отправил вопрос в ADN DevHelp по поводу динамических (COM) свойств и QSELECT. Нашёл на сайте ADN, что это вроде было возможно. Но во всех версиях до 2009 в QSELECT свойство показывалось, а фильтровать по нему было нельзя. У меня же оно даже не показывается (и в 2015 и в 2016). Пусть объяснят почему.
Итак получил ответ от ADN DevHelp, что динамические свойства (COM) в QSELECT не видны и это так и было задумано. В каком-то случае в старых версиях AutoCAD динамическое свойство попадало в QSELECT, но фильтровать по нему было невозможно. Команда инженеров Autodesk проанализировала объем работы, необходимый для подключения динамических свойств к QSELECT и забраковала эту идею. А чтобы не возникало никаких вопросов динамические свойства теперь в QSELECT совсем не видны.
Итак. Единственной возможностью использовать свойства в QSELECT остаются Не-COM свойства.
-
С свойствами типа AcGePoint3d (Point3d) возникла проблема. Пришлось отправить её в ADN DevHelp. Но и им она оказалась сходу не по зубам и вопрос переадресовали команде инженеров.
Как только получу ответ - отпишусь.
-
Получил ответ. Итак на данный момент использовать AcGePoint3d с Не-COM свойствами нельзя. Имеет место баг, который будут исправлять.