Тема: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

Мой класс унаследован от AcDbEntity.
Как реализовать обрезку примитивов, которые проходят через мой примитив, который образует мой класс.
Где это допустим реализовано в примере - polysamp.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> CheVik
Поставь задачу нормально (т.е. очень четко):
1) Что из себя представляет "твой примитив"?
2) Кого (какие типы примитивов) нужно обрезать и как (т.е. части их должны стать невидимыми, как у WIPEOUT, или они должны физически обрезаться, т.е. например укорачиваться пересекающийся отрезок?
3) Как ты будешь понимать, что другой примитив проходит через "твой примитив"?
4) Каким образом должна производится "обрезка"? Стандарной командой AutoCAD _TRIM, или какой-то твоей командой?
Если хочешь получить вразумительный ответ - не поленись и поставь задачу нормально!

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> Александр Ривилис
У меня примитив - это рисование профиля поверхности по отметкам и расстоянию между ними. На нем рисуется линиями некая конструкция. Нужно некоторые линии, которые пересекают мой профиль обрезать или удлинять(команды AutoCAD). Это то, что реализовано в примере polysamp. Линии, которые пересекают многоугольник или не доходят до него, обрезаются или удлиняются. Но я не знаю, что это за функции.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

1) Твой примитив должен быть производным от AcDbCurve
2) Ты должен переопределить множество методов:

Acad::ErrorStatus AcDbCurve::intersectWith(const AcDbEntity* pEnt,AcDb::Intersect intType, AcGePoint3dArray& points,
int thisGs, int otherGs) const
Acad::ErrorStatus AcDbCurve::intersectWith(const AcDbEntity* pEnt,
    AcDb::Intersect intType,  const AcGePlane& projPlane,  AcGePoint3dArray& points,  int thisGs,  int otherGs) const
Acad::ErrorStatus AcDbExtend::extend(double newParam)
Acad::ErrorStatus AcDbCurve::getClosestPointTo(const AcGePoint3d& givenPnt,
    const AcGeVector3d& normal, AcGePoint3d& pointOnCurve, Adesk::Boolean extend) const
Acad::ErrorStatus AcDbCurve::getClosestPointTo (const AcGePoint3d& givenPoint,
        AcGePoint3d&       pointOnCurve, Adesk::Boolean     extend) const
Acad::ErrorStatus AcDbCurve::getEndPoint(AcGePoint3d& endPoint) const
Acad::ErrorStatus AcDbCurve::getSplitCurves (const AcGeDoubleArray& parameters,
        AcDbVoidPtrArray& curveSegments) const

И т.д...

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> Александр
Ривилис
Я переопределил методы:
Acad::ErrorStatus AcDbEntity::intersectWith(const AcDbEntity* pEnt,AcDb::Intersect intType, AcGePoint3dArray& points,
int thisGs, int otherGs) const
Acad::ErrorStatus AcDbEntity::intersectWith(const AcDbEntity* pEnt,
    AcDb::Intersect intType,  const AcGePlane& projPlane,  AcGePoint3dArray& points,  int thisGs,  int otherGs) const
Вместо AcDbCurve AcDbEntity.
Линии обрезаются и удлиняются. С остальными методами нужно еще разбираться.
У меня еще вопрос: Как назначить толщину линии, если она рисуется функцией - mode->geometry().polyline(...);

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> CheVik
1) Я немного ввел тебя в заблуждение. Достаточно переопределить эти два метода, чтобы другие примитивы (производные от AcDbCurve, например AcDbLine, AcDbPolyline, AcDbArc и т.д.) обрезались по твоему примитиву. Но если тебе нужно, чтобы твой примитив обрезался по другим линиям, то нужно сделать то, что я описал здесь: > Александр Ривилис (2006-07-12 10:17:11)
2) Толщину или вес линии? Если вес линии, то mode->subEntityTraits().setLineWeight(...) Ну а если толщину, то проще всего создать AcDbPolyline с нужной толщиной и в твоем методе worldDraw()/viewportDraw() вызвать соответствующий метод этой AcDbPolyline.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> Александр Ривилис
Я задавал и вес и толщину линии работает и то и другое, за исключением того, что когда создаю AcDbPolyline, то не происходит привязки примитив(линия) AutoCAD к моей линии, которая входит в мой примитив.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

Тебе нужно переопределить метод getOsnapPoints() чтобы он учитывал и эту AcDbPolyline.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

Я не совсем ясно наверное выразился, когда вес(mode->subEntityTraits().setLineWeight(...) ), то все работает, а когда вместо веса я делаю толщину(использую AcDbPolyline), то привязка исчезает.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

А если объект невозможно, на то есть причины, наследовать от AcDbCurve? Как быть в таком случае?

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> Sandrick
Экспериментировать! Думаю, что для того чтобы обрезать другие примитивы не обязательно наследовать от AcDbCurve. Достаточно переопределить методы intersectWith.

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

Объект наследован в том числе от AcDbEntity. Грубо говоря, какая функция, предопределенная в классе AcDbEntity срабатывает на _trim или _extend? Может вопрос некорректен...
intersectWith я уже пробовал переопределять, ни к каким результатам не привело... срабатывание, естественно только при попадании другого объекта в периметр моего...

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

> Sandrick
Если обрезать нужно свой примитив, то он должен быть наследован от AcDbCurve (во всяком случай так заявляют в Autodesk) и должны быть переопределены все указанные мною в начале этой темы функции. И вообще команды _trim, _extend, _offset, _break должны работать только с линиями (наследницами AcDbCurve).

Re: Как реализовать обрезку примитивов в классе унаследованного от AcDbEntity?

дык в том-то и дело, что мне нужно использовать механизм trim и extend только на половину... т.е. использовать аналогично trim и extend в классе AcDbHatch...