ODAのファセットモデラーは、ソリッドモデリングに境界表現(B-Rep手法とも呼ばれる)を使用します。
ボディの概要:
- ボディ — 平面で構成され、内部のボディ空間を外部から隔てる「防水」シェルを形成します。
- 面 — 各面は平面とエッジループのリストとして表現され、平面の一部を境界付けます。
- エッジループ — 交差しないエッジの閉じたリスト。
- エッジ — 頂点へのポインタと、ループ内の前後のエッジへのポインタを持ちます。
- 頂点 — 3D点。
ファセットモデラーは、Bodyクラス用のイテレータのセットを提供します。これらは「…\FacetModeler\include\Modeler\FMMdlIterators.h」ヘッダーファイルで定義されています。
以下は、ボディのすべての面を反復処理する例です。
FaceIterator itF(pBody);
while( !itF.done() )
{
Face* pFace = itF.get();
… // working with pFace
itF.next();
}
B-Rep階層に従って、特定の面のすべてのエッジを反復処理できます。反復中にエッジが異なるループに属する可能性があることに注意してください。最初のループは外側のループであり、それに続くループは穴です。異なるループからエッジを分離する必要がある場合は、next()関数のbNextLoopパラメータを使用してください。
EdgeFaceIterator iter(pFace);
while ( !iter.done() )
{
Edge* pEdge = iter.get();
OdGePoint3d ptVtx = pEdge->vertex()->point();
... // work with edge here
bool bNextLoop;
iter.next( &bNextLoop );
if( bNextLoop )
{
... // next loop begins from next iteration
}
}
ボディを反復処理することなく、すべてのエッジまたはボディの頂点に直接アクセスするイテレータがさらに2つあります。
EdgeBodyIterator itE(pBody);
while( !itE.done() )
{
Edge* pEdge = iter.get();
... // work with edge here
itE.next();
}
VertexIterator itV(pBody);
while( !itV.done() )
{
Vertex* pVertex = itV.get();
… // work with vertex here
itV.next();
}