1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00
This commit is contained in:
ifv
2017-05-23 16:05:41 +03:00
parent c45a54c355
commit e5ed77c989

View File

@@ -241,6 +241,10 @@ static void DEBVerticesControl (const TopTools_IndexedMapOfShape& NewEdges,
static void UpdateTolerance ( TopoDS_Shape& myShape, static void UpdateTolerance ( TopoDS_Shape& myShape,
const TopTools_IndexedMapOfShape& myFaces); 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 Standard_Boolean FindParameter(const TopoDS_Vertex& V, static Standard_Boolean FindParameter(const TopoDS_Vertex& V,
@@ -3104,12 +3108,38 @@ 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 //function : UpDateTolerance
//purpose : //purpose :
//======================================================================= //=======================================================================
static void UpdateTolerance (TopoDS_Shape& S, void UpdateTolerance (TopoDS_Shape& S,
const TopTools_IndexedMapOfShape& Faces) const TopTools_IndexedMapOfShape& Faces)
{ {
BRep_Builder B; BRep_Builder B;
@@ -3126,14 +3156,35 @@ static void UpdateTolerance (TopoDS_Shape& S,
} }
} }
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; TopExp_Explorer Exp;
for (Exp.Init(S,TopAbs_EDGE); Exp.More(); Exp.Next()) { for (Exp.Init(F, TopAbs_EDGE); Exp.More(); Exp.Next()) {
TopoDS_Edge E = TopoDS::Edge(Exp.Current()); TopoDS_Edge E = TopoDS::Edge(Exp.Current());
if (View.Add(E)) { 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);
}
if (View.Add(E))
{
Handle(BRepCheck_Edge) EdgeCorrector = new BRepCheck_Edge(E); Handle(BRepCheck_Edge) EdgeCorrector = new BRepCheck_Edge(E);
Standard_Real Tol = EdgeCorrector->Tolerance(); Tol = EdgeCorrector->Tolerance();
B.UpdateEdge(E, Tol); B.UpdateEdge(E, Tol);
}
Tol = BRep_Tool::Tolerance(E);
// Update the vertices. // Update the vertices.
TopExp::Vertices(E, V[0], V[1]); TopExp::Vertices(E, V[0], V[1]);