Кастомные свойства custom entity

Автор Тема: Кастомные свойства custom entity  (Прочитано 17218 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Здравствуйте, необходимо сделать отображение некоторых свойств custom entity в панели свойств автокада. Из примеров что я увидел в sdk добавление новых свойств выглядит просто ужасно - необходимо создать файл idl вручную там прописать эти свойства для каждого custom entity. потом для каждого entity создать com interface где прописать геттеры и сеттеры каждого из свойств. А если элементы имеют общие свойства - опять же их приходится дублировать в этой куче файлов - нет ли более простого и элегантного способа добавление свойств обьекту и наследования общих свойств - спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #1 : 23-09-2018, 12:02:54 »
Вот это может несколько облегчить задачу, но всё равно будет много ручных правок:



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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #2 : 24-09-2018, 16:19:52 »
Александр Ривилис, Спасибо за совет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #3 : 24-09-2018, 18:31:17 »
Александр Ривилис, Спасибо за совет.
Кстати, работает не без глюков и потом приходится кое-что править ручками - результат работы этого визарда у меня не компилировался, пока я не изменил/добал некоторые include'ы
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #4 : 25-09-2018, 10:18:28 »
Александр Ривилис,  Я посмотрел что делает визард он генерирует болванку com  класса, но поля свойств все равно приходится вручную добавлять в idl классе а так же в классах com. как я понял какое-то наследование общих полей в данной реализации нельзя сделать, все равно в idl надо прописывать id параметров вручную а потом то же делать в com. у меня вопрос по одному из примеров asdkcomwrapper (нижу я привел отрывки кода) как я понял здесь инициализируются три свойства NUMBER  SQUARESIZE CENTERPOINT:
1. в com_wrapper.h #define DISPID_NUMBER       0x01 соответствует propget, id(1), в idl могут ли данные id идти не по порядку или порядок обязателен?
2. почему только два параметра присутствуют между BEGIN_OPMPROP_MAP() и END_OPMPROP_MAP() и зачем их там прописывать ?
3 функции типа STDMETHOD(get_CenterPoint)/STDMETHOD(put_CenterPoint) необходимы для чтения и установки свойств но каким образом они присваиваются соответствующему свойству?
4. зачем нужны функции STDMETHOD(GetElementValue) и STDMETHOD(SetElementValue) могут ли они заменить отдельное создание put и get функций из пункта 3 для минификации написания кода ?

Буду благодарен за разъяснение.

Код - C++ [Выбрать]
  1. //com_wrapper.h
  2. #define DISPID_NUMBER       0x01
  3. #define DISPID_SQUARESIZE   0x02
  4. #define DISPID_CENTERPOINT  0x03
  5.  
  6. ......................................
  7.  
  8.    
  9. // IAsdkSquareWrapper
  10. public:
  11.     STDMETHOD(get_CenterPoint)(/*[out, retval]*/ VARIANT *pVal);
  12.     STDMETHOD(put_CenterPoint)(/*[in]*/ VARIANT newVal);
  13.     STDMETHOD(get_SquareSize)(/*[out, retval]*/ double *pVal);
  14.     STDMETHOD(put_SquareSize)(/*[in]*/ double newVal);
  15.     STDMETHOD(get_Number)(/*[out, retval]*/ short *pVal);
  16.     STDMETHOD(put_Number)(/*[in]*/ short newVal);
  17.  
  18. // OPM
  19. //
  20. // IOPMPropertyExtension
  21. //
  22. BEGIN_OPMPROP_MAP()
  23.     OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, \
  24.         0, 0, 0, _T(""), 0, 1, IID_NULL, IID_NULL, "")
  25.     OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, \
  26.         0, 0, 0, _T(""), 0, 1, IID_NULL, IID_NULL, "")
  27. END_OPMPROP_MAP()
  28.  
  29.     STDMETHOD(GetCategoryName)(THIS_
  30.                            /* [in]  */ PROPCAT propcat,
  31.                            /* [in]  */ LCID lcid,
  32.                            /* [out] */ BSTR* pbstrName) { return S_FALSE;}
  33.  
  34.     virtual HINSTANCE GetResourceInstance()
  35.     {
  36.         return _Module.GetResourceInstance();
  37.     }
  38.  
  39.     STDMETHOD(GetElementValue)(
  40.         /* [in] */ DISPID dispID,
  41.         /* [in] */ DWORD dwCookie,
  42.         /* [out] */ VARIANT * pVarOut) ;
  43.  
  44.     //Used for property expansion (currently variant types)
  45.     STDMETHOD(SetElementValue)(
  46.         /* [in] */ DISPID dispID,
  47.         /* [in] */ DWORD dwCookie,
  48.         /* [in] */ VARIANT VarIn) ;      
  49.  
  50.     //Used for property expansion (currently variant types)
  51.     STDMETHOD(GetElementStrings)(
  52.         /* [in] */ DISPID dispID,
  53.         /* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,
  54.         /* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut) ;
  55.  
  56.     //Used for property expansion (currently variant types)
  57.     STDMETHOD(GetElementGrouping)(
  58.         /* [in] */ DISPID dispID,
  59.         /* [out] */ short *groupingNumber) ;
  60.  
  61.     //Used for property expansion (currently variant types)
  62.     STDMETHOD(GetGroupCount)(
  63.         /* [in] */ DISPID dispID,
  64.         /* [out] */ long *nGroupCnt) ;
  65.     STDMETHOD(GetPredefinedStrings)(
  66.         /* [in] */ DISPID dispID,
  67.         /* [out] */ CALPOLESTR *pCaStringsOut,
  68.         /* [out] */ CADWORD *pCaCookiesOut);
  69.     STDMETHOD(GetPredefinedValue)(
  70.         /* [in] */ DISPID dispID,
  71.         /* [out] */ DWORD dwCookie,
  72.         /* [out] */ VARIANT *pVarOut);
  73.  
  74. private:
  75.     //short mNumber;
  76. };
  77.  

