1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0024157: Parallelization of assembly part of BO

New features
class BOPAlgo_BuilderSolid
-method:
void BOPAlgo_BuilderSolid::SetSolid(const TopoDS_Solid& theSolid) has been added.
Purpose: Sets the source solid <theSolid>

class BOPAlgo_BuilderSolid
-method:
const TopoDS_Solid& BOPAlgo_BuilderSolid::Solid()const
has been added.
Purpose: Returns the source solid

Auxiliary classes
BOPAlgo_BuilderSolidFunctor
BOPAlgo_BuilderSolidCnt
have been added.
Purpose: The classes provide the interface and implementation of the parallel computations.

class BOPTools_AlgoTools
-method:
Standard_Boolean  BOPTools_AlgoTools::IsOpenShell(const TopoDS_Shell& theShell) has been added.
Purpose: Returns true if the shell <theShell> is open

class BOPTools_AlgoTools
-method:
Standard_Boolean  BOPTools_AlgoTools::IsInvertedSolid(const TopoDS_Solid& theSolid) has been added.
Purpose: Returns true if the solid <theSolid> is inverted

class BOPDS_DS
-protected  method:
void BOPDS_DS::BuildBndBoxSolid(const Standard_Integer theIndex, Bnd_Box& theBoxS) has been added.
The method computes bouding box <theBoxS> for the solid with DS-index <theIndex>

Changes
class BOPDS_DS
- method:
void BOPDS_DS::Init()
The block to compute bouding box for the solids has been added.

class BOPAlgo_Builder
- method:
void BOPAlgo_Builder::FillIn3DParts
(BOPCol_DataMapOfShapeListOfShape& theInParts,
BOPCol_DataMapOfShapeShape& theDraftSolids,
const BOPCol_BaseAllocator& theAllocator)
The order of treatment of the unbalanced binary tree of overlapped bounding boxes has been changed

class BOPAlgo_Builder
- method:
 void BOPAlgo_Builder::BuildSplitSolids
(BOPCol_DataMapOfShapeListOfShape& theInParts,
BOPCol_DataMapOfShapeShape& theDraftSolids,
const BOPCol_BaseAllocator&  theAllocator)
The algorithm has been adapted to provide the parallel computations
This commit is contained in:
pkv 2013-12-10 09:08:44 +04:00 committed by bugmaster
parent 5a07b8e1c4
commit 30ecd5f8bf
9 changed files with 330 additions and 207 deletions

View File

@ -203,13 +203,8 @@ is
theInParts:out DataMapOfShapeListOfShape from BOPCol;
theDraftSolids:out DataMapOfShapeShape from BOPCol;
theAllocator:BaseAllocator from BOPCol)
is protected;
BuildBndBox(me:out;
theIndex:Integer from Standard;
theBox: out Box from Bnd)
is protected;
is protected;
FillInternalShapes(me:out)
is protected;
--

View File

@ -21,8 +21,9 @@ class BuilderSolid from BOPAlgo
---Purpose: The algorithm to build solids from set of faces
uses
BaseAllocator from BOPCol
BaseAllocator from BOPCol,
Solid from TopoDS
--raises
is
@ -33,6 +34,15 @@ is
Create (theAllocator: BaseAllocator from BOPCol)
returns BuilderSolid from BOPAlgo;
SetSolid(me:out;
theSolid:Solid from TopoDS);
---Purpose: Sets the source solid <theSolid>
Solid(me)
returns Solid from TopoDS;
---C++: return const &
---Purpose: Returns the source solid
Perform(me:out)
---Purpose: Performs the algorithm
@ -60,6 +70,7 @@ is
---Purpose: Build finalized solids with internal shells
is redefined protected;
--fields
fields
mySolid:Solid from TopoDS is protected;
end BuilderSolid;

View File

