mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-04 13:13:25 +03:00
0024964: ThruSections crashes the DRAW.exe
Test case for issue CR24964
This commit is contained in:
@@ -239,7 +239,7 @@ static TopoDS_Solid MakeSolid(TopoDS_Shell& shell, const TopoDS_Wire& wire1,
|
|||||||
BB.MakeSolid(solid);
|
BB.MakeSolid(solid);
|
||||||
TopoDS_Shape aLocalShape = shell.Reversed();
|
TopoDS_Shape aLocalShape = shell.Reversed();
|
||||||
BB.Add(solid, TopoDS::Shell(aLocalShape));
|
BB.Add(solid, TopoDS::Shell(aLocalShape));
|
||||||
// B.Add(solid, TopoDS::Shell(newShell.Reversed()));
|
// B.Add(solid, TopoDS::Shell(newShell.Reversed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
solid.Closed(Standard_True);
|
solid.Closed(Standard_True);
|
||||||
@@ -254,10 +254,10 @@ static TopoDS_Solid MakeSolid(TopoDS_Shell& shell, const TopoDS_Wire& wire1,
|
|||||||
|
|
||||||
BRepOffsetAPI_ThruSections::BRepOffsetAPI_ThruSections(const Standard_Boolean isSolid, const Standard_Boolean ruled,
|
BRepOffsetAPI_ThruSections::BRepOffsetAPI_ThruSections(const Standard_Boolean isSolid, const Standard_Boolean ruled,
|
||||||
const Standard_Real pres3d):
|
const Standard_Real pres3d):
|
||||||
myIsSolid(isSolid), myIsRuled(ruled), myPres3d(pres3d)
|
myIsSolid(isSolid), myIsRuled(ruled), myPres3d(pres3d)
|
||||||
{
|
{
|
||||||
myWCheck = Standard_True;
|
myWCheck = Standard_True;
|
||||||
//----------------------------
|
//----------------------------
|
||||||
myParamType = Approx_ChordLength;
|
myParamType = Approx_ChordLength;
|
||||||
myDegMax = 8;
|
myDegMax = 8;
|
||||||
myContinuity = GeomAbs_C2;
|
myContinuity = GeomAbs_C2;
|
||||||
@@ -280,7 +280,7 @@ void BRepOffsetAPI_ThruSections::Init(const Standard_Boolean isSolid, const Stan
|
|||||||
myIsRuled = ruled;
|
myIsRuled = ruled;
|
||||||
myPres3d = pres3d;
|
myPres3d = pres3d;
|
||||||
myWCheck = Standard_True;
|
myWCheck = Standard_True;
|
||||||
//----------------------------
|
//----------------------------
|
||||||
myParamType = Approx_ChordLength;
|
myParamType = Approx_ChordLength;
|
||||||
myDegMax = 6;
|
myDegMax = 6;
|
||||||
myContinuity = GeomAbs_C2;
|
myContinuity = GeomAbs_C2;
|
||||||
@@ -415,7 +415,7 @@ void BRepOffsetAPI_ThruSections::CreateRuled()
|
|||||||
{
|
{
|
||||||
Standard_Integer nbSects = myWires.Length();
|
Standard_Integer nbSects = myWires.Length();
|
||||||
BRepFill_Generator aGene;
|
BRepFill_Generator aGene;
|
||||||
// for (Standard_Integer i=1; i<=nbSects; i++) {
|
// for (Standard_Integer i=1; i<=nbSects; i++) {
|
||||||
Standard_Integer i;
|
Standard_Integer i;
|
||||||
for (i=1; i<=nbSects; i++) {
|
for (i=1; i<=nbSects; i++) {
|
||||||
aGene.AddWire(TopoDS::Wire(myWires(i)));
|
aGene.AddWire(TopoDS::Wire(myWires(i)));
|
||||||
@@ -442,7 +442,7 @@ void BRepOffsetAPI_ThruSections::CreateRuled()
|
|||||||
B.MakeSolid(solid);
|
B.MakeSolid(solid);
|
||||||
TopoDS_Shape aLocalShape = shell.Reversed();
|
TopoDS_Shape aLocalShape = shell.Reversed();
|
||||||
B.Add(solid, TopoDS::Shell(aLocalShape));
|
B.Add(solid, TopoDS::Shell(aLocalShape));
|
||||||
// B.Add(solid, TopoDS::Shell(shell.Reversed()));
|
// B.Add(solid, TopoDS::Shell(shell.Reversed()));
|
||||||
}
|
}
|
||||||
myShape = solid;
|
myShape = solid;
|
||||||
|
|
||||||
@@ -677,7 +677,7 @@ void BRepOffsetAPI_ThruSections::CreateSmoothed()
|
|||||||
// copy the degenerated edge
|
// copy the degenerated edge
|
||||||
TopoDS_Shape aLocalShape = shapes(1).EmptyCopied();
|
TopoDS_Shape aLocalShape = shapes(1).EmptyCopied();
|
||||||
edge1 = TopoDS::Edge(aLocalShape);
|
edge1 = TopoDS::Edge(aLocalShape);
|
||||||
// edge1 = TopoDS::Edge(shapes(1).EmptyCopied());
|
// edge1 = TopoDS::Edge(shapes(1).EmptyCopied());
|
||||||
edge1.Orientation(TopAbs_FORWARD);
|
edge1.Orientation(TopAbs_FORWARD);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -702,7 +702,7 @@ void BRepOffsetAPI_ThruSections::CreateSmoothed()
|
|||||||
// copy of the degenerated edge
|
// copy of the degenerated edge
|
||||||
TopoDS_Shape aLocalShape = shapes(nbSects*nbEdges).EmptyCopied();
|
TopoDS_Shape aLocalShape = shapes(nbSects*nbEdges).EmptyCopied();
|
||||||
edge2 = TopoDS::Edge(aLocalShape);
|
edge2 = TopoDS::Edge(aLocalShape);
|
||||||
// edge2 = TopoDS::Edge(shapes(nbSects*nbEdges).EmptyCopied());
|
// edge2 = TopoDS::Edge(shapes(nbSects*nbEdges).EmptyCopied());
|
||||||
edge2.Orientation(TopAbs_FORWARD);
|
edge2.Orientation(TopAbs_FORWARD);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -819,7 +819,7 @@ void BRepOffsetAPI_ThruSections::CreateSmoothed()
|
|||||||
B.MakeSolid(solid);
|
B.MakeSolid(solid);
|
||||||
TopoDS_Shape aLocalShape = shell.Reversed();
|
TopoDS_Shape aLocalShape = shell.Reversed();
|
||||||
B.Add(solid, TopoDS::Shell(aLocalShape));
|
B.Add(solid, TopoDS::Shell(aLocalShape));
|
||||||
// B.Add(solid, TopoDS::Shell(shell.Reversed()));
|
// B.Add(solid, TopoDS::Shell(shell.Reversed()));
|
||||||
}
|
}
|
||||||
myShape = solid;
|
myShape = solid;
|
||||||
|
|
||||||
@@ -932,7 +932,6 @@ Handle(Geom_BSplineSurface) BRepOffsetAPI_ThruSections::
|
|||||||
const Standard_Boolean vClosed) const
|
const Standard_Boolean vClosed) const
|
||||||
{
|
{
|
||||||
Standard_Integer i,j,jdeb=1,jfin=NbSects;
|
Standard_Integer i,j,jdeb=1,jfin=NbSects;
|
||||||
TopoDS_Edge edge;
|
|
||||||
TopoDS_Vertex vf,vl;
|
TopoDS_Vertex vf,vl;
|
||||||
|
|
||||||
GeomFill_SectionGenerator section;
|
GeomFill_SectionGenerator section;
|
||||||
@@ -943,7 +942,7 @@ Handle(Geom_BSplineSurface) BRepOffsetAPI_ThruSections::
|
|||||||
|
|
||||||
if (w1Point) {
|
if (w1Point) {
|
||||||
jdeb++;
|
jdeb++;
|
||||||
edge = TopoDS::Edge(shapes(1));
|
TopoDS_Edge edge = TopoDS::Edge(shapes(1));
|
||||||
TopExp::Vertices(edge,vl,vf);
|
TopExp::Vertices(edge,vl,vf);
|
||||||
TColgp_Array1OfPnt Extremities(1,2);
|
TColgp_Array1OfPnt Extremities(1,2);
|
||||||
Extremities(1) = BRep_Tool::Pnt(vf);
|
Extremities(1) = BRep_Tool::Pnt(vf);
|
||||||
@@ -981,10 +980,15 @@ Handle(Geom_BSplineSurface) BRepOffsetAPI_ThruSections::
|
|||||||
for (i=2; i<=NbEdges; i++) {
|
for (i=2; i<=NbEdges; i++) {
|
||||||
// read the edge
|
// read the edge
|
||||||
TopoDS_Edge aNextEdge = TopoDS::Edge (shapes((j-1)*NbEdges+i));
|
TopoDS_Edge aNextEdge = TopoDS::Edge (shapes((j-1)*NbEdges+i));
|
||||||
|
Standard_Real aTolV = Precision::Confusion();
|
||||||
|
TopExp::Vertices(aNextEdge,vf,vl);
|
||||||
|
aTolV = Max(aTolV, BRep_Tool::Tolerance(vf));
|
||||||
|
aTolV = Max(aTolV, BRep_Tool::Tolerance(vl));
|
||||||
|
aTolV = Min(aTolV, 1.e-3);
|
||||||
curvBS = EdgeToBSpline (aNextEdge);
|
curvBS = EdgeToBSpline (aNextEdge);
|
||||||
|
|
||||||
// concatenation
|
// concatenation
|
||||||
CompBS.Add(curvBS, Precision::Confusion(), Standard_True, Standard_False, 1);
|
CompBS.Add(curvBS, aTolV, Standard_True, Standard_False, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the final section
|
// return the final section
|
||||||
@@ -1000,7 +1004,7 @@ Handle(Geom_BSplineSurface) BRepOffsetAPI_ThruSections::
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (w2Point) {
|
if (w2Point) {
|
||||||
edge = TopoDS::Edge(shapes(NbSects*NbEdges));
|
TopoDS_Edge edge = TopoDS::Edge(shapes(NbSects*NbEdges));
|
||||||
TopExp::Vertices(edge,vl,vf);
|
TopExp::Vertices(edge,vl,vf);
|
||||||
TColgp_Array1OfPnt Extremities(1,2);
|
TColgp_Array1OfPnt Extremities(1,2);
|
||||||
Extremities(1) = BRep_Tool::Pnt(vf);
|
Extremities(1) = BRep_Tool::Pnt(vf);
|
||||||
|
27
tests/bugs/modalg_5/bug24964
Normal file
27
tests/bugs/modalg_5/bug24964
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "OCC24964"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
#########################################################################
|
||||||
|
# ThruSections crashes the DRAW.exe
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
restore [locate_data_file bug24964_w1.brep] w1
|
||||||
|
restore [locate_data_file bug24964_w2.brep] w2
|
||||||
|
restore [locate_data_file bug24964_w3.brep] w3
|
||||||
|
|
||||||
|
thrusections result 0 0 w1 w2 w3
|
||||||
|
|
||||||
|
set square 163127
|
||||||
|
|
||||||
|
set nb_v_good 30
|
||||||
|
set nb_e_good 45
|
||||||
|
set nb_w_good 15
|
||||||
|
set nb_f_good 15
|
||||||
|
set nb_sh_good 1
|
||||||
|
set nb_sol_good 0
|
||||||
|
set nb_compsol_good 0
|
||||||
|
set nb_compound_good 0
|
||||||
|
set nb_shape_good 106
|
||||||
|
|
||||||
|
set 2dviewer 1
|
Reference in New Issue
Block a user