COM. CustomEntity. Палитра свойств. AutoCAD 2017

Автор Тема: COM. CustomEntity. Палитра свойств. AutoCAD 2017  (Прочитано 21525 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Столкнулся с проблемой в палитре свойств в AutoCAD 2017, может кто подскажет решение.
Написаны несколько CustomEntity. Для них реализованы COM палитры свойств. Для AutoCAD 2013-2016 все работает хорошо, никаких проблем нет.

В AutoCAD 2017 возникла проблема: нельзя изменить параметр AcDbEntity «Цвет», в комбобоксе выбираю другой цвет, после выбора он сбивается назад. И так для всех CustomEntity.

Пример оглавления палитры:
Код - C++ [Выбрать]
  1. class ATL_NO_VTABLE CProfileFrameCOMObj :
  2.         public CComObjectRootEx<CComSingleThreadModel>,
  3.         public CComCoClass<CProfileFrameCOMObj, &CLSID_ProfileFrameCOMObj>,
  4.         public IAcPiCategorizeProperties,
  5.         public ISupportErrorInfo,
  6.         public IOPMPropertyExtensionImpl<CProfileFrameCOMObj>,
  7.         public IAcadEntityDispatchImpl<CProfileFrameCOMObj, &CLSID_ProfileFrameCOMObj, IProfileFrameCOMObj, &IID_IProfileFrameCOMObj, &LIBID_UnisTraceDBXLib>
  8. #ifdef NEVER
  9.         //- Please do not remove the following line. It is here to make .NET ATL Wizards
  10.         //- running properly. The parent class will not compile but is required by .NET to recognize
  11.         //-     this class as being an ATL coclass
  12.         ,public IDispatchImpl<IProfileFrameCOMObj, &IID_IIProfileFrameCOMObj, &LIBID_UnisProfileDBXLib>
  13. #endif
  14. {
  15. ...
  16. }

COM_MAP:
Код - C++ [Выбрать]
  1.         DECLARE_REGISTRY_RESOURCEID(IDR_PROFILEFRAMECOMOBJ)
  2.  
  3.         BEGIN_COM_MAP(CProfileFrameCOMObj)
  4.                 COM_INTERFACE_ENTRY(IProfileFrameCOMObj)
  5.                 COM_INTERFACE_ENTRY(IDispatch)         
  6.                 COM_INTERFACE_ENTRY(ISupportErrorInfo)
  7.                 COM_INTERFACE_ENTRY(IConnectionPointContainer)
  8.                 COM_INTERFACE_ENTRY(IOPMPropertyExtension)
  9.                 COM_INTERFACE_ENTRY(ICategorizeProperties)
  10.                 COM_INTERFACE_ENTRY(IPerPropertyBrowsing)
  11.                 COM_INTERFACE_ENTRY(IAcadBaseObject)
  12.                 COM_INTERFACE_ENTRY(IAcadBaseObject2)
  13.                 COM_INTERFACE_ENTRY(IAcadObject)
  14.                 COM_INTERFACE_ENTRY(IAcadEntity)
  15.                 COM_INTERFACE_ENTRY(IRetrieveApplication)              
  16.                 COM_INTERFACE_ENTRY(IAcPiCategorizeProperties)         
  17.         END_COM_MAP()


Пробовал перегрузить методы:
Код - C++ [Выбрать]
  1. STDMETHODIMP CProfileFrameCOMObj::get_TrueColor(IAcadAcCmColor** pColor)
  2. {
  3.         HRESULT res = AcAxGetTrueColor(m_objRef, pColor);
  4.         return res;
  5. }
  6.  
  7. STDMETHODIMP CProfileFrameCOMObj::put_TrueColor(IAcadAcCmColor* color)
  8. {
  9.         HRESULT res = AcAxPutTrueColor(m_objRef, color);
  10.         return res;
  11. }      
  12.  

Для AutoCAD 2013-2016 сначала вызывается get_TrueColor, потом при прохождении курсором по элементам комбобокса вызывается put_TrueColor и объект нормально перерисовывается. В AutoCAD 2017 get_TrueColor вызывается і возвращет S_OK, но put_TrueColor уже не вызывается, соответственно никакой реакции на CustomEntity нет.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #1 : 17-05-2016, 10:50:33 »
Тебе придётся приложить полный проект, который можно скомпилировать и проверить. В крайнем случае придётся отправить в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #2 : 17-05-2016, 10:57:17 »
Кстати, убедись, что у тебя в idl-файле есть строка:
importlib("acax21enu.tlb");
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #3 : 17-05-2016, 11:07:46 »
Лично у меня всё работает. Правда, я не пользуюсь AcAx функциями.
У меня открывается в функции враппера объект для записи, ну и уже функцией класса этого объекта меняется цвет.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #4 : 17-05-2016, 11:32:19 »
Проверил свой тестовый Custom Entity. Изменение цвета работает нормально:



Сам проект прикладываю. Сравни со своим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #5 : 18-05-2016, 11:51:43 »
Строки:
Код - C++ [Выбрать]
  1. importlib("acax21enu.tlb");
нет. Но есть
Код - C++ [Выбрать]
  1. importlib("axdb21enu.tlb");
это dbx у меня. Выглядит вот так:
Код - C++ [Выбрать]
  1. #if ACAD_VER <= 2014
  2.         importlib("axdb19enu.tlb");
  3. #elif ACAD_VER <= 2016
  4.         importlib("axdb20enu.tlb");
  5. #else
  6.         importlib("axdb21enu.tlb");
  7. #endif
  8.        

Пробовал добавлять importlib("acax21enu.tlb"); , не помогло.

Под всеми остальными версиями AutoCAD все работает.

На счет AcAx функций. Я их не использую. Код добавил для тестирования.

Полный проект приложить не могу, у него есть зависимости от других проектов :(.

Создал тестовый проект, в нем написал линию, наследованную от AcDbCurve, полностью скопировал код палитры свойств и в нем все работает. Пока не знаю что с этим делать. Пробовал отключать реакторы от объектов, Ribbon ленты, ничего не помогает. Очень странно что не работает только под AutoCAD 2017 :( .

Если разберусь в чем проблема обязательно отпишусь. Если есть еще какие-то идеи буду рад попробовать.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #6 : 20-05-2016, 15:00:48 »
Создал тестовый проект, в нем написал линию, наследованную от AcDbCurve, полностью скопировал код палитры свойств и в нем все работает. Пока не знаю что с этим делать. Пробовал отключать реакторы от объектов, Ribbon ленты, ничего не помогает. Очень странно что не работает только под AutoCAD 2017 :( .
Единственное предположение, которое у меня есть - изменились сигнатуры функций и методов. Например, было BOOL (т.е. тип int), а стало Adesk::Boolean или bool. И соотвественно если есть какой-то virtual-метод с такой сигнатурой, то в AutoCAD 2017 он вызваться не будет.
Подробнее это описано в Release Notes в документации ObjectARX SDK 2017.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #7 : 23-06-2016, 14:04:23 »
Вылезла еще одна проблема - падение AutoCAD 2013, 2014 при открытии палитры свойств объектов для которых не изменялся цвет в AutoCAD 2017. Падал AutoCAD на методе IsTrueColor (см. прикрепленный рисунок).

Разобрался с проблемой. Помогла перегенерация GUID и запуск программы под AutoCAD 2013 (в реестре прописался путь к DBX скомпилированному под AutoCAD 2013). Потом то же самое под AutoCAD 2017 - цвет изменяется.

У меня COM объекты регистрируются через .rgs файлы. Пример кода регистрации:

Код - Microsoft Registry [Выбрать]
  1. HKCR
  2. {
  3.         UnisTraceDBX.ProfileFrameCOMObj.1 = s 'ProfileFrameCOMObj Class'
  4.         {
  5.                 CLSID = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  6.         }
  7.         UnisTraceDBX.ProfileFrameCOMObj = s 'ProfileFrameCOMObj Class'
  8.         {
  9.                 CLSID = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  10.                 CurVer = s 'UnisTraceDBX.ProfileFrameCOMObj.1'
  11.         }
  12.         NoRemove CLSID
  13.         {
  14.                 ForceRemove {C332A90F-7DDD-4A04-B11F-D0A8F4D61C49} = s 'ProfileFrameCOMObj Class'
  15.                 {
  16.                         ProgID = s 'UnisTraceDBX.ProfileFrameCOMObj.1'
  17.                         VersionIndependentProgID = s 'UnisTraceDBX.ProfileFrameCOMObj'
  18.                         ForceRemove 'Programmable'
  19.                         InprocServer32 = s '%MODULE%'
  20.                         {
  21.                                 val ThreadingModel = s 'Apartment'
  22.                         }
  23.                         val AppID = s '%APPID%'
  24.                         'TypeLib' = s '{DBFFC099-0CA3-43C2-A5E8-C32148949804}'
  25.                 }
  26.         }
  27. }
  28.  
  29. HKLM
  30. {
  31.         NoRemove SOFTWARE
  32.         {
  33.                 NoRemove Autodesk
  34.                 {
  35.                         NoRemove ObjectDBX
  36.                         {
  37.                                 NoRemove R19.0
  38.                                 {
  39.                                         NoRemove ActiveXCLSID
  40.                                         {
  41.                                                 val UNISPROFFRAMEENT = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  42.                                         }
  43.                                 }
  44.                                 NoRemove R19.1
  45.                                 {
  46.                                         NoRemove ActiveXCLSID
  47.                                         {
  48.                                                 val UNISPROFFRAMEENT = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  49.                                         }
  50.                                 }
  51.                                 NoRemove R20.0
  52.                                 {
  53.                                         NoRemove ActiveXCLSID
  54.                                         {
  55.                                                 val UNISPROFFRAMEENT = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  56.                                         }
  57.                                 }
  58.                                 NoRemove R20.1
  59.                                 {
  60.                                         NoRemove ActiveXCLSID
  61.                                         {
  62.                                                 val UNISPROFFRAMEENT = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  63.                                         }
  64.                                 }
  65.                                 NoRemove R21.0
  66.                                 {
  67.                                         NoRemove ActiveXCLSID
  68.                                         {
  69.                                                 val UNISPROFFRAMEENT = s '{C332A90F-7DDD-4A04-B11F-D0A8F4D61C49}'
  70.                                         }
  71.                                 }
  72.                         }
  73.                 }
  74.         }
  75. }

Вопрос. Как правильно регистрировать один и тот же DBX (палитры CustomEntity) собранный под разные версии AutoCAD и COM объекты в реестре чтоб работала палитра под всеми версиями AutoCAD?
Нужно создавать под каждую версию AutoCAD отдельные *.rgs файлы с разными GUID и в *.idl файле через #ifdef для интерфейсов и классов задавать эти GUID или есть способ по проще?


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #8 : 23-06-2016, 14:31:18 »
Нужно создавать под каждую версию AutoCAD отдельные *.rgs файлы с разными GUID и в *.idl файле через #ifdef для интерфейсов и классов задавать эти GUID или есть способ по проще?
Вроде бы не надо. У меня с одними и теми же GUID в разных версиях работают без проблем. Только нужно удалить в rgs-файлах раздел связанный с HKLM - он не нужен и выполняется только под административной учетной записью.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #9 : 23-06-2016, 15:08:38 »
Вроде бы не надо. У меня с одними и теми же GUID в разных версиях работают без проблем.
под обрезанным пользователем? не верю :):):)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #10 : 23-06-2016, 15:35:08 »
под обрезанным пользователем? не верю :):):)
Зря не веришь ("обрезанный" - это из другой области - здесь ограниченный).
Замени описание DllRegisterServer на вот это (к сожалению уже не помню откуда его взял):

