0030795: BRepOffsetAPI_MakePipeShell: hangs on the attached model and produces infini...
authorakaftasev <akaftasev@opencascade.com>
Mon, 17 Aug 2020 15:44:19 +0000 (18:44 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 3 Sep 2020 17:00:47 +0000 (20:00 +0300)
Added new condition to catch bad shape

src/BRepFill/BRepFill_Sweep.cxx
src/BRepFill/BRepFill_Sweep.hxx
tests/bugs/modalg_7/bug30787
tests/bugs/modalg_7/bug30795 [new file with mode: 0644]
tests/pipe/standard/G1 [new file with mode: 0644]
tests/pipe/standard/G2 [new file with mode: 0644]
tests/pipe/standard/G3 [new file with mode: 0644]
tests/pipe/standard/G4 [new file with mode: 0644]
tests/pipe/standard/G5 [new file with mode: 0644]
tests/pipe/standard/G6 [new file with mode: 0644]

index 61fb51c..e00cf0a 100644 (file)
@@ -2923,38 +2923,46 @@ void BRepFill_Sweep::Build(TopTools_MapOfShape& ReversedEdges,
       Standard_Real Extend = 0.0;
       if (NbTrous==1)  Extend = EvalExtrapol(1, Transition);
       isDone = BuildShell(Transition, 
-                         1, NbPath+1,
+                          1, NbPath+1,
                           ReversedEdges,
                           Tapes, Rails,
-                         Extend, Extend);
+                          Extend, Extend);
     }
     else { //  This is done piece by piece
       Standard_Integer IFirst = 1, ILast;
       for (ii=1, isDone=Standard_True; 
-          ii<=NbPart && isDone; ii++) {
-       if (ii > NbTrous) ILast =  NbPath+1;
-       else ILast = Trous->Value(ii);
-       isDone = BuildShell(Transition, 
-                           IFirst, ILast,
+           ii<=NbPart && isDone; ii++) {
+        if (ii > NbTrous) ILast =  NbPath+1;
+        else ILast = Trous->Value(ii);
+        isDone = BuildShell(Transition, 
+                            IFirst, ILast,
                             ReversedEdges,
                             Tapes, Rails,
-                           EvalExtrapol(IFirst, Transition),
-                           EvalExtrapol(ILast,  Transition));
-       if (IFirst>1) {
-         Translate(myVEdges, IFirst, Bounds, 2);
-         PerformCorner(IFirst, 
-                       Transition, Bounds);
-       }
-       IFirst = ILast;
-       Translate(myVEdges, IFirst, Bounds, 1);
+                            EvalExtrapol(IFirst, Transition),
+                            EvalExtrapol(ILast,  Transition));
+        if (IFirst>1) {
+          Translate(myVEdges, IFirst, Bounds, 2);
+          if (!PerformCorner(IFirst,
+            Transition, Bounds))
+          {
+            isDone = Standard_False;
+            return;
+          }
+        }
+        IFirst = ILast;
+        Translate(myVEdges, IFirst, Bounds, 1);
       }
     }
     // Management of looping ends
     if ( (NbTrous>0) && (myLoc->IsClosed()) &&
-        (Trous->Value(NbTrous) == NbPath+1) ) {
+         (Trous->Value(NbTrous) == NbPath+1) ) {
       Translate(myVEdges, NbPath+1, Bounds, 1);
       Translate(myVEdges, 1, Bounds, 2);
-      PerformCorner(1, Transition, Bounds); 
+      if (!PerformCorner(1, Transition, Bounds))
+      {
+        isDone = Standard_False;
+        return;
+      }
       Translate(myVEdges, 1, myVEdges, NbPath+1);
     }
 
@@ -3175,12 +3183,14 @@ TopoDS_Shape BRepFill_Sweep::Tape(const Standard_Integer Index) const
 //function : PerformCorner
 //purpose  : Trim and/or loop a corner
 //======================================================================
- void  BRepFill_Sweep::PerformCorner(const Standard_Integer Index,
-                                    const BRepFill_TransitionStyle Transition,
-                                    const Handle(TopTools_HArray2OfShape)& Bounds)
+ Standard_Boolean BRepFill_Sweep::PerformCorner(const Standard_Integer Index,
+                                                const BRepFill_TransitionStyle Transition,
+                                                const Handle(TopTools_HArray2OfShape)& Bounds)
 {
 
-  if (Transition == BRepFill_Modified) return; // Do nothing.
+  if (Transition == BRepFill_Modified) return Standard_True; // Do nothing.
+
+  const Standard_Real anAngularTol = 0.025;
 
   BRepFill_TransitionStyle TheTransition = Transition;
   Standard_Boolean isTangent=Standard_False;
@@ -3226,11 +3236,15 @@ TopoDS_Shape BRepFill_Sweep::Tape(const Standard_Integer Index) const
 #ifdef OCCT_DEBUG
       std::cout << "BRepFill_Sweep::PerformCorner : This is not a corner !" << std::endl;
 #endif
-      return;
+      return Standard_True;
     }
     Sortant = t2 - t1;
   }
 
