managed wrapper

Автор Тема: managed wrapper  (Прочитано 10800 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
managed wrapper
« : 20-01-2015, 15:31:02 »
Добрый день!
Пишу свой wrapper используя пример из Object ARX 2015 polysamp, там используется старая версия CLR,
а у меня проект в новой версии CLR в VS2013 (ToolSet v110 и установлена VS2012)
Подскажите как мне преобразовать этот код из примера в новую версию CLR
Код - C++ [Выбрать]
  1. Point2dCollection* Autodesk::ObjectDbxSample::Poly::get_Vertices()
  2. {
  3.     AcGePoint2dArray* pArr = new AcGePoint2dArray();
  4.     Autodesk::AutoCAD::Runtime::Interop::Check(GetImpObj()->getVertices2d(*pArr));
  5.  
  6.     Point2dCollection* ret =
  7.         __try_cast<Point2dCollection*>(Autodesk::AutoCAD::Runtime::DisposableWrapper::Create(__typeof(Point2dCollection),pArr,true));
  8.  
  9.     return ret;
  10. }

__try_cast заменяю на safe_cast, а дальше не могу разобраться и примеров не нашел.
С остальным разобрался а здесь пока не могу. Попутно где можно почитать в документации о преобразованиях объектов AutoCAD c++ в managed (типа AcGePoint3dArray в Point3dCollection и т.п.)?
« Последнее редактирование: 20-01-2015, 20:13:27 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: managed wrapper
« Ответ #1 : 20-01-2015, 15:41:35 »
__try_cast заменяю на safe_cast, а дальше не могу разобраться и примеров не нашел.
А что дальше не так?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: managed wrapper
« Ответ #2 : 20-01-2015, 15:55:26 »
на данном этапе у меня такой код
Код - C++ [Выбрать]
  1.         property Point3dCollection^ points
  2.                 {
  3.                         Point3dCollection^ get()
  4.                         {
  5.                                 AcGePoint3dArray* pArr = new AcGePoint3dArray();
  6.                                 Autodesk::AutoCAD::Runtime::Interop::Check(GetImpObj()->getPoints(*pArr));
  7.  
  8.                                 Point3dCollection^ ret =        safe_cast<Point3dCollection^>(
  9.                                                                         Autodesk::AutoCAD::Runtime::DisposableWrapper::Create(Point3dCollection::typeid, pArr, true));
  10.                                
  11.                                 return ret;
  12.                         }
  13.                 }

не подходит аргумент pArr в DisposableWrapper::Create
Еще предстоит написать метод set с обратным преобразованием, его примера нет в ObjectARX SDK!
« Последнее редактирование: 26-01-2015, 01:41:39 от Александр Ривилис »

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: managed wrapper
« Ответ #3 : 20-01-2015, 17:43:27 »
если сделать так, то компилятор ошибок не выдает
Autodesk::AutoCAD::Runtime::DisposableWrapper::Create(Point3dCollection::typeid, IntPtr(pArr), true));
остается вопрос как написать метод set()?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: managed wrapper
« Ответ #4 : 20-01-2015, 20:18:26 »
остается вопрос как написать метод set()?
Как я понимаю в этом метод ты передаешь Point3dCollection, а своему примитиву ты должен передать AcGePoint3dArray
Так вот Point3dCollection.UnmanagedObject - это и есть AcGePoint3dArray.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: managed wrapper
« Ответ #5 : 21-01-2015, 17:55:34 »
Чтобы не создавать новую тему, у меня еще появился вопрос по wrapper
Все получилось, объект создается в c#  и работает НО!!!

когда я пытаюсь получить его обратно на c#, даже в том же методе сразу после добавления в базу чертежа

MyNameSpase.MyPoly pl =tr.GetObject(idPl, OpenMode.ForWrite) as MyNameSpase.MyPoly;
pl == null
получаю Autodesk.AutoCAD.DatabaseServices.ImpCurve

почему не конвертируется в MyPoly?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: managed wrapper
« Ответ #6 : 21-01-2015, 18:28:38 »
почему не конвертируется в MyPoly?
Наверное потому, что не зарегистрировано MyNameSpase.MyPoly
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: managed wrapper
« Ответ #7 : 21-01-2015, 18:47:04 »
А где и как его зарегистрировать?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: managed wrapper
« Ответ #8 : 21-01-2015, 19:16:33 »
Посмотри тот пример, на основе которого ты всё делал. Там в main.cpp при AcRx::kInitAppMsg создается "фабрика объектов":
Код - C++ [Выбрать]
  1.                         static AcMgObjectFactoryBase* PEs[] =
  2.                         {
  3.                                 new AcMgObjectFactory<Autodesk::ObjectDbxSample::Poly,AsdkPoly>(),
  4.                                 // end the array with a NULL
  5.                                 NULL
  6.                         };
  7.  
Тебе нужно сделать тоже самое, только указав свой свой класс и пространство имён.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: managed wrapper
« Ответ #9 : 21-01-2015, 19:36:58 »
Большое спасибо, Александр. Надеюсь это было последнее недостающее звено в цепочке создания Custom Object и Managed Wrapper.
В итоге за месяц активного изучения c++ почти с нуля и arx на практическом примере мне удалось создать свой работающий примитив. Дальше будет уже легче.