Virtual method Generated() inherited from BRepPrimAPI_MakeSweep is overridden in class BRepOffsetAPI_MakePipe, providing information on shapes generated from the profile.
-- 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.
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;
ErrorOnSurface (me)
returns Real from Standard;
-
+
FirstShape(me) returns Shape from TopoDS
---C++ : return const &
is static;
---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 <S>.
+
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
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 <spine>
- returns Wire from TopoDS
+ returns Wire from TopoDS
raises
DomainError from Standard
- ---Purpose: if the <Spine> is undefined
+ ---Purpose: if the <Spine> 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;
-- 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;
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 {
ListOfShape from TopTools
is
-
-
+
+
Create( Spine : Wire from TopoDS;
Profile : Shape from TopoDS )
---Purpose: Constructs a pipe by sweeping the shape Profile along
-- 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;
Build(me : in out)
is redefined;
---Purpose: Builds the resulting shape (redefined from MakeShape).
- ---Level: Public
+ ---Level: Public
FirstShape (me : in out)
---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
myPipe : Pipe from BRepFill;
-end MakePipe;
+end MakePipe;
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));
#include <GeomFill_Trihedron.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <Standard_Atomic.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <Standard_Version.hxx>
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";
theCommands.Add ("OCC26313", "OCC26313 result shape", __FILE__, OCC26313, 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