#include <NCollection_IncAllocator.hxx>
+#include <Geom_RectangularTrimmedSurface.hxx>
+#include <Geom_Plane.hxx>
+#include <Geom_Surface.hxx>
+#include <Geom_RectangularTrimmedSurface.hxx>
+
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <BRep_Builder.hxx>
#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
#include <Geom_Curve.hxx>
#include <Geom_Surface.hxx>
#include <BOPCol_NCVector.hxx>
#include <BOPCol_TBB.hxx>
-
-#include <BOPTools_AlgoTools.hxx>
-#include <BOPTools_AlgoTools2D.hxx>
+#include <BOPCol_MapOfShape.hxx>
#include <BOPDS_VectorOfListOfPaveBlock.hxx>
#include <BOPDS_ListOfPaveBlock.hxx>
#include <BOPDS_FaceInfo.hxx>
#include <BOPDS_MapOfPaveBlock.hxx>
#include <BOPDS_Curve.hxx>
+#include <BOPDS_Iterator.hxx>
+
+#include <BOPTools_AlgoTools.hxx>
+#include <BOPTools_AlgoTools2D.hxx>
+
+static
+ Standard_Boolean IsBasedOnPlane(const TopoDS_Face& aF);
static void UpdateVertices(const TopoDS_Edge& aE,
BOPAlgo_VectorOfSplitEdge> BOPAlgo_SplitEdgeCnt;
//
//=======================================================================
+//class : BOPAlgo_MPC
+//purpose :
+//=======================================================================
+class BOPAlgo_MPC {
+ public:
+ BOPAlgo_MPC()
+ : myFlag(Standard_False) {
+ };
+ //
+ ~BOPAlgo_MPC(){
+ };
+ //
+ void SetEdge(const TopoDS_Edge& aE) {
+ myE=aE;
+ }
+ //
+ const TopoDS_Edge& Edge() const {
+ return myE;
+ }
+ //
+ void SetFace(const TopoDS_Face& aF) {
+ myF=aF;
+ }
+ //
+ const TopoDS_Face& Face() const {
+ return myF;
+ }
+ //
+ void SetFlag(const Standard_Boolean bFlag) {
+ myFlag=bFlag;
+ }
+ //
+ Standard_Boolean Flag() const {
+ return myFlag;
+ }
+ //
+ void Perform() {
+ BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(myE, myF);
+ if (myFlag) {
+ UpdateVertices(myE, myF);
+ }
+ }
+ //
+ protected:
+ Standard_Boolean myFlag;
+ TopoDS_Edge myE;
+ TopoDS_Face myF;
+};
+//
+//=======================================================================
+typedef BOPCol_NCVector
+ <BOPAlgo_MPC> BOPAlgo_VectorOfMPC;
+//
+typedef BOPCol_TBBFunctor
+ <BOPAlgo_MPC,
+ BOPAlgo_VectorOfMPC> BOPAlgo_MPCFunctor;
+//
+typedef BOPCol_TBBCnt
+ <BOPAlgo_MPCFunctor,
+ BOPAlgo_VectorOfMPC> BOPAlgo_MPCCnt;
+//
+//=======================================================================
+//class : BOPAlgo_BPC
+//purpose :
+//=======================================================================
+class BOPAlgo_BPC {
+ public:
+ BOPAlgo_BPC(){
+ };
+ //
+ ~BOPAlgo_BPC(){
+ };
+ //
+ void SetFace(const TopoDS_Face& aF) {
+ myF=aF;
+ }
+ //
+ void SetEdge(const TopoDS_Edge& aE) {
+ myE=aE;
+ }
+ //
+ void Perform() {
+ BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane (myE, myF);
+ };
+ //
+ protected:
+ TopoDS_Edge myE;
+ TopoDS_Face myF;
+};
+//=======================================================================
+typedef BOPCol_NCVector
+ <BOPAlgo_BPC> BOPAlgo_VectorOfBPC;
+//
+typedef BOPCol_TBBFunctor
+ <BOPAlgo_BPC,
+ BOPAlgo_VectorOfBPC> BOPAlgo_BPCFunctor;
+//
+typedef BOPCol_TBBCnt
+ <BOPAlgo_BPCFunctor,
+ BOPAlgo_VectorOfBPC> BOPAlgo_BPCCnt;
+//
+//
+//=======================================================================
// function: MakeSplitEdges
// purpose:
//=======================================================================
//=======================================================================
void BOPAlgo_PaveFiller::MakePCurves()
{
+
Standard_Integer i, nF1, nF2, aNbC, k, nE, aNbFF, aNbFI;
BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
BOPDS_MapIteratorOfMapOfPaveBlock aItMPB;
TopoDS_Face aF1F, aF2F;
+ BOPAlgo_VectorOfMPC aVMPC;
//
myErrorStatus=0;
//
nE=aPB->Edge();
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
//
- BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF1F);
+ BOPAlgo_MPC& aMPC=aVMPC.Append1();
+ aMPC.SetEdge(aE);
+ aMPC.SetFace(aF1F);
}
+ //
// On
const BOPDS_IndexedMapOfPaveBlock& aMPBOn=aFI.PaveBlocksOn();
aItMPB.Initialize(aMPBOn);
nE=aPB->Edge();
const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
//
- BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF1F);
+ BOPAlgo_MPC& aMPC=aVMPC.Append1();
+ aMPC.SetEdge(aE);
+ aMPC.SetFace(aF1F);
}
}
- }
- //
- if (!mySectionAttribute.PCurveOnS1() &&
- !mySectionAttribute.PCurveOnS2()) {
- return;
- }
+ }// for (i=0; i<aNbFI; ++i) {
//
// 2. Process section edges
- BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
- aNbFF=aFFs.Extent();
- for (i=0; i<aNbFF; ++i) {
- const BOPDS_InterfFF& aFF=aFFs(i);
- aFF.Indices(nF1, nF2);
- //
- aF1F=(*(TopoDS_Face *)(&myDS->Shape(nF1)));
- aF1F.Orientation(TopAbs_FORWARD);
- aF2F=(*(TopoDS_Face *)(&myDS->Shape(nF2)));
- aF2F.Orientation(TopAbs_FORWARD);
- //
- const BOPDS_VectorOfCurve& aVNC=aFF.Curves();
- aNbC=aVNC.Extent();
- for (k=0; k<aNbC; ++k) {
- const BOPDS_Curve& aNC=aVNC(k);
- const BOPDS_ListOfPaveBlock& aLPB=aNC.PaveBlocks();
- aItLPB.Initialize(aLPB);
- for(; aItLPB.More(); aItLPB.Next()) {
- const Handle(BOPDS_PaveBlock)& aPB=aItLPB.Value();
- nE=aPB->Edge();
- const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
- //
- if (mySectionAttribute.PCurveOnS1()) {
- BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF1F);
- UpdateVertices(aE, aF1F);
- }
- //
- if (mySectionAttribute.PCurveOnS2()) {
- BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace(aE, aF2F);
- UpdateVertices(aE, aF2F);
+ Standard_Boolean bPCurveOnS[2];
+ Standard_Integer m;
+ TopoDS_Face aFf[2];
+ //
+ bPCurveOnS[0]=mySectionAttribute.PCurveOnS1();
+ bPCurveOnS[1]=mySectionAttribute.PCurveOnS2();
+ //
+ if (bPCurveOnS[0] || bPCurveOnS[1]) {
+ BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
+ aNbFF=aFFs.Extent();
+ for (i=0; i<aNbFF; ++i) {
+ const BOPDS_InterfFF& aFF=aFFs(i);
+ aFF.Indices(nF1, nF2);
+ //
+ aFf[0]=(*(TopoDS_Face *)(&myDS->Shape(nF1)));
+ aFf[0].Orientation(TopAbs_FORWARD);
+ //
+ aFf[1]=(*(TopoDS_Face *)(&myDS->Shape(nF2)));
+ aFf[1].Orientation(TopAbs_FORWARD);
+ //
+ const BOPDS_VectorOfCurve& aVNC=aFF.Curves();
+ aNbC=aVNC.Extent();
+ for (k=0; k<aNbC; ++k) {
+ const BOPDS_Curve& aNC=aVNC(k);
+ const BOPDS_ListOfPaveBlock& aLPB=aNC.PaveBlocks();
+ aItLPB.Initialize(aLPB);
+ for(; aItLPB.More(); aItLPB.Next()) {
+ const Handle(BOPDS_PaveBlock)& aPB=aItLPB.Value();
+ nE=aPB->Edge();
+ const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&myDS->Shape(nE)));
+ //
+ for (m=0; m<2; ++m) {
+ if (bPCurveOnS[m]) {
+ BOPAlgo_MPC& aMPC=aVMPC.Append1();
+ aMPC.SetEdge(aE);
+ aMPC.SetFace(aFf[m]);
+ aMPC.SetFlag(bPCurveOnS[m]);
+ }
+ }
}
}
- }
- }
+ }// for (i=0; i<aNbFF; ++i) {
+ }//if (bPCurveOnS1 || bPCurveOnS2 ) {
+ //
+ //======================================================
+ BOPAlgo_MPCCnt::Perform(myRunParallel, aVMPC);
+ //======================================================
}
//=======================================================================
// function: RefineFaceInfoOn
}
}
}
-
+//=======================================================================
+// function: Prepare
+// purpose:
+//=======================================================================
+void BOPAlgo_PaveFiller::Prepare()
+{
+ TopAbs_ShapeEnum aType[] = {
+ TopAbs_VERTEX,
+ TopAbs_EDGE,
+ TopAbs_FACE
+ };
+ Standard_Boolean bJustAdd, bIsBasedOnPlane;
+ Standard_Integer i, aNb, n1, nF;
+ TopExp_Explorer aExp;
+ BOPCol_MapOfShape aMF;
+ BOPCol_MapIteratorOfMapOfShape aItMF;
+ //
+ myErrorStatus=0;
+ //
+ aNb=3;
+ for(i=0; i<aNb; ++i) {
+ myIterator->Initialize(aType[i], aType[2]);
+ for (; myIterator->More(); myIterator->Next()) {
+ myIterator->Value(n1, nF, bJustAdd);
+ const TopoDS_Face& aF=(*(TopoDS_Face *)(&myDS->Shape(nF)));
+ //
+ bIsBasedOnPlane=IsBasedOnPlane(aF);
+ if (bIsBasedOnPlane) {
+ aMF.Add(aF);
+ }
+ }
+ }
+ //
+ if (aMF.IsEmpty()) {
+ return;
+ }
+ //
+ BOPAlgo_VectorOfBPC aVBPC;
+ //
+ aItMF.Initialize(aMF);
+ for (; aItMF.More(); aItMF.Next()) {
+ const TopoDS_Face& aF=*((TopoDS_Face *)&aItMF.Key());
+ aExp.Init(aF, aType[1]);
+ for (; aExp.More(); aExp.Next()) {
+ const TopoDS_Edge& aE=*((TopoDS_Edge *)&aExp.Current());
+ BOPAlgo_BPC& aBPC=aVBPC.Append1();
+ aBPC.SetEdge(aE);
+ aBPC.SetFace(aF);
+ }
+ }
+ //
+ //======================================================
+ BOPAlgo_BPCCnt::Perform(myRunParallel, aVBPC);
+ //======================================================
+}
+//=======================================================================
+//function : IsBasedOnPlane
+//purpose :
+//=======================================================================
+Standard_Boolean IsBasedOnPlane(const TopoDS_Face& aF)
+{
+ TopLoc_Location aLoc;
+ Handle(Geom_RectangularTrimmedSurface) aGRTS;
+ Handle(Geom_Plane) aGP;
+
+ const Handle(Geom_Surface)& aS = BRep_Tool::Surface(aF, aLoc);
+ aGRTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(aS);
+ if(!aGRTS.IsNull()) {
+ aGP = Handle(Geom_Plane)::DownCast(aGRTS->BasisSurface());
+ }
+ else {
+ aGP = Handle(Geom_Plane)::DownCast(aS);
+ }
+ //
+ return (!aGP.IsNull());
+}