1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0027065: BRepOffsetAPI_MakePipe misses definition of virtual method Generated()

Virtual method Generated() inherited from BRepPrimAPI_MakeSweep is overridden in class BRepOffsetAPI_MakePipe, providing information on shapes generated from the profile.
This commit is contained in:
jgv 2016-02-04 13:35:52 +03:00 committed by dbv
parent 9e5394288d
commit b3cbd47d26
7 changed files with 303 additions and 61 deletions

View File

@ -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 <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
@ -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 <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;
@ -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;

View File

@ -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 <myFirst> and <myLast>
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 {

View File

@ -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;

View File

@ -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));

View File

@ -53,6 +53,7 @@
#include <GeomFill_Trihedron.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <Standard_Atomic.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <Standard_Version.hxx>
@ -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;
}

View File

@ -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

View File

@ -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