]> OCCT Git - occt-copy.git/commitdiff
0031199: BRepMesh fails on thin faces
authoroan <oan@opencascade.com>
Wed, 4 Dec 2019 09:26:10 +0000 (12:26 +0300)
committerazv <azv@opencascade.com>
Sat, 27 Mar 2021 12:02:35 +0000 (15:02 +0300)
Use real tolerance of a face to define threshold for tolerance of discrete model instead of empirical values based on discrete model itself

src/BRepMesh/BRepMesh_DefaultRangeSplitter.cxx

index a72cdfec2dc8dc6c42f058f4de9fe0d07ff74d70..ae5041418e2b6d4a586026bc5e8f47eb2bd58eae 100644 (file)
@@ -18,6 +18,7 @@
 #include <GCPnts_AbscissaPoint.hxx>
 #include <GeomAdaptor_Curve.hxx>
 #include <GeomAbs_IsoType.hxx>
+#include <BRep_Tool.hxx>
 
 //=======================================================================
 // Function: Reset
@@ -125,9 +126,14 @@ void BRepMesh_DefaultRangeSplitter::computeTolerance(
   const Standard_Real aDiffU = myRangeU.second - myRangeU.first;
   const Standard_Real aDiffV = myRangeV.second - myRangeV.first;
 
+  const Standard_Real      aTolerance = BRep_Tool::Tolerance (myDFace->GetFace());
+  const Adaptor3d_Surface& aSurface   = GetSurface()->Surface();
+  const Standard_Real      aResU      = aSurface.UResolution (aTolerance);
+  const Standard_Real      aResV      = aSurface.VResolution (aTolerance);
+
   const Standard_Real aDeflectionUV = 1.e-05;
-  myTolerance.first  = Max(Min(aDeflectionUV, 0.1 * aDiffU), 1e-7 * aDiffU);
-  myTolerance.second = Max(Min(aDeflectionUV, 0.1 * aDiffV), 1e-7 * aDiffV);
+  myTolerance.first  = Max(Min(aDeflectionUV, aResU), 1e-7 * aDiffU);
+  myTolerance.second = Max(Min(aDeflectionUV, aResV), 1e-7 * aDiffV);
 }
 
 //=======================================================================