Virtual method Generated() inherited from BRepPrimAPI_MakeSweep is overridden in class BRepOffsetAPI_MakePipe, providing information on shapes generated from the profile.
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)
{
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
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();
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);
BS.Add(solid,TopoDS::Shell(aLocalShape));
// BS.Add(solid,TopoDS::Shell(result.Reversed()));
}
+ UpdateMap(TheS.Located(myProfile.Location()), solid, myGenMap);
return solid;
}
else {
#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>
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
Standard_Integer myCurIndexOfSectionEdge;
TopoDS_Shape myFirst;
TopoDS_Shape myLast;
+ TopTools_DataMapOfShapeListOfShape myGenMap;
Standard_Integer myDegmax;
Standard_Integer mySegmax;
GeomAbs_Shape myContinuity;
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));
//! 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;
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";
"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;
}
--- /dev/null
+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
--- /dev/null
+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