布尔数据 BOPDS_DS
布尔数据 BOPDS_DS
1 Introduction
在OpenCASCADE中,布尔相关的算子Operator有General Fuse Operator(GFA),Boolean Operator(BOA),Section Operator(SA),Splitter Operator(SPA),这些布尔算子都共用一套数据结构BOPDS_DS,其中存储了输入数据及中间结果数据。布尔算子包含两部分:
- Intersection Part(IP)相交部分:相交部分IP主要用来计算模型之间的相交情况,并将计算结果保存到BOPDS_DS中;
- Building Part(BP)构建部分:构建部件BP从BOPDS_DS中获取相交和其他数据来构建相应的结果;
由此可见,布尔数据BOPDS_DS是布尔操作中的数据中转站,将布尔操作的输入数据及中间计算结果数据都保存起来。本文主要介绍BOPDS_DS保存的数据。
2 BOPDS_DS
BOPDS_DS中存储的信息有:
- Arguments:输入模型数据;
- Shapes:模型信息;
- Interferences:相交数据;
- Pave Blocks:字面意思是铺路砖,我理解的是对边Edge分块;
- Common Blocks:公共部分,边与边,边与面的重叠部分;
这里的Shapes是模型信息BOPDS_ShapeInfo,存储模型类型,包围盒等数据:
这里应该不需要再另外保存myType,因为在myShape中可以直接获取类型信息。模型信息在初始化函数Init()中来设置,主要是包围盒等信息:
//=======================================================================
//function : Init
//purpose :
//=======================================================================
void BOPDS_DS::Init(const Standard_Real theFuzz)
{
Standard_Integer i1, i2, j, aI, aNb, aNbS, aNbE, aNbSx;
Standard_Integer n1, n2, n3, nV, nW, nE, aNbF;
Standard_Real aTol, aTolAdd;
TopAbs_ShapeEnum aTS;
TopoDS_Iterator aItS;
TColStd_ListIteratorOfListOfInteger aIt1, aIt2, aIt3;
TopTools_ListIteratorOfListOfShape aIt;
BOPDS_IndexRange aR;
Handle(NCollection_BaseAllocator) aAllocator;
TopTools_MapOfShape aMS;
//
// 1 Append Source Shapes
aNb=myArguments.Extent();
if (!aNb) {
return;
}
//
myRanges.SetIncrement(aNb);
//
aNbS=0;
aIt.Initialize(myArguments);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aSx=aIt.Value();
//
aNbSx=0;
TotalShapes(aSx, aNbSx, aMS);
//
aNbS=aNbS+aNbSx;
}
aMS.Clear();
//
myLines.SetIncrement(2*aNbS);
//-----------------------------------------------------scope_1 f
aAllocator=
NCollection_BaseAllocator::CommonBaseAllocator();
//
//
i1=0;
i2=0;
aIt.Initialize(myArguments);
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aS=aIt.Value();
if (myMapShapeIndex.IsBound(aS)) {
continue;
}
aI=Append(aS);
//
InitShape(aI, aS);
//
i2=NbShapes()-1;
aR.SetIndices(i1, i2);
myRanges.Append(aR);
i1=i2+1;
}
//
aTolAdd = Max(theFuzz, Precision::Confusion()) * 0.5;
myNbSourceShapes = NbShapes();
//
// 2 Bounding Boxes
//
// 2.1 Vertex
for (j=0; j<myNbSourceShapes; ++j) {
BOPDS_ShapeInfo& aSI=ChangeShapeInfo(j);
//
const TopoDS_Shape& aS=aSI.Shape();
//
aTS=aSI.ShapeType();
//
if (aTS==TopAbs_VERTEX) {
Bnd_Box& aBox=aSI.ChangeBox();
const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&aS);
const gp_Pnt& aP=BRep_Tool::Pnt(aV);
aTol = BRep_Tool::Tolerance(aV);
aBox.SetGap(aTol + aTolAdd);
aBox.Add(aP);
}
}
在初始化函数中通过两个递归函数TotalShapes()和InitShape()来收集所有模型数据,然后再分别计算点、边、面的包围盒。这些包围盒数据为后面使用BVH相交检测做准备。
3 Interferences
相交数据Interferences主要用来保存求交结果数据,使用了简单的派生关系,不同的相交类型得到不同的相交结果。
保存的数据有:
其中Index1和Index2为相交的两个模型在BOPDS_DS中的索引号。对于点Vertex和边Edge的相交结果,保存了相交点在边上的参数myParam:
4 DRAW
在DRAW中输入相关的命令可以方便地对这些数据结构进行Debug。
从源码可以看出,在做求交的初始函数中准备了三部分数据,一个是BOPDS_DS,一个是BOPDS_Iterator,还有一部分是缓存的求交工具的数据IntTools_Context。后面将结合DRAW代码对C++源码调试,分析布尔操作中求交数据BOPDS_DS保存的具体数据。