在 Facet Modeler 中将实体转换为 SubDMesh

有时您可能需要将 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 命令。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用