From 8948e7784aaba9e3ec9cf852d7d9bb34ac4157ea Mon Sep 17 00:00:00 2001 From: aml Date: Wed, 29 Jul 2015 16:14:09 +0300 Subject: [PATCH] 026464: BRepOffset_MakeOffset does not provide valid output Handling of degenerated case improved. Test-case for issue #26464 --- src/BRepOffset/BRepOffset_Offset.cxx | 31 +++++++++++++++++++++------- tests/bugs/modalg_6/bug26464 | 17 +++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 tests/bugs/modalg_6/bug26464 diff --git a/src/BRepOffset/BRepOffset_Offset.cxx b/src/BRepOffset/BRepOffset_Offset.cxx index db104453e1..05bf9b8156 100644 --- a/src/BRepOffset/BRepOffset_Offset.cxx +++ b/src/BRepOffset/BRepOffset_Offset.cxx @@ -537,11 +537,29 @@ void BRepOffset_Offset::Init(const TopoDS_Face& Face, TopTools_SequenceOfShape DegEdges; TopExp_Explorer Explo(Face, TopAbs_EDGE); for (; Explo.More(); Explo.Next()) - { - const TopoDS_Edge& anEdge = TopoDS::Edge(Explo.Current()); - if (BRep_Tool::Degenerated(anEdge)) - DegEdges.Append(anEdge); - } + { + const TopoDS_Edge& anEdge = TopoDS::Edge(Explo.Current()); + + if (BRep_Tool::Degenerated(anEdge)) + { + Standard_Real aF, aL; + Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface(anEdge, Face, aF, aL); + + gp_Pnt2d aFPnt2d = c2d->Value(aF), + aLPnt2d = c2d->Value(aL); + + gp_Pnt aFPnt = S->Value(aFPnt2d.X(), aFPnt2d.Y()), + aLPnt = S->Value(aLPnt2d.X(), aLPnt2d.Y()); + + // aFPnt.SquareDistance(aLPnt) > Precision::SquareConfusion() - + // is a sufficient condition of troubles: non-singular case, but edge is degenerated. + // So, normal handling of degenerated edges is not applicable in case of non-singular point. + if (aFPnt.SquareDistance(aLPnt) < Precision::SquareConfusion()) + { + DegEdges.Append(anEdge); + } + } + } if (!DegEdges.IsEmpty()) { const Standard_Real TolApex = 1.e-5; @@ -1640,6 +1658,3 @@ BRepOffset_Status BRepOffset_Offset::Status() const { return myStatus; } - - - diff --git a/tests/bugs/modalg_6/bug26464 b/tests/bugs/modalg_6/bug26464 new file mode 100644 index 0000000000..86cfbeaddf --- /dev/null +++ b/tests/bugs/modalg_6/bug26464 @@ -0,0 +1,17 @@ +puts "========" +puts "OCC26464" +puts "========" +puts "" +####################################################### +# BRepOffset_MakeOffset does not provide valid output +####################################################### + +smallview + +restore [locate_data_file OCC26464-extracted_Plate5520contour.brep] sh +offsetparameter 1e-7 p i +offsetload sh 60 +offsetperform r +fit + +set only_screen_axo 1