有时您可能需要将 FacetModeler::Body 转换为 OdDbSubDMesh 对象以继续对其进行操作。首先,将实体转换为三角形网格,然后执行几个额外的步骤。
首先,使用 generateMesh() 方法生成表示实体的三角形网格。
void generateMesh(GeMesh::OdGeTrMesh& mesh) const;
此处,网格是一个输出参数。
由于它是一个成员函数,因此可以直接为对象调用它:
FacetModeler::Body body;
/*...*/
GeMesh::OdGeTrMesh mesh;
body.generateMesh(mesh);
现在,您需要将该 OdGeTrMesh 转换为适合 OdDbSubDMesh 创建的格式。方法如下:
OdInt32Array faceArray;
faceArray.reserve(mesh.m_aTr.logicalLength() * 4);
for (unsigned int j = 0; j < mesh.m_aTr.logicalLength(); ++j)
{
const GeMesh::OdGeTr& tr = mesh.m_aTr[j];
faceArray.push_back(3);
faceArray.push_back(tr.tr[0]);
faceArray.push_back(tr.tr[1]);
faceArray.push_back(tr.tr[2]);
}
此处,faceArray 包含以下模式的数据:
"n P1 P2 ... Pn",
其中 n 表示构成一个面的点数,后跟 3D 点数组中所需顶点的索引。
例如,在此特定数组中,数据存储如下:
... 3, 10, 11, 12, 3, 13, 14, 15 ...
最后,要完成转换,请创建一个新的 OdDbSubDMesh 对象,或将收集到的数据 (mesh.m_aVx, faceArray) 应用到现有对象。为此,请使用 setSubDMesh() 方法。
OdDbSubDMeshPtr pMesh = OdDbSubDMesh::createObject();
/*...*/
OdResult res = pMesh->setSubDMesh(mesh.m_aVx, faceArray, 0); // 0 - no smoothing
现在,完成此操作后,可能需要通过标签机制传输从 GeMesh::OdGeTrMesh 或 FacetModeler::Body 接收到的附加信息。
在大多数情况下,下一步是将结果放入块中,例如 ModelSpace:
OdDbDatabase *pDb;
/*...*/
OdDbBlockTableRecordPtr pMS = pDb->getModelSpaceId().openObject(OdDb::kForWrite);
pMesh->setDatabaseDefaults(pDb);
pMS->appendOdDbEntity(pMesh);
要查看工作代码并亲自尝试,请参阅 CommonApplications/Drawing/Examples/ExFMBody/ExFMBodyCommands.cpp 和 FMBodyConvert2SubDMesh_func 函数。它是 ExFMBody 示例的一部分,您可以将其作为模块加载。要测试该函数,请调用 FMBodyConvert2SubDMesh 命令。