29/05/2013
Получение граней SubD Сети
Если вы хотите получить все грани геометрии поверхности AcDbSubDMesh (называемой просто "Сеть" в Палитре свойств), то вы можете использовать либо getFaceArray (возвращает базовый (уровня 0) список граней сети) или getSubDividedFaceArray (возврат список граней сглаженной сети). Ниже пример кода, использующий второй вариант:
Код - C++: [Выделить]
- void drawSubDMeshFacets()
- {
- ads_name name;
- AcGePoint3d pt;
- int ret = acedEntSel(
- _T("\nВыберите SubD сеть: "), name, asDblArray(pt));
- if (ret != RTNORM)
- {
- acutPrintf(_T("\nНичего не выбрано!"));
- return;
- }
- AcDbObjectId id;
- acdbGetObjectId(id, name);
- if (id.objectClass() != AcDbSubDMesh::desc())
- {
- acutPrintf(_T("\nВыбрана не SubD сеть!"));
- return;
- }
- AcDbObjectPointer<AcDbSubDMesh> mesh(id, AcDb::kForRead);
- AcGePoint3dArray vertices;
- mesh->getSubDividedVertices(vertices);
- AcArray<Adesk::Int32> faces;
- mesh->getSubDividedFaceArray(faces);
- // Содержимое списка граней выглядит так:
- // [число вершин следующей грани],
- // <индексВершины1, индексВершины2, и т.д.>,
- // т.е. [4], <1, 2, 3, 4>, [3], <1, 2, 3>, и т.д.
- AcDbDatabase * pDb =
- acdbHostApplicationServices()->workingDatabase();
- AcDbBlockTableRecordPointer
- ms(ACDB_MODEL_SPACE, pDb, AcDb::kForWrite);
- for (int numVertices = 0, i = 0;
- i < faces.length(); i += numVertices + 1)
- {
- numVertices = faces.at(i);
- // Нарисуем ребра грани
- for (int j = 0; j < numVertices; j++)
- {
- AcGePoint3d pt1 =
- vertices.at(faces.at(i + j + 1));
- AcGePoint3d pt2 =
- vertices.at(faces.at(i + ((j + 1) % numVertices) + 1));
- AcDbObjectPointer<AcDbLine> line;
- line.create();
- line->setStartPoint(pt1);
- line->setEndPoint(pt2);
- ms->appendAcDbEntity(line);
- }
- }
- }
Источник: 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
Отредактировано 08.06.2013 в 00:46:23