Работа с Панелью свойств в .NET (OPMNetExt) для AutoCAD

Автор Тема: Работа с Панелью свойств в .NET (OPMNetExt) для AutoCAD  (Прочитано 93205 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Те, кто интересовался, как добавить свои свойства в Панель свойств при помощи AutoCAD .NET API наверняка помнят статью Kean Walmsley: http://through-the-interface.typepad.com/through_the_interface/2009/03/exposing-autocads-properties-palette-functionality-to-net---part-1.html
Прошло много лет с тех пор. Cyrille Fauvel сделал обновлённую версию. Исходник и примеры можно найти здесь: https://github.com/cyrillef/OPMNetExt
 
« Последнее редактирование: 22-01-2017, 17:56:06 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Исправленная версия от Virupaksha Aithal для AutoCAD 2017 и VS 2015: http://forums.autodesk.com/autodesk/attachments/autodesk/34/33606/1/OPMNetExt-master.zip   
« Последнее редактирование: 22-01-2017, 17:56:19 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Стоит из названия убрать "для AutoCAD 2016" и может даже закрепить
« Последнее редактирование: 22-01-2017, 17:56:31 от Александр Ривилис »

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Стоит из названия убрать "для AutoCAD 2016" и может даже закрепить
Согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Добавил версию, адаптированную под AutoCAD 2018.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Объясните мне, не знакомому с С++:
1. Чтобы открыть проект по ссылкам нужен VS 2015 (2010)? У меня 2017 - не открывается.
2. Для каждой версии автокада (2010-2018) должна собираться отдельная библиотека? Универсальной сделать невозможно?
3. Ко второму пункту - от разрядности платформы тоже зависит? 32 или 64

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Чтобы открыть проект по ссылкам нужен VS 2015 (2010)? У меня 2017 - не открывается.
Для какой версии AutoCAD? VS 2017 без установленного VS 2015 не подойдёт.
2. Для каждой версии автокада (2010-2018) должна собираться отдельная библиотека? Универсальной сделать невозможно?
Универсальной сделать невозможно. Для версии 2010...2012,2013...2014,2015...2016,2017,2018 нужны отдельные модули.
3. Ко второму пункту - от разрядности платформы тоже зависит? 32 или 64
Да. Т.е. количество модулей увеличивается в два раза.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Для какой версии AutoCAD? VS 2017 без установленного VS 2015 не подойдёт.
Получается, что если мне нужно иметь библиотеки для 2010-2018 автокадов, то у меня должны быть установлены VS 2010, 2012, 2013, 2015? Какой ужас)) С .Net все проще конечно

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты пропустил VS 2008 SP1 (для AutoCAD 2010...2012).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
VS 2013 не нужен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Еще вопрос - если я делаю проект к которому подключаю ссылку на библиотеку OPM, мне нужно для этого проекта указывать платформу? По сути мой проект не зависит от платформы и целевое значение платформы установлено в AnyCPU. При использовании "минимального" набора ссылок (acdbmgd.dll, acmgd.dll (accoremgd.dll)) такой вариант работает как надо.
Будет ли правильным оставить AnyCPU, добавить ссылку на библиотеку OPM для моей платформы (х64), а уже при использовании моего проекта в процессе загрузки в AutoCAD предусмотреть вариант загрузки библиотеки OPM (x68 или x64)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Будет ли правильным оставить AnyCPU, добавить ссылку на библиотеку OPM для моей платформы (х64), а уже при использовании моего проекта в процессе загрузки в AutoCAD предусмотреть вариант загрузки библиотеки OPM (x68 или x64)
Думаю, что это будет неправильно. По сути здесь такая же ситуация, как и с AutoCAD COM/ActiveX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Александр, я перестроил оба этих проекта у себя, получил нужные DLL и загрузил asdkOPMNetSample.dll в C3D2018.
По идее при выборе на чертеже отрезка в его свойствах должно появиться пользовательское свойство "My integer property"... Однако у меня, видимо, загрузка модуля не происходит - я добавил в метод Initialize вывод в командную строку, чтобы отсеживать этапы загрузки, но не отрабатывается даже первая строка.
Во время загрузки DLL ошибок и сообщений нет.


Я не знаю, куда я смотрел, но у меня все работает :)

Единственное замечание - при открытии этого решения один из проектов не загружается:


