При разработке собственного CustomEntity, решил разбить ее на SubEntity и написать для SubEntity COM-объекты для паллеты свойств, чтобы выводить отдельные параметры.
За основу взял пример из
"ObjectARX 2009\samples\entity\SubEntity\".
При рисовании объекта в SubWorldDraw, перед рисованием отдельных элементов CustomEntity вызываю mode->subEntityTraits().setSelectionMarker(id).
По сколько количество SubEntity у меня меняется я рассчитываю SelectionMarker динамически.
::subWorldDraw (AcGiWorldDraw *mode)
{
....
for(PolylinePtrVecIt it = polyElems.begin(); it != polyElems.end(); ++it ){
Adesk::LongPtr markerId = std::distance(polyElems.begin(), it) + 1;
mode->subEntityTraits().setSelectionMarker( markerId );
mode->subEntityTraits().setColor(3);
int size = it->get()->numVerts();
AcGePoint3dArray polyPnts;
for(int i = 0; i < (int)it->get()->numVerts(); ++i){
AcGePoint3d pnt;
it->get()->getPointAt(i, pnt);
polyPnts.append(pnt);
}
mode->geometry().polyline(polyPnts.length(), &polyPnts[0]);
// mode->geometry().pline(*it->get());
// (*it)->worldDraw(mode);
}
....
}
Когда рисую полилинию по точкам
mode->geometry().polyline(polyPnts.length(), &polyPnts[0]);
При выделении SubEntity (кликом мыши + Сtrl по части CustomEntity), подсвечивается полилиния целиком и в унаследованный метод
subGetSubentPathsAtGsMarker(AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d & pickPoint, const AcGeMatrix3d & viewXform, int & numPaths, AcDbFullSubentPath *& subentPaths, int numInserts, AcDbObjectId * entAndInsertStack) const
gsMark приходить всегда тот что я задал в setSelectionMarker.
Если же рисовать полилинии одним из методов:
mode->geometry().pline(*it->get());
(*it)->worldDraw(mode);
При выделении SubEntity (кликом мыши + Сtrl по части CustomEntity), подсвечивается части полилинии (полилиния разбивается на линии) и в унаследованный метод:
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 проблем нет.