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

0026588: SIGSEGV in BRepFeat_MakeDPrism::Perform()

Test case for issue CR26588
This commit is contained in:
ifv 2015-09-17 14:39:05 +03:00 committed by bugmaster
parent 836d7b64ba
commit 4c71cff8e9
2 changed files with 175 additions and 256 deletions

View File

@ -87,10 +87,6 @@ static Standard_Integer SensOfPrism(const Handle(Geom_Curve) C,
static Handle(Geom_Curve) TestCurve(const TopoDS_Face&);
static Standard_Boolean ToFuse(const TopoDS_Face& ,
const TopoDS_Face&);
//=======================================================================
//function : Init
@ -156,7 +152,7 @@ void BRepFeat_MakeDPrism::Init(const TopoDS_Shape& Sbase,
if (myFuse) cout << " Fuse" << endl;
if (!myFuse) cout << " Cut" << endl;
if (!myModify) cout << " Modify = 0" << endl;
// cout <<" Angle = " << myAngle << endl;
// cout <<" Angle = " << myAngle << endl;
}
#endif
}
@ -229,7 +225,7 @@ void BRepFeat_MakeDPrism::Perform(const Standard_Real Height)
PerfSelectionValid();
Standard_Real theheight = Height/cos(myAngle);
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
LocOpe_DPrism theDPrism(myPbase,theheight,myAngle);
TopoDS_Shape VraiDPrism = theDPrism.Shape();
@ -248,37 +244,7 @@ void BRepFeat_MakeDPrism::Perform(const Standard_Real Height)
return;
}
TopoDS_Face FFace;
Standard_Boolean found = Standard_False;
if(!mySkface.IsNull() || !mySlface.IsEmpty()) {
if(myLShape.ShapeType() == TopAbs_WIRE) {
TopExp_Explorer ex1(VraiDPrism, TopAbs_FACE);
for(; ex1.More(); ex1.Next()) {
TopExp_Explorer ex2(ex1.Current(), TopAbs_WIRE);
for(; ex2.More(); ex2.Next()) {
if(ex2.Current().IsSame(myLShape)) {
FFace = TopoDS::Face(ex1.Current());
found = Standard_True;
break;
}
}
if(found) break;
}
}
TopExp_Explorer anExp(mySbase, TopAbs_FACE);
for(; anExp.More(); anExp.Next()) {
const TopoDS_Face& ff = TopoDS::Face(anExp.Current());
if(ToFuse(ff, FFace)) {
TopTools_DataMapOfShapeListOfShape sl;
break;
}
}
}
// management of gluing faces
// management of gluing faces
GluedFacesValid();
@ -289,7 +255,7 @@ void BRepFeat_MakeDPrism::Perform(const Standard_Real Height)
GlobalPerform();
}
// if there is no gluing -> call topological operations
// if there is no gluing -> call topological operations
if(!myJustGluer) {
if(myFuse == 1) {
//modified by NIZNHY-PKV Thu Mar 21 17:32:17 2002 f
@ -338,7 +304,7 @@ void BRepFeat_MakeDPrism::Perform(const TopoDS_Shape& Until)
if (!exp.More()) {
Standard_ConstructionError::Raise();
}
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
myGluedF.Clear();
myPerfSelection = BRepFeat_SelectionU;
@ -398,8 +364,8 @@ void BRepFeat_MakeDPrism::Perform(const TopoDS_Shape& Until)
else {
Or = ASI.Point(1,ASI.NbPoints(1)).Orientation();
}
// Standard_Real prm = ASI.Point(1,1).Parameter();
// if(prm < 0) Or = TopAbs::Reverse(Or);
// Standard_Real prm = ASI.Point(1,1).Parameter();
// if(prm < 0) Or = TopAbs::Reverse(Or);
TopoDS_Face FUntil = ASI.Point(1,1).Face();
TopoDS_Shape Comp;
bB.MakeCompound(TopoDS::Compound(Comp));
@ -483,7 +449,7 @@ void BRepFeat_MakeDPrism::Perform(const TopoDS_Shape& From,
if (myJustGluer) return;
}
}
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
myGluedF.Clear();
myPerfSelection = BRepFeat_SelectionFU;
@ -566,8 +532,8 @@ void BRepFeat_MakeDPrism::Perform(const TopoDS_Shape& From,
else {
OrU = ASI1.Point(1,ASI1.NbPoints(1)).Orientation();
}
// Standard_Real prm = ASI1.Point(1,1).Parameter();
// if(prm < 0) OrU = TopAbs::Reverse(OrU);
// Standard_Real prm = ASI1.Point(1,1).Parameter();
// if(prm < 0) OrU = TopAbs::Reverse(OrU);
FUntil = ASI1.Point(1,1).Face();
}
else {
@ -577,7 +543,7 @@ void BRepFeat_MakeDPrism::Perform(const TopoDS_Shape& From,
}
if (ASI2.IsDone() && ASI2.NbPoints(1) >=1) {
OrF = ASI2.Point(1,1).Orientation();
// Standard_Real prm = ASI2.Point(1,1).Parameter();
// Standard_Real prm = ASI2.Point(1,1).Parameter();
OrF = TopAbs::Reverse(OrF);
FFrom = ASI2.Point(1,1).Face();
}
@ -659,7 +625,7 @@ void BRepFeat_MakeDPrism::PerformUntilEnd()
mySFrom.Nullify();
ShapeFromValid();
Standard_Real Height = HeightMax(mySbase, mySkface, mySFrom, mySUntil);
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
LocOpe_DPrism theDPrism(myPbase, Height, myAngle);
TopoDS_Shape VraiDPrism = theDPrism.Shape();
@ -697,7 +663,7 @@ void BRepFeat_MakeDPrism::PerformFromEnd(const TopoDS_Shape& Until)
if (!exp.More()) {
Standard_ConstructionError::Raise();
}
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
myPerfSelection = BRepFeat_SelectionShU;
PerfSelectionValid();
mySFrom.Nullify();
@ -776,7 +742,7 @@ void BRepFeat_MakeDPrism::PerformFromEnd(const TopoDS_Shape& Until)
BRepLib_MakeFace fac(S, Precision::Confusion());
mySFrom = fac.Face();
Trf = TransformShapeFU(0);
// FFrom = TopoDS::Face(mySFrom);
// FFrom = TopoDS::Face(mySFrom);
}
TopoDS_Shape Comp;
@ -856,7 +822,7 @@ void BRepFeat_MakeDPrism::PerformThruAll()
}
PerfSelectionValid();
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
myGluedF.Clear();
GluedFacesValid();
@ -912,7 +878,7 @@ void BRepFeat_MakeDPrism::PerformUntilHeight(const TopoDS_Shape& Until,
if (!exp.More()) {
Standard_ConstructionError::Raise();
}
// myPbase.Orientation(TopAbs_FORWARD);
// myPbase.Orientation(TopAbs_FORWARD);
myGluedF.Clear();
myPerfSelection = BRepFeat_NoSelection;
PerfSelectionValid();
@ -968,8 +934,8 @@ void BRepFeat_MakeDPrism::PerformUntilHeight(const TopoDS_Shape& Until,
else {
Or = ASI.Point(1,ASI.NbPoints(1)).Orientation();
}
// Standard_Real prm = ASI.Point(1,1).Parameter();
// if(prm < 0) Or = TopAbs::Reverse(Or);
// Standard_Real prm = ASI.Point(1,1).Parameter();
// if(prm < 0) Or = TopAbs::Reverse(Or);
TopoDS_Face FUntil = ASI.Point(1,1).Face();
TopoDS_Shape Comp;
BRep_Builder B;
@ -1058,7 +1024,7 @@ void BRepFeat_MakeDPrism::BossEdges (const Standard_Integer signature)
// Edges Bottom
if (signature < 0) {
// Attention check if TgtEdges is important
// Attention check if TgtEdges is important
myLatEdges = NewEdges();
}
else if (signature > 0) {
@ -1073,6 +1039,7 @@ void BRepFeat_MakeDPrism::BossEdges (const Standard_Integer signature)
for (itLS.Initialize(theLastShape);itLS.More();itLS.Next()) {
const TopoDS_Face& TopFace = TopoDS::Face(itLS.Value());
if (!FF.IsSame(TopFace)) {
TopExp_Explorer ExpE;
for (ExpE.Init(FF,TopAbs_EDGE);ExpE.More() && !Found ;ExpE.Next()) {
const TopoDS_Edge& E1 = TopoDS::Edge(ExpE.Current());
TopoDS_Vertex V1,V2;
@ -1167,18 +1134,18 @@ static Standard_Real HeightMax(const TopoDS_Shape& theSbase, // shape initial
Standard_Real c[6];
Box.Get(c[0],c[2],c[4],c[1],c[3],c[5]);
// Standard_Real parmin=c[0], parmax = c[0];
// for(Standard_Integer i = 0 ; i < 6; i++) {
// if(c[i] > parmax) parmax = c[i];
// if(c[i] < parmin ) parmin = c[i];
// }
// Standard_Real Height = abs(2.*(parmax - parmin));
// return(2.*Height);
//#ifndef OCCT_DEBUG
// Standard_Real parmin=c[0], parmax = c[0];
// for(Standard_Integer i = 0 ; i < 6; i++) {
// if(c[i] > parmax) parmax = c[i];
// if(c[i] < parmin ) parmin = c[i];
// }
// Standard_Real Height = abs(2.*(parmax - parmin));
// return(2.*Height);
//#ifndef OCCT_DEBUG
Standard_Real par = Max( Max( fabs(c[1] - c[0]), fabs(c[3] - c[2]) ), fabs(c[5] - c[4]) );
//#else
// Standard_Real par = Max( Max( abs(c[1] - c[0]), abs(c[3] - c[2]) ), abs(c[5] - c[4]) );
//#endif
//#else
// Standard_Real par = Max( Max( abs(c[1] - c[0]), abs(c[3] - c[2]) ), abs(c[5] - c[4]) );
//#endif
#ifdef OCCT_DEBUG
cout << "Height = > " << par << endl;
#endif
@ -1189,7 +1156,7 @@ static Standard_Real HeightMax(const TopoDS_Shape& theSbase, // shape initial
//=======================================================================
//=======================================================================
//function : SensOfPrism
//purpose : determine the direction of prism generation
//=======================================================================
@ -1295,70 +1262,3 @@ static Handle(Geom_Curve) TestCurve(const TopoDS_Face& Base)
return theLin;
}
//=======================================================================
//function : ToFuse
//purpose :
//=======================================================================
Standard_Boolean ToFuse(const TopoDS_Face& F1,
const TopoDS_Face& F2)
{
if (F1.IsNull() || F2.IsNull()) {
return Standard_False;
}
Handle(Geom_Surface) S1,S2;
TopLoc_Location loc1, loc2;
Handle(Standard_Type) typS1,typS2;
const Standard_Real tollin = Precision::Confusion();
const Standard_Real tolang = Precision::Angular();
S1 = BRep_Tool::Surface(F1,loc1);
S2 = BRep_Tool::Surface(F2,loc2);
typS1 = S1->DynamicType();
typS2 = S2->DynamicType();
if (typS1 == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
S1 = Handle(Geom_RectangularTrimmedSurface)::DownCast (S1)->BasisSurface();
typS1 = S1->DynamicType();
}
if (typS2 == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
S2 = Handle(Geom_RectangularTrimmedSurface)::DownCast (S2)->BasisSurface();
typS2 = S2->DynamicType();
}
if (typS1 != typS2) {
return Standard_False;
}
Standard_Boolean ValRet = Standard_False;
if (typS1 == STANDARD_TYPE(Geom_Plane)) {
S1 = BRep_Tool::Surface(F1); // to apply the location.
S2 = BRep_Tool::Surface(F2);
gp_Pln pl1( Handle(Geom_Plane)::DownCast (S1)->Pln());
gp_Pln pl2( Handle(Geom_Plane)::DownCast (S2)->Pln());
if (pl1.Position().IsCoplanar(pl2.Position(),tollin,tolang)) {
ValRet = Standard_True;
}
}
return ValRet;
}

View File

@ -0,0 +1,19 @@
puts "================"
puts "CR26588"
puts "================"
puts ""
###############################################
## SIGSEGV in BRepFeat_MakeDPrism::Perform()
###############################################
pload DCAF
Open [locate_data_file bug26588_Study1_new_GEOM.cbf] D
GetShape D 0:1:8:1:1:2 s
GetShape D 0:1:27:1:1:2 a
featdprism s a a 25 0 1
featperformval dprism result 200
set 2dviewer 1