0027065: BRepOffsetAPI_MakePipe misses definition of virtual method Generated()
authorjgv <jgv@opencascade.com>
Thu, 4 Feb 2016 10:35:52 +0000 (13:35 +0300)
committerabv <abv@opencascade.com>
Thu, 11 Feb 2016 21:04:04 +0000 (00:04 +0300)
Virtual method Generated() inherited from BRepPrimAPI_MakeSweep is overridden in class BRepOffsetAPI_MakePipe, providing information on shapes generated from the profile.

src/BRepFill/BRepFill_Pipe.cxx
src/BRepFill/BRepFill_Pipe.hxx
src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.hxx
src/QABugs/QABugs_19.cxx
tests/bugs/modalg_6/bug27065_1 [new file with mode: 0644]
tests/bugs/modalg_6/bug27065_2 [new file with mode: 0644]

index 829110d..46bee4d 100644 (file)
 static Standard_Boolean Affich = 0;
 #endif
 
+// ---------------------------------------------------------------------------------
+// static function: UpdateMap
+// purpose:
+// ---------------------------------------------------------------------------------
+static Standard_Boolean UpdateMap(const TopoDS_Shape&                 theKey,
+                                  const TopoDS_Shape&                 theValue,
+                                  TopTools_DataMapOfShapeListOfShape& theMap)
+{
+  if(!theMap.IsBound(theKey))
+  {
+    TopTools_ListOfShape thelist;
+    theMap.Bind(theKey, thelist);
+  }
+  TopTools_ListOfShape& aList = theMap.ChangeFind(theKey);
+  TopTools_ListIteratorOfListOfShape anIt(aList);
+  Standard_Boolean found = Standard_False;
+
+  for(; anIt.More(); anIt.Next())
+  {
+    if(theValue.IsSame(anIt.Value()))
+    {
+      found = Standard_True;
+      break;
+    }
+  }
+
+  if(!found)
+    aList.Append(theValue);
+  
+  return !found;
+}
+
 static void ReverseModifiedEdges(TopoDS_Shape& aShape,
                                  TopTools_MapOfShape& Emap)
 {
@@ -375,6 +407,47 @@ const TopoDS_Shape& BRepFill_Pipe::LastShape() const
   return myLast;
 }
 
+//=======================================================================
+//function : Generated
+//purpose  : 
+//=======================================================================
+void BRepFill_Pipe::Generated(const TopoDS_Shape&   theShape,
+                              TopTools_ListOfShape& theList) 
+{
+  theList.Clear();
+
+  if (theShape.IsSame(myProfile))
+    theList.Append(myShape);
+  else
+  {
+    if (theShape.ShapeType() == TopAbs_FACE ||
+        theShape.ShapeType() == TopAbs_WIRE)
+    {
+      if(myGenMap.IsBound(theShape))
+        theList = myGenMap.Find(theShape);
+    }
+    else if (theShape.ShapeType() == TopAbs_EDGE)
+    {
+      TopoDS_Iterator itw(mySpine);
+      for (; itw.More(); itw.Next())
+      {
+        const TopoDS_Edge& aSpineEdge = TopoDS::Edge(itw.Value());
+        const TopoDS_Shape& aFace = Face(aSpineEdge, TopoDS::Edge(theShape));
+        theList.Append(aFace);
+      }
+    }
+    else if (theShape.ShapeType() == TopAbs_VERTEX)
+    {
+      TopoDS_Iterator itw(mySpine);
+      for (; itw.More(); itw.Next())
+      {
+        const TopoDS_Edge& aSpineEdge = TopoDS::Edge(itw.Value());
+        const TopoDS_Shape& anEdge = Edge(aSpineEdge, TopoDS::Vertex(theShape));
+        theList.Append(anEdge);
+      }
+    }
+  }
+}
 
 //=======================================================================
 //function : Face
@@ -641,6 +714,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();
+      UpdateMap(TheS.Located(myProfile.Location()), result, myGenMap);
       myErrorOnSurf = MkSw.ErrorOnSurface();
 
       Handle(TopTools_HArray2OfShape) aSections = MkSw.Sections();
@@ -663,6 +737,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();
+      UpdateMap(TheS.Located(myProfile.Location()), result, myGenMap);
       myErrorOnSurf = MkSw.ErrorOnSurface();
       //Correct <myFirst> and <myLast>
       ReverseModifiedEdges(myFirst, myReversedEdges);
@@ -770,6 +845,7 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
       BS.Add(solid,TopoDS::Shell(aLocalShape));
 //      BS.Add(solid,TopoDS::Shell(result.Reversed()));
     }
