From a0ae8ca8a0a2bdb47419d798900459baafe2d54a Mon Sep 17 00:00:00 2001 From: ifv Date: Mon, 29 May 2017 14:16:52 +0300 Subject: [PATCH] Commit for #28771 (thickshell produces wrong result, SENR-17-060) --- src/BRepOffset/BRepOffset_MakeOffset.cxx | 104 ++++++++++++++++++----- 1 file changed, 82 insertions(+), 22 deletions(-) diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 71f7615e52..e322951f95 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -247,6 +247,11 @@ static void DEBVerticesControl (const TopTools_IndexedMapOfShape& NewEdges, static void UpdateTolerance ( TopoDS_Shape& myShape, const TopTools_IndexedMapOfShape& myFaces); +static Standard_Real ComputeMaxDist(const gp_Pln& thePlane, + const Handle(Geom_Curve)& theCrv, + const Standard_Real theFirst, + const Standard_Real theLast); + static void CorrectSolid(TopoDS_Solid& theSol, TopTools_ListOfShape& theSolList); //--------------------------------------------------------------------- // @@ -3325,13 +3330,39 @@ void BRepOffset_MakeOffset::EncodeRegularity () +//======================================================================= +//function : ComputeMaxDist +//purpose : +//======================================================================= +Standard_Real ComputeMaxDist(const gp_Pln& thePlane, + const Handle(Geom_Curve)& theCrv, + const Standard_Real theFirst, + const Standard_Real theLast) +{ + Standard_Real aMaxDist = 0.; + Standard_Integer i, NCONTROL = 23; + Standard_Real aPrm, aDist2; + gp_Pnt aP; + for (i = 0; i< NCONTROL; i++) { + aPrm = ((NCONTROL - 1 - i)*theFirst + i*theLast) / (NCONTROL - 1); + aP = theCrv->Value(aPrm); + if (Precision::IsInfinite(aP.X()) || Precision::IsInfinite(aP.Y()) + || Precision::IsInfinite(aP.Z())) + { + return Precision::Infinite(); + } + aDist2 = thePlane.SquareDistance(aP); + if (aDist2 > aMaxDist) aMaxDist = aDist2; + } + return sqrt(aMaxDist)*1.05; +} //======================================================================= //function : UpDateTolerance //purpose : //======================================================================= void UpdateTolerance (TopoDS_Shape& S, - const TopTools_IndexedMapOfShape& Faces) + const TopTools_IndexedMapOfShape& Faces) { BRep_Builder B; TopTools_MapOfShape View; @@ -3347,32 +3378,61 @@ void UpdateTolerance (TopoDS_Shape& S, } } - TopExp_Explorer Exp; - for (Exp.Init(S,TopAbs_EDGE); Exp.More(); Exp.Next()) { - TopoDS_Edge E = TopoDS::Edge(Exp.Current()); - if (View.Add(E)) { - Handle(BRepCheck_Edge) EdgeCorrector = new BRepCheck_Edge(E); - Standard_Real Tol = EdgeCorrector->Tolerance(); - B.UpdateEdge (E,Tol); - - // Update the vertices. - TopExp::Vertices(E,V[0],V[1]); - - for (Standard_Integer i = 0 ; i <=1 ; i++) { - if (View.Add(V[i])) { - Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V[i].TShape()); - TV->Tolerance(0.); - Handle(BRepCheck_Vertex) VertexCorrector = new BRepCheck_Vertex(V[i]); - B.UpdateVertex (V[i],VertexCorrector->Tolerance()); - // use the occasion to clean the vertices. - (TV->ChangePoints()).Clear(); - } - B.UpdateVertex(V[i],Tol); + Standard_Real Tol; + TopExp_Explorer ExpF; + for (ExpF.Init(S, TopAbs_FACE); ExpF.More(); ExpF.Next()) + { + const TopoDS_Shape& F = ExpF.Current(); + if (Faces.Contains(F)) + { + continue; + } + BRepAdaptor_Surface aBAS(TopoDS::Face(F), Standard_False); + TopExp_Explorer Exp; + for (Exp.Init(F, TopAbs_EDGE); Exp.More(); Exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(Exp.Current()); + Standard_Boolean isUpdated = Standard_False; + if (aBAS.GetType() == GeomAbs_Plane) + { + //Edge does not seem to have pcurve on plane, + //so EdgeCorrector does not include it in tolerance calculation + Standard_Real aFirst, aLast; + Handle(Geom_Curve) aCrv = BRep_Tool::Curve(E, aFirst, aLast); + Standard_Real aMaxDist = ComputeMaxDist(aBAS.Plane(), aCrv, aFirst, aLast); + B.UpdateEdge(E, aMaxDist); + isUpdated = Standard_True; + } + if (View.Add(E)) + { + + BRepCheck_Edge EdgeCorrector(E); + Tol = EdgeCorrector.Tolerance(); + B.UpdateEdge(E, Tol); + isUpdated = Standard_True; + } + if (isUpdated) + { + Tol = BRep_Tool::Tolerance(E); + // Update the vertices. + TopExp::Vertices(E, V[0], V[1]); + + for (Standard_Integer i = 0; i <= 1; i++) { + if (View.Add(V[i])) { + Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V[i].TShape()); + TV->Tolerance(0.); + BRepCheck_Vertex VertexCorrector(V[i]); + B.UpdateVertex(V[i], VertexCorrector.Tolerance()); + // use the occasion to clean the vertices. + (TV->ChangePoints()).Clear(); + } + B.UpdateVertex(V[i], Tol); + } } } } } + //======================================================================= //function : CorrectSolid //purpose : -- 2.39.5