+  if (T1.Angle(T2) >= M_PI - anAngularTol)
+  {
+    return Standard_False;
+  }
   if ((TheTransition == BRepFill_Right) 
       && (T1.Angle(T2) >  myAngMax) ) {
     TheTransition =  BRepFill_Round;
@@ -3336,7 +3350,7 @@ TopoDS_Shape BRepFill_Sweep::Tape(const Standard_Integer Index) const
 #ifdef OCCT_DEBUG
     std::cout << "Fail of TrimCorner" << std::endl;
 #endif
-    return; // Nothing is touched
+    return Standard_True; // Nothing is touched
   }
 
   if (mySec->IsUClosed())
@@ -3416,7 +3430,7 @@ TopoDS_Shape BRepFill_Sweep::Tape(const Standard_Integer Index) const
 #endif
     }
   }
-
+  return Standard_True;
 /*  
 #if DRAW
   if (Affich) {
index 72b1897..30a02c2 100644 (file)
@@ -124,7 +124,7 @@ protected:
   
   Standard_EXPORT Standard_Boolean BuildShell (const BRepFill_TransitionStyle Transition, const Standard_Integer Vf, const Standard_Integer Vl, TopTools_MapOfShape& ReversedEdges, BRepFill_DataMapOfShapeHArray2OfShape& Tapes, BRepFill_DataMapOfShapeHArray2OfShape& Rails, const Standard_Real ExtendFirst = 0.0, const Standard_Real ExtendLast = 0.0);
   
-  Standard_EXPORT void PerformCorner (const Standard_Integer Index, const BRepFill_TransitionStyle Transition, const Handle(TopTools_HArray2OfShape)& Bounds);
+  Standard_EXPORT Standard_Boolean PerformCorner (const Standard_Integer Index, const BRepFill_TransitionStyle Transition, const Handle(TopTools_HArray2OfShape)& Bounds);
   
   Standard_EXPORT Standard_Real EvalExtrapol (const Standard_Integer Index, const BRepFill_TransitionStyle Transition) const;
   
index 6014d09..5afc0e8 100644 (file)
@@ -1,6 +1,3 @@
-puts "TODO OCC30808 ALL: An exception was caught"
-puts "TODO OCC30808 ALL:TEST INCOMPLETE"
-
 puts "========"
 puts "0030787: BRepOffsetAPI_MakePipeShell: hangs on the attached model"
 puts "========"
diff --git a/tests/bugs/modalg_7/bug30795 b/tests/bugs/modalg_7/bug30795
new file mode 100644 (file)
index 0000000..7278e37
--- /dev/null
@@ -0,0 +1,11 @@
+puts "========"
+puts "0030795: BRepOffsetAPI_MakePipeShell: hangs on the attached model and produces infinite rails"
+puts "========"
+puts ""
+
+restore [locate_data_file bug30795.brep] a
+explode a
+
+mksweep a_1 
+addsweep a_2
+buildsweep result -C -S
\ No newline at end of file
diff --git a/tests/pipe/standard/G1 b/tests/pipe/standard/G1
new file mode 100644 (file)
index 0000000..9ef26d0
--- /dev/null
@@ -0,0 +1,22 @@
+circle c1 0 10 0 10
+circle c2 0 9 0 9.1
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R
+
+checkprops result -s 32.412
\ No newline at end of file
diff --git a/tests/pipe/standard/G2 b/tests/pipe/standard/G2
new file mode 100644 (file)
index 0000000..5230097
--- /dev/null
@@ -0,0 +1,20 @@
+circle c1 0 10 0 10
+circle c2 0 9 0 9.01
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R
\ No newline at end of file
diff --git a/tests/pipe/standard/G3 b/tests/pipe/standard/G3
new file mode 100644 (file)
index 0000000..f4956be
--- /dev/null
@@ -0,0 +1,20 @@
+circle c1 0 10 0 10
+circle c2 0 9 0 9.001
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R
\ No newline at end of file
diff --git a/tests/pipe/standard/G4 b/tests/pipe/standard/G4
new file mode 100644 (file)
index 0000000..5705659
--- /dev/null
@@ -0,0 +1,22 @@
+circle c1 0 10 0 10
+circle c2 0 -9 0 9.1
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R
+
+checkprops result -s 36.5019
\ No newline at end of file
diff --git a/tests/pipe/standard/G5 b/tests/pipe/standard/G5
new file mode 100644 (file)
index 0000000..7bd3667
--- /dev/null
@@ -0,0 +1,22 @@
+circle c1 0 10 0 10
+circle c2 0 -9 0 9.01
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R
+
+checkprops result -s 37.4358
diff --git a/tests/pipe/standard/G6 b/tests/pipe/standard/G6
new file mode 100644 (file)
index 0000000..2f450ad
--- /dev/null
@@ -0,0 +1,20 @@
+circle c1 0 10 0 10
+circle c2 0 -9 0 9.001
+circle c3 10 10 0 0 10 0 0.05
+
+mkedge e1 c1
+mkedge e2 c2
+mkedge profile c3
+
+bclearobjects
+baddobjects e1 e2
+bfillds
+bbuild result
+
+explode result e
+wire path result_1 result_3 result_4 result_6
+wire profile profile
+
+mksweep path
+addsweep profile 
+buildsweep result -C -R