diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx index a4e454665d..9ee95bf647 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx @@ -934,7 +934,10 @@ void BOPAlgo_PaveFiller::MakeBlocks(const Message_ProgressRange& theRange) // into all faces, not participated in creation of that edge, as IN edge PutSEInOtherFaces(aPSOuter.Next()); - // + + // Filter the Common Blocks created on the Face/Face post treatment stage from duplicates + myDS->FilterCommonBlocks(); + //-----------------------------------------------------scope t aMVStick.Clear(); aMPBOnIn.Clear(); diff --git a/src/BOPDS/BOPDS_DS.cxx b/src/BOPDS/BOPDS_DS.cxx index 9ad33e6fdd..2f6a9efb12 100644 --- a/src/BOPDS/BOPDS_DS.cxx +++ b/src/BOPDS/BOPDS_DS.cxx @@ -1116,13 +1116,7 @@ Handle(BOPDS_CommonBlock) BOPDS_DS::CommonBlock void BOPDS_DS::SetCommonBlock(const Handle(BOPDS_PaveBlock)& thePB, const Handle(BOPDS_CommonBlock)& theCB) { - if (IsCommonBlock(thePB)) { - Handle(BOPDS_CommonBlock)& aCB = myMapPBCB.ChangeFind(thePB); - aCB=theCB; - } - else { - myMapPBCB.Bind(thePB, theCB); - } + myMapPBCB.Bind(thePB, theCB); } // @@ -2202,4 +2196,50 @@ Standard_Boolean BOPDS_DS::IsValidShrunkData(const Handle(BOPDS_PaveBlock)& theP } } return Standard_True; +} + +//======================================================================= +//function : FilterCommonBlocks +//purpose : +//======================================================================= +void BOPDS_DS::FilterCommonBlocks() +{ + // Connection map from edge to common block + NCollection_DataMap aMapEC; + + // Iterate on all Pave Blocks in the Data Structure and make + // the Pave Blocks with the same edges be lined to the same Common Block + BOPDS_VectorOfListOfPaveBlock& aPBP = ChangePaveBlocksPool(); + Standard_Integer aNbPBP = aPBP.Length(); + for (Standard_Integer i = 0; i < aNbPBP; ++i) + { + BOPDS_ListOfPaveBlock& aLPB = aPBP(i); + BOPDS_ListIteratorOfListOfPaveBlock aItPB; + aItPB.Initialize(aLPB); + for (; aItPB.More(); aItPB.Next()) + { + const Handle(BOPDS_PaveBlock) &aPB = aItPB.Value(); + + if (!IsCommonBlock(aPB)) + // not a Common block - skip + continue; + + // Get index of the edge + const Standard_Integer anEIdx = aPB->Edge(); + + Handle(BOPDS_CommonBlock) *aCB = aMapEC.ChangeSeek(anEIdx); + if (!aCB) + { + // Firstly met edge. Make all other Pave Blocks with the same edge + // be linked to the same Common Block. + aCB = aMapEC.Bound(anEIdx, CommonBlock(aPB)); + } + else + { + // Update the information about Common Block + (*aCB)->AddPaveBlock(aPB); + SetCommonBlock(aPB, *aCB); + } + } + } } \ No newline at end of file diff --git a/src/BOPDS/BOPDS_DS.hxx b/src/BOPDS/BOPDS_DS.hxx index 38d0f33e8d..ff88d0f1f6 100644 --- a/src/BOPDS/BOPDS_DS.hxx +++ b/src/BOPDS/BOPDS_DS.hxx @@ -471,6 +471,10 @@ public: Bnd_Box& theBox, const Standard_Boolean theCheckInverted = Standard_True); + //! Filter the Common Blocks on edges so that all Pave Blocks with the same Edge + //! have the same Common Block linked to it. + Standard_EXPORT void FilterCommonBlocks(); + protected: diff --git a/src/BOPTools/BOPTools_AlgoTools.cxx b/src/BOPTools/BOPTools_AlgoTools.cxx index 78322a73c5..ba8678ed1c 100644 --- a/src/BOPTools/BOPTools_AlgoTools.cxx +++ b/src/BOPTools/BOPTools_AlgoTools.cxx @@ -1803,6 +1803,10 @@ Standard_Boolean FindFacePairs (const TopoDS_Edge& theE, } } // + + if (aLCEFx.IsEmpty()) + return Standard_False; + // F2 BOPTools_AlgoTools::GetFaceOff(aE1, aF1, aLCEFx, aF2, theContext); // diff --git a/src/IntImpParGen/IntImpParGen_Intersector.gxx b/src/IntImpParGen/IntImpParGen_Intersector.gxx index cd02df9abb..9d0d778c00 100644 --- a/src/IntImpParGen/IntImpParGen_Intersector.gxx +++ b/src/IntImpParGen/IntImpParGen_Intersector.gxx @@ -32,6 +32,8 @@ #include #include +#include + //====================================================================== #define EPSDIST Tol #define EPSNUL TolConf @@ -164,8 +166,13 @@ void IntImpParGen_Intersector::And_Domaine_Objet1_Intersections(const ImpTool& T Resultat2.SetValue(NbResultats, Inter2_And_Domain2.Value(indice_2)); } else { //====== la borne2 et la borne1 sont hors domaine ===== - if (param1TheImpCurveDomain.LastParameter()) { + const Standard_Real aParF = TheImpCurveDomain.HasFirstPoint() ? + TheImpCurveDomain.FirstParameter() : + -Precision::Infinite(); + const Standard_Real aParL = TheImpCurveDomain.HasLastPoint() ? + TheImpCurveDomain.LastParameter() : + Precision::Infinite(); + if (param1aParL) { Standard_Real t; NbResultats++; t = TheImpCurveDomain.FirstParameter(); diff --git a/src/IntTools/IntTools_BeanFaceIntersector.cxx b/src/IntTools/IntTools_BeanFaceIntersector.cxx index b5095096eb..216bc097ba 100644 --- a/src/IntTools/IntTools_BeanFaceIntersector.cxx +++ b/src/IntTools/IntTools_BeanFaceIntersector.cxx @@ -1188,7 +1188,11 @@ void IntTools_BeanFaceIntersector::ComputeRangeFromStartPoint(const Standard_Boo // if point found decide to increase aDelta using derivative of distance function // - aDelta = (pointfound) ? (aDelta * 2.) : (aDelta * 0.5); + // (aDelta*2) and (aDelta/(3/2)). + // Use of constants 2 and 0.5 leads to infinite loop + // connected with the sequence: pointfound == TRUE ==> + // aDelta *= 2.0 ==> pointfound == FALSE ==> aDelta *= 0.5 ... + aDelta *= (pointfound) ? 2.0 : 0.6667; aDelta = (aDelta < aDeltaRestrictor) ? aDelta : aDeltaRestrictor; aCurPar = (ToIncreaseParameter) ? (aPrevPar + aDelta) : (aPrevPar - aDelta); diff --git a/tests/perf/modalg/bug29144 b/tests/perf/modalg/bug29144 new file mode 100644 index 0000000000..72dc0f7888 --- /dev/null +++ b/tests/perf/modalg/bug29144 @@ -0,0 +1,27 @@ +puts "========" +puts "0029144: Modeling Algorithms - BOP PaveFiller hangs in some case" +puts "========" +puts "" + +puts "TODO OCC29145 ALL : Faulty shapes in variables faulty_1 to faulty_" + +bclearobjects; +bcleartools; + +restore [locate_data_file bug29093_hung3.brep] a +explode a So +baddobjects a_7 +baddtools a_11 + +dchrono cr restart + +bfillds +bbuild result + +dchrono cr stop counter bbuild + +checkshape result +checkprops result -s 1313890 -v 46778600 +checknbshapes result -vertex 9 -edge 20 -wire 12 -face 12 -shell 3 -solid 3 + +checkview -display result -2d -path ${imagedir}/${test_image}.png