//-----------------------------------------------------------------------------
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //- DllRegisterServer - Adds entries to the system registry
  3. //STDAPI DllRegisterServer (void) {
  4. //  //- Registers object, typelib and all interfaces in typelib
  5. //  return (_AtlModule.RegisterServer (TRUE)) ;
  6. //}
  7. typedef void (*OaEnablePerUserTLibRegistration)();
  8. STDAPI DllRegisterServer(void)
  9. {
  10.     HINSTANCE hInstOle32=NULL;
  11.     try
  12.     {
  13.         HRESULT hr = _AtlModule.RegisterServer(TRUE);
  14.         if(FAILED(hr))
  15.         {
  16.             hInstOle32 = LoadLibrary(_T("Oleaut32.dll"));
  17.             if(hInstOle32)
  18.             {
  19.                 OaEnablePerUserTLibRegistration lr=(OaEnablePerUserTLibRegistration)GetProcAddress(hInstOle32,("OaEnablePerUserTLibRegistration"));
  20.  
  21.                 if(lr!=NULL)
  22.                 {
  23.                     lr();
  24.                     hr = _AtlModule.RegisterServer(TRUE);
  25.                     if(SUCCEEDED(hr))
  26.                     {
  27.                         FreeLibrary(hInstOle32);
  28.                         return hr;
  29.                     }
  30.                 }      
  31.             }  
  32.  
  33.             HKEY hKCr;
  34.             hr=RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\Classes"),0,KEY_READ,&hKCr);
  35.             if(hr!=ERROR_SUCCESS)
  36.             {
  37.                 return hr;
  38.             }
  39.             hr = RegOverridePredefKey(HKEY_CLASSES_ROOT,hKCr);
  40.             RegCloseKey(hKCr);
  41.             if(FAILED(hr))
  42.             {
  43.                 return hr;
  44.             }  
  45.             hr = _AtlModule.RegisterServer(TRUE);
  46.             RegOverridePredefKey(HKEY_CLASSES_ROOT,NULL);
  47.             hr=S_OK;
  48.         }
  49.         if(hInstOle32)
  50.             FreeLibrary(hInstOle32);
  51.         return hr;
  52.     }
  53.     catch (...)
  54.     {
  55.         if(hInstOle32)
  56.             FreeLibrary(hInstOle32);
  57.         return E_FAIL;
  58.     }
  59. }

