Drawings SDK:导出为 STL 格式

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);

下图显示了导出结果。

 

export result

 

使用 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);

下图显示了导出结果。

 

the export result

 

今天就开始行动

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

免费试用