@ -90,7 +90,7 @@ static
//function :
//purpose :
//=======================================================================
BOPAlgo_BuilderSolid::BOPAlgo_BuilderSolid(const Handle(NCollection_BaseAllocator)& theAllocator)
BOPAlgo_BuilderSolid::BOPAlgo_BuilderSolid(const Handle(NCollection_BaseAllocator)& theAllocator)
:
BOPAlgo_BuilderArea(theAllocator)
{
@ -99,14 +99,30 @@ static
//function : ~
//purpose :
//=======================================================================
BOPAlgo_BuilderSolid::~BOPAlgo_BuilderSolid()
BOPAlgo_BuilderSolid::~BOPAlgo_BuilderSolid()
{
}
//=======================================================================
//function : SetSolid
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::SetSolid(const TopoDS_Solid& aS)
{
mySolid=aS;
}
//=======================================================================
//function : Solid
//purpose :
//=======================================================================
const TopoDS_Solid& BOPAlgo_BuilderSolid::Solid()const
{
return mySolid;
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::Perform()
void BOPAlgo_BuilderSolid::Perform()
{
myErrorStatus=0;
//
@ -150,7 +166,7 @@ static
//function :PerformShapesToAvoid
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::PerformShapesToAvoid()
void BOPAlgo_BuilderSolid::PerformShapesToAvoid()
{
Standard_Boolean bFound;
Standard_Integer i, iCnt, aNbE, aNbF;
@ -227,7 +243,7 @@ static
//function : PerformLoops
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::PerformLoops()
void BOPAlgo_BuilderSolid::PerformLoops()
{
myErrorStatus=0;
//
@ -447,7 +463,7 @@ static
//function : PerformAreas
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::PerformAreas()
void BOPAlgo_BuilderSolid::PerformAreas()
{
myErrorStatus=0;
//
@ -583,7 +599,7 @@ static
//function : PerformInternalShapes
//purpose :
//=======================================================================
void BOPAlgo_BuilderSolid::PerformInternalShapes()
void BOPAlgo_BuilderSolid::PerformInternalShapes()
{
myErrorStatus=0;
//

View File

@ -30,16 +30,14 @@
#include <BOPInt_Context.hxx>
#include <BOPAlgo_BuilderFace.hxx>
#include <BOPAlgo_BuilderSolid.hxx>
//=======================================================================
//class : BOPAlgo_VectorOfBuilderFace
//purpose :
//=======================================================================
typedef BOPCol_NCVector<BOPAlgo_BuilderFace> BOPAlgo_VectorOfBuilderFace;
//
//=======================================================================
//class : BOPAlgo_BuilderFaceFunctor
//purpose :
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderFaceFunctor {
protected:
@ -67,7 +65,8 @@ class BOPAlgo_BuilderFaceFunctor {
};
//=======================================================================
//class : BOPAlgo_BuilderFaceCnt
//purpose :
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderFaceCnt {
public:
@ -89,10 +88,11 @@ class BOPAlgo_BuilderFaceCnt {
//
};
//
//-------------------------------------------------------------------------
typedef BOPCol_NCVector<TopoDS_Shape> BOPAlgo_VectorOfShape;
typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> BOPAlgo_VectorOfVectorOfShape;
//
typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> \
BOPAlgo_VectorOfVectorOfShape;
//
typedef NCollection_IndexedDataMap\
<BOPTools_Set, Standard_Integer, BOPTools_SetMapHasher> \
BOPAlgo_IndexedDataMapOfSetInteger;
@ -124,13 +124,14 @@ class BOPAlgo_PairOfShapeBoolean {
TopoDS_Shape myShape1;
TopoDS_Shape myShape2;
};
typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> BOPAlgo_VectorOfPairOfShapeBoolean;
//
typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> \
BOPAlgo_VectorOfPairOfShapeBoolean;
//
//=======================================================================
//function : BOPAlgo_BuilderSDFaceFunctor
//purpose :
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderSDFaceFunctor {
protected:
@ -167,7 +168,8 @@ class BOPAlgo_BuilderSDFaceFunctor {
//
//=======================================================================
//function : BOPAlgo_BuilderSDFaceCnt
//purpose :
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderSDFaceCnt {
public:
@ -190,6 +192,61 @@ class BOPAlgo_BuilderSDFaceCnt {
}
//
};
//
typedef BOPCol_NCVector<BOPAlgo_BuilderSolid> BOPAlgo_VectorOfBuilderSolid;
//
//=======================================================================
//class : BOPAlgo_BuilderSolidFunctor
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderSolidFunctor {
protected:
BOPAlgo_VectorOfBuilderSolid* myPVBS;
//
public:
//
BOPAlgo_BuilderSolidFunctor(BOPAlgo_VectorOfBuilderSolid& aVBS)
: myPVBS(&aVBS) {
}
//
void operator()( const flexible_range<Standard_Integer>& aBR ) const{
Standard_Integer i, iBeg, iEnd;
//
BOPAlgo_VectorOfBuilderSolid& aVBS=*myPVBS;
//
iBeg=aBR.begin();
iEnd=aBR.end();
for(i=iBeg; i!=iEnd; ++i) {
BOPAlgo_BuilderSolid& aBS=aVBS(i);
//
aBS.Perform();
}
}
};
//=======================================================================
//class : BOPAlgo_BuilderSolidCnt
//purpose : The class provides the interface and implementation
// of the parallel computations
//=======================================================================
class BOPAlgo_BuilderSolidCnt {
public:
//-------------------------------
// Perform
Standard_EXPORT static void Perform(const Standard_Boolean bRunParallel,
BOPAlgo_VectorOfBuilderSolid& aVBS) {
Standard_Size aNbBS=aVBS.Extent();
BOPAlgo_BuilderSolidFunctor aBSF(aVBS);
//
if (bRunParallel) {
flexible_for(flexible_range<Standard_Integer>(0,aNbBS), aBSF);
}
else {
aBSF.operator()(flexible_range<Standard_Integer>(0,aNbBS));
}
}
//
};
#endif

View File

@ -63,11 +63,9 @@
#include <BOPDS_BoxBndTree.hxx>
#include <BOPCol_ListOfInteger.hxx>
#include <BOPInt_Context.hxx>
#include <BOPAlgo_Builder_2Cnt.hxx>
static
Standard_Boolean IsClosedShell(const TopoDS_Shell& aSh);
static
void OwnInternalShapes(const TopoDS_Shape& ,
BOPCol_IndexedMapOfShape& );
@ -146,11 +144,10 @@ void BOPAlgo_Builder::FillImagesSolids()
Handle(NCollection_IncAllocator) aAlr;
//
aAlr=new NCollection_IncAllocator();
//
BOPCol_DataMapOfShapeListOfShape theInParts(100, aAlr);
BOPCol_DataMapOfShapeShape theDraftSolids(100, aAlr);
//
FillIn3DParts(theInParts, theDraftSolids, aAlr);
FillIn3DParts(theInParts, theDraftSolids, aAlr);
BuildSplitSolids(theInParts, theDraftSolids, aAlr);
FillInternalShapes();
//
@ -182,7 +179,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
myErrorStatus=0;
theDraftSolids.Clear();
//
// 1. aDMISB map Index/FaceBox
// 1. aDMISB map Index/FaceBox
k=0;
aNbS=myDS->NbSourceShapes();
for (i=0; i<aNbS; ++i) {
@ -220,6 +217,23 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
}
}//for (i=0; i<aNbS; ++i) {
//
// 1.2. Prepare TreeFiller
BOPDS_BoxBndTree aBBTree;
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
//
aItDMISB.Initialize(aDMISB);
for (; aItDMISB.More(); aItDMISB.Next()) {
k=aItDMISB.Key();
const BOPAlgo_ShapeBox& aSBk=aItDMISB.Value();
const Bnd_Box& aBk=aSBk.Box();
//
aTreeFiller.Add(k, aBk);
}
//
// 1.3. Shake TreeFiller
aTreeFiller.Fill();
//
//---------------------------------------------
// 2. Solids
for (i=0; i<aNbS; ++i) {
const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
@ -236,10 +250,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
BOPCol_ListOfShape aLIF(aAlr1);
BOPCol_IndexedMapOfShape aMF(100, aAlr1);
BOPCol_IndexedDataMapOfShapeListOfShape aMEF(100, aAlr1);
//
BOPDS_BoxBndTreeSelector aSelector;
BOPDS_BoxBndTree aBBTree;
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
Bnd_Box aBoxS;
//
const TopoDS_Shape& aS=aSI.Shape();
@ -256,8 +267,8 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
}
}
//
// 2.1 Compute Bnd_Box for the solid aS [ aBoxS ]
BuildBndBox(i, aBoxS);
// 2.1 Bounding box for the solid aS [ aBoxS ]
aBoxS=aSI.Box();
//-----
//
// 2.2 Build Draft Solid [aSD]
@ -277,25 +288,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
aMF.Add(aFI);
}
//
// 2.4. Prepare TreeFiller
aItDMISB.Initialize(aDMISB);
for (; aItDMISB.More(); aItDMISB.Next()) {
k=aItDMISB.Key();
const BOPAlgo_ShapeBox& aSBk=aItDMISB.Value();
const TopoDS_Shape& aFk=aSBk.Shape();
if (aMF.Contains(aFk)) {
continue;
}
//
const Bnd_Box& aBk=aSBk.Box();
//
aTreeFiller.Add(k, aBk);
}
//
// 2.5. Shake TreeFiller
aTreeFiller.Fill();
//
// 2.6. Select boxes of faces that are not out of aBoxS
// 2.4. Select boxes of faces that are not out of aBoxS
aSelector.Clear();
aSelector.SetBox(aBoxS);
//
@ -303,7 +296,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
//
const BOPCol_ListOfInteger& aLIFP=aSelector.Indices();
//
// 2.7. Collect faces that are IN aSolid [ aLFIN ]
// 2.5. Collect faces that are IN aSolid [ aLFIN ]
BOPCol_ListOfShape aLFP(aAlr1);
BOPCol_ListOfShape aLCBF(aAlr1);
BOPCol_MapOfShape aMFDone(100, aAlr1);
@ -316,6 +309,9 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
nFP=aItLI.Value();
const BOPAlgo_ShapeBox& aSBF=aDMISB.Find(nFP);
const TopoDS_Face& aFP=(*(TopoDS_Face*)&aSBF.Shape());
if (aMF.Contains(aFP)) {
continue;
}
if (aMFDone.Contains(aFP)) {
continue;
}
@ -354,7 +350,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
}
}// for (; aItLI.More(); aItLI.Next()) {
//
// 2.8. Store the results in theInParts, theDraftSolids
// 2.6. Store the results in theInParts, theDraftSolids
aNbFIN=aLFIN.Extent();
if (aNbFIN || aNbLIF) {
aItLS.Initialize(aLIF);
@ -474,7 +470,7 @@ void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInPa
myErrorStatus=0;
//
Standard_Boolean bFlagSD;
Standard_Integer i, aNbS, iErr, aNbSFS;
Standard_Integer i, aNbS, aNbSFS;//, iErr
TopExp_Explorer aExp;
BOPCol_ListIteratorOfListOfShape aIt;
BOPCol_DataMapIteratorOfDataMapOfShapeShape aIt1;
@ -485,6 +481,7 @@ void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInPa
BOPCol_ListOfShape aSFS(aAlr0), aLSEmpty(aAlr0);
BOPCol_MapOfShape aMFence(100, aAlr0);
BOPTools_MapOfSet aMST(100, aAlr0);
BOPAlgo_VectorOfBuilderSolid aVBS;
//
// 0. Find same domain solids for non-interferred solids
aNbS=myDS->NbSourceShapes();
@ -519,6 +516,7 @@ void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInPa
}
//
const TopoDS_Shape& aS=aSI.Shape();
const TopoDS_Solid& aSolid=(*(TopoDS_Solid*)(&aS));
if(!theDraftSolids.IsBound(aS)) {
continue;
}
@ -550,21 +548,24 @@ void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInPa
Handle(NCollection_IncAllocator) aAlr1;
aAlr1=new NCollection_IncAllocator();
//
BOPAlgo_BuilderSolid aSB(aAlr1);
BOPAlgo_BuilderSolid& aBS=aVBS.Append1();
aBS.SetSolid(aSolid);
aBS.SetShapes(aSFS);
}//for (i=0; i<aNbS; ++i) {
//
Standard_Integer k, aNbBS;
//
aNbBS=aVBS.Extent();
//
//===================================================
BOPAlgo_BuilderSolidCnt::Perform(myRunParallel, aVBS);
//===================================================
//
for (k=0; k<aNbBS; ++k) {
BOPAlgo_BuilderSolid& aBS=aVBS(k);
const TopoDS_Solid& aS=aBS.Solid();
const BOPCol_ListOfShape& aLSR=aBS.Areas();
//
//aSB.SetContext(myContext);
aSB.SetShapes(aSFS);
aSB.Perform();
iErr=aSB.ErrorStatus();
if (iErr) {
myErrorStatus=30; // SolidBuilder failed
return;
}
//
const BOPCol_ListOfShape& aLSR=aSB.Areas();
//
// 1.4 Collect resulting solids and theirs set of faces.
// Update Images.
if (!myImages.IsBound(aS)) {
BOPCol_ListOfShape aLSx;
//
@ -589,9 +590,8 @@ void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInPa
}
}
}
}// for (i=0; i<aNbS; ++i) {
}
}
//=======================================================================
//function :FillInternalShapes
//purpose :
@ -812,85 +812,6 @@ void BOPAlgo_Builder::FillInternalShapes()
aMSx.Clear();
}
//=======================================================================
//function : BuildBndBox
//purpose :
//=======================================================================
void BOPAlgo_Builder::BuildBndBox(const Standard_Integer theIndex,
Bnd_Box& aBoxS)
{
Standard_Boolean bIsOpenBox;
Standard_Integer nSh, nFc;
Standard_Real aTolS, aTolFc;
TopAbs_State aState;
BOPCol_ListIteratorOfListOfInteger aItLI, aItLI1;
//
const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(theIndex);
const TopoDS_Shape& aS=aSI.Shape();
const TopoDS_Solid& aSolid=(*(TopoDS_Solid*)(&aS));
//
bIsOpenBox=Standard_False;
//
aTolS=0.;
const BOPCol_ListOfInteger& aLISh=aSI.SubShapes();
aItLI.Initialize(aLISh);
for (; aItLI.More(); aItLI.Next()) {
nSh=aItLI.Value();
const BOPDS_ShapeInfo& aSISh=myDS->ShapeInfo(nSh);
if (aSISh.ShapeType()!=TopAbs_SHELL) {
continue;
}
//
const BOPCol_ListOfInteger& aLIFc=aSISh.SubShapes();
aItLI1.Initialize(aLIFc);
for (; aItLI1.More(); aItLI1.Next()) {
nFc=aItLI1.Value();
const BOPDS_ShapeInfo& aSIFc=myDS->ShapeInfo(nFc);
if (aSIFc.ShapeType()!=TopAbs_FACE) {
continue;
}
//
const Bnd_Box& aBFc=aSIFc.Box();
aBoxS.Add(aBFc);
//
if (!bIsOpenBox) {
bIsOpenBox=(aBFc.IsOpenXmin() || aBFc.IsOpenXmax() ||
aBFc.IsOpenYmin() || aBFc.IsOpenYmax() ||
aBFc.IsOpenZmin() || aBFc.IsOpenZmax());
if (bIsOpenBox) {
break;
}
}
//
const TopoDS_Face& aFc=*((TopoDS_Face*)&aSIFc.Shape());
aTolFc=BRep_Tool::Tolerance(aFc);
if (aTolFc>aTolS) {
aTolS=aTolFc;
}
}//for (; aItLI1.More(); aItLI1.Next()) {
if (bIsOpenBox) {
break;
}
//
const TopoDS_Shell& aSh=*((TopoDS_Shell*)&aSISh.Shape());
bIsOpenBox=IsClosedShell(aSh);
if (bIsOpenBox) {
break;
}
}//for (; aItLI.More(); aItLI.Next()) {
//
if (bIsOpenBox) {
aBoxS.SetWhole();
}
else {
BRepClass3d_SolidClassifier& aSC=myContext->SolidClassifier(aSolid);
aSC.PerformInfinitePoint(aTolS);
aState=aSC.State();
if (aState==TopAbs_IN) {
aBoxS.SetWhole();
}
}
}
//=======================================================================
//function : OwnInternalShapes
//purpose :
//=======================================================================
@ -908,49 +829,6 @@ void BOPAlgo_Builder::BuildBndBox(const Standard_Integer theIndex,
}
}
//=======================================================================
//function : IsClosedShell
//purpose :
//=======================================================================
Standard_Boolean IsClosedShell(const TopoDS_Shell& aSh)
{
Standard_Boolean bRet;
Standard_Integer i, aNbE, aNbF;
TopAbs_Orientation aOrF;
BOPCol_IndexedDataMapOfShapeListOfShape aMEF;
BOPCol_ListIteratorOfListOfShape aItLS;
//
bRet=Standard_False;
//
BOPTools::MapShapesAndAncestors(aSh, TopAbs_EDGE, TopAbs_FACE, aMEF);
//
aNbE=aMEF.Extent();
for (i=1; i<=aNbE; ++i) {
const TopoDS_Edge& aE=*((TopoDS_Edge*)&aMEF.FindKey(i));
if (BRep_Tool::Degenerated(aE)) {
continue;
}
//
aNbF=0;
const BOPCol_ListOfShape& aLF=aMEF(i);
aItLS.Initialize(aLF);
for (; aItLS.More(); aItLS.Next()) {
const TopoDS_Shape& aF=aItLS.Value();
aOrF=aF.Orientation();
if (aOrF==TopAbs_INTERNAL || aOrF==TopAbs_EXTERNAL) {
continue;
}
++aNbF;
}
//
if (aNbF==1) {
bRet=!bRet; // True
break;
}
}
//
return bRet;
}
//=======================================================================
//function : TreatCompound
//purpose :
//=======================================================================

