> Владимир Громов
Согласен. НО если человек заинтересовался, то радоваться нада - нашего полку прибыло. А Вы отбиваете всякую охоту задавать вопросы. Согласитесь, не сильно приятно расчитывая получить помошь читать сообщения, которые мягко говоря не несут в себе полезной информации. Берите пример с Александра Ривилиса :), учитесь терпимей относиться к вопросам, какими б ... они не были.
> Александр Ривилис
Сорри, больше не буду :)
> supremum
А это код, который тебя интересует. Работает только в МСК, но его не сложно переделать под любую систему координат. Про дуговые сегменты речь вроде не шла.
ads_name ent;
ads_point pt;
AcDbCurve* pCurve;
AcDbObjectId eId;
if(ads_entsel("\nУкажите контур: ",ent,pt) != RTNORM) return;
if(acdbGetObjectId(eId, ent)!= Acad::eOk) return;
if (acdbOpenObject(pCurve, eId, AcDb::kForRead)!= Acad::eOk)return;
// -- начало проверки
// контур должен быть только полилинией
if (pCurve!=0) pCurve->close(); // на всякий случай закрываем объект
else return;
// -- конец поверки
if (RTNORM != acedGetPoint(0, "\nУкажите сегмент:\n", pt)) return;
AcGePoint3dArray ptArr; ptArr.setLogicalLength(0); // на всякий случай
AcGeIntArray a1; a1.setLogicalLength(0);
AcGeIntArray a2; a2.setLogicalLength(0);
pCurve->getGripPoints(ptArr,a1,a2);
if (pCurve->isClosed()) ptArr.append(ptArr.first());
// в ptArr теперь хранятся координаты узловых точек контура
AcGePoint3d pt3d;
pt3d.x = pt[X];pt3d.y = pt[Y];pt3d.z = pt[Z];
AcGePoint3d ptOnCurve;
AcGePoint3d ptStartSegment, ptEndSegment;
pCurve->getClosestPointTo(pt3d, ptOnCurve);
// точка ptOnCurve лежит на контуре. Осталось вычленить сегмент.
double param1, param2, paramPT, dist1, dist2, distPT;
pCurve->getParamAtPoint(ptOnCurve,paramPT);
pCurve->getDistAtParam(paramPT,distPT); // вычисляем расстояние от начальной точки до нашей точки
for (int i = 0; i < ptArr.length() - 1; i++)
{
// pCurve->getDistAtPoint() не всегда срабатывает правильно
pCurve->getParamAtPoint(ptArr.at(i),param1);
pCurve->getParamAtPoint(ptArr.at(i+1),param2);
pCurve->getDistAtParam(param1,dist1);
pCurve->getDistAtParam(param2,dist2);
if (dist2 < dist1)
{
pCurve->getEndParam(param2);
pCurve->getDistAtParam(param2,dist2);
}
if ((distPT > dist1)&&(distPT < dist2))
{
pCurve->getPointAtParam(param1,ptStartSegment);
pCurve->getPointAtParam(param2,ptEndSegment);
break;
}
}
// в ptStartSegment находится начальная точка сегмента
// в ptEndSegment находится конечная точка сегмента
// ...
Может и не совсем изящно написано, но работает правильно на 100%. Проверял.