mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
Commit for #28771
This commit is contained in:
@@ -241,6 +241,10 @@ 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 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
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
static void UpdateTolerance (TopoDS_Shape& S,
|
||||
void UpdateTolerance (TopoDS_Shape& S,
|
||||
const TopTools_IndexedMapOfShape& Faces)
|
||||
{
|
||||
BRep_Builder B;
|
||||
@@ -3126,27 +3156,48 @@ 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;
|
||||
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());
|
||||
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);
|
||||
Standard_Real Tol = EdgeCorrector->Tolerance();
|
||||
B.UpdateEdge (E,Tol);
|
||||
|
||||
Tol = EdgeCorrector->Tolerance();
|
||||
B.UpdateEdge(E, Tol);
|
||||
}
|
||||
Tol = BRep_Tool::Tolerance(E);
|
||||
// Update the vertices.
|
||||
TopExp::Vertices(E,V[0],V[1]);
|
||||
TopExp::Vertices(E, V[0], V[1]);
|
||||
|
||||
for (Standard_Integer i = 0 ; i <=1 ; i++) {
|
||||
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());
|
||||
B.UpdateVertex(V[i], VertexCorrector->Tolerance());
|
||||
// use the occasion to clean the vertices.
|
||||
(TV->ChangePoints()).Clear();
|
||||
}
|
||||
B.UpdateVertex(V[i],Tol);
|
||||
B.UpdateVertex(V[i], Tol);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user