CustomEntity. SubEntity

Автор Тема: CustomEntity. SubEntity  (Прочитано 8444 раз)

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

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
CustomEntity. SubEntity
« : 23-04-2015, 11:15:18 »
При разработке собственного CustomEntity, решил разбить ее на SubEntity и написать для SubEntity COM-объекты для паллеты свойств, чтобы выводить отдельные параметры.
За основу взял пример из "ObjectARX 2009\samples\entity\SubEntity\".

При рисовании объекта в SubWorldDraw, перед рисованием отдельных элементов CustomEntity вызываю mode->subEntityTraits().setSelectionMarker(id).
По сколько количество SubEntity у меня меняется я рассчитываю SelectionMarker динамически.

Код - C++ [Выбрать]
  1. ::subWorldDraw (AcGiWorldDraw *mode)
  2. {
  3.         ....
  4.         for(PolylinePtrVecIt it = polyElems.begin(); it != polyElems.end(); ++it ){            
  5.                 Adesk::LongPtr markerId = std::distance(polyElems.begin(), it) + 1;
  6.                 mode->subEntityTraits().setSelectionMarker( markerId );
  7.                
  8.                 mode->subEntityTraits().setColor(3);
  9.                 int size = it->get()->numVerts();
  10.                 AcGePoint3dArray polyPnts;
  11.                 for(int i = 0; i < (int)it->get()->numVerts(); ++i){
  12.                         AcGePoint3d pnt;
  13.                         it->get()->getPointAt(i, pnt);
  14.                         polyPnts.append(pnt);
  15.                 }
  16.  
  17.                 mode->geometry().polyline(polyPnts.length(), &polyPnts[0]);
  18. //              mode->geometry().pline(*it->get());
  19. //              (*it)->worldDraw(mode);
  20.         }
  21.  
  22.         ....
  23. }

Когда рисую полилинию по точкам

Код - C++ [Выбрать]
  1. mode->geometry().polyline(polyPnts.length(), &polyPnts[0]);

При выделении SubEntity (кликом мыши + Сtrl по части CustomEntity), подсвечивается полилиния целиком и в унаследованный метод

Код - C++ [Выбрать]
  1. subGetSubentPathsAtGsMarker(AcDb::SubentType  type, Adesk::GsMarker gsMark, const AcGePoint3d & pickPoint, const AcGeMatrix3d & viewXform, int & numPaths, AcDbFullSubentPath *& subentPaths, int  numInserts, AcDbObjectId * entAndInsertStack) const

gsMark приходить всегда тот что я задал в setSelectionMarker.

Если же рисовать полилинии одним из методов:

Код - C++ [Выбрать]
  1. mode->geometry().pline(*it->get());
  2. (*it)->worldDraw(mode);

При выделении SubEntity (кликом мыши + Сtrl по части CustomEntity), подсвечивается части полилинии (полилиния разбивается на линии) и в унаследованный метод:

Код - C++ [Выбрать]
  1. subGetSubentPathsAtGsMarker(AcDb::SubentType  type, Adesk::GsMarker gsMark, const AcGePoint3d & pickPoint, const AcGeMatrix3d & viewXform, int & numPaths, AcDbFullSubentPath *& subentPaths, int  numInserts, AcDbObjectId * entAndInsertStack) const

gsMark приходить для первой линии (части полилинии что рисовалась) тот что я задал в  setSelectionMarker (в начале это 1), а для последующих инкрементируется (соответственно 2, 3,....).

Проблема в том что мне нужно рисовать полилинии с кривыми (Bulge) и по этому мне не подходит mode->geometry().polyline, а в дальнейшем мне нужно знать какая SubEntity (часть объекта) была выбрана для того чтобы выводить данные в паллету свойств.
Как можно выйти из этой ситуации? Можно ли сделать так чтобы полилиния выделялась целиком и чтобы gsMark приходил тот что я задаю при рисовании для целой полилинии используя выше указанные методы?

С COM-объектами и палеттой свойств для CustomEntity i SubEntity проблем нет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. SubEntity
« Ответ #1 : 23-04-2015, 11:40:06 »
А если ты будешь рисовать свою полилинию последовательными кусками при  помощи AcGiGeometry::polyline и AcGiGeometry::circularArc в зависимости от типа участка?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Dziubyna 28-04-2015, 10:02:30

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

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. SubEntity
« Ответ #2 : 23-04-2015, 11:50:47 »
У меня сложные кривые, мне нужно именно полилиния, а может в дальнейшем и AcDbSpline.

Отвечу сам на свой вопрос, только что нашел решение.

Нужно вместо:

Код - C++ [Выбрать]
  1. mode->subEntityTraits().setSelectionMarker( markerId );

Использовать:

Код - C++ [Выбрать]
  1. mode->subEntityTraits().pushMarkerOverride(true, markerId);

Для каждого отдельного SubEntity. После прорисовки SubEntities нужно вызвать:

Код - C++ [Выбрать]
  1. mode->subEntityTraits().clearMarkerOverride();

для нормальной прорисовки других элементов CustomEntity что рисуются, которые не являются частью SubEntity.

По крайней мере у меня все нормально заработало. Буду еще разбираться не влияет оно что то еще

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. SubEntity
« Ответ #3 : 23-04-2015, 11:53:36 »
По крайней мере у меня все нормально заработало. Буду еще разбираться не влияет оно что то еще
Во всяком случае если тебе нужна отрисованная тобой полилиния (сплайн) всегда целиком, то это правильное решение.
Единственный нюанс - оно будет работать только в AutoCAD 2015 и 2016. В предыдущих версиях таких методов нет. Если тебе нужна поддержка предыдущих версий, то придётся делать так, как я предложил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение