mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0025578: SIGSEGV in BRepSweep_Rotation in case of singularities
Eliminating degenerated edges
This commit is contained in:
@@ -822,7 +822,17 @@ Standard_Boolean BRepSweep_Rotation::HasShape
|
|||||||
{
|
{
|
||||||
if(aDirS.Type()==TopAbs_EDGE&&
|
if(aDirS.Type()==TopAbs_EDGE&&
|
||||||
aGenS.ShapeType()==TopAbs_EDGE){
|
aGenS.ShapeType()==TopAbs_EDGE){
|
||||||
return !IsInvariant(aGenS);
|
// 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();
|
||||||
|
}
|
||||||
|
return hasGeom && !IsInvariant(aGenS);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
@@ -843,8 +853,7 @@ Standard_Boolean BRepSweep_Rotation::IsInvariant
|
|||||||
Standard_Real First,Last;
|
Standard_Real First,Last;
|
||||||
Handle(Geom_Curve)
|
Handle(Geom_Curve)
|
||||||
C = BRep_Tool::Curve(TopoDS::Edge(aGenS),Loc,First,Last);
|
C = BRep_Tool::Curve(TopoDS::Edge(aGenS),Loc,First,Last);
|
||||||
Handle(Standard_Type) TheType = C->DynamicType();
|
if (C.IsNull() || C->DynamicType() == STANDARD_TYPE(Geom_Line)) {
|
||||||
if ( TheType == STANDARD_TYPE(Geom_Line)) {
|
|
||||||
TopoDS_Vertex V1, V2;
|
TopoDS_Vertex V1, V2;
|
||||||
TopExp::Vertices(TopoDS::Edge(aGenS), V1, V2);
|
TopExp::Vertices(TopoDS::Edge(aGenS), V1, V2);
|
||||||
return ( IsInvariant(V1) && IsInvariant(V2));
|
return ( IsInvariant(V1) && IsInvariant(V2));
|
||||||
|
Reference in New Issue
Block a user