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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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 проектах?