idl file

Код - C++ [Выбрать]
  1. ...
  2.  interface IAsdkSquareWrapper : IAcadEntity
  3.     {
  4.         [propget, id(1), helpstring("property Number")] HRESULT Number([out, retval] short *pVal);
  5.         [propput, id(1), helpstring("property Number")] HRESULT Number([in] short newVal);
  6.         [propget, id(2), helpstring("property SquareSize")] HRESULT SquareSize([out, retval] double *pVal);
  7.         [propput, id(2), helpstring("property SquareSize")] HRESULT SquareSize([in] double newVal);
  8.         [propget, id(3), helpstring("property CenterPoint")] HRESULT CenterPoint([out, retval] VARIANT *pVal);
  9.         [propput, id(3), helpstring("property CenterPoint")] HRESULT CenterPoint([in] VARIANT newVal);
  10.     };
  11. ....
  12.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #5 : 25-09-2018, 11:20:53 »
1. в com_wrapper.h #define DISPID_NUMBER       0x01 соответствует propget, id(1), в idl могут ли данные id идти не по порядку или порядок обязателен?
В смысле могут ли быть пропуски типа 1, 3, 5, 105, и т.д. ??? Могут. Более того есть зарезервированные AutoCAD'ом значения.
2. почему только два параметра присутствуют между BEGIN_OPMPROP_MAP() и END_OPMPROP_MAP() и зачем их там прописывать ?
Вообще-то должно быть по одной записи на каждое свойство.
3 функции типа STDMETHOD(get_CenterPoint)/STDMETHOD(put_CenterPoint) необходимы для чтения и установки свойств но каким образом они присваиваются соответствующему свойству?
Не понял вопроса. По OPMPROP_MAP они определяются, по номеру.
4. зачем нужны функции STDMETHOD(GetElementValue) и STDMETHOD(SetElementValue) могут ли они заменить отдельное создание put и get функций из пункта 3 для минификации написания кода ?
Насколько я помню они используются для изменения значений в составных свойствах, типа массива (например, координата X для точки). Передается DispId и номер элемента массива - для точки от 0 до 2.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #6 : 25-09-2018, 11:49:18 »
Цитата: Vitaut Tryputsin от 25-09-2018, 10:18:28
3 функции типа STDMETHOD(get_CenterPoint)/STDMETHOD(put_CenterPoint) необходимы для чтения и установки свойств но каким образом они присваиваются соответствующему свойству?
Не понял вопроса. По OPMPROP_MAP они определяются, по номеру.
Спасибо за ответ. Я имел ввиду почему именно функция put_CenterPoint является set методом свойства centerpoint а не к примеру функция put_centrpoint1, просто я не увидел где указатель на сеттер или геттер сопоставляется со свойством. Или сопоставление этих функций где-то внутри происходит по имени переменной?

И еще один вопрос - можно ли к примеру наследовать класс обьекта от какого нибудь стандартного (Mleader к примеру) не переопределять его виртуальные методы subworldraw и тп - что бы он полностью сохранил функционал родителя в тч и свойства и добавить просто одно доп свойство и один сохраняемый параметр в базе автокада? (к примеру id Какого либо элемента)?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #7 : 25-09-2018, 12:07:34 »
И еще один вопрос - можно ли к примеру наследовать класс обьекта от какого нибудь стандартного (Mleader к примеру) не переопределять его виртуальные методы subworldraw и тп - что бы он полностью сохранил функционал родителя в тч и свойства и добавить просто одно доп свойство и один сохраняемый параметр в базе автокада? (к примеру id Какого либо элемента)?
Так просто не получится. Если это необходимо, то имеет смысл подумать не о Custom Entity, а о динамических свойствах.

Я имел ввиду почему именно функция put_CenterPoint является set методом свойства centerpoint а не к примеру функция put_centrpoint1, просто я не увидел где указатель на сеттер или геттер сопоставляется со свойством. Или сопоставление этих функций где-то внутри происходит по имени переменной?
При компиляции AsdkSquareLib.idl получаются файлы AsdkSquareLib_i.c и AsdkSquareLib_i.h и соответственно для
   