View File

@ -33,7 +33,8 @@ class DS from BOPDS
-- myInterfVV,..myInterfFF]
uses
ShapeEnum from TopAbs,
ShapeEnum from TopAbs,
Box from Bnd,
Shape from TopoDS,
--
ListOfShape from BOPCol,
@ -580,7 +581,14 @@ is
---Purpose:
--- Updates tolerance of the sub-shapes of the shape with index <theIndex>.
---
BuildBndBoxSolid (me:out;
theIndex:Integer from Standard;
theBox:out Box from Bnd)
is protected;
---Purpose:
--- Computes bouding box <theBox> for the solid with DS-index <theIndex>
---
fields
myAllocator : BaseAllocator from BOPCol is protected;
myArguments : ListOfShape from BOPCol is protected;

View File

@ -522,6 +522,17 @@ void BOPDS_DS::Init()
}//if (aTS==TopAbs_FACE) {
}//for (j=0; j<myNbSourceShapes; ++j) {
//
// 2.4 Solids
for (j=0; j<myNbSourceShapes; ++j) {
BOPDS_ShapeInfo& aSI=ChangeShapeInfo(j);
//
aTS=aSI.ShapeType();
if (aTS==TopAbs_SOLID) {
Bnd_Box& aBox=aSI.ChangeBox();
BuildBndBoxSolid(j, aBox);
}
}//for (j=0; j<myNbSourceShapes; ++j) {
//
aMI.Clear();
aAllocator.Nullify();
//-----------------------------------------------------scope_1 t
@ -1832,3 +1843,79 @@ void SortShell(const int n, BOPDS_Pave *a)
}//for (i=0; i<nd; ++i)
}//while (1)
}
//=======================================================================
//function : BuildBndBoxSolid
//purpose :
//=======================================================================
void BOPDS_DS::BuildBndBoxSolid(const Standard_Integer theIndex,
Bnd_Box& aBoxS)
{
Standard_Boolean bIsOpenBox, bIsInverted;
Standard_Integer nSh, nFc;
Standard_Real aTolS, aTolFc;
BOPCol_ListIteratorOfListOfInteger aItLI, aItLI1;
//
const BOPDS_ShapeInfo& aSI=ShapeInfo(theIndex);
const TopoDS_Shape& aS=aSI.Shape();
const TopoDS_Solid& aSolid=(*(TopoDS_Solid*)(&aS));
//
bIsOpenBox=Standard_False;
//
aTolS=0.;
const BOPCol_ListOfInteger& aLISh=aSI.SubShapes();
aItLI.Initialize(aLISh);
for (; aItLI.More(); aItLI.Next()) {
nSh=aItLI.Value();
const BOPDS_ShapeInfo& aSISh=ShapeInfo(nSh);
if (aSISh.ShapeType()!=TopAbs_SHELL) {
continue;
}
//
const BOPCol_ListOfInteger& aLIFc=aSISh.SubShapes();
aItLI1.Initialize(aLIFc);
for (; aItLI1.More(); aItLI1.Next()) {
nFc=aItLI1.Value();
const BOPDS_ShapeInfo& aSIFc=ShapeInfo(nFc);
if (aSIFc.ShapeType()!=TopAbs_FACE) {
continue;
}
//
const Bnd_Box& aBFc=aSIFc.Box();
aBoxS.Add(aBFc);
//
if (!bIsOpenBox) {
bIsOpenBox=(aBFc.IsOpenXmin() || aBFc.IsOpenXmax() ||
aBFc.IsOpenYmin() || aBFc.IsOpenYmax() ||
aBFc.IsOpenZmin() || aBFc.IsOpenZmax());
if (bIsOpenBox) {
break;
}
}
//
const TopoDS_Face& aFc=*((TopoDS_Face*)&aSIFc.Shape());
aTolFc=BRep_Tool::Tolerance(aFc);
if (aTolFc>aTolS) {
aTolS=aTolFc;
}
}//for (; aItLI1.More(); aItLI1.Next()) {
if (bIsOpenBox) {
break;
}
//
const TopoDS_Shell& aSh=*((TopoDS_Shell*)&aSISh.Shape());
bIsOpenBox=BOPTools_AlgoTools::IsOpenShell(aSh);
if (bIsOpenBox) {
break;
}
}//for (; aItLI.More(); aItLI.Next()) {
//
if (bIsOpenBox) {
aBoxS.SetWhole();
}
else {
bIsInverted=BOPTools_AlgoTools::IsInvertedSolid(aSolid);
if (bIsInverted) {
aBoxS.SetWhole();
}
}
}