+    UpdateMap(TheS.Located(myProfile.Location()), solid, myGenMap);
     return solid;
   }
   else {
index 12b0a28..e4b7fb4 100644 (file)
@@ -27,6 +27,7 @@
 #include <TopTools_HArray2OfShape.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <BRepFill_DataMapOfShapeHArray2OfShape.hxx>
+#include <TopTools_DataMapOfShapeListOfShape.hxx>
 #include <Standard_Integer.hxx>
 #include <GeomAbs_Shape.hxx>
 #include <GeomFill_Trihedron.hxx>
@@ -74,6 +75,10 @@ public:
   
   Standard_EXPORT const TopoDS_Shape& LastShape() const;
   
+  //! Returns the  list   of shapes generated   from the
+  //! shape <S>.
+  Standard_EXPORT void Generated (const TopoDS_Shape& S, TopTools_ListOfShape& L);
+  
   //! Returns the face created from an edge of the spine
   //! and an edge of the profile.
   //! if the edges are not in the spine or the profile
@@ -140,6 +145,7 @@ private:
   Standard_Integer myCurIndexOfSectionEdge;
   TopoDS_Shape myFirst;
   TopoDS_Shape myLast;
+  TopTools_DataMapOfShapeListOfShape myGenMap;
   Standard_Integer myDegmax;
   Standard_Integer mySegmax;
   GeomAbs_Shape myContinuity;
index 666529d..a4131ea 100644 (file)
@@ -111,14 +111,23 @@ TopoDS_Shape BRepOffsetAPI_MakePipe::LastShape()
   return myPipe.LastShape();
 }
 
+//=======================================================================
+//function : Generated
+//purpose  : standard method
+//=======================================================================
+const TopTools_ListOfShape& BRepOffsetAPI_MakePipe::Generated(const TopoDS_Shape& S) 
+{
+  myPipe.Generated(S, myGenerated);
+  return myGenerated;
+}
 
 //=======================================================================
 //function : Generated
-//purpose  : 
+//purpose  : returns generated elementary subshape
 //=======================================================================
 
-TopoDS_Shape BRepOffsetAPI_MakePipe::Generated (const TopoDS_Shape& SSpine,
-                                         const TopoDS_Shape& SProfile)
+TopoDS_Shape BRepOffsetAPI_MakePipe::Generated(const TopoDS_Shape& SSpine,
+                                               const TopoDS_Shape& SProfile)
 {
   if (SProfile.ShapeType () == TopAbs_EDGE) {
     return myPipe.Face (TopoDS::Edge (SSpine), TopoDS::Edge (SProfile));
index c9aaa43..fc49ce3 100644 (file)
@@ -79,7 +79,9 @@ public:
   //! Returns the TopoDS Shape of the top of the prism.
   Standard_EXPORT TopoDS_Shape LastShape() Standard_OVERRIDE;
   
-  Standard_EXPORT TopoDS_Shape Generated (const TopoDS_Shape& SSpine, const TopoDS_Shape& SProfile);
+  Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& S) Standard_OVERRIDE;
+  
+  Standard_EXPORT TopoDS_Shape Generated(const TopoDS_Shape& SSpine, const TopoDS_Shape& SProfile);
   
   Standard_EXPORT Standard_Real ErrorOnSurface() const;
 
index ff7b2bf..faa0efc 100644 (file)
@@ -5051,6 +5051,95 @@ static Standard_Integer OCC27048(Draw_Interpretor& theDI, Standard_Integer theAr
   return 0;
 }
 
+//========================================================================
+//function : OCC27065
+//purpose  : Tests overloaded method "Generated" of BRepOffsetAPI_MakePipe
+//========================================================================
+static Standard_Integer OCC27065(Draw_Interpretor& di,
+                                 Standard_Integer n, const char** a)
+{
+  if (n < 3) return 1;
+  BRep_Builder BB;
+
+  TopoDS_Shape SpineShape = DBRep::Get(a[1],TopAbs_WIRE);
+  if ( SpineShape.IsNull()) return 1;
+  TopoDS_Wire Spine = TopoDS::Wire(SpineShape);
+
+  TopoDS_Shape Profile = DBRep::Get(a[2]);
+  if ( Profile.IsNull()) return 1;
+
+  BRepOffsetAPI_MakePipe aPipeBuilder(Spine, Profile);
+  if (!aPipeBuilder.IsDone())
+  {
+    di << "Error: failed to create pipe\n";
+    return 1;
+  }
+
+  TopExp_Explorer Explo(Profile, TopAbs_SHELL);
+  TopoDS_Shape aShape;
+  TopTools_ListIteratorOfListOfShape itl;
+  if (Explo.More())
+  {
+    aShape = Explo.Current();
+    TopoDS_Compound res1;
+    BB.MakeCompound(res1);
+    itl.Initialize(aPipeBuilder.Generated(aShape));
+    for (; itl.More(); itl.Next())
+      BB.Add(res1, itl.Value());
+    DBRep::Set("res_shell", res1);
+  }
+
+  Explo.Init(Profile, TopAbs_FACE);
+  if (Explo.More())
+  {
+    aShape = Explo.Current();
+    TopoDS_Compound res2;
+    BB.MakeCompound(res2);
+    itl.Initialize(aPipeBuilder.Generated(aShape));
+    for (; itl.More(); itl.Next())
+      BB.Add(res2, itl.Value());
+    DBRep::Set("res_face", res2);
+  }
+  
+  Explo.Init(Profile, TopAbs_WIRE);
+  if (Explo.More())
+  {
+    aShape = Explo.Current();
+    TopoDS_Compound res3;
+    BB.MakeCompound(res3);
+    itl.Initialize(aPipeBuilder.Generated(aShape));
+    for (; itl.More(); itl.Next())
+      BB.Add(res3, itl.Value());
+    DBRep::Set("res_wire", res3);
+  }
+  
+  Explo.Init(Profile, TopAbs_EDGE);
+  if (Explo.More())
+  {
+    aShape = Explo.Current();
+    TopoDS_Compound res4;
+    BB.MakeCompound(res4);
+    itl.Initialize(aPipeBuilder.Generated(aShape));
+    for (; itl.More(); itl.Next())
+      BB.Add(res4, itl.Value());
+    DBRep::Set("res_edge", res4);
+  }
+  
+  Explo.Init(Profile, TopAbs_VERTEX);
+  if (Explo.More())
+  {
+    aShape = Explo.Current();
+    TopoDS_Compound res5;
+    BB.MakeCompound(res5);
+    itl.Initialize(aPipeBuilder.Generated(aShape));
+    for (; itl.More(); itl.Next())
+      BB.Add(res5, itl.Value());
+    DBRep::Set("res_vertex", res5);
+  }
+  
+  return 0;
+}
+
 void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   const char *group = "QABugs";
 
@@ -5161,5 +5250,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
                    "OCC27048 surf U V N\nCalculate value of surface N times in the point (U, V)",
                    __FILE__, OCC27048, group);
   
