ODA 的 Facet Modeler 使用边界表示法进行实体建模,也称为 B-Rep 技术。
体的简要概述:
- 体 (Body) — 由平面面组成,形成一个“防水”外壳,将内部体空间与外部隔开。
- 面 (Face) — 每个面都表示为一个平面和一系列边循环,边界限定了平面的某个部分。
- 边循环 (Edge loop) — 一个不相交边的闭合列表。
- 边 (Edge) — 具有指向其顶点的指针以及指向循环中前一个和下一个边的指针。
- 顶点 (Vertex) — 一个 3D 点。
Facet Modeler 为 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
}
}
还有另外两个迭代器可以直接访问所有边或体顶点,而无需遍历体:
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();
}