Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Gennadiy от 20-01-2015, 15:31:02

Название: managed wrapper
Отправлено: Gennadiy от 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 и т.п.)?
Название: Re: managed wrapper
Отправлено: Александр Ривилис от 20-01-2015, 15:41:35
__try_cast заменяю на safe_cast, а дальше не могу разобраться и примеров не нашел.
А что дальше не так?
Название: Re: managed wrapper
Отправлено: Gennadiy от 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!
Название: Re: managed wrapper
Отправлено: Gennadiy от 20-01-2015, 17:43:27
если сделать так, то компилятор ошибок не выдает
Autodesk::AutoCAD::Runtime::DisposableWrapper::Create(Point3dCollection::typeid, IntPtr(pArr), true));
остается вопрос как написать метод set()?
Название: Re: managed wrapper
Отправлено: Александр Ривилис от 20-01-2015, 20:18:26
остается вопрос как написать метод set()?
Как я понимаю в этом метод ты передаешь Point3dCollection, а своему примитиву ты должен передать AcGePoint3dArray
Так вот Point3dCollection.UnmanagedObject - это и есть AcGePoint3dArray.
Название: Re: managed wrapper
Отправлено: Gennadiy от 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?
Название: Re: managed wrapper
Отправлено: Александр Ривилис от 21-01-2015, 18:28:38
почему не конвертируется в MyPoly?
Наверное потому, что не зарегистрировано MyNameSpase.MyPoly
Название: Re: managed wrapper
Отправлено: Gennadiy от 21-01-2015, 18:47:04
А где и как его зарегистрировать?
Название: Re: managed wrapper
Отправлено: Александр Ривилис от 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.  
Тебе нужно сделать тоже самое, только указав свой свой класс и пространство имён.
Название: Re: managed wrapper
Отправлено: Gennadiy от 21-01-2015, 19:36:58
Большое спасибо, Александр. Надеюсь это было последнее недостающее звено в цепочке создания Custom Object и Managed Wrapper.
В итоге за месяц активного изучения c++ почти с нуля и arx на практическом примере мне удалось создать свой работающий примитив. Дальше будет уже легче.