Приходится открывать файл arx-config.props в текстовом редакторе и править путь к каталогу Object ARX:


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр, я перестроил оба этих проекта у себя, получил нужные DLL и загрузил asdkOPMNetSample.dll в C3D2018.
По идее при выборе на чертеже отрезка в его свойствах должно появиться пользовательское свойство "My integer property"... Однако у меня, видимо, загрузка модуля не происходит - я добавил в метод Initialize вывод в командную строку, чтобы отсеживать этапы загрузки, но не отрабатывается даже первая строка.
Во время загрузки DLL ошибок и сообщений нет.
Так как архив с проектом скачан из интернета, то у построенной библиотеки скорее всего установился идентификатор "заблокировано". Откройте свойства dll файла и снимите блокировку

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приходится открывать файл arx-config.props в текстовом редакторе и править путь к каталогу Object ARX:
У тебя на картинке моя настройка пути к ObjectARX SDK - она у меня не на стандартном месте. Так что действительно нужно править конфигурационный файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще-то я не очень понимаю зачем тебе нужно перекомпилировать. В моём архиве уже готовые dll-файлы для подключения:
OPMNetExt-master\Release\asdkOPMNetExt.dll - для x86
OPMNetExt-master\x64\Release\asdkOPMNetExt.dll - для x64
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
А вот интересно, как эти свойства добавить не к классу целиком, а к одному конкретному объекту, например, в ExtensionDictionary которого есть определенные записи?

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Вообще-то я не очень понимаю зачем тебе нужно перекомпилировать. В моём архиве уже готовые dll-файлы для подключения:
Чтобы у меня был живой проект, с которым я могу экспериментировать )

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А вот интересно, как эти свойства добавить не к классу целиком, а к одному конкретному объекту, например, в ExtensionDictionary которого есть определенные записи?
у интерфейса IDynamicProperty2 есть параметр IsPropertyEnabled.
Использовать типа так можно:
Код - C# [Выбрать]
  1. private readonly XProperty<double> TextHeight = new XProperty<double>()
  2.         {
  3.             //...
  4.             Enabled = new Func<ObjectId, bool>((ObjectId objectId) => Helper.IsMyObject(objectId)),
  5.             //...
  6.         };

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Чтобы у меня был живой проект, с которым я могу экспериментировать )
Проект и так бы был "живой". Добавлял бы как добавляешь dll-файлы AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот интересно, как эти свойства добавить не к классу целиком, а к одному конкретному объекту, например, в ExtensionDictionary которого есть определенные записи?
Александр Пекшев aka Modis прав. Пример есть в customPropertySample.cs:
Код - C# [Выбрать]
  1. // Show/Hide property in the OPM, for this object instance
  2. public void IsPropertyEnabled (object pUnk, out int bEnabled) {
  3.     bEnabled =1; // Если     bEnabled = 0, то свойство не видно в Панели свойств.
  4. }
  5.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Да, я как раз с ним разбираюсь.
Получилось внутри метода IsPropertyEnabled получить сам объект и, соответственно, все параметры этого объекта:
Код - C# [Выбрать]
  1. public void IsPropertyEnabled (object pUnk, out int bEnabled)
  2. {
  3.     AcadLine l;
  4.     l = (AcadLine)pUnk;
  5.  
  6.     if (l.Length > 10)
  7.         bEnabled = 1;
  8.     else
  9.         bEnabled = 0;
  10. }

