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

Roman Martens 二月 19, 2021 [\#getting started](/cn/blog/tag/getting-started) [\#export](/cn/blog/tag/export)

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

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

有两种方法可以将几何体导出为 STL 格式：

- 使用 STLExport 模块
- 使用 OdDb3dSolid

#### 使用 STLExport 模块导出为 STL

使用该模块导出非常灵活，例如，您可以将多个实体或整个模型空间导出到一个 .stl 文件中。导出模块文件具有以下名称：  
TD\_STLExport\_xx.yy\_zz.tx  
其中：

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

要使用 STLExport 模块导出：

- 加载 STLExport 模块。
- 创建 OdDbBlockReference。
- 用实体填充创建的 OdDbBlockReference 并使用以下函数之一：
    - OdResult exportSTL(OdDbBaseDatabase \*pDb, const OdGiDrawable &amp;pEntity, OdStreamBuf &amp;pOutStream, bool bTextMode, double dDeviation, bool positiveOctant = true);
    - OdResult exportSTLEx(OdDbBaseDatabase \*pDb, const OdGiDrawable &amp;pEntity, OdStreamBuf &amp;pOutStream, bool bTextMode, double dDeviation, bool positiveOctant = true);

这些函数之间的区别在于，exportSTLEx() 函数在导出之前检查实体拓扑，并在三角化实体的有符号体积小于 0 时反转三角形的方向。

**注意**：在原始 STL 规范中，所有 STL 坐标都必须是正数（&gt;= 0.01），但此限制不再强制执行，并且现在 .stl 文件中通常会遇到负坐标。如果您不需要将所有坐标移动到正八分体，请将最后一个参数设置为“false”。

##### 使用 STLExport 模块导出到 STL 文件的示例

此示例说明了如何使用 STLExport 模块将多个实体（圆环和球体）导出到 .stl 文件。

```
STLModulePtr stlModule = odrxDynamicLinker()->loadModule(OdSTLExportModuleName);

OdDb3dSolidPtr pSphere = OdDb3dSolid::createObject();
pSphere->createSphere(5);

OdGeExtents3d extents;
pSphere->getGeomExtents(extents);
double dDeviation = extents.minPoint().distanceTo(extents.maxPoint()) / 100.;

OdDb3dSolidPtr pTorus = OdDb3dSolid::createObject();
pTorus->createTorus(10, 5);
OdGeVector3d transl(15, 15, 15);
pTorus->transformBy(transl);

OdDbBlockTableRecordPtr blockTblRcrd = OdDbBlockTableRecord::createObject();
blockTblRcrd->appendOdDbEntity(pSphere);
blockTblRcrd->appendOdDbEntity(pTorus);
blockTblRcrd->setName("block1");

OdDbDatabasePtr pDb = pHostApp->createDatabase();
OdDbBlockTablePtr bt = pDb->getBlockTableId().safeOpenObject(OdDb::kForWrite);
bt->add(blockTblRcrd);

OdDbBlockReferencePtr blockRef = OdDbBlockReference::createObject();
blockRef->setBlockTableRecord(blockTblRcrd->objectId());
blockRef->setDatabaseDefaults(pDb);

OdDbBlockTableRecordPtr btr = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
btr->appendOdDbEntity(blockRef);

bool asciiFormat = true; // saving as a text file, not binary

OdString fileName("sphere_torus.stl");

OdStreamBufPtr pOutStream = odrxSystemServices()->createFile(fileName, Oda::kFileWrite, Oda::kShareDenyNo, Oda::kCreateAlways);

stlModule->exportSTL(pDb, *blockRef, *pOutStream, asciiFormat, dDeviation);
```

下图显示了导出结果。

![export result](/files/inline-images/the%20export%20result.jpg)#### 使用 OdDb3dSolid 导出为 STL

使用 OdDb3dSolid 仅将一个实体导出为 STL 格式。为此，OdDb3dSolid 类中有两个函数：

- OdResult stlOut(OdStreamBuf\* output, bool asciiFormat, double maxSurfaceDeviation) const
- OdResult stlOut(const OdChar\* filename, bool asciiFormat, double maxSurfaceDeviation) const

函数之间的区别在于，第二个函数创建文件，而第一个函数导出到流。

**注意**：所有坐标都已移至正八分体 &gt;= 0.01。

##### 使用 OdDb3dSolid 导出到 STL 文件的示例

此示例演示了使用 OdDb3dSolid 类的函数将一个实体（球体）导出到 .stl 文件：

```
OdDb3dSolidPtr pSphere = OdDb3dSolid::createObject();
pSphere->createSphere(5);

OdDbDatabasePtr pDb = pHostApp->createDatabase();
pSphere->setDatabaseDefaults(pDb);
OdGeExtents3d extents;
pSphere->getGeomExtents(extents);
double dDeviation = extents.minPoint().distanceTo(extents.maxPoint()) / 1000.;
bool asciiFormat = true; // saving as a text file, not binary
OdString fileName("sphere.stl");

pSphere->stlOut(fileName.c_str(), asciiFormat, dDeviation);
```

下图显示了导出结果。

![the export result](/files/inline-images/export%20result_2.jpg)

## 今天就开始行动

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

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