布尔数据 BOPDS_DS

布尔数据 BOPDS_DS

eryar@163.com

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保存的具体数据。

 

posted @ 2023-09-23 17:21  opencascade  阅读(117)  评论(0编辑  收藏  举报