Разумеется тут должны быть проверки на соответствие объекта pUnk необходимому типу и проверка на null. Тоже самое и в методе GetCurrentValueName.

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Еще один вопрос: свои свойства можно группировать?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще один вопрос: свои свойства можно группировать?
Вообще можно, но не через OPMNetExt. Там не реализован интерфейс ICategorizeProperties, который необходим для группировки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Вообще можно, но не через OPMNetExt. Там не реализован интерфейс ICategorizeProperties, который необходим для группировки.
Александр, а вы можете помочь реализовать этот интерфейс? Я пример нашел:
https://github.com/kevinzhwl/ObjectARXCore/blob/master/2004/inc/axtempl.h
но без хорошего знания С++ ничего не понимается :(

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я его реализовал для AutoCAD 2018, но тестировал по-минимуму (и только для x64). Выглядит это так:

(аналогично тому как это сделано в моём GeomProps)
Проверяй.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Проверяй.
Александр, спасибо!
Чуть позже посмотрю.

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Еще один вопрос назрел: можно ли как-то использовать списки в качестве данных, чтобы в свойствах выбирать из combobox?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще один вопрос назрел: можно ли как-то использовать списки в качестве данных, чтобы в свойствах выбирать из combobox?
Теоретически можно. Практически - это перебор. Я туда не полезу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Коллеги, нашел на форуме, как добавить собственные перечисления:
https://forums.autodesk.com/t5/objectarx/property-palette-and-custom-entities/m-p/5724429/highlight/true#M32847
Код - C++ [Выбрать]
  1. // idl
  2. [propget, id(3), helpstring("property myenum")] HRESULT myenum1([out, retval] long* pVal);
  3. [propput, id(3), helpstring("property myenum")] HRESULT myenum1([in] long newVal);
  4.  
  5. // COM Wrapper header
  6. STDMETHOD(GetPredefinedStrings)(
  7.         /* [in] */ DISPID dispID,
  8.         /* [out] */ CALPOLESTR *pCaStringsOut,
  9.         /* [out] */ CADWORD *pCaCookiesOut);
  10. STDMETHOD(GetPredefinedValue)(
  11.         /* [in] */ DISPID dispID,
  12.         /* [out] */ DWORD dwCookie,
  13.         /* [out] */ VARIANT *pVarOut);
  14.  
  15. // COM Wrapper cpp
  16. //- IAcPiPropertyDisplay
  17. STDMETHODIMP CMyObject::GetCustomPropertyCtrl (VARIANT Id, LCID lcid, BSTR *pProgId) {
  18.             if ( pProgId == NULL )
  19.                         return (E_FAIL) ;
  20.            
  21.             if ( V_I4(&Id) == 3 ) {
  22.                         LPOLESTR progId;
  23.                         ProgIDFromCLSID (CLSID_AcPePropertyEditorEnum, &progId);
  24.                         *pProgId =::SysAllocString (progId);
  25.  
  26.                         return (S_OK) ;
  27.             }
  28.  
  29.             return (E_NOTIMPL) ;
  30. }
  31.  
  32. STDMETHODIMP CMyObject::GetPredefinedStrings(DISPID dispID, CALPOLESTR *pCaStringsOut, CADWORD *pCaCookiesOut)
  33. {
  34.             USES_CONVERSION;
  35.  
  36.             if( (dispID == 0x3))
  37.             {
  38.                         pCaStringsOut->pElems = (LPOLESTR *)::CoTaskMemAlloc(sizeof(LPOLESTR) * 2);
  39.                         pCaCookiesOut->pElems = (DWORD *)::CoTaskMemAlloc(sizeof(DWORD) * 2);
  40.  
  41.                         pCaStringsOut->pElems[0] = ::SysAllocString(L"First");
  42.                         pCaCookiesOut->pElems[0] = 1;
  43.                         pCaStringsOut->pElems[1] = ::SysAllocString(L"Second");
  44.                         pCaCookiesOut->pElems[1] = 2;
  45.  
  46.                         pCaStringsOut->cElems = 2;
  47.                         pCaCookiesOut->cElems = 2;
  48.                         return S_OK;
  49.             }
  50.             return  IOPMPropertyExtensionImpl<CMyObject>::GetPredefinedStrings(dispID,pCaStringsOut,pCaCookiesOut);    
  51. }
  52.  
  53. STDMETHODIMP CMyObject::GetPredefinedValue(DISPID dispID, DWORD dwCookie, VARIANT *pVarOut)
  54. {
  55.             if(dispID == 0x3)
  56.             {
  57.                         if(dwCookie == 1)
  58.                         {
  59.                                     ::VariantCopy(pVarOut, &CComVariant((long)1));
  60.                         }
  61.                         else if(dwCookie == 2)
  62.                         {
  63.                                     ::VariantCopy(pVarOut, &CComVariant((long)2));
  64.                         }
  65.             }
  66.             else
  67.                         return IOPMPropertyExtensionImpl<CMyObject>::GetPredefinedValue(dispID, dwCookie, pVarOut);
  68.  
  69.     return S_OK;
  70. }

Я правильно понимаю, что если в проекте OPMNetExt переопределить GetCustomPropertyCtrl, как показано по ссылке выше, то потом можно будет использовать в .NET проектах?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я правильно понимаю, что если в проекте OPMNetExt переопределить GetCustomPropertyCtrl, как показано по ссылке выше, то потом можно будет использовать в .NET проектах?
Нет. Ты не понимаешь разницу между static и dynamic property. То что ты показал - это static property, которые содержатся в COM-обертке класса примитива и только там. А OPMNetExt оперирует dynamic property. Я кое что сделал, чтобы в OPMNetExt можно было использовать перечисления (используется интерфейс IDynamicEnumProperty). Пока работает частично. Когда закончу - выложу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Алексей Терно
Я правильно понял что тебе нужно? Посмотри видео:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Я правильно понял что тебе нужно?
Да - именно это!

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну тогда посмотри этот код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Алексей Терно
Я так понимаю, что код ты посмотрел, но я в очередной раз не увидел никакой реакции на то, что я для тебе делаю. ;) Так и запишем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Александр, да - пример посмотрел, он работает так, как мне надо, стал переделывать под свои нужды и он перестал работать :( Не успел до конца разобраться, где у меня ошибка, как возникла срочная необходимость переключиться на другую задачу. В начале следующей недели должен вернуться к этой задаче и тогда уже сделаю свой код рабочим и выложу тут свою модификацию  :)

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
И спасибо Вам огромное за Ваш труд!!!

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И спасибо Вам огромное за Ваш труд!!!
Так и быть прощаю. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 609
  • Карма: 155
    • ПГСу Бложик