Важное условие: в rgs-файлах не должно быть секции HKLM, т.к. в противном случае это не сработает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #11 : 23-06-2016, 15:41:42 »
А вот еще один вариант (в принципе тоже самое): http://www.cnblogs.com/smartgloble/p/3224873.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #12 : 23-06-2016, 16:30:49 »
А вот еще один вариант (в принципе тоже самое): http://www.cnblogs.com/smartgloble/p/3224873.html
:o а таки работает. получается, запись идет в "HKCU/Software/Classes" вместо HKCR. значит долой INF файлы, которые запускаются в процессе установки программы. переведу все свои dbx-ины на этот способ и повычищаю все развилки на уникальные GUID-ы и т.п.
так что в очередной раз спасибо за идею и её реализацию :)


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #13 : 23-06-2016, 16:32:35 »
значит долой INF файлы, которые запускаются в процессе установки программы
inf-файлы??? Это ты о чем???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Dziubyna 23-06-2016, 18:00:24

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: COM. CustomEntity. Палитра свойств. AutoCAD 2017
« Ответ #14 : 23-06-2016, 18:00:20 »
Важное условие: в rgs-файлах не должно быть секции HKLM, т.к. в противном случае это не сработает.

Это и было корнем всех моих проблем. После удаления HKLM с *.rgs файлов (соответственно обновил GUID'ы, иначе не работало) все начало работать под всеми версия AutoCAD, проверил!

Спасибо за помощь!