IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    布尔数据 BOPDS_DS

    eryar发表于 2023-09-23 09:37:00
    love 0

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

     



    eryar 2023-09-23 17:37 发表评论


沪ICP备19023445号-2号
友情链接