Salome HOME
Preparation of intermediate revision
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_Tools.cxx
index bad8a3c150eadb738057b169b476a66ee853bb45..a265c785f28788af96f951437ef5f7060e5605fa 100644 (file)
@@ -266,7 +266,8 @@ Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopoDS_Shape& aE1,
     else {
       bIsDone=GEOMAlgo_Tools::ProjectPointOnShape(aP1, aE2, aP2, aCtx);
       if (!bIsDone) {
-       return 1; 
+       //return 1; 
+       continue; // jfa BUG 20361
       }
       aD2=aP1.SquareDistance(aP2);
       if(aD2<aTol2) {
@@ -286,41 +287,54 @@ Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1,
                                                     gp_Pnt& aP2,
                                                     IntTools_Context& aCtx)
 {
-  Standard_Boolean bIsDone=Standard_False;
+  Standard_Boolean bIsDone = Standard_False;
   Standard_Real aT2;
   TopAbs_ShapeEnum aType;
   //
-  aType=aS.ShapeType();
-  switch(aType) {
-    case TopAbs_EDGE: {
-      const TopoDS_Edge& aE2=TopoDS::Edge(aS);
-      //
-      bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
-      if (!bIsDone) {
-       return bIsDone;
+  aType = aS.ShapeType();
+  switch (aType)
+    {
+    case TopAbs_EDGE:
+      {
+        const TopoDS_Edge& aE2 = TopoDS::Edge(aS);
+        //
+        if (BRep_Tool::Degenerated(aE2)) { // jfa
+          return Standard_True;
+        }
+        else {
+          Standard_Real f, l;
+          Handle(Geom_Curve) aC3D = BRep_Tool::Curve (aE2, f, l);
+          if (aC3D.IsNull()) {
+            return Standard_True;
+          }
+          bIsDone = aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
+        }
+        if (!bIsDone) {
+          return bIsDone;
+        }
+        //
+        GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
       }
-      //
-      GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
-    }
       break;
       //
-    case TopAbs_FACE: {
-      const TopoDS_Face& aF2=TopoDS::Face(aS);
-      GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2);
-      //
-      aProj.Perform(aP1);
-      bIsDone=aProj.IsDone();
-      if (!bIsDone) {
-       return bIsDone;
+    case TopAbs_FACE:
+      {
+        const TopoDS_Face& aF2 = TopoDS::Face(aS);
+        GeomAPI_ProjectPointOnSurf& aProj = aCtx.ProjPS(aF2);
+        //
+        aProj.Perform(aP1);
+        bIsDone = aProj.IsDone();
+        if (!bIsDone) {
+          return bIsDone;
+        }
+        //
+        aP2 = aProj.NearestPoint(); 
       }
-      //
-      aP2=aProj.NearestPoint(); 
-    }
       break;
       //  
     default:
       break; // Err
-  }
+    }
   return bIsDone;
 }
 //=======================================================================