0024949: Segmentation Violation during pipe creation
authorjgv <jgv@opencascade.com>
Thu, 21 Aug 2014 08:28:08 +0000 (12:28 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 21 Aug 2014 11:51:12 +0000 (15:51 +0400)
Test cases for issue 0024949

Correction of test case for issue CR24949

src/BRepFill/BRepFill_Pipe.cdl
src/BRepFill/BRepFill_Pipe.cxx
src/BRepFill/BRepFill_PipeShell.cdl
src/BRepFill/BRepFill_PipeShell.cxx
src/BRepFill/BRepFill_Sweep.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cdl
src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakePipeShell.cdl
src/BRepOffsetAPI/BRepOffsetAPI_MakePipeShell.cxx
tests/bugs/modalg_5/bug24949 [new file with mode: 0644]

index 889f850..00dc651 100644 (file)
@@ -72,6 +72,9 @@ is
        ---C++ : return const &
     is static;
 
+    ErrorOnSurface (me)
+    returns Real from Standard;
+    
     FirstShape(me) returns Shape from TopoDS
        ---C++ : return const &
     is static;
@@ -185,4 +188,6 @@ fields
     myMode    : Trihedron from GeomFill;
     myForceApproxC1 : Boolean from Standard;
     
+    myErrorOnSurf : Real from Standard;
+    
 end Pipe;
index 046279d..04a2ec6 100644 (file)
@@ -363,6 +363,16 @@ const TopoDS_Shape& BRepFill_Pipe::Shape() const
   return myShape;
 }
 
+//=======================================================================
+//function : ErrorOnSurface
+//purpose  : 
+//=======================================================================
+
+Standard_Real BRepFill_Pipe::ErrorOnSurface() const 
+{
+  return myErrorOnSurf;
+}
+
 
 //=======================================================================
 //function : FirstShape
@@ -521,6 +531,7 @@ TopoDS_Wire BRepFill_Pipe::PipeLine(const gp_Pnt& Point)
  MkSw.Build( myReversedEdges, myTapes, myRails,
              BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
  TopoDS_Shape aLocalShape = MkSw.Shape();
+ myErrorOnSurf = MkSw.ErrorOnSurface();
  return TopoDS::Wire(aLocalShape);
 // return TopoDS::Wire(MkSw.Shape());
 }
@@ -648,6 +659,7 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
       MkSw.Build( myReversedEdges, myTapes, myRails,
                   BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
       result = MkSw.Shape();
+      myErrorOnSurf = MkSw.ErrorOnSurface();
 
       Handle(TopTools_HArray2OfShape) aSections = MkSw.Sections();
 
@@ -669,6 +681,7 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
       MkSw.Build( myReversedEdges, myTapes, myRails,
                   BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
       result = MkSw.Shape();
+      myErrorOnSurf = MkSw.ErrorOnSurface();
       //Correct <myFirst> and <myLast>
       ReverseModifiedEdges(myFirst, myReversedEdges);
       ReverseModifiedEdges(myLast, myReversedEdges);
index f75a5e6..b3ca435 100644 (file)
@@ -256,6 +256,9 @@ is
     returns Shape from TopoDS
     is  static;    
     
+    ErrorOnSurface (me)
+    returns Real from Standard;
+    
     FirstShape (me)
     ---Purpose: Returns the  TopoDS  Shape of the bottom of the sweep.
     ---C++: return const & 
@@ -316,6 +319,8 @@ fields
   myTrihedron   :  Trihedron        from  GeomFill;
   myTransition  :  TransitionStyle  from  BRepFill; 
   myStatus      :  PipeError        from  GeomFill;
+  myErrorOnSurf :  Real             from  Standard;
+  
 end PipeShell;
 
 
index 48880fb..e08bb5a 100644 (file)
@@ -773,6 +773,7 @@ void BRepFill_PipeShell::SetForceApproxC1(const Standard_Boolean ForceApproxC1)
 
   if (Ok) {
     myShape = MkSw.Shape();
+    myErrorOnSurf = MkSw.ErrorOnSurface();
 
     TopoDS_Shape aBottomWire = myFirst;
     TopoDS_Shape aTopWire    = myLast;
@@ -880,6 +881,16 @@ const TopoDS_Shape& BRepFill_PipeShell::Shape() const
 }
 
 //=======================================================================
+//function : ErrorOnSurface
+//purpose  : 
+//=======================================================================
+
+Standard_Real BRepFill_PipeShell::ErrorOnSurface() const 
+{
+  return myErrorOnSurf;
+}
+
+//=======================================================================
 //function : FirstShape
 //purpose  : Return the start section 
 //=======================================================================
index bdd7080..93e3d95 100644 (file)
@@ -2456,8 +2456,13 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
                                      Vertex(1,ipath+1),
                                      myTol3d);
        }
