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 &pEntity, OdStreamBuf &pOutStream, bool bTextMode, double dDeviation, bool positiveOctant = true);
- OdResult exportSTLEx(OdDbBaseDatabase *pDb, const OdGiDrawable &pEntity, OdStreamBuf &pOutStream, bool bTextMode, double dDeviation, bool positiveOctant = true);
这些函数之间的区别在于,exportSTLEx() 函数在导出之前检查实体拓扑,并在三角化实体的有符号体积小于 0 时反转三角形的方向。
注意:在原始 STL 规范中,所有 STL 坐标都必须是正数(>= 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);
下图显示了导出结果。
使用 OdDb3dSolid 导出为 STL
使用 OdDb3dSolid 仅将一个实体导出为 STL 格式。为此,OdDb3dSolid 类中有两个函数:
- OdResult stlOut(OdStreamBuf* output, bool asciiFormat, double maxSurfaceDeviation) const
- OdResult stlOut(const OdChar* filename, bool asciiFormat, double maxSurfaceDeviation) const
函数之间的区别在于,第二个函数创建文件,而第一个函数导出到流。
注意:所有坐标都已移至正八分体 >= 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);
下图显示了导出结果。