0026619: Tolerances of operands are modified using bop
[occt.git] / src / IntTools / IntTools_Context.cxx
index 08395ed..a84b20c 100644 (file)
@@ -500,7 +500,7 @@ Standard_Integer IntTools_Context::ComputePE
   aDist=aProjector.LowerDistance();
   //
   aTolE2=BRep_Tool::Tolerance(aE2);
-  aTolSum=aTolP1+aTolE2;
+  aTolSum = aTolP1 + aTolE2 + Precision::Confusion();
   //
   aT=aProjector.LowerDistanceParameter();
   if (aDist > aTolSum) {
@@ -515,7 +515,8 @@ Standard_Integer IntTools_Context::ComputePE
 Standard_Integer IntTools_Context::ComputeVE
   (const TopoDS_Vertex& aV1, 
    const TopoDS_Edge&   aE2,
-   Standard_Real& aT)
+   Standard_Real& aParam,
+   Standard_Real& aTolVnew)
 {
   if (BRep_Tool::Degenerated(aE2)) {
     return -1;
@@ -538,29 +539,29 @@ Standard_Integer IntTools_Context::ComputeVE
   }
   //
   aDist=aProjector.LowerDistance();
-
-  // tolerance of check for coincidence is sum of tolerances of edge and vertex 
-  // extended by additional Precision::Confusion() to allow for interference where
-  // it is very close but not fit to tolerance (see #24108)
+  //
   aTolV1=BRep_Tool::Tolerance(aV1);
   aTolE2=BRep_Tool::Tolerance(aE2);
   aTolSum = aTolV1 + aTolE2 + Precision::Confusion();
   //
-  aT=aProjector.LowerDistanceParameter();
+  aTolVnew=aDist+aTolE2;
+  //
+  aParam=aProjector.LowerDistanceParameter();
   if (aDist > aTolSum) {
     return -4;
   }
   return 0;
 }
 //=======================================================================
-//function : ComputeVS
+//function : ComputeVF
 //purpose  : 
 //=======================================================================
 Standard_Integer IntTools_Context::ComputeVF
   (const TopoDS_Vertex& aV1, 
    const TopoDS_Face&   aF2,
    Standard_Real& U,
-   Standard_Real& V)
+   Standard_Real& V,
+   Standard_Real& aTolVnew)
 {
   Standard_Real aTolV1, aTolF2, aTolSum, aDist;
   gp_Pnt aP;
@@ -578,10 +579,13 @@ Standard_Integer IntTools_Context::ComputeVF
   // 2. Check the distance between the projection point and 
   //    the original point
   aDist=aProjector.LowerDistance();
-
+  //
   aTolV1=BRep_Tool::Tolerance(aV1);
   aTolF2=BRep_Tool::Tolerance(aF2);
-  aTolSum=aTolV1+aTolF2;
+  //
+  aTolSum = aTolV1 + aTolF2 + Precision::Confusion();
+  aTolVnew = aDist + aTolF2;
+  //
   if (aDist > aTolSum) {
     // the distance is too large
     return -2;
@@ -860,14 +864,16 @@ Standard_Boolean IntTools_Context::IsVertexOnLine
           Extrema_ExtPC anExt2(aPv, aGAC, 1.e-10);
           Standard_Real aMinDist = RealLast();
           Standard_Integer aMinIdx = -1;
-          for (Standard_Integer anIdx = 1; anIdx <= anExt2.NbExt(); anIdx++)
-          {
-            if ( anExt2.IsMin(anIdx) &&
-                 anExt2.SquareDistance(anIdx) < aMinDist )
+          if (anExt2.IsDone()) {
+            for (Standard_Integer anIdx = 1; anIdx <= anExt2.NbExt(); anIdx++)
+            {
+              if ( anExt2.IsMin(anIdx) &&
+                   anExt2.SquareDistance(anIdx) < aMinDist )
               {
                 aMinDist = anExt2.SquareDistance(anIdx);
                 aMinIdx = anIdx;
               }
+            }
           }
           if (aMinIdx != -1)
           {
@@ -912,14 +918,16 @@ Standard_Boolean IntTools_Context::IsVertexOnLine
           Extrema_ExtPC anExt2(aPv, aGAC, 1.e-10);
           Standard_Real aMinDist = RealLast();
           Standard_Integer aMinIdx = -1;
-          for (Standard_Integer anIdx = 1; anIdx <= anExt2.NbExt(); anIdx++)
-          {
-            if ( anExt2.IsMin(anIdx) &&
-                 anExt2.SquareDistance(anIdx) < aMinDist )
+          if (anExt2.IsDone()) {
+            for (Standard_Integer anIdx = 1; anIdx <= anExt2.NbExt(); anIdx++)
+            {
+              if ( anExt2.IsMin(anIdx) &&
+                   anExt2.SquareDistance(anIdx) < aMinDist )
               {
                 aMinDist = anExt2.SquareDistance(anIdx);
                 aMinIdx = anIdx;
               }
+            }
           }
           if (aMinIdx != -1)
           {