diff --git a/src/BRepFill/BRepFill_Pipe.cxx b/src/BRepFill/BRepFill_Pipe.cxx index 829110d65a..46bee4dd06 100644 --- a/src/BRepFill/BRepFill_Pipe.cxx +++ b/src/BRepFill/BRepFill_Pipe.cxx @@ -70,6 +70,38 @@ 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 and 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 { diff --git a/src/BRepFill/BRepFill_Pipe.hxx b/src/BRepFill/BRepFill_Pipe.hxx index 12b0a28d83..e4b7fb4a45 100644 --- a/src/BRepFill/BRepFill_Pipe.hxx +++ b/src/BRepFill/BRepFill_Pipe.hxx @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -74,6 +75,10 @@ public: Standard_EXPORT const TopoDS_Shape& LastShape() const; + //! Returns the list of shapes generated from the + //! shape . + 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; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx index 666529deef..a4131ea8ca 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx @@ -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)); diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.hxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.hxx index c9aaa43067..fc49ce31eb 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.hxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.hxx @@ -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; diff --git a/src/QABugs/QABugs_19.cxx b/src/QABugs/QABugs_19.cxx index ff7b2bfa92..faa0efce72 100644 --- a/src/QABugs/QABugs_19.cxx +++ b/src/QABugs/QABugs_19.cxx @@ -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 index 0000000000..8b8042eccd --- /dev/null +++ b/tests/bugs/modalg_6/bug27065_1 @@ -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 index 0000000000..1b0d584f39 --- /dev/null +++ b/tests/bugs/modalg_6/bug27065_2 @@ -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