STL(ステレオリソグラフィー)形式は、オブジェクトの表面を三角形メッシュとして記述するためのシンプルで公開されたドキュメント形式です。各三角形は、3次元直交座標系を使用して、単位法線と頂点(右手系で順序付け)によって表されます。
ジオメトリをSTL形式にエクスポートするには、次の2つの方法があります。
- STLExportモジュールを使用する
- OdDb3dSolidを使用する
STLExportモジュールを使用したSTLへのエクスポート
モジュールを使用したエクスポートは柔軟で、たとえば、複数のソリッドまたはモデル空間全体を1つの.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 を使用して、1つのソリッドのみを STL 形式にエクスポートします。この目的のために、OdDb3dSolid クラスには2つの関数があります。
- OdResult stlOut(OdStreamBuf* output, bool asciiFormat, double maxSurfaceDeviation) const
- OdResult stlOut(const OdChar* filename, bool asciiFormat, double maxSurfaceDeviation) const
これらの関数の違いは、2番目の関数がファイルを作成するのに対し、最初の関数はストリームにエクスポートする点です。
注: すべての座標は、正の八分円 >= 0.01 に移動されます。
OdDb3dSolid を使用して STL ファイルにエクスポートする例
この例では、OdDb3dSolid クラスの関数を使用して、1つのソリッド (球体) を .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);
次の図は、エクスポート結果を示しています。