]> OCCT Git - occt.git/commitdiff
0029144: Modeling Algorithms - BOP PaveFiller hangs in some case CR29144_4
authorakaftasev <akaftasev@opencascade.com>
Wed, 19 Oct 2022 14:08:09 +0000 (17:08 +0300)
committerakaftasev <akaftasev@opencascade.com>
Thu, 20 Oct 2022 14:43:05 +0000 (17:43 +0300)
1. Method IntTools_BeanFaceIntersector::ComputeRangeFromStartPoint(...) has been corrected in order to avoid infinite loop described in the issue. The algorithm of obtaining the neighborhood of the intersection point has been improved.

2. Post-processing has been added to join several common blocks to one. Method BOPDS_DS::RemoveCommonBlock(...) has been added in order to avoid duplication after joining.

src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx
src/BOPDS/BOPDS_DS.cxx
src/BOPDS/BOPDS_DS.hxx
src/BOPTools/BOPTools_AlgoTools.cxx
src/IntImpParGen/IntImpParGen_Intersector.gxx
src/IntTools/IntTools_BeanFaceIntersector.cxx
tests/perf/modalg/bug29144 [new file with mode: 0644]

index a4e454665d9e8b669996a0256582c697efc0b425..9ee95bf6472429f2c3cd7e4675bf3ea7c7d664bc 100644 (file)
@@ -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();
index 9ad33e6fdd3107ad9d56c89140ba3dfb202fa782..2f6a9efb1290e21c08c06a22d52c4239f94e0a94 100644 (file)
@@ -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<Standard_Integer, Handle(BOPDS_CommonBlock)> 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
index 38d0f33e8da619b6e4b5345ee5f8afb77656024c..ff88d0f1f6edf1bb047d5cb1835590f81e7c5647 100644 (file)
@@ -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:
 
   
index 78322a73c5380c3ab318d9a679777db4cb6b8517..ba8678ed1c819a0f46002f25a102b4ad2c92f2c5 100644 (file)
@@ -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);
     //
index cd02df9abb9bf0e84cb0064dc10f628c48cb34ab..9d0d778c0062d5b64e03105268a71badbf11d76f 100644 (file)
@@ -32,6 +32,8 @@
 #include <gp.hxx>
 #include <gp_Vec2d.hxx>
 
+#include <Precision.hxx>
+
 //======================================================================
 #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 (param1<TheImpCurveDomain.FirstParameter()
-          && param2>TheImpCurveDomain.LastParameter()) {
+        const Standard_Real aParF = TheImpCurveDomain.HasFirstPoint() ?
+                                      TheImpCurveDomain.FirstParameter() :
+                                      -Precision::Infinite();
+        const Standard_Real aParL = TheImpCurveDomain.HasLastPoint() ?
+                                      TheImpCurveDomain.LastParameter() :
+                                      Precision::Infinite();
+        if (param1<aParF && param2>aParL) {
           Standard_Real t;
           NbResultats++;
           t = TheImpCurveDomain.FirstParameter();
index b5095096ebafa3376ecaca96335f482f61a6b84f..216bc097bac0bec25963a38ee048cc81d5a34976 100644 (file)
@@ -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 (file)
index 0000000..72dc0f7
--- /dev/null
@@ -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