ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/05/2013

Получение граней SubD Сети

Если вы хотите получить все грани геометрии поверхности AcDbSubDMesh (называемой просто "Сеть" в Палитре свойств), то вы можете использовать либо getFaceArray (возвращает базовый (уровня 0) список граней сети) или getSubDividedFaceArray (возврат список граней сглаженной сети). Ниже пример кода, использующий второй вариант:

Код - C++: [Выделить]
  1. void drawSubDMeshFacets()
  2. {
  3.   ads_name name;
  4.   AcGePoint3d pt;
  5.  
  6.   int ret = acedEntSel(
  7.     _T("\nВыберите SubD сеть: "), name, asDblArray(pt));
  8.  
  9.   if (ret != RTNORM)
  10.   {
  11.       acutPrintf(_T("\nНичего не выбрано!"));
  12.       return;
  13.   }
  14.  
  15.   AcDbObjectId id;
  16.   acdbGetObjectId(id, name);
  17.  
  18.   if (id.objectClass() != AcDbSubDMesh::desc())
  19.   {
  20.       acutPrintf(_T("\nВыбрана не SubD сеть!"));
  21.       return;
  22.   }
  23.  
  24.   AcDbObjectPointer<AcDbSubDMesh> mesh(id, AcDb::kForRead);
  25.  
  26.   AcGePoint3dArray vertices;
  27.   mesh->getSubDividedVertices(vertices);
  28.  
  29.   AcArray<Adesk::Int32> faces;
  30.   mesh->getSubDividedFaceArray(faces);
  31.  
  32.   // Содержимое списка граней выглядит так:
  33.   // [число вершин следующей грани],
  34.   // <индексВершины1, индексВершины2, и т.д.>,
  35.   // т.е. [4], <1, 2, 3, 4>, [3], <1, 2, 3>, и т.д.
  36.  
  37.   AcDbDatabase * pDb =
  38.     acdbHostApplicationServices()->workingDatabase();
  39.   AcDbBlockTableRecordPointer
  40.     ms(ACDB_MODEL_SPACE, pDb, AcDb::kForWrite);
  41.  
  42.   for (int numVertices = 0, i = 0;
  43.     i < faces.length(); i += numVertices + 1)
  44.   {
  45.     numVertices = faces.at(i);
  46.  
  47.     // Нарисуем ребра грани
  48.     for (int j = 0; j < numVertices; j++)
  49.     {
  50.       AcGePoint3d pt1 =
  51.         vertices.at(faces.at(i + j + 1));
  52.       AcGePoint3d pt2 =
  53.         vertices.at(faces.at(i + ((j + 1) % numVertices) + 1));
  54.  
  55.       AcDbObjectPointer<AcDbLine> line;
  56.       line.create();
  57.       line->setStartPoint(pt1);
  58.       line->setEndPoint(pt2);
  59.  
  60.       ms->appendAcDbEntity(line);
  61.     }
  62.   }
  63. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/05/facet-subd-mesh.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=66.0

Опубликовано 29.05.2013
Отредактировано 08.06.2013 в 00:46:23