View File

@ -30,7 +30,8 @@ uses
Vertex from TopoDS,
Edge from TopoDS,
Face from TopoDS,
Wire from TopoDS,
Wire from TopoDS,
Shell from TopoDS,
Solid from TopoDS,
--
BaseAllocator from BOPCol,
@ -446,5 +447,15 @@ is
returns Integer from Standard;
---Purpose:
--- Retutns dimension of the shape <theS>.
IsOpenShell(myclass;
theShell:Shell from TopoDS)
returns Boolean from Standard;
---Purpose: Returns true if the shell <theShell> is open
IsInvertedSolid(myclass;
theSolid:Solid from TopoDS)
returns Boolean from Standard;
---Purpose: Returns true if the solid <theSolid> is inverted
end AlgoTools;

View File

@ -1880,3 +1880,63 @@ Standard_Boolean FindPointInFace(const TopoDS_Edge& aE,
bRet = aDist < Precision::Angular();
return bRet;
}
//=======================================================================
//function : IsOpenShell
//purpose :
//=======================================================================
Standard_Boolean
BOPTools_AlgoTools::IsOpenShell(const TopoDS_Shell& aSh)
{
Standard_Boolean bRet;
Standard_Integer i, aNbE, aNbF;
TopAbs_Orientation aOrF;
BOPCol_IndexedDataMapOfShapeListOfShape aMEF;
BOPCol_ListIteratorOfListOfShape aItLS;
//
bRet=Standard_False;
//
BOPTools::MapShapesAndAncestors(aSh, TopAbs_EDGE, TopAbs_FACE, aMEF);
//
aNbE=aMEF.Extent();
for (i=1; i<=aNbE; ++i) {
const TopoDS_Edge& aE=*((TopoDS_Edge*)&aMEF.FindKey(i));
if (BRep_Tool::Degenerated(aE)) {
continue;
}
//
aNbF=0;
const BOPCol_ListOfShape& aLF=aMEF(i);
aItLS.Initialize(aLF);
for (; aItLS.More(); aItLS.Next()) {
const TopoDS_Shape& aF=aItLS.Value();
aOrF=aF.Orientation();
if (aOrF==TopAbs_INTERNAL || aOrF==TopAbs_EXTERNAL) {
continue;
}
++aNbF;
}
//
if (aNbF==1) {
bRet=!bRet; // True
break;
}
}
//
return bRet;
}
//=======================================================================
//function : IsInvertedSolid
//purpose :
//=======================================================================
Standard_Boolean
BOPTools_AlgoTools::IsInvertedSolid(const TopoDS_Solid& aSolid)
{
Standard_Real aTolS;
TopAbs_State aState;
BRepClass3d_SolidClassifier aSC(aSolid);
//
aTolS=1.e-7;
aSC.PerformInfinitePoint(aTolS);
aState=aSC.State();
return (aState==TopAbs_IN);
}