[返回博客](/cn/blog) # Drawings SDK：从 STL 格式导入

Roman Martens 三月 05, 2021 [\#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>

STL（立体光刻）格式是一种简单、公开文档化的格式，用于将对象的表面描述为三角形网格。每个三角形都通过单位法线和顶点（按右手定则排序）使用三维笛卡尔坐标系表示。

使用 STL 导入模块执行导入过程：

STLImport\_xx.yy\_zz.tx

其中：

- xx — Drawings SDK 主版本号。
- yy — Drawings SDK 次版本号。
- zz — Microsoft® Visual C++® 编译器版本号。例如，对于 Microsoft Visual Studio® 2015 版本，该数字为 14。

要使用 STLImport 模块导入 .stl 文件：

1. 加载 STLImport 模块。
2. 创建一个 OdStlImport 对象。
3. 使用以下函数之一：
    - OdStlImportRes import(const OdString &amp;strFilePath);
    - OdStlImportRes import(const OdStreamBufPtr&amp; pStreamBuf);
    这两个函数的区别在于，第一个函数从文件导入，而第二个函数从流导入。

导入 STL 数据后，可以使用以下函数获取由顶点、面（三角形）和面法线组成的壳：

```
OdStlImportRes getShell(OdGePoint3dArray &vertices,
                        OdUInt32Array &faces,
                        OdGeVector3dArray &normals,
                        OdUInt8 flags = 0) const
```

其中 flags 可以取以下值：

- kFixNormals — 检查法线并在以下情况下进行校正：
- 零法线
- 法线与根据右手定则计算的法线不匹配  
    如果设置此标志，则法线数组包含面上的法线。

- kUnifyDuplicatedVertices — 统一重复的顶点。如果设置此标志，则顶点数组仅包含不重复的顶点。
- kCalcNormalsAtVertices — 对顶点处的法线进行原始计算。顶点处的法线可用于平滑着色渲染模式。
- 如果未设置 kUnifyDuplicatedVertices 标志，则顶点处的法线简单地等于包含该顶点的面的法线。
- 如果设置了 kUnifyDuplicatedVertices 标志，则通过平均包含该顶点的面上的法线来计算顶点处的法线。  
    如果设置此标志，则法线数组包含顶点处的法线。

注意：这种计算方法非常粗糙，仅适用于平滑的壳。例如，对于立方体，此方法会产生较差的结果。在这种情况下，用户端需要更复杂的算法。

有关如何使用获取的面和顶点数组创建实体 (FacetModeler::Body) 或实体 (OdDb3dSolidPtr) 的更多信息，请参阅以下内容：

- [使用 Facet Modeler 创建实体](https://www.opendesign.com/blog/2019/march/creating-bodies-using-facet-modeler)
- [在图纸中使用网格](https://www.opendesign.com/blog/2019/march/working-meshes-drawings)

#### 从 .stl 文件导入的示例

此示例演示了从 .stl 文件导入并使用 getShell() 函数获取壳。

```
STLFileImport::OdStlImportModulePtr stlModule = odrxDynamicLinker()->loadModule(OdStlImportModuleName);
STLFileImport::OdStlImportPtr stlImport = stlModule->create();

stlImport->import(fileName);

OdGePoint3dArray vertices;
OdUInt32Array faces;
OdGeVector3dArray normals;

OdUInt8 flags = 0;
SETBIT(flags, STLFileImport::OdStlImport::kUnifyDuplicatedVertices, true);
stlImport->getShell(vertices, faces, normals, flags);
```

## 今天就开始行动

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

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