diff --git a/src/BRepFill/BRepFill_Pipe.cdl b/src/BRepFill/BRepFill_Pipe.cdl index 00dc651e08..a542e41ad7 100644 --- a/src/BRepFill/BRepFill_Pipe.cdl +++ b/src/BRepFill/BRepFill_Pipe.cdl @@ -15,11 +15,11 @@ -- commercial license or contractual agreement. -class Pipe from BRepFill +class Pipe from BRepFill ---Purpose: Create a shape by sweeping a shape (the profile) -- along a wire (the spine). - -- + -- -- For each edge or vertex from the spine the user -- may ask for the shape generated from each subshape -- of the profile. @@ -28,38 +28,40 @@ uses HArray2OfShape from TopTools, MapOfShape from TopTools, + ListOfShape from TopTools, DataMapOfShapeHArray2OfShape from BRepFill, + DataMapOfShapeListOfShape from TopTools, LocationLaw from BRepFill, Shape from TopoDS, Face from TopoDS, Wire from TopoDS, Edge from TopoDS, - Vertex from TopoDS, + Vertex from TopoDS, Pnt from gp, Trsf from gp, Shape from GeomAbs, Trihedron from GeomFill raises - DomainError from Standard, + DomainError from Standard, NotDone from StdFail is Create returns Pipe from BRepFill; - - Create ( Spine : Wire from TopoDS; + + Create ( Spine : Wire from TopoDS; Profile : Shape from TopoDS; aMode : Trihedron from GeomFill = GeomFill_IsCorrectedFrenet; ForceApproxC1 : Boolean from Standard = Standard_False; - GeneratePartCase : Boolean from Standard = Standard_False) + GeneratePartCase : Boolean from Standard = Standard_False) returns Pipe from BRepFill; - - Perform (me : in out; Spine : Wire from TopoDS; + + Perform (me : in out; Spine : Wire from TopoDS; Profile : Shape from TopoDS; - GeneratePartCase : Boolean from Standard = Standard_False) + GeneratePartCase : Boolean from Standard = Standard_False) is static; - + Spine(me) returns Shape from TopoDS ---C++ : return const & is static; @@ -74,7 +76,7 @@ is ErrorOnSurface (me) returns Real from Standard; - + FirstShape(me) returns Shape from TopoDS ---C++ : return const & is static; @@ -83,27 +85,30 @@ is ---C++ : return const & is static; + Generated(me: in out; S: Shape from TopoDS; L: in out ListOfShape from TopTools); + ---Purpose: Returns the list of shapes generated from the shape . + Face(me : in out; ESpine, EProfile : Edge from TopoDS) returns Face from TopoDS ---Purpose: Returns the face created from an edge of the spine -- and an edge of the profile. raises - DomainError from Standard + DomainError from Standard ---Purpose: if the edges are not in the spine or the profile - + is static; - + Edge(me : in out; ESpine : Edge from TopoDS; VProfile : Vertex from TopoDS) returns Edge from TopoDS ---Purpose: Returns the edge created from an edge of the spine -- and a vertex of the profile. raises - DomainError from Standard + DomainError from Standard ---Purpose: if the edge or the vertex are not in the spine or -- the profile. - + is static; - + Section(me; VSpine : Vertex from TopoDS) returns Shape from TopoDS ---Purpose: Returns the shape created from the profile at the @@ -111,50 +116,50 @@ is raises DomainError from Standard ---Purpose: if the vertex is not in the Spine - is static; - - - PipeLine(me : in out; Point : Pnt from gp) + is static; + + + PipeLine(me : in out; Point : Pnt from gp) ---Purpose: Create a Wire by sweeping the Point along the - returns Wire from TopoDS + returns Wire from TopoDS raises DomainError from Standard - ---Purpose: if the is undefined + ---Purpose: if the is undefined is static; -- -- Private methods - -- - - MakeShape(me : in out; S : Shape from TopoDS; + -- + + MakeShape(me : in out; S : Shape from TopoDS; FirstShape, LastShape : Shape from TopoDS) returns Shape from TopoDS ---Purpose: Auxiliary recursive method used to build the - -- result. + -- result. is static private; - FindEdge(me; S : Shape from TopoDS; - E : Edge from TopoDS; - Init : in out Integer) + FindEdge(me; S : Shape from TopoDS; + E : Edge from TopoDS; + Init : in out Integer) ---Purpose: Auxiliary recursive method used to find the edge's index returns Integer is static private; - FindVertex(me; S : Shape from TopoDS; - V : Vertex from TopoDS; - Init : in out Integer) + FindVertex(me; S : Shape from TopoDS; + V : Vertex from TopoDS; + Init : in out Integer) returns Integer - is static private; - + is static private; + DefineRealSegmax(me : in out) - is static private; - + is static private; + RebuildTopOrBottomFace(me; aFace: Shape from TopoDS; IsTop: Boolean from Standard) - is static private; - + is static private; + ShareFaces(me: in out; theShape: Shape from TopoDS; theInitialFacesLen: Integer; theInitialEdgesLen: Integer; @@ -164,30 +169,31 @@ is -- Returns the shared shape. If theShape is not modified this -- method returns it. returns Shape from TopoDS - is static private; - + is static private; + fields mySpine : Wire from TopoDS; myProfile : Shape from TopoDS; - myShape : Shape from TopoDS; - myTrsf : Trsf from gp; + myShape : Shape from TopoDS; + myTrsf : Trsf from gp; myLoc : LocationLaw from BRepFill; - mySections: HArray2OfShape from TopTools; - myFaces : HArray2OfShape from TopTools; - myEdges : HArray2OfShape from TopTools; - myReversedEdges : MapOfShape from TopTools; + mySections: HArray2OfShape from TopTools; + myFaces : HArray2OfShape from TopTools; + myEdges : HArray2OfShape from TopTools; + myReversedEdges : MapOfShape from TopTools; myTapes : DataMapOfShapeHArray2OfShape from BRepFill; myRails : DataMapOfShapeHArray2OfShape from BRepFill; myCurIndexOfSectionEdge : Integer from Standard; - myFirst : Shape from TopoDS; - myLast : Shape from TopoDS; - + myFirst : Shape from TopoDS; + myLast : Shape from TopoDS; + myGenMap : DataMapOfShapeListOfShape from TopTools; + myDegmax : Integer from Standard; mySegmax : Integer from Standard; myContinuity : Shape from GeomAbs; myMode : Trihedron from GeomFill; myForceApproxC1 : Boolean from Standard; - + myErrorOnSurf : Real from Standard; - + end Pipe; diff --git a/src/BRepFill/BRepFill_Pipe.cxx b/src/BRepFill/BRepFill_Pipe.cxx index 9b3af5c996..1bae03b559 100644 --- a/src/BRepFill/BRepFill_Pipe.cxx +++ b/src/BRepFill/BRepFill_Pipe.cxx @@ -69,6 +69,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) { @@ -374,6 +406,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 @@ -640,6 +713,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(); @@ -662,6 +736,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); @@ -769,6 +844,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/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cdl b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cdl index 00fea56f6a..d1f0f2f929 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cdl +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cdl @@ -36,8 +36,8 @@ uses ListOfShape from TopTools is - - + + Create( Spine : Wire from TopoDS; Profile : Shape from TopoDS ) ---Purpose: Constructs a pipe by sweeping the shape Profile along @@ -52,7 +52,7 @@ is -- Standard_DomainError if the profile is a solid or a -- composite solid. returns MakePipe from BRepOffsetAPI; - + Create( Spine : Wire from TopoDS; Profile : Shape from TopoDS; aMode : Trihedron from GeomFill; @@ -72,7 +72,7 @@ is Build(me : in out) is redefined; ---Purpose: Builds the resulting shape (redefined from MakeShape). - ---Level: Public + ---Level: Public FirstShape (me : in out) @@ -84,6 +84,11 @@ is ---Purpose: Returns the TopoDS Shape of the top of the prism. returns Shape from TopoDS; + Generated (me: in out; S: Shape from TopoDS) + returns ListOfShape from TopTools + is redefined; + ---C++: return const & + ---Level: Public Generated (me: in out; SSpine, SProfile : Shape from TopoDS) ---Level: Public @@ -99,4 +104,4 @@ fields myPipe : Pipe from BRepFill; -end MakePipe; +end MakePipe; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx index dc5ed78dcc..7740963001 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakePipe.cxx @@ -109,14 +109,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/QABugs/QABugs_19.cxx b/src/QABugs/QABugs_19.cxx index 02f24518ed..b767c260f9 100755 --- a/src/QABugs/QABugs_19.cxx +++ b/src/QABugs/QABugs_19.cxx @@ -53,6 +53,7 @@ #include #include #include +#include #include @@ -4306,6 +4307,95 @@ static Standard_Integer OCC26313(Draw_Interpretor& di,Standard_Integer n,const c 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"; @@ -4397,5 +4487,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) { theCommands.Add ("OCC26313", "OCC26313 result shape", __FILE__, OCC26313, 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