Тема: Координаты объекта

Есть Polyline, нужны ее кординаты. Знаю что можно использовать GetPointAt но не знаю каким макаром!!!
Спасибо!!!

Re: Координаты объекта

К примеру (подходит и к 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;
}

Ес-но на авторство не претендую :)

Re: Координаты объекта

> alex
А как изменится код, если нужно получить координаты Polysolid?

Re: Координаты объекта

> 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);
}

Но оба варианта возвращают только УЗЛОВЫЕ точки.

Re: Координаты объекта

> Doglexx
Что такое Polysolid?

Re: Координаты объекта

> Александр Ривилис
Этот объект появился в 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.

Re: Координаты объекта

> Doglexx
Это не объект, а команда. А объект (точнее примитив) AcDb3dSolid. Поэтому нужно использовать методы этого класса, ну и возможно AcBrep...

Re: Координаты объекта

Попытался переделать приведённый Николаем пример...
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" Автокад выдаёт ошибку и вылетает:( прАтивный:))))

Re: Координаты объекта

> Doglexx
А зачем ты один и тотже примитив по нескольку раз открываешь и ни разу не закрываешь?

Re: Координаты объекта

> Александр Ривилис
мда... точно...:( Тут выяснилось, что использовать Grip-поинты для получения координат объекта AcDb3dSolid(его вершин) нельзя:(

Re: Координаты объекта

> Александр Ривилис
Так они обернуты в AcDbObjectPointer<> - сами закрываются в его деструкторе.

Re: Координаты объекта

> Диман
Ну... некоторые обернуты... :)

Re: Координаты объекта

> Диман
Вот-вот. Doglexx тоже так думал...

Re: Координаты объекта

Хорошо такой вопрос тогда... Как можно получить координаты вершин AcDb3DSolid? Опишите алгоритм хотя бы. Заранее спасибо!

Re: Координаты объекта

> Doglexx
Ты понимаешь, что AcDbSolid - это тело ограниченное поверхностями? Какие же координаты ты можешь получить?
Если хочешь получить информацию о вершинах и поверхностях этого тела - посмотри в ObjectARX SDK пример utils\brep\samples\brepsamp

Re: Координаты объекта

Вот описание команды из данного проекта:
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"?

Re: Координаты объекта

Вопрос снимается. Спасибо за помощь.