-       else UpdateEdge(TopoDS::Edge(UEdge(isec, ipath)), 
-                       S, !exuv, UFirst);
+       else
+        {
+          if (UEdge(isec, ipath).IsNull()) //sweep failed
+            return Standard_False;
+          UpdateEdge(TopoDS::Edge(UEdge(isec, ipath)), 
+                     S, !exuv, UFirst);
+        }
      
        if (uclose && (isec==NbLaw)) {
          UpdateEdge(TopoDS::Edge(UEdge(1, ipath)), 
index cd76bce..00fea56 100644 (file)
@@ -90,6 +90,11 @@ is
     returns Shape from TopoDS;
 
 
+    ErrorOnSurface (me)
+        ---Level: Public
+    returns Real from Standard;
+
+
 fields
 
     myPipe : Pipe from BRepFill;
index c34ce44..dc5ed78 100644 (file)
@@ -22,6 +22,8 @@
 #include <TopoDS_Vertex.hxx>
 #include <TopoDS.hxx>
 #include <TopAbs_ShapeEnum.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
 
 //=======================================================================
 //function : BRepOffsetAPI_MakePipe
@@ -76,7 +78,13 @@ const BRepFill_Pipe& BRepOffsetAPI_MakePipe::Pipe() const
 void BRepOffsetAPI_MakePipe::Build() 
 {
   myShape = myPipe.Shape();
-  Done();
+  //Check for emptiness of result
+  TopTools_IndexedMapOfShape theMap;
+  TopExp::MapShapes(myShape, theMap);
+  if (theMap.Extent() == 1)
+    NotDone();
+  else
+    Done();
 }
 
 
@@ -122,3 +130,12 @@ TopoDS_Shape BRepOffsetAPI_MakePipe::Generated (const TopoDS_Shape& SSpine,
   return bid;
 }
 
+//=======================================================================
+//function : ErrorOnSurface
+//purpose  : 
+//=======================================================================
+
+Standard_Real BRepOffsetAPI_MakePipe::ErrorOnSurface() const
+{
+  return myPipe.ErrorOnSurface();
+}
index 738fdfd..73b20ed 100644 (file)
@@ -349,6 +349,9 @@ is
     returns ListOfShape from TopTools
     is redefined; 
      
+    ErrorOnSurface (me)
+    returns Real from Standard;
+    
 fields 
 
   myPipe  :  PipeShell  from  BRepFill;
index 7ca9365..510797e 100644 (file)
@@ -305,3 +305,12 @@ BRepOffsetAPI_MakePipeShell::Generated(const TopoDS_Shape& S)
   return myGenerated;
 }
 
+//=======================================================================
+//function : ErrorOnSurface
+//purpose  : 
+//=======================================================================
+
+Standard_Real BRepOffsetAPI_MakePipeShell::ErrorOnSurface() const
+{
+  return myPipe->ErrorOnSurface();
+}
diff --git a/tests/bugs/modalg_5/bug24949 b/tests/bugs/modalg_5/bug24949
new file mode 100644 (file)
index 0000000..da907a0
--- /dev/null
@@ -0,0 +1,31 @@
+puts "============"
+puts "OCC24949"
+puts "============"
+puts ""
+#######################################################################
+# Segmentation Violation during pipe creation
+#######################################################################
+
+restore [locate_data_file bug24949_Comp.brep] c
+explode c
+mksweep c_1
+addsweep c_2
+catch {buildsweep res}
+
+restore [locate_data_file bug24949_Comp.brep] c
+explode c
+pipe result c_1 c_2 2
+
+set square 188.689
+
+set nb_v_good 14
+set nb_e_good 19
+set nb_w_good 6
+set nb_f_good 6
+set nb_sh_good 1
+set nb_sol_good 0
+set nb_compsol_good 0
+set nb_compound_good 0
+set nb_shape_good 46
+
+set 2dviewer 1