+  theCommands.Add ("OCC27065",
+                   "OCC27065 spine profile",
+                   __FILE__, OCC27065, group);
+  
   return;
 }
diff --git a/tests/bugs/modalg_6/bug27065_1 b/tests/bugs/modalg_6/bug27065_1
new file mode 100644 (file)
index 0000000..8b8042e
--- /dev/null
@@ -0,0 +1,24 @@
+puts "============"
+puts "OCC27065"
+puts "============"
+puts ""
+###############################
+## BRepOffsetAPI_MakePipe misses definition of virtual method Generated()
+###############################
+
+pload QAcommands
+
+restore [locate_data_file bug24840_comp.brep] sh
+explode sh
+OCC27065 sh_1 sh_2
+fit
+
+checknbshapes res_shell -vertex 56 -edge 130 -wire 99 -face 99 -shell 24 -solid 24 -compsolid 1 -compound 1 -shape 434
+
+checknbshapes res_face -vertex 8 -edge 12 -wire 6 -face 6 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 35
+
+checknbshapes res_wire -vertex 8 -edge 12 -wire 4 -face 4 -shell 1 -solid 0 -compsolid 0 -compound 1 -shape 30
+
+checknbshapes res_edge -vertex 4 -edge 4 -wire 1 -face 1 -shell 0 -solid 0 -compsolid 0 -compound 1 -shape 11
+
+checknbshapes res_vertex -vertex 2 -edge 1 -wire 0 -face 0 -shell 0 -solid 0 -compsolid 0 -compound 1 -shape 4
diff --git a/tests/bugs/modalg_6/bug27065_2 b/tests/bugs/modalg_6/bug27065_2
new file mode 100644 (file)
index 0000000..1b0d584
--- /dev/null
@@ -0,0 +1,28 @@
+puts "============"
+puts "OCC27065"
+puts "============"
+puts ""
+###############################
+## BRepOffsetAPI_MakePipe misses definition of virtual method Generated()
+###############################
+
+pload QAcommands
+
+restore [locate_data_file bug23903_base.brep] base
+restore [locate_data_file bug23903_path.brep] sp
+explode base
+shape pr Sh
+add base_1 pr
+add base_2 pr
+OCC27065 sp pr
+fit
+
+checknbshapes res_shell -vertex 2 -edge 5 -wire 3 -face 3 -shell 2 -solid 2 -compsolid 1 -compound 1 -shape 19
+
+checknbshapes res_face -vertex 2 -edge 4 -wire 2 -face 2 -shell 1 -solid 1 -compsolid 0 -compound 1 -shape 13
+
+checknbshapes res_wire -vertex 2 -edge 4 -wire 2 -face 2 -shell 1 -solid 0 -compsolid 0 -compound 1 -shape 12
+
+checknbshapes res_edge -vertex 2 -edge 3 -wire 1 -face 1 -shell 0 -solid 0 -compsolid 0 -compound 1 -shape 8
+
+checknbshapes res_vertex -vertex 1 -edge 1 -wire 0 -face 0 -shell 0 -solid 0 -compsolid 0 -compound 1 -shape 3