Тема: Координаты объекта
Есть Polyline, нужны ее кординаты. Знаю что можно использовать GetPointAt но не знаю каким макаром!!!
Спасибо!!!
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Координаты объекта
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть Polyline, нужны ее кординаты. Знаю что можно использовать GetPointAt но не знаю каким макаром!!!
Спасибо!!!
К примеру (подходит и к 3д и к 2д, только класс поменять):
// функция возвращает координаты вершины полилинии с указанным номером (нумерация с 0). AcGePoint3d alxCoordOfNumberVertex (AcDbObjectId pLineId, int NumberOfVertex) { AcDb3dPolyline *old_poly; acdbOpenObject(old_poly, pLineId, AcDb::kForRead); AcDbObjectIterator *pVertIter = old_poly->vertexIterator(); old_poly->close(); AcDb3dPolylineVertex *pVertex; AcDbObjectId vertexObjId; AcGePoint3d location; for (int vertexNumber = 0; !pVertIter->done(); vertexNumber++, pVertIter->step()) { vertexObjId = pVertIter->objectId(); acdbOpenObject(pVertex, vertexObjId, AcDb::kForRead); location = pVertex->position(); //acutPrintf("\nVertex #%d's location is" " : %0.3f, %0.3f, %0.3f", vertexNumber, location[X], location[Y], location[Z]); if (vertexNumber == NumberOfVertex) {pVertex->close(); delete pVertIter; return location;} pVertex->close(); } delete pVertIter; return location; }
Ес-но на авторство не претендую :)
> alex
А как изменится код, если нужно получить координаты Polysolid?
> alex
интересный вариант, но вот только зачем столько лишнего текста, есть же функция getGripPoints, тем более можно брать точки с базового класса
void GetAllCoords(AcDbObjectId id, AcGePoint3dArray &ptArr) { AcDbIntArray a1, a2; ptArr.setLogicalLength(0); a1.setLogicalLength(0); // на всякий случай обнулим a2.setLogicalLength(0); // и это тоже AcDbCurve *pCurve; if (acdbOpenObject(pCurve, id, AcDb::kForRead) != Acad::eOk) return; pCurve->getGripPoints(ptArr,a1,a2); }
Но оба варианта возвращают только УЗЛОВЫЕ точки.
> Александр Ривилис
Этот объект появился в 2007 Автокаде. С его помощью рисуют объёмные стенки.
Вот что пишут в хелпе:
With the POLYSOLID command, you can convert an existing line, 2D polyline, arc, or circle to a solid with a rectangular profile. A polysolid can have curved segments, but the profile is always rectangular by default.
> Doglexx
Это не объект, а команда. А объект (точнее примитив) AcDb3dSolid. Поэтому нужно использовать методы этого класса, ну и возможно AcBrep...
Попытался переделать приведённый Николаем пример...
static void PolySolidCoord_GetCoord(void)
{
AcDb3dSolid *pSolid;
AcGePoint3dArray gripPoints;
ads_name ss;
long nss = 0;
// Выбираем на экране примитивы и вычисляем их количество
if (acedSSGet(NULL,NULL,NULL,NULL,ss) == RTNORM && acedSSLength(ss,&nss) == RTNORM)
{
// Цикл по всем примитивам
for (long i = 0; i < nss; i++)
{
ads_name en;
if (acedSSName(ss,i,en) != RTNORM) continue;
AcDbObjectId eid;
if (acdbGetObjectId(eid,en) != Acad::eOk) continue;
// Открываем примитив для получения его типа
AcDbObjectPointer<AcDbEntity> pEnt(eid,AcDb::kForRead);
if (pEnt.openStatus() != Acad::eOk) continue;
acutPrintf(_T("\nN=%d "),i);
if (AcDb3dSolid::cast(pEnt.object()))
{
AcDbObjectId id;
AcGePoint3dArray gripPoints;
AcDbIntArray a1, a2;
gripPoints.setLogicalLength(0);
a1.setLogicalLength(0); // на всякий случай обнулим
a2.setLogicalLength(0); // и это тоже
AcDbEntity *pCurve;
if (acdbOpenObject(pCurve, eid, AcDb::kForRead) != Acad::eOk) return;
pCurve->getGripPoints(gripPoints,a1,a2);
acutPrintf(_T("Класс: %s"),a1.at(1));
}
else
{
// Не обрабатываем другие примитивы
acutPrintf(_T("Класс: %s"),pEnt.object()->isA()->name());
}
}
acedSSFree(ss);
Но после выбора объектов и нажатия кнопки "Enter" Автокад выдаёт ошибку и вылетает:( прАтивный:))))
> Doglexx
А зачем ты один и тотже примитив по нескольку раз открываешь и ни разу не закрываешь?
> Александр Ривилис
мда... точно...:( Тут выяснилось, что использовать Grip-поинты для получения координат объекта AcDb3dSolid(его вершин) нельзя:(
> Александр Ривилис
Так они обернуты в AcDbObjectPointer<> - сами закрываются в его деструкторе.
Хорошо такой вопрос тогда... Как можно получить координаты вершин AcDb3DSolid? Опишите алгоритм хотя бы. Заранее спасибо!
> Doglexx
Ты понимаешь, что AcDbSolid - это тело ограниченное поверхностями? Какие же координаты ты можешь получить?
Если хочешь получить информацию о вершинах и поверхностях этого тела - посмотри в ObjectARX SDK пример utils\brep\samples\brepsamp
Вот описание команды из данного проекта:
BRBBLOCK returns the model space coordinates of the lower left and upper right corners of the bounding box for the selected subentity in the solid model. The results are annotated on the
screen.
Что такое "bounding box"?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Координаты объекта
Форум работает на PunBB, при поддержке Informer Technologies, Inc