[返回博客](/cn/blog) # 在 Facet Modeler 中将实体转换为 SubDMesh

Taras Khalimanenko 三月 12, 2021 [\#facet modeler](/cn/blog/tag/facet-modeler) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

有时您可能需要将 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 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
