Salome HOME
Merge branch 'V9_8_BR'
[tools/medcoupling.git] / src / INTERP_KERNEL / InterpolationOptions.cxx
index c3551054a9ad987a33c486817c9c218a49ec196a..381214cced10251422280907e26f4037b6badce4 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,6 +19,8 @@
 // Author : Anthony Geay (CEA/DEN)
 
 #include "InterpolationOptions.hxx"
+#include "InterpKernelGeo2DPrecision.hxx"
+#include "InterpKernelException.hxx"
 
 #include <sstream>
 
@@ -28,6 +30,8 @@ const double INTERP_KERNEL::InterpolationOptions::DFT_SURF3D_ADJ_EPS=1.e-4;
 
 const double INTERP_KERNEL::InterpolationOptions::DFT_MAX_DIST_3DSURF_INTERSECT=-1.;
 
+const double INTERP_KERNEL::InterpolationOptions::DFT_MIN_DOT_BTW_3DSURF_INTERSECT=-1.;
+
 const char INTERP_KERNEL::InterpolationOptions::PRECISION_STR[]="Precision";
 
 const char INTERP_KERNEL::InterpolationOptions::MEDIANE_PLANE_STR[]="MedianPlane";
@@ -38,6 +42,8 @@ const char INTERP_KERNEL::InterpolationOptions::BOUNDING_BOX_ADJ_ABS_STR[]="Boun
 
 const char INTERP_KERNEL::InterpolationOptions::MAX_DISTANCE_3DSURF_INSECT_STR[]="MaxDistance3DSurfIntersect";
 
+const char INTERP_KERNEL::InterpolationOptions::MIN_DOT_BTW_3DSURF_INSECT_STR[]="MinDotBetween3DSurfIntersect";
+
 const char INTERP_KERNEL::InterpolationOptions::PRINT_LEV_STR[]="PrintLevel";
 
 const char INTERP_KERNEL::InterpolationOptions::DO_ROTATE_STR[]="DoRotate";
@@ -80,6 +86,7 @@ void INTERP_KERNEL::InterpolationOptions::init()
   _bounding_box_adjustment=DFT_SURF3D_ADJ_EPS;
   _bounding_box_adjustment_abs=0.;
   _max_distance_for_3Dsurf_intersect=DFT_MAX_DIST_3DSURF_INTERSECT;
+  _min_dot_btw_3Dsurf_intersect=DFT_MIN_DOT_BTW_3DSURF_INTERSECT;
   _orientation=0;
   _measure_abs=true;
   _splitting_policy=PLANAR_FACE_5;
@@ -130,6 +137,11 @@ bool INTERP_KERNEL::InterpolationOptions::setOptionDouble(const std::string& key
       setMaxDistance3DSurfIntersect(value);
       return true;
     }
+  else if(key==MIN_DOT_BTW_3DSURF_INSECT_STR)
+    {
+      setMinDotBtwPlane3DSurfIntersect(value);
+      return true;
+    }
   else
     return false;
 }
@@ -243,7 +255,7 @@ std::string INTERP_KERNEL::InterpolationOptions::filterInterpolationMethod(const
   return std::string(meth);
 }
 
-bool INTERP_KERNEL::InterpolationOptions::setInterpolationOptions(long print_level,
+bool INTERP_KERNEL::InterpolationOptions::setInterpolationOptions(int print_level,
                                                                   std::string intersection_type,
                                                                   double precision,
                                                                   double median_plane,
@@ -251,7 +263,7 @@ bool INTERP_KERNEL::InterpolationOptions::setInterpolationOptions(long print_lev
                                                                   double bounding_box_adjustment,
                                                                   double bounding_box_adjustment_abs,
                                                                   double max_distance_for_3Dsurf_intersect,
-                                                                  long orientation,
+                                                                  int orientation,
                                                                   bool measure_abs,
                                                                   std::string splitting_policy)
 {
@@ -278,9 +290,26 @@ std::string INTERP_KERNEL::InterpolationOptions::printOptions() const
   oss << "Bounding box adj : " << _bounding_box_adjustment << std::endl;
   oss << "Bounding box adj abs : " << _bounding_box_adjustment_abs << std::endl;
   oss << "Max distance for 3DSurf intersect : " << _max_distance_for_3Dsurf_intersect << std::endl;
+  oss << "Min dot between plane for 3DSurf intersect : " << _min_dot_btw_3Dsurf_intersect << std::endl;
   oss << "Orientation : " << _orientation << std::endl;
   oss << "Measure abs : " << _measure_abs << std::endl;
   oss << "Splitting policy : " << getSplittingPolicyRepr() << std::endl;
   oss << "****************************" << std::endl;
   return oss.str();
 }
+
+void INTERP_KERNEL::InterpolationOptions::CheckAndSplitInterpolationMethod(const std::string& method, std::string& srcMeth, std::string& trgMeth)
+{
+  const int NB_OF_METH_MANAGED=4;
+  const char *METH_MANAGED[NB_OF_METH_MANAGED]={"P0P0","P0P1","P1P0","P1P1"};
+  bool found=false;
+  for(int i=0;i<NB_OF_METH_MANAGED && !found;i++)
+    found=(method==METH_MANAGED[i]);
+  if(!found)
+    {
+      std::string msg("The interpolation method : \'"); msg+=method; msg+="\' not managed by INTERP_KERNEL interpolators ! Supported are \"P0P0\", \"P0P1\", \"P1P0\" and \"P1P1\".";
+      throw INTERP_KERNEL::Exception(msg.c_str());
+    }
+  srcMeth=method.substr(0,2);
+  trgMeth=method.substr(2);
+}