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:
parent
3c1379f824
commit
5e9548e77b
src
BRepFill
BRepOffsetAPI
QABugs
tests/bugs/modalg_6
@ -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 <myFirst> and <myLast>
|
||||
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 {
|
||||
|
@ -27,6 +27,7 @@
|
||||
#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>
|
||||
@ -74,6 +75,10 @@ public:
|
||||
|
||||
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
|
||||
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
24
tests/bugs/modalg_6/bug27065_1
Normal file
24
tests/bugs/modalg_6/bug27065_1
Normal 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
|
28
tests/bugs/modalg_6/bug27065_2
Normal file
28
tests/bugs/modalg_6/bug27065_2
Normal 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
|
Loading…
x
Reference in New Issue
Block a user