]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Correct diagnostic of result of coarse proximity
authorjgv <jgv@opencascade.com>
Mon, 19 Sep 2022 14:36:41 +0000 (17:36 +0300)
committerjfa <jfa@opencascade.com>
Fri, 4 Nov 2022 10:11:07 +0000 (13:11 +0300)
src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx
src/GEOMImpl/GEOMImpl_ShapeProximityDriver.cxx

index 9c3f197530de789511280e9bd7758534a6b3ee3b..a24237e09cf8e9509faa002b703a6f54cd38c723 100644 (file)
@@ -3442,31 +3442,46 @@ Standard_Real GEOMImpl_IMeasureOperations::GetPreciseProximity(Handle(GEOM_Objec
   if (aShape1.IsNull() || aShape2.IsNull())
     return NULL;
   gp_Pnt aProxPnt1, aProxPnt2;
+  BRepExtrema_ProximityDistTool::ProxPnt_Status aStatus1, aStatus2;
+  Standard_Integer intStatus1, intStatus2;
   aCoarseProximity.GetProximityPoints(aProxPnt1, aProxPnt2);
+  aCoarseProximity.GetStatusOfPoints(intStatus1, intStatus2);
+  aStatus1 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus1;
+  aStatus2 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus2;
 
-  GEOMImpl_IProximity aFineProximity(aProximityFuncFine);
-  aFineProximity.SetShapes(aShape1, aShape2);
-  aFineProximity.SetProximityPoints(aProxPnt1, aProxPnt2);
+  Standard_Real aResultValue = aCoarseProximity.GetValue();
 
-  // Perform
-  try
+  // call precise calculator only if at least one point is in the middle of the shape
+  if (aStatus1 != BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER &&
+      aStatus2 != BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER)
   {
-    OCC_CATCH_SIGNALS;
-    if (!GetSolver()->ComputeFunction(aProximityFuncFine))
+    GEOMImpl_IProximity aFineProximity(aProximityFuncFine);
+    aFineProximity.SetShapes(aShape1, aShape2);
+    aFineProximity.SetProximityPoints(aProxPnt1, aProxPnt2);
+    aFineProximity.SetStatusOfPoints(intStatus1, intStatus2);
+    
+    // Perform
+    try
     {
-      SetErrorCode("shape proximity driver failed");
+      OCC_CATCH_SIGNALS;
+      if (!GetSolver()->ComputeFunction(aProximityFuncFine))
+      {
+        SetErrorCode("shape proximity driver failed");
+        return NULL;
+      }
+    }
+    catch (Standard_Failure& aFail)
+    {
+      SetErrorCode(aFail.GetMessageString());
       return NULL;
     }
-  }
-  catch (Standard_Failure& aFail)
-  {
-    SetErrorCode(aFail.GetMessageString());
-    return NULL;
+
+    aResultValue = aFineProximity.GetValue();
   }
 
   //Make a Python command
   GEOM::TPythonDump(aProximityFuncCoarse) << "value = p.preciseProximity()";
 
   SetErrorCode(OK);
-  return aFineProximity.GetValue();
+  return aResultValue;
 }
index 99a7431087dee482d5bb421f131feea9555d2327..1c67aa44e9ff36df146f5c714950dc9e3b9ab081 100644 (file)
@@ -328,7 +328,6 @@ Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook
     aStatus1 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus1;
     aStatus2 = (BRepExtrema_ProximityDistTool::ProxPnt_Status)intStatus2;
 
-    Standard_Real anExactValue = -1;
     if (aType1 == TopAbs_EDGE)
     {
       if (aType2 == TopAbs_EDGE)
@@ -336,17 +335,17 @@ Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook
         if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
             aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaEE(TopoDS::Edge(aShape1), TopoDS::Edge(aShape2), aPnt1, aPnt2);
+          aValue = extremaEE(TopoDS::Edge(aShape1), TopoDS::Edge(aShape2), aPnt1, aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2);
+          aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER)
         {
-          anExactValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1);
+          aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1);
         }
       }
       else if (aType2 == TopAbs_FACE)
@@ -354,17 +353,17 @@ Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook
         if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
             aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaEF(TopoDS::Edge(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2);
+          aValue = extremaEF(TopoDS::Edge(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2);
+          aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER)
         {
-          anExactValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1);
+          aValue = extremaPE(aPnt2, TopoDS::Edge(aShape1), aPnt1);
         }
       }
     }
@@ -375,17 +374,17 @@ Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook
         if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
             aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaEF(TopoDS::Edge(aShape2), TopoDS::Face(aShape1), aPnt2, aPnt1);
+          aValue = extremaEF(TopoDS::Edge(aShape2), TopoDS::Face(aShape1), aPnt2, aPnt1);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2);
+          aValue = extremaPE(aPnt1, TopoDS::Edge(aShape2), aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER)
         {
-          anExactValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1);
+          aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1);
         }
       }
       else if (aType2 == TopAbs_FACE)
@@ -393,24 +392,21 @@ Standard_Integer GEOMImpl_ShapeProximityDriver::Execute(Handle(TFunction_Logbook
         if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
             aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaFF(TopoDS::Face(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2);
+          aValue = extremaFF(TopoDS::Face(aShape1), TopoDS::Face(aShape2), aPnt1, aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE)
         {
-          anExactValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2);
+          aValue = extremaPF(aPnt1, TopoDS::Face(aShape2), aPnt2);
         }
         else if (aStatus1 == BRepExtrema_ProximityDistTool::ProxPnt_Status_MIDDLE &&
                  aStatus2 == BRepExtrema_ProximityDistTool::ProxPnt_Status_BORDER)
         {
-          anExactValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1);
+          aValue = extremaPF(aPnt2, TopoDS::Face(aShape1), aPnt1);
         }
       }
     }
 
-    if (anExactValue != -1)
-      aValue = anExactValue;
-
     if (aValue >= 0)
       aProximity.SetProximityPoints(aPnt1, aPnt2);
     else