Александр Ривилис,  спасибо за сборку для 18 акада.
Под 2017 так же собралась и теперь у мультилинии хотя бы базовые геометрические свойства появились, работать стало намного удобнее.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Под 2017 так же собралась и теперь у мультилинии хотя бы базовые геометрические свойства появились, работать стало намного удобнее.
Эту фразу я не понял. Ты добавил для мультилинии динамические свойства?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 609
  • Карма: 155
    • ПГСу Бложик
Пересобрал программу под 2017х64 автокад и да, добавил динамические свойства мультилинии.

Длину показывает, площадь показывает, уровень показывает и позволяет поменять.
Чуть позже при помощи выпадающего списка добавлю выбор и редактирование вершин (по крайней мере попробую).

ЗЫ.
Раньше мультилиниями не пользовался, а тут архитекторы к ним пристрастились и теперь приходится искать инструменты для работы...

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Коллеги, а это нормально, что после перестроения в проекте есть файлы:
\OPMNetExt.VC.db
\ipch\OPMNETEXT-3f21b66b\ASDKOPMNETEXT-ef141531.ipch
Соответственно 144 и 120 Мб? Причем сама итоговая DLL весит всего 54 Кб.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Коллеги, а это нормально, что после перестроения в проекте есть файлы:
\OPMNetExt.VC.db
\ipch\OPMNETEXT-3f21b66b\ASDKOPMNETEXT-ef141531.ipch
Соответственно 144 и 120 Мб? Причем сама итоговая DLL весит всего 54 Кб.
Абсолютно нормально. Почитай про precompiled headers.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Абсолютно нормально. Почитай про precompiled headers.
Теперь понятно :)
Спасибо!

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Адаптация для AutoCAD 2019.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Я его реализовал для AutoCAD 2018
Александр, здравствуйте!
А как прикрутить данную библиотеку к AutoCAD Civil 3D 2017 ?
У меня ругается и не хочет подгружать ее

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Ага, спасибо)
И почему-то подчеркивает Inherits IDynamicProperty2: Classes can inherit only from other Classes..
Что я не так скопировал?)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Что я не так скопировал?)
Понятия не имею.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Я взял код из примера на C#, конвертировал в VB.NET и компилятор стал подчеркивать Inherits IDynamicProperty2.
Ума не приложу это из-за чего?


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
конвертировал в VB.NET
На мой взгляд - это самая главная ошибка

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Какой может быть выход  :-\ ?
Если убрать эту строку работать не будет ?

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Если убрать эту строку работать не будет ?
Не будет.

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Спасибо, ребят.
Попытался запустить из-под C#,  при загрузке сборки:
NETLOAD
Не удалось загрузить файл или сборку "file:///C:\Users\Bars\Desktop\OPMNetExt-master_2017+\OPMNetExt-master\OPMNetSample\asdkOPMNetExt.dll" либо одну из их зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515) ---> System.NotSupportedException: Предпринята попытка загрузить сборку из сетевого ресурса, что в предыдущих версиях .NET Framework могло привести к помещению сборки в "песочницу". Этот выпуск .NET Framework не включает политику CAS по умолчанию, поэтому данная загрузка может быть опасной. Если эта нагрузка не предназначена для изоляции сборки, включите переключатель loadFromRemoteSources. Дополнительные сведения см. на странице http://go.microsoft.com/fwlink/?LinkId=155569.

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Откройте свойства dll файла и снимите блокировку
Почему-то не увидел этот параметр в палитре свойств библиотеки.
Где смотреть, подскажи ?

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
На мой взгляд - это самая главная ошибка
Тут https://github.com/cyrillef/OPMNetExt вроде заявлена возможность ее использования на VB.NET, однако найти примера именно для VB я не смог.
Печалька

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 609
  • Карма: 155
    • ПГСу Бложик
