mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-09 18:50:54 +03:00
0024639: Parallelization FillDS part of BO
The contents dealing with the parallel computation of Vertex/Face interferences.
This commit is contained in:
parent
c0ade4c610
commit
a0a3f6aca4
@ -166,11 +166,6 @@ is
|
|||||||
|
|
||||||
FillImagesFaces1 (me:out)
|
FillImagesFaces1 (me:out)
|
||||||
is protected;
|
is protected;
|
||||||
|
|
||||||
FillInternalVertices(me:out;
|
|
||||||
theLF:out ListOfShape from BOPCol;
|
|
||||||
theLIV:out ListOfInteger from BOPCol)
|
|
||||||
is protected;
|
|
||||||
--
|
--
|
||||||
-- solids
|
-- solids
|
||||||
--
|
--
|
||||||
|
@ -16,28 +16,30 @@
|
|||||||
// commercial license or contractual agreement.
|
// commercial license or contractual agreement.
|
||||||
|
|
||||||
#include <BOPAlgo_Builder.ixx>
|
#include <BOPAlgo_Builder.ixx>
|
||||||
|
//
|
||||||
#include <NCollection_IncAllocator.hxx>
|
#include <NCollection_IncAllocator.hxx>
|
||||||
|
//
|
||||||
#include <TopoDS_Shape.hxx>
|
#include <TopoDS_Shape.hxx>
|
||||||
#include <TopoDS_Face.hxx>
|
#include <TopoDS_Face.hxx>
|
||||||
#include <TopoDS_Edge.hxx>
|
#include <TopoDS_Edge.hxx>
|
||||||
#include <TopoDS_Vertex.hxx>
|
#include <TopoDS_Vertex.hxx>
|
||||||
#include <TopoDS_Compound.hxx>
|
#include <TopoDS_Compound.hxx>
|
||||||
|
//
|
||||||
#include <BRep_Tool.hxx>
|
#include <BRep_Tool.hxx>
|
||||||
#include <BRep_Builder.hxx>
|
#include <BRep_Builder.hxx>
|
||||||
|
//
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
|
//
|
||||||
#include <BOPCol_ListOfShape.hxx>
|
#include <BOPCol_ListOfShape.hxx>
|
||||||
#include <BOPCol_ListOfInteger.hxx>
|
#include <BOPCol_ListOfInteger.hxx>
|
||||||
#include <BOPCol_MapOfInteger.hxx>
|
#include <BOPCol_MapOfInteger.hxx>
|
||||||
#include <BOPCol_DataMapOfIntegerListOfShape.hxx>
|
#include <BOPCol_DataMapOfIntegerListOfShape.hxx>
|
||||||
#include <BOPCol_DataMapOfShapeShape.hxx>
|
#include <BOPCol_DataMapOfShapeShape.hxx>
|
||||||
|
#include <BOPCol_NCVector.hxx>
|
||||||
|
#include <BOPCol_TBB.hxx>
|
||||||
|
//
|
||||||
#include <BOPInt_Context.hxx>
|
#include <BOPInt_Context.hxx>
|
||||||
|
//
|
||||||
#include <BOPDS_PaveBlock.hxx>
|
#include <BOPDS_PaveBlock.hxx>
|
||||||
#include <BOPDS_ShapeInfo.hxx>
|
#include <BOPDS_ShapeInfo.hxx>
|
||||||
#include <BOPDS_DS.hxx>
|
#include <BOPDS_DS.hxx>
|
||||||
@ -47,7 +49,7 @@
|
|||||||
#include <BOPDS_Interf.hxx>
|
#include <BOPDS_Interf.hxx>
|
||||||
#include <BOPDS_VectorOfCurve.hxx>
|
#include <BOPDS_VectorOfCurve.hxx>
|
||||||
#include <BOPDS_VectorOfPoint.hxx>
|
#include <BOPDS_VectorOfPoint.hxx>
|
||||||
|
//
|
||||||
#include <BOPTools.hxx>
|
#include <BOPTools.hxx>
|
||||||
#include <BOPTools_AlgoTools.hxx>
|
#include <BOPTools_AlgoTools.hxx>
|
||||||
#include <BOPTools_AlgoTools2D.hxx>
|
#include <BOPTools_AlgoTools2D.hxx>
|
||||||
@ -57,7 +59,7 @@
|
|||||||
#include <BOPTools_ListOfCoupleOfShape.hxx>
|
#include <BOPTools_ListOfCoupleOfShape.hxx>
|
||||||
#include <BOPTools_MapOfSet.hxx>
|
#include <BOPTools_MapOfSet.hxx>
|
||||||
#include <BOPTools_DataMapOfShapeSet.hxx>
|
#include <BOPTools_DataMapOfShapeSet.hxx>
|
||||||
#include <BOPAlgo_Builder_2Cnt.hxx>
|
|
||||||
|
|
||||||
static
|
static
|
||||||
Standard_Boolean HasPaveBlocksOnIn(const BOPDS_FaceInfo& aFI1,
|
Standard_Boolean HasPaveBlocksOnIn(const BOPDS_FaceInfo& aFI1,
|
||||||
@ -71,8 +73,190 @@ static
|
|||||||
void MakeBlocksCnx(const BOPCol_IndexedDataMapOfShapeListOfShape& aMILI,
|
void MakeBlocksCnx(const BOPCol_IndexedDataMapOfShapeListOfShape& aMILI,
|
||||||
BOPCol_DataMapOfIntegerListOfShape& aMBlocks,
|
BOPCol_DataMapOfIntegerListOfShape& aMBlocks,
|
||||||
Handle(NCollection_IncAllocator)& aAllocator);
|
Handle(NCollection_IncAllocator)& aAllocator);
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector<TopoDS_Shape> BOPAlgo_VectorOfShape;
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> \
|
||||||
|
BOPAlgo_VectorOfVectorOfShape;
|
||||||
|
//
|
||||||
|
typedef NCollection_IndexedDataMap\
|
||||||
|
<BOPTools_Set, Standard_Integer, BOPTools_SetMapHasher> \
|
||||||
|
BOPAlgo_IndexedDataMapOfSetInteger;
|
||||||
|
//
|
||||||
|
//=======================================================================
|
||||||
|
//class : BOPAlgo_PairOfShapeBoolean
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
class BOPAlgo_PairOfShapeBoolean {
|
||||||
|
public:
|
||||||
|
BOPAlgo_PairOfShapeBoolean()
|
||||||
|
: myFlag(Standard_False) {
|
||||||
|
}
|
||||||
|
//
|
||||||
|
TopoDS_Shape& Shape1() {
|
||||||
|
return myShape1;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
TopoDS_Shape& Shape2() {
|
||||||
|
return myShape2;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
Standard_Boolean& Flag() {
|
||||||
|
return myFlag;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
protected:
|
||||||
|
Standard_Boolean myFlag;
|
||||||
|
TopoDS_Shape myShape1;
|
||||||
|
TopoDS_Shape myShape2;
|
||||||
|
};
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> \
|
||||||
|
BOPAlgo_VectorOfPairOfShapeBoolean;
|
||||||
|
//
|
||||||
|
//=======================================================================
|
||||||
|
//function : BOPAlgo_BuilderSDFaceFunctor
|
||||||
|
//purpose : The class provides the interface and implementation
|
||||||
|
// of the parallel computations
|
||||||
|
//=======================================================================
|
||||||
|
class BOPAlgo_BuilderSDFaceFunctor {
|
||||||
|
protected:
|
||||||
|
BOPAlgo_VectorOfPairOfShapeBoolean* myPVPSB;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//
|
||||||
|
BOPAlgo_BuilderSDFaceFunctor(BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB)
|
||||||
|
: myPVPSB(&aVPSB){
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void operator()( const flexible_range<Standard_Integer>& aBR ) const {
|
||||||
|
Standard_Boolean bFlag;
|
||||||
|
Standard_Integer i, iBeg, iEnd;
|
||||||
|
Handle(BOPInt_Context) aContext;
|
||||||
|
//
|
||||||
|
aContext=new BOPInt_Context;
|
||||||
|
//
|
||||||
|
BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB=*myPVPSB;
|
||||||
|
//
|
||||||
|
iBeg=aBR.begin();
|
||||||
|
iEnd=aBR.end();
|
||||||
|
for(i=iBeg; i!=iEnd; ++i) {
|
||||||
|
BOPAlgo_PairOfShapeBoolean& aPSB=aVPSB(i);
|
||||||
|
const TopoDS_Face& aFj=(*(TopoDS_Face*)(&aPSB.Shape1()));
|
||||||
|
const TopoDS_Face& aFk=(*(TopoDS_Face*)(&aPSB.Shape2()));
|
||||||
|
bFlag=BOPTools_AlgoTools::AreFacesSameDomain(aFj, aFk, aContext);
|
||||||
|
if (bFlag) {
|
||||||
|
aPSB.Flag()=bFlag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//
|
||||||
|
//=======================================================================
|
||||||
|
//function : BOPAlgo_BuilderSDFaceCnt
|
||||||
|
//purpose : The class provides the interface and implementation
|
||||||
|
// of the parallel computations
|
||||||
|
//=======================================================================
|
||||||
|
class BOPAlgo_BuilderSDFaceCnt {
|
||||||
|
public:
|
||||||
|
//-------------------------------
|
||||||
|
// Perform
|
||||||
|
Standard_EXPORT static
|
||||||
|
void Perform(const Standard_Boolean bRunParallel,
|
||||||
|
BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB) {
|
||||||
|
Standard_Integer aNbVPSB;
|
||||||
|
//
|
||||||
|
aNbVPSB=aVPSB.Extent();
|
||||||
|
BOPAlgo_BuilderSDFaceFunctor aBFF(aVPSB);
|
||||||
|
//
|
||||||
|
if (bRunParallel) {
|
||||||
|
flexible_for(flexible_range<Standard_Integer>(0,aNbVPSB), aBFF);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aBFF.operator()(flexible_range<Standard_Integer>(0,aNbVPSB));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//=======================================================================
|
||||||
|
// BuilderFace
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector<BOPAlgo_BuilderFace> BOPAlgo_VectorOfBuilderFace;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBFunctor
|
||||||
|
<BOPAlgo_BuilderFace,
|
||||||
|
BOPAlgo_VectorOfBuilderFace> BOPAlgo_BuilderFaceFunctor;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBCnt
|
||||||
|
<BOPAlgo_BuilderFaceFunctor,
|
||||||
|
BOPAlgo_VectorOfBuilderFace> BOPAlgo_BuilderFaceCnt;
|
||||||
|
//
|
||||||
|
//=======================================================================
|
||||||
|
//class : BOPAlgo_VFI
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
class BOPAlgo_VFI {
|
||||||
|
public:
|
||||||
|
BOPAlgo_VFI()
|
||||||
|
: myFlag(-1) {
|
||||||
|
}
|
||||||
|
//
|
||||||
|
~BOPAlgo_VFI(){
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetVertex(const TopoDS_Vertex& aV) {
|
||||||
|
myV=aV;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
TopoDS_Vertex& Vertex() {
|
||||||
|
return myV;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetFace(const TopoDS_Face& aF) {
|
||||||
|
myF=aF;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
TopoDS_Face& Face() {
|
||||||
|
return myF;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
Standard_Integer Flag()const {
|
||||||
|
return myFlag;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetContext(const Handle(BOPInt_Context)& aContext) {
|
||||||
|
myContext=aContext;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
const Handle(BOPInt_Context)& Context()const {
|
||||||
|
return myContext;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void Perform() {
|
||||||
|
Standard_Real aT1, aT2;
|
||||||
|
//
|
||||||
|
myFlag=myContext->ComputeVF(myV, myF, aT1, aT2);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
protected:
|
||||||
|
Standard_Integer myFlag;
|
||||||
|
TopoDS_Vertex myV;
|
||||||
|
TopoDS_Face myF;
|
||||||
|
Handle(BOPInt_Context) myContext;
|
||||||
|
};
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector<BOPAlgo_VFI> BOPAlgo_VectorOfVFI;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBContextFunctor
|
||||||
|
<BOPAlgo_VFI,
|
||||||
|
BOPAlgo_VectorOfVFI,
|
||||||
|
Handle_BOPInt_Context,
|
||||||
|
BOPInt_Context> BOPAlgo_VFIFunctor;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBContextCnt
|
||||||
|
<BOPAlgo_VFIFunctor,
|
||||||
|
BOPAlgo_VectorOfVFI,
|
||||||
|
Handle_BOPInt_Context> BOPAlgo_VFICnt;
|
||||||
|
//
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : FillImagesFaces
|
//function : FillImagesFaces
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -493,11 +677,15 @@ void BOPAlgo_Builder::FillSameDomainFaces()
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_Builder::FillImagesFaces1()
|
void BOPAlgo_Builder::FillImagesFaces1()
|
||||||
{
|
{
|
||||||
Standard_Integer i, aNbS, iSense;
|
Standard_Integer i, aNbS, iSense, nVx, aNbVFI, iFlag;
|
||||||
TopoDS_Face aFSD;
|
TopoDS_Face aFSD;
|
||||||
|
TopoDS_Vertex aVx;
|
||||||
|
BRep_Builder aBB;
|
||||||
BOPCol_ListOfInteger aLIAV;
|
BOPCol_ListOfInteger aLIAV;
|
||||||
BOPCol_ListOfShape aLFIm;
|
BOPCol_ListOfShape aLFIm;
|
||||||
BOPCol_ListIteratorOfListOfShape aItLS;
|
BOPCol_ListIteratorOfListOfInteger aItV;
|
||||||
|
BOPCol_ListIteratorOfListOfShape aItLS, aItF;
|
||||||
|
BOPAlgo_VectorOfVFI aVVFI;
|
||||||
//
|
//
|
||||||
aNbS=myDS->NbSourceShapes();
|
aNbS=myDS->NbSourceShapes();
|
||||||
for (i=0; i<aNbS; ++i) {
|
for (i=0; i<aNbS; ++i) {
|
||||||
@ -511,7 +699,8 @@ void BOPAlgo_Builder::FillImagesFaces1()
|
|||||||
if (!mySplits.IsBound(aF)) {
|
if (!mySplits.IsBound(aF)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
// 1.
|
||||||
aLIAV.Clear();
|
aLIAV.Clear();
|
||||||
myDS->AloneVertices(i, aLIAV);
|
myDS->AloneVertices(i, aLIAV);
|
||||||
aLFIm.Clear();
|
aLFIm.Clear();
|
||||||
@ -533,47 +722,50 @@ void BOPAlgo_Builder::FillImagesFaces1()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
FillInternalVertices(aLFIm, aLIAV);
|
//FillInternalVertices(aLFIm, aLIAV);
|
||||||
//
|
//
|
||||||
myImages.Bind(aF, aLFIm);
|
myImages.Bind(aF, aLFIm);
|
||||||
//
|
//
|
||||||
//fill myOrigins
|
// 2. fill myOrigins
|
||||||
aItLS.Initialize(aLFIm);
|
aItLS.Initialize(aLFIm);
|
||||||
for (; aItLS.More(); aItLS.Next()) {
|
for (; aItLS.More(); aItLS.Next()) {
|
||||||
const TopoDS_Face& aFSp=(*(TopoDS_Face*)(&aItLS.Value()));
|
const TopoDS_Face& aFSp=(*(TopoDS_Face*)(&aItLS.Value()));
|
||||||
myOrigins.Bind(aFSp, aF);
|
myOrigins.Bind(aFSp, aF);
|
||||||
}
|
}
|
||||||
}// for (i=0; i<aNbS; ++i) {
|
|
||||||
}
|
|
||||||
//=======================================================================
|
|
||||||
// function: FillInternalVertices
|
|
||||||
// purpose:
|
|
||||||
//=======================================================================
|
|
||||||
void BOPAlgo_Builder::FillInternalVertices(BOPCol_ListOfShape& aLFIm,
|
|
||||||
BOPCol_ListOfInteger& aLIAV)
|
|
||||||
{
|
|
||||||
Standard_Integer nV, iFlag;
|
|
||||||
Standard_Real aU1, aU2;
|
|
||||||
TopoDS_Vertex aV;
|
|
||||||
BRep_Builder aBB;
|
|
||||||
BOPCol_ListIteratorOfListOfInteger aItV;
|
|
||||||
BOPCol_ListIteratorOfListOfShape aItF;
|
|
||||||
//
|
|
||||||
aItV.Initialize(aLIAV);
|
|
||||||
for (; aItV.More(); aItV.Next()) {
|
|
||||||
nV=aItV.Value();
|
|
||||||
aV=(*(TopoDS_Vertex*)(&myDS->Shape(nV)));
|
|
||||||
aV.Orientation(TopAbs_INTERNAL);
|
|
||||||
//
|
//
|
||||||
aItF.Initialize(aLFIm);
|
// 3.
|
||||||
for (; aItF.More(); aItF.Next()) {
|
aItV.Initialize(aLIAV);
|
||||||
TopoDS_Face& aF=(*(TopoDS_Face*)(&aItF.Value()));
|
for (; aItV.More(); aItV.Next()) {
|
||||||
iFlag=myContext->ComputeVF(aV, aF, aU1, aU2);
|
nVx=aItV.Value();
|
||||||
if (!iFlag) {
|
aVx=(*(TopoDS_Vertex*)(&myDS->Shape(nVx)));
|
||||||
aBB.Add(aF, aV);
|
aVx.Orientation(TopAbs_INTERNAL);
|
||||||
break;
|
//
|
||||||
|
aItF.Initialize(aLFIm);
|
||||||
|
for (; aItF.More(); aItF.Next()) {
|
||||||
|
TopoDS_Face& aFy=(*(TopoDS_Face*)(&aItF.Value()));
|
||||||
|
//
|
||||||
|
BOPAlgo_VFI& aVFI=aVVFI.Append1();
|
||||||
|
aVFI.SetVertex(aVx);
|
||||||
|
aVFI.SetFace(aFy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}// for (i=0; i<aNbS; ++i) {
|
||||||
|
//
|
||||||
|
// 4.
|
||||||
|
aNbVFI=aVVFI.Extent();
|
||||||
|
//================================================================
|
||||||
|
BOPAlgo_VFICnt::Perform(myRunParallel, aVVFI, myContext);
|
||||||
|
//================================================================
|
||||||
|
//
|
||||||
|
for (i=0; i < aNbVFI; ++i) {
|
||||||
|
BOPAlgo_VFI& aVFI=aVVFI(i);
|
||||||
|
//
|
||||||
|
iFlag=aVFI.Flag();
|
||||||
|
if (!iFlag) {
|
||||||
|
TopoDS_Vertex& aVx=aVFI.Vertex();
|
||||||
|
TopoDS_Face& aFy=aVFI.Face();
|
||||||
|
aBB.Add(aFy, aVx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -657,7 +849,6 @@ void MakeBlocksCnx(const BOPCol_IndexedDataMapOfShapeListOfShape& aMILI,
|
|||||||
aMEC.Clear();
|
aMEC.Clear();
|
||||||
aMVS.Clear();
|
aMVS.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : FillMap
|
//function : FillMap
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -722,6 +913,7 @@ Standard_Boolean HasPaveBlocksOnIn(const BOPDS_FaceInfo& aFI1,
|
|||||||
}
|
}
|
||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//DEBf
|
//DEBf
|
||||||
{
|
{
|
||||||
|
@ -1,252 +0,0 @@
|
|||||||
// Created by: Peter KURNEV
|
|
||||||
// Copyright (c) 1999-2013 OPEN CASCADE SAS
|
|
||||||
//
|
|
||||||
// This file is part of Open CASCADE Technology software library.
|
|
||||||
//
|
|
||||||
// This library is free software; you can redistribute it and/or modify it under
|
|
||||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
||||||
// by the Free Software Foundation, with special exception defined in the file
|
|
||||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
||||||
// distribution for complete text of the license and disclaimer of any warranty.
|
|
||||||
//
|
|
||||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
||||||
// commercial license or contractual agreement.
|
|
||||||
|
|
||||||
#ifndef BOPAlgo_Builder_2Cnt_HeaderFile
|
|
||||||
#define BOPAlgo_Builder_2Cnt_HeaderFile
|
|
||||||
|
|
||||||
#include <NCollection_IndexedDataMap.hxx>
|
|
||||||
|
|
||||||
#include <TopoDS_Shape.hxx>
|
|
||||||
#include <TopoDS_Face.hxx>
|
|
||||||
|
|
||||||
#include <BOPCol_TBB.hxx>
|
|
||||||
#include <BOPCol_NCVector.hxx>
|
|
||||||
|
|
||||||
#include <BOPTools_Set.hxx>
|
|
||||||
#include <BOPTools_SetMapHasher.hxx>
|
|
||||||
#include <BOPTools_AlgoTools.hxx>
|
|
||||||
|
|
||||||
#include <BOPInt_Context.hxx>
|
|
||||||
|
|
||||||
#include <BOPAlgo_BuilderFace.hxx>
|
|
||||||
#include <BOPAlgo_BuilderSolid.hxx>
|
|
||||||
|
|
||||||
typedef BOPCol_NCVector<BOPAlgo_BuilderFace> BOPAlgo_VectorOfBuilderFace;
|
|
||||||
//
|
|
||||||
//=======================================================================
|
|
||||||
//class : BOPAlgo_BuilderFaceFunctor
|
|
||||||
//purpose : The class provides the interface and implementation
|
|
||||||
// of the parallel computations
|
|
||||||
//=======================================================================
|
|
||||||
class BOPAlgo_BuilderFaceFunctor {
|
|
||||||
protected:
|
|
||||||
BOPAlgo_VectorOfBuilderFace* myPVBF;
|
|
||||||
//
|
|
||||||
public:
|
|
||||||
//
|
|
||||||
BOPAlgo_BuilderFaceFunctor(BOPAlgo_VectorOfBuilderFace& aVBF)
|
|
||||||
: myPVBF(&aVBF) {
|
|
||||||
}
|
|
||||||
//
|
|
||||||
void operator()( const flexible_range<Standard_Integer>& aBR ) const{
|
|
||||||
Standard_Integer i, iBeg, iEnd;
|
|
||||||
//
|
|
||||||
BOPAlgo_VectorOfBuilderFace& aVBF=*myPVBF;
|
|
||||||
//
|
|
||||||
iBeg=aBR.begin();
|
|
||||||
iEnd=aBR.end();
|
|
||||||
for(i=iBeg; i!=iEnd; ++i) {
|
|
||||||
BOPAlgo_BuilderFace& aBF=aVBF(i);
|
|
||||||
//
|
|
||||||
aBF.Perform();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
//=======================================================================
|
|
||||||
//class : BOPAlgo_BuilderFaceCnt
|
|
||||||
//purpose : The class provides the interface and implementation
|
|
||||||
// of the parallel computations
|
|
||||||
//=======================================================================
|
|
||||||
class BOPAlgo_BuilderFaceCnt {
|
|
||||||
public:
|
|
||||||
//-------------------------------
|
|
||||||
// Perform
|
|
||||||
Standard_EXPORT static void Perform(const Standard_Boolean bRunParallel,
|
|
||||||
BOPAlgo_VectorOfBuilderFace& aVBF) {
|
|
||||||
//
|
|
||||||
BOPAlgo_BuilderFaceFunctor aBFF(aVBF);
|
|
||||||
Standard_Integer aNbBF=aVBF.Extent();
|
|
||||||
//
|
|
||||||
if (bRunParallel) {
|
|
||||||
flexible_for(flexible_range<Standard_Integer>(0,aNbBF), aBFF);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
aBFF.operator()(flexible_range<Standard_Integer>(0,aNbBF));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
};
|
|
||||||
//
|
|
||||||
typedef BOPCol_NCVector<TopoDS_Shape> BOPAlgo_VectorOfShape;
|
|
||||||
//
|
|
||||||
typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> \
|
|
||||||
BOPAlgo_VectorOfVectorOfShape;
|
|
||||||
//
|
|
||||||
typedef NCollection_IndexedDataMap\
|
|
||||||
<BOPTools_Set, Standard_Integer, BOPTools_SetMapHasher> \
|
|
||||||
BOPAlgo_IndexedDataMapOfSetInteger;
|
|
||||||
//
|
|
||||||
//=======================================================================
|
|
||||||
//class : BOPAlgo_PairOfShapeBoolean
|
|
||||||
//purpose :
|
|
||||||
//=======================================================================
|
|
||||||
class BOPAlgo_PairOfShapeBoolean {
|
|
||||||
public:
|
|
||||||
BOPAlgo_PairOfShapeBoolean()
|
|
||||||
: myFlag(Standard_False) {
|
|
||||||
}
|
|
||||||
//
|
|
||||||
TopoDS_Shape& Shape1() {
|
|
||||||
return myShape1;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
TopoDS_Shape& Shape2() {
|
|
||||||
return myShape2;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
Standard_Boolean& Flag() {
|
|
||||||
return myFlag;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
protected:
|
|
||||||
Standard_Boolean myFlag;
|
|
||||||
TopoDS_Shape myShape1;
|
|
||||||
TopoDS_Shape myShape2;
|
|
||||||
};
|
|
||||||
//
|
|
||||||
typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> \
|
|
||||||
BOPAlgo_VectorOfPairOfShapeBoolean;
|
|
||||||
//
|
|
||||||
//=======================================================================
|
|
||||||
//function : BOPAlgo_BuilderSDFaceFunctor
|
|
||||||
//purpose : The class provides the interface and implementation
|
|
||||||
// of the parallel computations
|
|
||||||
//=======================================================================
|
|
||||||
class BOPAlgo_BuilderSDFaceFunctor {
|
|
||||||
protected:
|
|
||||||
BOPAlgo_VectorOfPairOfShapeBoolean* myPVPSB;
|
|
||||||
|
|
||||||
public:
|
|
||||||
//
|
|
||||||
BOPAlgo_BuilderSDFaceFunctor(BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB)
|
|
||||||
: myPVPSB(&aVPSB){
|
|
||||||
}
|
|
||||||
//
|
|
||||||
void operator()( const flexible_range<Standard_Integer>& aBR ) const {
|
|
||||||
Standard_Boolean bFlag;
|
|
||||||
Standard_Integer i, iBeg, iEnd;
|
|
||||||
Handle(BOPInt_Context) aContext;
|
|
||||||
//
|
|
||||||
aContext=new BOPInt_Context;
|
|
||||||
//
|
|
||||||
BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB=*myPVPSB;
|
|
||||||
//
|
|
||||||
iBeg=aBR.begin();
|
|
||||||
iEnd=aBR.end();
|
|
||||||
for(i=iBeg; i!=iEnd; ++i) {
|
|
||||||
BOPAlgo_PairOfShapeBoolean& aPSB=aVPSB(i);
|
|
||||||
const TopoDS_Face& aFj=(*(TopoDS_Face*)(&aPSB.Shape1()));
|
|
||||||
const TopoDS_Face& aFk=(*(TopoDS_Face*)(&aPSB.Shape2()));
|
|
||||||
bFlag=BOPTools_AlgoTools::AreFacesSameDomain(aFj, aFk, aContext);
|
|
||||||
if (bFlag) {
|
|
||||||
aPSB.Flag()=bFlag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
//
|
|
||||||
//=======================================================================
|
|
||||||
//function : BOPAlgo_BuilderSDFaceCnt
|
|
||||||
//purpose : The class provides the interface and implementation
|
|
||||||
// of the parallel computations
|
|
||||||
//=======================================================================
|
|
||||||
class BOPAlgo_BuilderSDFaceCnt {
|
|
||||||
public:
|
|
||||||
//-------------------------------
|
|
||||||
// Perform
|
|
||||||
Standard_EXPORT static
|
|
||||||
void Perform(const Standard_Boolean bRunParallel,
|
|
||||||
BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB) {
|
|
||||||
Standard_Integer aNbVPSB;
|
|
||||||
//
|
|
||||||
aNbVPSB=aVPSB.Extent();
|
|
||||||
BOPAlgo_BuilderSDFaceFunctor aBFF(aVPSB);
|
|
||||||
//
|
|
||||||
if (bRunParallel) {
|
|
||||||
flexible_for(flexible_range<Standard_Integer>(0,aNbVPSB), aBFF);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
aBFF.operator()(flexible_range<Standard_Integer>(0,aNbVPSB));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
};
|
|
||||||
//
|
|
||||||
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_Integer 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
|
|
@ -16,13 +16,13 @@
|
|||||||
// commercial license or contractual agreement.
|
// commercial license or contractual agreement.
|
||||||
|
|
||||||
#include <BOPAlgo_Builder.hxx>
|
#include <BOPAlgo_Builder.hxx>
|
||||||
|
//
|
||||||
#include <NCollection_IncAllocator.hxx>
|
#include <NCollection_IncAllocator.hxx>
|
||||||
#include <NCollection_UBTreeFiller.hxx>
|
#include <NCollection_UBTreeFiller.hxx>
|
||||||
|
//
|
||||||
#include <Bnd_Box.hxx>
|
#include <Bnd_Box.hxx>
|
||||||
#include <TopAbs_State.hxx>
|
#include <TopAbs_State.hxx>
|
||||||
|
//
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
#include <TopoDS_Iterator.hxx>
|
#include <TopoDS_Iterator.hxx>
|
||||||
#include <TopoDS_Solid.hxx>
|
#include <TopoDS_Solid.hxx>
|
||||||
@ -33,10 +33,10 @@
|
|||||||
#include <TopoDS_Iterator.hxx>
|
#include <TopoDS_Iterator.hxx>
|
||||||
#include <TopoDS_Shell.hxx>
|
#include <TopoDS_Shell.hxx>
|
||||||
#include <TopoDS_Compound.hxx>
|
#include <TopoDS_Compound.hxx>
|
||||||
|
//
|
||||||
#include <TopExp.hxx>
|
#include <TopExp.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
|
//
|
||||||
#include <BRep_Builder.hxx>
|
#include <BRep_Builder.hxx>
|
||||||
#include <BRepTools.hxx>
|
#include <BRepTools.hxx>
|
||||||
#include <BRepClass3d_SolidClassifier.hxx>
|
#include <BRepClass3d_SolidClassifier.hxx>
|
||||||
@ -49,6 +49,8 @@
|
|||||||
#include <BOPCol_BoxBndTree.hxx>
|
#include <BOPCol_BoxBndTree.hxx>
|
||||||
#include <BOPCol_ListOfInteger.hxx>
|
#include <BOPCol_ListOfInteger.hxx>
|
||||||
#include <BOPCol_DataMapOfIntegerShape.hxx>
|
#include <BOPCol_DataMapOfIntegerShape.hxx>
|
||||||
|
#include <BOPCol_NCVector.hxx>
|
||||||
|
#include <BOPCol_TBB.hxx>
|
||||||
//
|
//
|
||||||
#include <BOPInt_Context.hxx>
|
#include <BOPInt_Context.hxx>
|
||||||
//
|
//
|
||||||
@ -61,7 +63,6 @@
|
|||||||
#include <BOPTools_Set.hxx>
|
#include <BOPTools_Set.hxx>
|
||||||
//
|
//
|
||||||
#include <BOPAlgo_BuilderSolid.hxx>
|
#include <BOPAlgo_BuilderSolid.hxx>
|
||||||
#include <BOPAlgo_Builder_2Cnt.hxx>
|
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -73,6 +74,20 @@ static
|
|||||||
BOPCol_MapOfShape& aMFence,
|
BOPCol_MapOfShape& aMFence,
|
||||||
BOPCol_ListOfShape& theLS);
|
BOPCol_ListOfShape& theLS);
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
// BOPAlgo_BuilderSolid
|
||||||
|
//
|
||||||
|
typedef BOPCol_NCVector
|
||||||
|
<BOPAlgo_BuilderSolid> BOPAlgo_VectorOfBuilderSolid;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBFunctor
|
||||||
|
<BOPAlgo_BuilderSolid,
|
||||||
|
BOPAlgo_VectorOfBuilderSolid> BOPAlgo_BuilderSolidFunctor;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBCnt
|
||||||
|
<BOPAlgo_BuilderSolidFunctor,
|
||||||
|
BOPAlgo_VectorOfBuilderSolid> BOPAlgo_BuilderSolidCnt;
|
||||||
|
//
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//class : BOPAlgo_ShapeBox
|
//class : BOPAlgo_ShapeBox
|
||||||
//purpose : Auxiliary class
|
//purpose : Auxiliary class
|
||||||
@ -156,9 +171,10 @@ void BOPAlgo_Builder::FillImagesSolids()
|
|||||||
//function : FillIn3DParts
|
//function : FillIn3DParts
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts,
|
void BOPAlgo_Builder::FillIn3DParts
|
||||||
BOPCol_DataMapOfShapeShape& theDraftSolids,
|
(BOPCol_DataMapOfShapeListOfShape& theInParts,
|
||||||
const BOPCol_BaseAllocator& )
|
BOPCol_DataMapOfShapeShape& theDraftSolids,
|
||||||
|
const BOPCol_BaseAllocator& )
|
||||||
{
|
{
|
||||||
Standard_Boolean bHasImage;
|
Standard_Boolean bHasImage;
|
||||||
Standard_Integer i, k, aNbS, aNbLIF, nFP, aNbFP, aNbFIN, iIsIN;
|
Standard_Integer i, k, aNbS, aNbLIF, nFP, aNbFP, aNbFIN, iIsIN;
|
||||||
@ -192,16 +208,16 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
const BOPCol_ListOfShape& aLS=myImages.Find(aS);
|
const BOPCol_ListOfShape& aLS=myImages.Find(aS);
|
||||||
aItLS.Initialize(aLS);
|
aItLS.Initialize(aLS);
|
||||||
for (; aItLS.More(); aItLS.Next()) {
|
for (; aItLS.More(); aItLS.Next()) {
|
||||||
const TopoDS_Shape& aSx=aItLS.Value();
|
const TopoDS_Shape& aSx=aItLS.Value();
|
||||||
//
|
//
|
||||||
Bnd_Box aBox;
|
Bnd_Box aBox;
|
||||||
BRepBndLib::Add(aSx, aBox);
|
BRepBndLib::Add(aSx, aBox);
|
||||||
//
|
//
|
||||||
aSB.SetShape(aSx);
|
aSB.SetShape(aSx);
|
||||||
aSB.SetBox(aBox);
|
aSB.SetBox(aBox);
|
||||||
//
|
//
|
||||||
aDMISB.Bind(k, aSB);
|
aDMISB.Bind(k, aSB);
|
||||||
++k;
|
++k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -261,7 +277,7 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
const TopoDS_Shape& aShell=aIt.Value();
|
const TopoDS_Shape& aShell=aIt.Value();
|
||||||
bHasImage=myImages.IsBound(aShell);
|
bHasImage=myImages.IsBound(aShell);
|
||||||
if (bHasImage){
|
if (bHasImage){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@ -308,10 +324,10 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
const BOPAlgo_ShapeBox& aSBF=aDMISB.Find(nFP);
|
const BOPAlgo_ShapeBox& aSBF=aDMISB.Find(nFP);
|
||||||
const TopoDS_Face& aFP=(*(TopoDS_Face*)&aSBF.Shape());
|
const TopoDS_Face& aFP=(*(TopoDS_Face*)&aSBF.Shape());
|
||||||
if (aMF.Contains(aFP)) {
|
if (aMF.Contains(aFP)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (aMFDone.Contains(aFP)) {
|
if (aMFDone.Contains(aFP)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
aMFDone.Add(aFP);
|
aMFDone.Add(aFP);
|
||||||
@ -323,19 +339,19 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
//
|
//
|
||||||
aItLI1.Initialize(aLIFP);
|
aItLI1.Initialize(aLIFP);
|
||||||
for (; aItLI1.More(); aItLI1.Next()) {
|
for (; aItLI1.More(); aItLI1.Next()) {
|
||||||
const TopoDS_Shape& aFx=aDMISB.Find(aItLI1.Value()).Shape();
|
const TopoDS_Shape& aFx=aDMISB.Find(aItLI1.Value()).Shape();
|
||||||
if (!aMFDone.Contains(aFx)) {
|
if (!aMFDone.Contains(aFx)) {
|
||||||
aLFP.Append(aFx);
|
aLFP.Append(aFx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
aLCBF.Clear();
|
aLCBF.Clear();
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
{
|
{
|
||||||
Handle(NCollection_IncAllocator) aAlr2;
|
Handle(NCollection_IncAllocator) aAlr2;
|
||||||
aAlr2=new NCollection_IncAllocator();
|
aAlr2=new NCollection_IncAllocator();
|
||||||
//
|
//
|
||||||
BOPTools_AlgoTools::MakeConnexityBlock(aLFP, aME, aLCBF, aAlr2);
|
BOPTools_AlgoTools::MakeConnexityBlock(aLFP, aME, aLCBF, aAlr2);
|
||||||
}
|
}
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
aItLS.Initialize(aLCBF);
|
aItLS.Initialize(aLCBF);
|
||||||
@ -353,8 +369,8 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
if (aNbFIN || aNbLIF) {
|
if (aNbFIN || aNbLIF) {
|
||||||
aItLS.Initialize(aLIF);
|
aItLS.Initialize(aLIF);
|
||||||
for (; aItLS.More(); aItLS.Next()) {
|
for (; aItLS.More(); aItLS.Next()) {
|
||||||
const TopoDS_Shape& aFI=aItLS.Value();
|
const TopoDS_Shape& aFI=aItLS.Value();
|
||||||
aLFIN.Append(aFI);
|
aLFIN.Append(aFI);
|
||||||
}
|
}
|
||||||
theInParts.Bind(aSolid, aLFIN);
|
theInParts.Bind(aSolid, aLFIN);
|
||||||
}
|
}
|
||||||
@ -365,14 +381,13 @@ void BOPAlgo_Builder::FillIn3DParts(BOPCol_DataMapOfShapeListOfShape& theInParts
|
|||||||
//---------------------------------------------
|
//---------------------------------------------
|
||||||
}// for (i=0; i<aNbS; ++i) {
|
}// for (i=0; i<aNbS; ++i) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : BuildDraftSolid
|
//function : BuildDraftSolid
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
|
void BOPAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
|
||||||
TopoDS_Shape& theDraftSolid,
|
TopoDS_Shape& theDraftSolid,
|
||||||
BOPCol_ListOfShape& theLIF)
|
BOPCol_ListOfShape& theLIF)
|
||||||
{
|
{
|
||||||
myErrorStatus=0;
|
myErrorStatus=0;
|
||||||
//
|
//
|
||||||
@ -383,7 +398,7 @@ void BOPAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
|
|||||||
TopoDS_Shell aShD;
|
TopoDS_Shell aShD;
|
||||||
TopoDS_Shape aFSDx, aFx;
|
TopoDS_Shape aFSDx, aFx;
|
||||||
BRep_Builder aBB;
|
BRep_Builder aBB;
|
||||||
BOPCol_ListIteratorOfListOfShape aItS;
|
BOPCol_ListIteratorOfListOfShape aItS;
|
||||||
//
|
//
|
||||||
aOrSd=theSolid.Orientation();
|
aOrSd=theSolid.Orientation();
|
||||||
theDraftSolid.Orientation(aOrSd);
|
theDraftSolid.Orientation(aOrSd);
|
||||||
@ -419,7 +434,9 @@ void BOPAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
|
|||||||
theLIF.Append(aFSDx);
|
theLIF.Append(aFSDx);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aFSDx, aF, myContext);
|
bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aFSDx,
|
||||||
|
aF,
|
||||||
|
myContext);
|
||||||
if (bToReverse) {
|
if (bToReverse) {
|
||||||
aFSDx.Reverse();
|
aFSDx.Reverse();
|
||||||
}
|
}
|
||||||
@ -461,9 +478,10 @@ void BOPAlgo_Builder::BuildDraftSolid(const TopoDS_Shape& theSolid,
|
|||||||
//function : BuildSplitSolids
|
//function : BuildSplitSolids
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_Builder::BuildSplitSolids(BOPCol_DataMapOfShapeListOfShape& theInParts,
|
void BOPAlgo_Builder::BuildSplitSolids
|
||||||
BOPCol_DataMapOfShapeShape& theDraftSolids,
|
(BOPCol_DataMapOfShapeListOfShape& theInParts,
|
||||||
const BOPCol_BaseAllocator& )
|
BOPCol_DataMapOfShapeShape& theDraftSolids,
|
||||||
|
const BOPCol_BaseAllocator& )
|
||||||
{
|
{
|
||||||
myErrorStatus=0;
|
myErrorStatus=0;
|
||||||
//
|
//
|
||||||
@ -650,7 +668,9 @@ void BOPAlgo_Builder::FillInternalShapes()
|
|||||||
for (; aIt.More(); aIt.Next()) {
|
for (; aIt.More(); aIt.Next()) {
|
||||||
const TopoDS_Shape& aS=aIt.Value();
|
const TopoDS_Shape& aS=aIt.Value();
|
||||||
aType=aS.ShapeType();
|
aType=aS.ShapeType();
|
||||||
if (aType==TopAbs_VERTEX || aType==TopAbs_EDGE ||aType==TopAbs_WIRE) {
|
if (aType==TopAbs_VERTEX ||
|
||||||
|
aType==TopAbs_EDGE ||
|
||||||
|
aType==TopAbs_WIRE) {
|
||||||
if (aMFence.Add(aS)) {
|
if (aMFence.Add(aS)) {
|
||||||
if (myImages.IsBound(aS)) {
|
if (myImages.IsBound(aS)) {
|
||||||
const BOPCol_ListOfShape &aLSp=myImages.Find(aS);
|
const BOPCol_ListOfShape &aLSp=myImages.Find(aS);
|
||||||
@ -809,8 +829,8 @@ void BOPAlgo_Builder::FillInternalShapes()
|
|||||||
//function : OwnInternalShapes
|
//function : OwnInternalShapes
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void OwnInternalShapes(const TopoDS_Shape& theS,
|
void OwnInternalShapes(const TopoDS_Shape& theS,
|
||||||
BOPCol_IndexedMapOfShape& theMx)
|
BOPCol_IndexedMapOfShape& theMx)
|
||||||
{
|
{
|
||||||
TopoDS_Iterator aIt;
|
TopoDS_Iterator aIt;
|
||||||
//
|
//
|
||||||
|
@ -16,37 +16,133 @@
|
|||||||
// commercial license or contractual agreement.
|
// commercial license or contractual agreement.
|
||||||
|
|
||||||
#include <BOPAlgo_PaveFiller.ixx>
|
#include <BOPAlgo_PaveFiller.ixx>
|
||||||
|
//
|
||||||
#include <NCollection_IncAllocator.hxx>
|
#include <NCollection_IncAllocator.hxx>
|
||||||
|
//
|
||||||
#include <TopoDS_Vertex.hxx>
|
#include <TopoDS_Vertex.hxx>
|
||||||
#include <TopoDS_Face.hxx>
|
#include <TopoDS_Face.hxx>
|
||||||
#include <BRep_Tool.hxx>
|
#include <BRep_Tool.hxx>
|
||||||
#include <BRep_Builder.hxx>
|
#include <BRep_Builder.hxx>
|
||||||
#include <BRepBndLib.hxx>
|
#include <BRepBndLib.hxx>
|
||||||
|
//
|
||||||
#include <BOPCol_MapOfInteger.hxx>
|
#include <BOPCol_MapOfInteger.hxx>
|
||||||
|
#include <BOPCol_NCVector.hxx>
|
||||||
|
#include <BOPCol_TBB.hxx>
|
||||||
|
//
|
||||||
#include <BOPInt_Context.hxx>
|
#include <BOPInt_Context.hxx>
|
||||||
|
//
|
||||||
#include <BOPDS_Iterator.hxx>
|
#include <BOPDS_Iterator.hxx>
|
||||||
#include <BOPDS_VectorOfInterfVF.hxx>
|
#include <BOPDS_VectorOfInterfVF.hxx>
|
||||||
#include <BOPDS_Interf.hxx>
|
#include <BOPDS_Interf.hxx>
|
||||||
#include <BOPDS_SubIterator.hxx>
|
#include <BOPDS_SubIterator.hxx>
|
||||||
#include <BOPDS_MapOfPaveBlock.hxx>
|
#include <BOPDS_MapOfPaveBlock.hxx>
|
||||||
#include <BOPDS_FaceInfo.hxx>
|
#include <BOPDS_FaceInfo.hxx>
|
||||||
#include <BOPCol_MapOfInteger.hxx>
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//class : BOPAlgo_VertexFace
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
class BOPAlgo_VertexFace {
|
||||||
|
public:
|
||||||
|
BOPAlgo_VertexFace()
|
||||||
|
: myIV(-1), myIF(-1), myIVx(-1),
|
||||||
|
myFlag(-1), myT1(-1.), myT2(-1.) {
|
||||||
|
}
|
||||||
|
//
|
||||||
|
~BOPAlgo_VertexFace(){
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetIndices(const Standard_Integer nV,
|
||||||
|
const Standard_Integer nF,
|
||||||
|
const Standard_Integer nVx) {
|
||||||
|
myIV=nV;
|
||||||
|
myIF=nF;
|
||||||
|
myIVx=nVx;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void Indices(Standard_Integer& nV,
|
||||||
|
Standard_Integer& nF,
|
||||||
|
Standard_Integer& nVx) const {
|
||||||
|
nV=myIV;
|
||||||
|
nF=myIF;
|
||||||
|
nVx=myIVx;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetVertex(const TopoDS_Vertex& aV) {
|
||||||
|
myV=aV;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
const TopoDS_Vertex& Vertex()const {
|
||||||
|
return myV;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetFace(const TopoDS_Face& aF) {
|
||||||
|
myF=aF;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
const TopoDS_Face& Face()const {
|
||||||
|
return myF;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
Standard_Integer Flag()const {
|
||||||
|
return myFlag;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void Parameters(Standard_Real& aT1,
|
||||||
|
Standard_Real& aT2)const {
|
||||||
|
aT1=myT1;
|
||||||
|
aT2=myT2;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void SetContext(const Handle(BOPInt_Context)& aContext) {
|
||||||
|
myContext=aContext;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
const Handle(BOPInt_Context)& Context()const {
|
||||||
|
return myContext;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void Perform() {
|
||||||
|
myFlag=myContext->ComputeVF(myV, myF, myT1, myT2);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
protected:
|
||||||
|
Standard_Integer myIV;
|
||||||
|
Standard_Integer myIF;
|
||||||
|
Standard_Integer myIVx;
|
||||||
|
Standard_Integer myFlag;
|
||||||
|
Standard_Real myT1;
|
||||||
|
Standard_Real myT2;
|
||||||
|
TopoDS_Vertex myV;
|
||||||
|
TopoDS_Face myF;
|
||||||
|
Handle(BOPInt_Context) myContext;
|
||||||
|
};
|
||||||
|
//=======================================================================
|
||||||
|
typedef BOPCol_NCVector<BOPAlgo_VertexFace>
|
||||||
|
BOPAlgo_VectorOfVertexFace;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBContextFunctor
|
||||||
|
<BOPAlgo_VertexFace,
|
||||||
|
BOPAlgo_VectorOfVertexFace,
|
||||||
|
Handle_BOPInt_Context,
|
||||||
|
BOPInt_Context> BOPAlgo_VertexFaceFunctor;
|
||||||
|
//
|
||||||
|
typedef BOPCol_TBBContextCnt
|
||||||
|
<BOPAlgo_VertexFaceFunctor,
|
||||||
|
BOPAlgo_VectorOfVertexFace,
|
||||||
|
Handle_BOPInt_Context> BOPAlgo_VertexFaceCnt;
|
||||||
|
//
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
// function: PerformVF
|
// function: PerformVF
|
||||||
// purpose:
|
// purpose:
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_PaveFiller::PerformVF()
|
void BOPAlgo_PaveFiller::PerformVF()
|
||||||
{
|
{
|
||||||
Standard_Boolean bJustAdd;
|
Standard_Boolean bJustAdd;
|
||||||
Standard_Integer iSize, nV, nF, nVSD, iFlag, nVx, i;
|
Standard_Integer iSize, nV, nF, nVSD, iFlag, nVx, i, aNbVF, k;
|
||||||
Standard_Real aT1, aT2, aTolF, aTolV;
|
Standard_Real aT1, aT2, aTolF, aTolV;
|
||||||
BRep_Builder aBB;
|
BRep_Builder aBB;
|
||||||
|
BOPAlgo_VectorOfVertexFace aVVF;
|
||||||
//
|
//
|
||||||
myErrorStatus=0;
|
myErrorStatus=0;
|
||||||
//
|
//
|
||||||
@ -83,34 +179,56 @@
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
myDS->ChangeFaceInfo(nF);// !
|
||||||
|
//
|
||||||
const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&myDS->Shape(nVx)));
|
const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&myDS->Shape(nVx)));
|
||||||
const TopoDS_Face& aF=(*(TopoDS_Face *)(&myDS->Shape(nF)));
|
const TopoDS_Face& aF=(*(TopoDS_Face *)(&myDS->Shape(nF)));
|
||||||
//
|
//
|
||||||
|
BOPAlgo_VertexFace& aVertexFace=aVVF.Append1();
|
||||||
|
//
|
||||||
|
aVertexFace.SetIndices(nV, nF, nVx);
|
||||||
|
aVertexFace.SetVertex(aV);
|
||||||
|
aVertexFace.SetFace(aF);
|
||||||
|
}//for (; myIterator->More(); myIterator->Next()) {
|
||||||
|
//
|
||||||
|
aNbVF=aVVF.Extent();
|
||||||
|
//================================================================
|
||||||
|
BOPAlgo_VertexFaceCnt::Perform(myRunParallel, aVVF, myContext);
|
||||||
|
//================================================================
|
||||||
|
//
|
||||||
|
for (k=0; k < aNbVF; ++k) {
|
||||||
|
const BOPAlgo_VertexFace& aVertexFace=aVVF(k);
|
||||||
|
//
|
||||||
|
iFlag=aVertexFace.Flag();
|
||||||
|
if (iFlag) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
aVertexFace.Indices(nV, nF, nVx);
|
||||||
|
aVertexFace.Parameters(aT1, aT2);
|
||||||
|
const TopoDS_Vertex& aV=aVertexFace.Vertex();
|
||||||
|
const TopoDS_Face& aF=aVertexFace.Face();
|
||||||
|
// 1
|
||||||
|
i=aVFs.Append()-1;
|
||||||
|
BOPDS_InterfVF& aVF=aVFs(i);
|
||||||
|
aVF.SetIndices(nVx, nF);
|
||||||
|
aVF.SetUV(aT1, aT2);
|
||||||
|
// 2
|
||||||
|
myDS->AddInterf(nVx, nF);
|
||||||
|
// 3
|
||||||
|
BOPDS_FaceInfo& aFI=myDS->ChangeFaceInfo(nF);
|
||||||
|
BOPCol_MapOfInteger& aMVIn=aFI.ChangeVerticesIn();
|
||||||
|
aMVIn.Add(nVx);
|
||||||
|
// 4
|
||||||
aTolV = BRep_Tool::Tolerance(aV);
|
aTolV = BRep_Tool::Tolerance(aV);
|
||||||
aTolF = BRep_Tool::Tolerance(aF);
|
aTolF = BRep_Tool::Tolerance(aF);
|
||||||
//
|
if (aTolV < aTolF) {
|
||||||
iFlag=myContext->ComputeVF(aV, aF, aT1, aT2);
|
aBB.UpdateVertex(aV, aTolF);
|
||||||
if (!iFlag) {
|
BOPDS_ShapeInfo& aSIV = myDS->ChangeShapeInfo(nVx);
|
||||||
// 1
|
Bnd_Box& aBoxV = aSIV.ChangeBox();
|
||||||
i=aVFs.Append()-1;
|
BRepBndLib::Add(aV, aBoxV);
|
||||||
BOPDS_InterfVF& aVF=aVFs(i);
|
|
||||||
aVF.SetIndices(nVx, nF);
|
|
||||||
aVF.SetUV(aT1, aT2);
|
|
||||||
// 2
|
|
||||||
myDS->AddInterf(nVx, nF);
|
|
||||||
//
|
|
||||||
BOPDS_FaceInfo& aFI=myDS->ChangeFaceInfo(nF);
|
|
||||||
BOPCol_MapOfInteger& aMVIn=aFI.ChangeVerticesIn();
|
|
||||||
aMVIn.Add(nVx);
|
|
||||||
//
|
|
||||||
if (aTolV < aTolF) {
|
|
||||||
aBB.UpdateVertex(aV, aTolF);
|
|
||||||
BOPDS_ShapeInfo& aSIV = myDS->ChangeShapeInfo(nVx);
|
|
||||||
Bnd_Box& aBoxV = aSIV.ChangeBox();
|
|
||||||
BRepBndLib::Add(aV, aBoxV);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}// for (; myIterator->More(); myIterator->Next()) {
|
}//for (k=0; k < aNbVF; ++k) {
|
||||||
}// if (iSize) {
|
}// if (iSize) {
|
||||||
else {
|
else {
|
||||||
iSize=10;
|
iSize=10;
|
||||||
@ -121,21 +239,18 @@
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
TreatVerticesEE();
|
TreatVerticesEE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : TreatVerticesEE
|
//function : TreatVerticesEE
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void BOPAlgo_PaveFiller::TreatVerticesEE()
|
void BOPAlgo_PaveFiller::TreatVerticesEE()
|
||||||
{
|
{
|
||||||
Standard_Integer i, aNbS, aNbEEs, nF, nV, iFlag;
|
Standard_Integer i, aNbS, aNbEEs, nF, nV, iFlag;
|
||||||
Standard_Real aT1, aT2;
|
Standard_Real aT1, aT2;
|
||||||
BOPCol_ListIteratorOfListOfInteger aItLI;
|
BOPCol_ListIteratorOfListOfInteger aItLI;
|
||||||
Handle(NCollection_IncAllocator) aAllocator;
|
Handle(NCollection_IncAllocator) aAllocator;
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------scope_1 f
|
|
||||||
aAllocator=new NCollection_IncAllocator();
|
aAllocator=new NCollection_IncAllocator();
|
||||||
BOPCol_ListOfInteger aLIV(aAllocator), aLIF(aAllocator);
|
BOPCol_ListOfInteger aLIV(aAllocator), aLIF(aAllocator);
|
||||||
BOPCol_MapOfInteger aMI(100, aAllocator);
|
BOPCol_MapOfInteger aMI(100, aAllocator);
|
||||||
@ -209,5 +324,4 @@
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
aAllocator.Nullify();
|
aAllocator.Nullify();
|
||||||
//-----------------------------------------------------scope_1 t
|
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,5 @@ BOPAlgo_Builder_4.cxx
|
|||||||
BOPAlgo_BOP_1.cxx
|
BOPAlgo_BOP_1.cxx
|
||||||
BOPAlgo_WireSplitter_1.cxx
|
BOPAlgo_WireSplitter_1.cxx
|
||||||
BOPAlgo_ListOfCheckResult.hxx
|
BOPAlgo_ListOfCheckResult.hxx
|
||||||
BOPAlgo_Builder_2Cnt.hxx
|
|
||||||
BOPAlgo_CheckerSI_1.cxx
|
BOPAlgo_CheckerSI_1.cxx
|
||||||
|
|
||||||
BOPAlgo_PaveFiller_9.cxx
|
BOPAlgo_PaveFiller_9.cxx
|
||||||
|
Loading…
x
Reference in New Issue
Block a user