Код - C++ [Выбрать]
  1. interface IAsdkSquareWrapper : IAcadEntity
  2.     {
  3.         [propget, id(1), helpstring("property Number")] HRESULT Number([out, retval] short *pVal);
  4.         [propput, id(1), helpstring("property Number")] HRESULT Number([in] short newVal);
  5.         [propget, id(2), helpstring("property SquareSize")] HRESULT SquareSize([out, retval] double *pVal);
  6.         [propput, id(2), helpstring("property SquareSize")] HRESULT SquareSize([in] double newVal);
  7.         [propget, id(3), helpstring("property CenterPoint")] HRESULT CenterPoint([out, retval] VARIANT *pVal);
  8.         [propput, id(3), helpstring("property CenterPoint")] HRESULT CenterPoint([in] VARIANT newVal);
  9.     };
имеем:
Код - C++ [Выбрать]
  1.     MIDL_INTERFACE("F27668A9-2E2D-4931-886F-ED93EF812D4E")
  2.     IAsdkSquareWrapper : public IAcadEntity
  3.     {
  4.     public:
  5.         virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Number(
  6.             /* [retval][out] */ short *pVal) = 0;
  7.        
  8.         virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_Number(
  9.             /* [in] */ short newVal) = 0;
  10.        
  11.         virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_SquareSize(
  12.             /* [retval][out] */ double *pVal) = 0;
  13.        
  14.         virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_SquareSize(
  15.             /* [in] */ double newVal) = 0;
  16.        
  17.         virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_CenterPoint(
  18.             /* [retval][out] */ VARIANT *pVal) = 0;
  19.        
  20.         virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_CenterPoint(
  21.             /* [in] */ VARIANT newVal) = 0;
  22.        
  23.     };
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #8 : 25-09-2018, 12:16:07 »
Супер  :), спасибо большое. Почитаю про динамические свойства.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #9 : 25-09-2018, 12:18:41 »
Цитата: Vitaut Tryputsin от 25-09-2018, 11:49:18
И еще один вопрос - можно ли к примеру наследовать класс обьекта от какого нибудь стандартного (Mleader к примеру) не переопределять его виртуальные методы subworldraw и тп - что бы он полностью сохранил функционал родителя в тч и свойства и добавить просто одно доп свойство и один сохраняемый параметр в базе автокада? (к примеру id Какого либо элемента)?
Так просто не получится. Если это необходимо, то имеет смысл подумать не о Custom Entity, а о динамических свойствах.
Я еще подумал что вроде можно и xdata использовать для записи каких то своих свойств и значений а потом при наличии динамических свойств их выводить. Я примерно правильно думаю?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #10 : 25-09-2018, 12:23:49 »
Я еще подумал что вроде можно и xdata использовать для записи каких то своих свойств и значений а потом при наличии динамических свойств их выводить. Я примерно правильно думаю?
Да. Я попробую сделать пример. Если речь идёт о свойстве для AcDbMLeader, то какое именно дополнительное свойство ты хотел бы сделать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #11 : 25-09-2018, 12:40:53 »
Да. Я попробую сделать пример. Если речь идёт о свойстве для AcDbMLeader, то какое именно дополнительное свойство ты хотел бы сделать?
Спасибо,Александр Ривилис,  это было бы здорово. Ну для мультивыноски к примеру текстовое поле формат. (это шаблон по которому будут вписывться данные). А так же в xdata хранить id элемента с которым связана мультивыноска. Предпологается что будет команда которая найдет все мои выноски и пересчитает тексовый месседж выносок используя присвоеный формат. И еще вопрос по дин свойствам они могут добавлятся к одному определенному классу примитивов или его можно на множество классов распространить (типо как общее свойство для нескольких классов)?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #12 : 25-09-2018, 12:52:15 »
И еще вопрос по дин свойствам они могут добавлятся к одному определенному классу примитивов или его можно на множество классов распространить (типо как общее свойство для нескольких классов)?
Его можно добавить к базовому классу, общему для всех твоих классов (например, если добавить для AcDbCurve, то сработает и для AcDbLine, и для AcDbPolyline, и для AcDbArc и т.д.) А можно добавить для AcDbEntity и управлять его появлением в OPM и выводимым значением в зависимости от того, что выбрано.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Кастомные свойства custom entity
« Ответ #13 : 25-09-2018, 13:20:53 »
Ну для мультивыноски к примеру текстовое поле формат. (это шаблон по которому будут вписывться данные).
Это поле редактируется в панели свойств или только показывается?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Кастомные свойства custom entity
« Ответ #14 : 25-09-2018, 13:48:06 »
Это поле редактируется в панели свойств или только показывается?
Редактируется. - это что то меняет? - Если это можно реализовать но много возни просто напишите как я сам разберусь