Я взял код из примера на C#, конвертировал в VB.NET и компилятор стал подчеркивать Inherits IDynamicProperty2.
Ума не приложу это из-за чего?
Из-за того, что Вы не очень хорошо знаете VB.NET.
Это в C#  можно наследоваться от классов и интерфейсов, а в VB можно наследоваться от классов и реализовывать интерфейсы. Разницу чувствуете?
Очевидно, что пример Вы конвертировали автоматическими инструментами, а вот они эту разницу зачастую не улавливают.
Код - vb.net [Выбрать]
  1. 'Наследование от класса
  2. Public Class Client
  3.     Inherits Person
  4. ...
  5. End Class
  6.  
  7. 'Реализация интерфейса
  8. Public Class Client
  9.     Implements IAccount
  10. ...
  11. End Class
  12.  
  13. 'Наследоване и реализация
  14. Public Class Client
  15.     Inherits Person
  16.     Implements IAccount
  17. ...    
  18. End Class

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
О, да, как же Вы правы)  :)
Т.е. я вручную к каждому члену прикручиваю реализацию, предварительно сделав метод Public? Как то:
Код - vb.net [Выбрать]
  1.       Public Sub GetDisplayName(<Out> ByRef szName As String) Implements IDynamicProperty2.GetDisplayName
  2.             szName = "My integer property"
  3.         End Sub
« Последнее редактирование: 20-05-2018, 16:03:31 от Александр Ривилис »

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Владимир Шу, спасибо огромное за подсказку.
Прикрутил реализацию к каждому методу и ошибка пропала.

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Откройте свойства dll файла и снимите блокировку
Победил через Assembly.UnsafeLoadFrom("asdkOPMNetExt.dll")

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Все, ребят, завелось из-под VB.NET! :)
Всем откликнувшимся спасибо, здоровья и ++++

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
предварительно сделав метод Public
З.ы. Public не причем, сорри)

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Еще проблемка возникла: как можно реализовать сохранение значения свойства для каждого экземпляра объекта ?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще проблемка возникла: как можно реализовать сохранение значения свойства для каждого экземпляра объекта ?
В методе SetCurrentValueData сохраняешь значение. Где и как - это твоё дело.
P.S.: Внимательно прочитай у меня в подписи как следует форматировать код для форума и соблюдай это правило.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Александр Ривилис, спасибо.
А нет ли примера сохранения кастомных свойств в базу данных чертежа?
З.ы.: по форматированию кода исправлюсь)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А нет ли примера сохранения кастомных свойств в базу данных чертежа?
Как минимум нужно понимать куда и что ты собираешься сохранять.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Александр Ривилис, моя цель проста.
Мне нужно реализовать объединение нескольких произвольно указанных пользователем примитивов (различных классов) в одну группу.
Это похоже на образование блока, но только виртуального - без реального объединения примитивов в блок.
Т.е. выделенным пользователем примитивам в кастомное свойство присваиваю значение ObjectId какого-либо одного примитива из этой выделенной группы - это будет так сказать базовый (опорный) примитив.
А затем по произвольному выделенному на чертеже примитву через сохраненное значение кастомного свойства осуществляю выделение (включение в SelectionSet) остальных примитивов-членов, входящих в группу.
Т.о. как-то нужно произвести запись значений кастомного свойства каждого примитива в БД чертежа.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
bars4@inbox.ru
Так почему не воспользоваться именно группой (Group)? Там вроде бы всё что тебе нужно есть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Далее по бизнес-логике будет производиться экспорт данных чертежа через DataExtraction в Excel, где будет производиться анализ созданных группировок примитивов, а именно от каждого входящего члена группы будут извлечены значения имени блока, слоя, типа линии, цвет и т.п. (в зависимости что попадет в группу) для интерпретации и отчетов, а так же каждому из этих входящих примитивов потребуется раздать (присвоить, назначить) координату (адрес) опорного примитива данной виртуальной группы, который тоже пойдет в отчеты в виде отдельного поля.
Можно ли будет достичь этого же результата посредством Group как таковых ?

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли будет достичь этого же результата посредством групп как таковых ?
Я думаю тебе нужно начать с изучения AutoCAD. А точнее выяснить что такое группа в AutoCAD и как это реализовано, где она хранится, как в неё добавить примитивы, как извлечь информацию о примитивах в группе.
К данной теме это не имеет никакого отношения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bars4@inbox.ru

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Александр Ривилис, согласен, это уже другая тема. Спасибо)

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Портировал OPMNetExt для AutoCAD 2021:  https://adn-cis.org/opmnetext-dlya-autocad-2021.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение