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

0026406: BRepPrimAPI_MakeRevol crash when rotating Paraboloid face.

Test-case for issue #26406
This commit is contained in:
ifv 2015-07-20 14:59:07 +03:00 committed by bugmaster
parent 679d4fa8ca
commit 4f0fb8b396
3 changed files with 281 additions and 238 deletions

View File

@ -37,10 +37,10 @@
//=======================================================================
BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
(const BRepSweep_Builder& aBuilder,
const TopoDS_Shape& aGenShape,
const Sweep_NumShape& aDirShape):
const TopoDS_Shape& aGenShape,
const Sweep_NumShape& aDirShape):
myBuilder(aBuilder),
myBuilder(aBuilder),
myGenShape(aGenShape),
myDirWire(aDirShape),
@ -52,9 +52,9 @@ BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
// *****************************************************************
myShapes(1,myGenShapeTool.NbShapes(),
1,myDirShapeTool.NbShapes()),
1,myDirShapeTool.NbShapes()),
myBuiltShapes(1,myGenShapeTool.NbShapes(),
1,myDirShapeTool.NbShapes())
1,myDirShapeTool.NbShapes())
{
myBuiltShapes.Init(Standard_False);
}
@ -91,7 +91,7 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape ()
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
{
if (myGenShapeTool.Index(aGenS) != 0 &&
HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
else {
TopoDS_Shape bidon;
return bidon;
@ -105,7 +105,7 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
//=======================================================================
TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
const Sweep_NumShape& aDirS)
const Sweep_NumShape& aDirS)
{
Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
@ -122,80 +122,80 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
switch (aGenSType){
case TopAbs_VERTEX :
myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
break;
myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
break;
case TopAbs_EDGE :
myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
break;
myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
break;
case TopAbs_WIRE :
myBuilder.MakeWire(myShapes(iGenS,iDirS));
break;
myBuilder.MakeWire(myShapes(iGenS,iDirS));
break;
case TopAbs_FACE :
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
break;
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
break;
case TopAbs_SHELL :
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
case TopAbs_SOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPSOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPOUND :
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
default:
Standard_NoSuchObject::Raise("Unknown Shape");
break;
Standard_NoSuchObject::Raise("Unknown Shape");
break;
}
bGenS = aGenS;
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
for (It.Init(bGenS);It.More();It.Next()){
subGenS = It.Value();
Or = It.Orientation();
if(HasShape(subGenS,aDirS)){
newShape = Shape(subGenS,aDirS);
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
//Les "planchers" doivent etre construits par les
//fonctions de construcion geometrique identiquement
//au shape generateur.
//On leur recolle juste une orientation pour etre bien
//sur.
subGenS = It.Value();
Or = It.Orientation();
if(HasShape(subGenS,aDirS)){
newShape = Shape(subGenS,aDirS);
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
//Les "planchers" doivent etre construits par les
//fonctions de construcion geometrique identiquement
//au shape generateur.
//On leur recolle juste une orientation pour etre bien
//sur.
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
if (aGenSType==TopAbs_FACE){
if(subGenSType==TopAbs_VERTEX){
SetParameters(myShapes(iGenS,iDirS),
newShape,aGenS,subGenS,aDirS);
}
else if(subGenSType==TopAbs_EDGE){
SetPCurve(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS,Or);
}
else if(subGenSType==TopAbs_WIRE){
BRepSweep_Iterator Jt;
cGenS = subGenS;
myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
for (Jt.Init(cGenS);Jt.More();Jt.Next()){
subsubGenS = Jt.Value();
Pr = Jt.Orientation();
if(HasShape(subsubGenS,aDirS)){
TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
aGenS,subsubGenS,aDirS,Pr);
}
}
}
}
else if(aGenSType==TopAbs_EDGE){
SetGeneratingParameter(myShapes(iGenS,iDirS),
newShape,bGenS,subGenS,aDirS);
}
}
}
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
if (aGenSType==TopAbs_FACE){
if(subGenSType==TopAbs_VERTEX){
SetParameters(myShapes(iGenS,iDirS),
newShape,aGenS,subGenS,aDirS);
}
else if(subGenSType==TopAbs_EDGE){
SetPCurve(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS,Or);
}
else if(subGenSType==TopAbs_WIRE){
BRepSweep_Iterator Jt;
cGenS = subGenS;
myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
for (Jt.Init(cGenS);Jt.More();Jt.Next()){
subsubGenS = Jt.Value();
Pr = Jt.Orientation();
if(HasShape(subsubGenS,aDirS)){
TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
aGenS,subsubGenS,aDirS,Pr);
}
}
}
}
else if(aGenSType==TopAbs_EDGE){
SetGeneratingParameter(myShapes(iGenS,iDirS),
newShape,bGenS,subGenS,aDirS);
}
}
}
}
}
else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
@ -206,201 +206,201 @@ TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
Standard_Boolean sepwires = Standard_False;
switch (aGenSType){
case TopAbs_VERTEX :
myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
break;
myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
break;
case TopAbs_EDGE :
//On cree un wire intermediaire qui contient tous les edges
//du montant (face) du Shape pour le cas standard, et une
//sequence de wires pour les cas merdiques necessitant des
//wires independants.
myBuilder.MakeWire(newWire);
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
break;
//On cree un wire intermediaire qui contient tous les edges
//du montant (face) du Shape pour le cas standard, et une
//sequence de wires pour les cas merdiques necessitant des
//wires independants.
myBuilder.MakeWire(newWire);
myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
break;
case TopAbs_WIRE :
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
case TopAbs_FACE :
//On cree un shell intermediaire dans lequel on jette toutes
//les faces en direct, pour eviter les empilages compliques
//de shells et sous shells dans la structure du solide.
myBuilder.MakeShell(newShell);
myBuilder.MakeSolid(myShapes(iGenS,iDirS));
break;
//On cree un shell intermediaire dans lequel on jette toutes
//les faces en direct, pour eviter les empilages compliques
//de shells et sous shells dans la structure du solide.
myBuilder.MakeShell(newShell);
myBuilder.MakeSolid(myShapes(iGenS,iDirS));
break;
case TopAbs_SHELL :
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
case TopAbs_SOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPSOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPOUND :
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
default:
Standard_NoSuchObject::Raise("Unknown Shape");
break;
Standard_NoSuchObject::Raise("Unknown Shape");
break;
}
bGenS = aGenS;
myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
for (It.Init(bGenS);It.More();It.Next()){
subGenS = It.Value();
if(HasShape(subGenS,aDirS)){
newShape = Shape(subGenS,aDirS);
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
if (aGenSType==TopAbs_EDGE){
Or = It.Orientation();
if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
sepwires = Standard_True;
TopoDS_Shape wi;
myBuilder.MakeWire(wi);
myBuilder.Add(wi,newShape,Or);
wi.Closed(BRep_Tool::IsClosed(wi));
WireSeq.Append(wi);
}
else{
myBuilder.Add(newWire,newShape,Or);
}
SetDirectingPCurve (myShapes(iGenS,iDirS),
newShape,bGenS,subGenS,aDirS,Or);
}
else if (aGenSType==TopAbs_WIRE){
Or = It.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else if (aGenSType==TopAbs_FACE){
Or = It.Orientation();
if(subGenSType == TopAbs_WIRE) {
for (Lt.Init(newShape);Lt.More();Lt.Next()){
myBuilder.Add(newShell,Lt.Value(),
TopAbs::Compose(Lt.Orientation(),Or));
}
}
else if(subGenSType == TopAbs_EDGE) {
myBuilder.Add(newShell,newShape,Or);
}
}
else if(aGenSType == TopAbs_SHELL){
Or = TopAbs_FORWARD;
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else if(aGenSType == TopAbs_COMPOUND){
Or = TopAbs_FORWARD;
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else{
Or = It.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
}
}
subGenS = It.Value();
if(HasShape(subGenS,aDirS)){
newShape = Shape(subGenS,aDirS);
if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
if (aGenSType==TopAbs_EDGE){
Or = It.Orientation();
if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
aGenS,subGenS,aDirS)){
sepwires = Standard_True;
TopoDS_Shape wi;
myBuilder.MakeWire(wi);
myBuilder.Add(wi,newShape,Or);
wi.Closed(BRep_Tool::IsClosed(wi));
WireSeq.Append(wi);
}
else{
myBuilder.Add(newWire,newShape,Or);
}
SetDirectingPCurve (myShapes(iGenS,iDirS),
newShape,bGenS,subGenS,aDirS,Or);
}
else if (aGenSType==TopAbs_WIRE){
Or = It.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else if (aGenSType==TopAbs_FACE){
Or = It.Orientation();
if(subGenSType == TopAbs_WIRE) {
for (Lt.Init(newShape);Lt.More();Lt.Next()){
myBuilder.Add(newShell,Lt.Value(),
TopAbs::Compose(Lt.Orientation(),Or));
}
}
else if(subGenSType == TopAbs_EDGE) {
myBuilder.Add(newShell,newShape,Or);
}
}
else if(aGenSType == TopAbs_SHELL){
Or = TopAbs_FORWARD;
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else if(aGenSType == TopAbs_COMPOUND){
Or = TopAbs_FORWARD;
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
else{
Or = It.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
}
}
}
bDirS = aDirS;
for (Kt.Init(bDirS);Kt.More();Kt.Next()){
subDirS = Kt.Value();
if(HasShape(aGenS,subDirS)){
newShape = Shape(aGenS,subDirS);
if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,aDirS,subDirS)){
if (aGenSType==TopAbs_EDGE){
Or = TopAbs::Reverse(Kt.Orientation());
myBuilder.Add(newWire,newShape,Or);
SetGeneratingPCurve
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
}
else if(aGenSType==TopAbs_VERTEX){
Or = Kt.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
SetDirectingParameter
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
}
else if(aGenSType==TopAbs_FACE){
Or = Kt.Orientation();
myBuilder.Add(newShell,newShape,Or);
}
}
}
subDirS = Kt.Value();
if(HasShape(aGenS,subDirS)){
newShape = Shape(aGenS,subDirS);
if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
aGenS,aDirS,subDirS)){
if (aGenSType==TopAbs_EDGE){
Or = TopAbs::Reverse(Kt.Orientation());
myBuilder.Add(newWire,newShape,Or);
SetGeneratingPCurve
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
}
else if(aGenSType==TopAbs_VERTEX){
Or = Kt.Orientation();
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
SetDirectingParameter
(myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
}
else if(aGenSType==TopAbs_FACE){
Or = Kt.Orientation();
myBuilder.Add(newShell,newShape,Or);
}
}
}
}
if (aGenSType==TopAbs_EDGE){
if (sepwires){
for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
}
}
else{
newWire.Closed(BRep_Tool::IsClosed(newWire));
myBuilder.Add(myShapes(iGenS,iDirS),newWire);
}
myBuiltShapes(iGenS,iDirS) = Standard_True;
SetContinuity(aGenS,aDirS);
if (sepwires){
for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
}
}
else{
newWire.Closed(BRep_Tool::IsClosed(newWire));
myBuilder.Add(myShapes(iGenS,iDirS),newWire);
}
myBuiltShapes(iGenS,iDirS) = Standard_True;
SetContinuity(aGenS,aDirS);
}
if (aGenSType==TopAbs_WIRE){
SetContinuity(aGenS,aDirS);
SetContinuity(aGenS,aDirS);
}
if (aGenSType==TopAbs_FACE){
newShell.Closed (BRep_Tool::IsClosed (newShell));
TopoDS_Shape temp = SplitShell(newShell);
TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
Lt.Init(temp);
if(Lt.More()) Lt.Next();
if(Lt.More()){
for (Lt.Init(temp);Lt.More();Lt.Next()){
myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
}
}
else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
TopoDS_Shape temp = SplitShell(newShell);
TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
Lt.Init(temp);
if(Lt.More()) Lt.Next();
if(Lt.More()){
for (Lt.Init(temp);Lt.More();Lt.Next()){
myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
}
}
else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
}
}
else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
switch (aGenSType){
case TopAbs_VERTEX :
myBuilder.MakeWire(myShapes(iGenS,iDirS));
break;
myBuilder.MakeWire(myShapes(iGenS,iDirS));
break;
case TopAbs_EDGE :
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
case TopAbs_WIRE :
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
myBuilder.MakeShell(myShapes(iGenS,iDirS));
break;
case TopAbs_FACE :
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
case TopAbs_SHELL :
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
break;
case TopAbs_SOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPSOLID :
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
Standard_NoSuchObject::Raise("Solids are not Processed");
break;
case TopAbs_COMPOUND :
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
myBuilder.MakeCompound(myShapes(iGenS,iDirS));
break;
default:
Standard_NoSuchObject::Raise("Unknown Shape");
break;
Standard_NoSuchObject::Raise("Unknown Shape");
break;
}
bDirS = aDirS;
for (Kt.Init(aDirS);Kt.More();Kt.Next()){
subDirS = Kt.Value();
if(HasShape(aGenS,subDirS)){
Or = Kt.Orientation();
newShape = Shape(aGenS,subDirS);
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
subDirS = Kt.Value();
if(HasShape(aGenS,subDirS)){
Or = Kt.Orientation();
newShape = Shape(aGenS,subDirS);
myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
}
}
}
myBuiltShapes(iGenS,iDirS) = Standard_True;
}
// Change the "Closed" flag only for Wires and Shells
if (myShapes(iGenS, iDirS).ShapeType() == TopAbs_WIRE ||
myShapes(iGenS, iDirS).ShapeType() == TopAbs_SHELL)
myShapes(iGenS, iDirS).ShapeType() == TopAbs_SHELL)
myShapes(iGenS,iDirS).Closed (BRep_Tool::IsClosed (myShapes(iGenS,iDirS)));
return myShapes(iGenS,iDirS);
}

View File

@ -66,6 +66,8 @@
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopExp_Explorer.hxx>
static Standard_Real ComputeTolerance(TopoDS_Edge& E,
const TopoDS_Face& F,
const Handle(Geom2d_Curve)& C)
@ -221,14 +223,26 @@ TopoDS_Shape BRepSweep_Rotation::MakeEmptyGeneratingEdge
const Sweep_NumShape& aDirV)
{
//call in case of construction with copy, or only when meridian touches myaxe.
Standard_Real First,Last;
TopLoc_Location Loc;
Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
(BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
C->Transform(Loc.Transformation());
TopoDS_Edge E;
if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
TopoDS_Edge E;
if(BRep_Tool::Degenerated(TopoDS::Edge(aGenE)))
{
myBuilder.Builder().MakeEdge(E);
myBuilder.Builder().UpdateEdge(E, BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
myBuilder.Builder().Degenerated(E, Standard_True);
}
else
{
Standard_Real First,Last;
TopLoc_Location Loc;
Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast
(BRep_Tool::Curve(TopoDS::Edge(aGenE),Loc,First,Last)->Copy());
if(!C.IsNull())
{
C->Transform(Loc.Transformation());
if(aDirV.Index() == 2) C->Transform(myLocation.Transformation());
}
myBuilder.Builder().MakeEdge(E,C,BRep_Tool::Tolerance(TopoDS::Edge(aGenE)));
}
if (aDirV.Index() == 1 &&
IsInvariant(aGenE) &&
myDirShapeTool.NbShapes() == 3) {
@ -723,6 +737,7 @@ Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
const TopoDS_Shape& aSubGenS,
const Sweep_NumShape& aDirS )const
{
Standard_Boolean aRes = Standard_True;
if (aNewShape.ShapeType()==TopAbs_FACE &&
aNewSubShape.ShapeType()==TopAbs_EDGE &&
aGenS.ShapeType()==TopAbs_EDGE &&
@ -734,11 +749,11 @@ Standard_Boolean BRepSweep_Rotation::GGDShapeIsToAdd
return (!IsInvariant(aSubGenS));
}
else{
return Standard_True;
return aRes;
}
}
else{
return Standard_True;
return aRes;
}
}
@ -835,20 +850,33 @@ Standard_Boolean BRepSweep_Rotation::HasShape
const Sweep_NumShape& aDirS)const
{
if(aDirS.Type()==TopAbs_EDGE&&
aGenS.ShapeType()==TopAbs_EDGE){
aGenS.ShapeType()==TopAbs_EDGE)
{
// Verify that the edge has entrails
const TopoDS_Edge& anEdge = TopoDS::Edge(aGenS);
Standard_Boolean hasGeom = !BRep_Tool::Degenerated(anEdge);
if (hasGeom)
{ // The edge is not degenerated. Check if it has no curve
Standard_Real aPFirst, aPLast;
TopLoc_Location aLoc;
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aLoc, aPFirst, aPLast);
hasGeom = !aCurve.IsNull();
//
if(BRep_Tool::Degenerated(anEdge)) return Standard_False;
Standard_Real aPFirst, aPLast;
TopLoc_Location aLoc;
Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aLoc, aPFirst, aPLast);
if(aCurve.IsNull()) return Standard_False;
if(IsInvariant(aGenS)) return Standard_False;
//Check seem edge
TopExp_Explorer FaceExp(myGenShape, TopAbs_FACE);
for (;FaceExp.More(); FaceExp.Next()) {
TopoDS_Face F = TopoDS::Face(FaceExp.Current());
if (BRepTools::IsReallyClosed(anEdge, F))
return Standard_False;
}
return hasGeom && !IsInvariant(aGenS);
return Standard_True;
}
else{
else
{
return Standard_True;
}
}

View File

@ -0,0 +1,15 @@
puts "========"
puts "OCC26406"
puts "========"
puts ""
#############################################################
# BRepPrimAPI_MakeRevol crash when rotating Paraboloid face
#############################################################
smallview
restore [locate_data_file OCC26406-Paraboloid.brep] p
revol r p 0 0 0 0 0 1 180 c
checkshape r
set only_screen_axo 1