1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #include "InterpolationOptions.hxx"
22 #include "InterpKernelGeo2DPrecision.hxx"
23 #include "InterpKernelException.hxx"
27 const double INTERP_KERNEL::InterpolationOptions::DFT_MEDIAN_PLANE=0.5;
29 const double INTERP_KERNEL::InterpolationOptions::DFT_SURF3D_ADJ_EPS=1.e-4;
31 const double INTERP_KERNEL::InterpolationOptions::DFT_MAX_DIST_3DSURF_INTERSECT=-1.;
33 const double INTERP_KERNEL::InterpolationOptions::DFT_MIN_DOT_BTW_3DSURF_INTERSECT=-1.;
35 const char INTERP_KERNEL::InterpolationOptions::PRECISION_STR[]="Precision";
37 const char INTERP_KERNEL::InterpolationOptions::ARC_DETECTION_PRECISION_STR[]="ArcDetectionPrecision";
39 const char INTERP_KERNEL::InterpolationOptions::MEDIANE_PLANE_STR[]="MedianPlane";
41 const char INTERP_KERNEL::InterpolationOptions::BOUNDING_BOX_ADJ_STR[]="BoundingBoxAdjustment";
43 const char INTERP_KERNEL::InterpolationOptions::BOUNDING_BOX_ADJ_ABS_STR[]="BoundingBoxAdjustmentAbs";
45 const char INTERP_KERNEL::InterpolationOptions::MAX_DISTANCE_3DSURF_INSECT_STR[]="MaxDistance3DSurfIntersect";
47 const char INTERP_KERNEL::InterpolationOptions::MIN_DOT_BTW_3DSURF_INSECT_STR[]="MinDotBetween3DSurfIntersect";
49 const char INTERP_KERNEL::InterpolationOptions::PRINT_LEV_STR[]="PrintLevel";
51 const char INTERP_KERNEL::InterpolationOptions::DO_ROTATE_STR[]="DoRotate";
53 const char INTERP_KERNEL::InterpolationOptions::ORIENTATION_STR[]="Orientation";
55 const char INTERP_KERNEL::InterpolationOptions::MEASURE_ABS_STR[]="MeasureAbs";
57 const char INTERP_KERNEL::InterpolationOptions::INTERSEC_TYPE_STR[]="IntersectionType";
59 const char INTERP_KERNEL::InterpolationOptions::SPLITTING_POLICY_STR[]="SplittingPolicy";
61 const char INTERP_KERNEL::InterpolationOptions::TRIANGULATION_INTERSECT2D_STR[]="Triangulation";
63 const char INTERP_KERNEL::InterpolationOptions::CONVEX_INTERSECT2D_STR[]="Convex";
65 const char INTERP_KERNEL::InterpolationOptions::GEOMETRIC_INTERSECT2D_STR[]="Geometric2D";
67 const char INTERP_KERNEL::InterpolationOptions::POINTLOCATOR_INTERSECT_STR[]="PointLocator";
69 const char INTERP_KERNEL::InterpolationOptions::BARYCENTRIC_INTERSECT_STR[]="Barycentric";
71 const char INTERP_KERNEL::InterpolationOptions::BARYCENTRICGEO2D_INTERSECT_STR[]="BarycentricGeo2D";
73 const char INTERP_KERNEL::InterpolationOptions::PLANAR_SPLIT_FACE_5_STR[]="PLANAR_FACE_5";
75 const char INTERP_KERNEL::InterpolationOptions::PLANAR_SPLIT_FACE_6_STR[]="PLANAR_FACE_6";
77 const char INTERP_KERNEL::InterpolationOptions::GENERAL_SPLIT_24_STR[]="GENERAL_24";
79 const char INTERP_KERNEL::InterpolationOptions::GENERAL_SPLIT_48_STR[]="GENERAL_48";
81 void INTERP_KERNEL::InterpolationOptions::init()
84 _intersection_type=Triangulation;
86 _median_plane=DFT_MEDIAN_PLANE;
88 _bounding_box_adjustment=DFT_SURF3D_ADJ_EPS;
89 _bounding_box_adjustment_abs=0.;
90 _max_distance_for_3Dsurf_intersect=DFT_MAX_DIST_3DSURF_INTERSECT;
91 _min_dot_btw_3Dsurf_intersect=DFT_MIN_DOT_BTW_3DSURF_INTERSECT;
94 _splitting_policy=PLANAR_FACE_5;
97 double INTERP_KERNEL::InterpolationOptions::getArcDetectionPrecision() const
99 return INTERP_KERNEL::QUADRATIC_PLANAR::_arc_detection_precision;
102 void INTERP_KERNEL::InterpolationOptions::setArcDetectionPrecision(double p)
104 INTERP_KERNEL::QUADRATIC_PLANAR::_arc_detection_precision=p;
107 std::string INTERP_KERNEL::InterpolationOptions::getIntersectionTypeRepr() const
109 if(_intersection_type==INTERP_KERNEL::Triangulation)
110 return std::string(TRIANGULATION_INTERSECT2D_STR);
111 else if(_intersection_type==INTERP_KERNEL::Convex)
112 return std::string(CONVEX_INTERSECT2D_STR);
113 else if(_intersection_type==INTERP_KERNEL::Geometric2D)
114 return std::string(GEOMETRIC_INTERSECT2D_STR);
115 else if(_intersection_type==INTERP_KERNEL::PointLocator)
116 return std::string(POINTLOCATOR_INTERSECT_STR);
117 else if(_intersection_type==INTERP_KERNEL::Barycentric)
118 return std::string(BARYCENTRIC_INTERSECT_STR);
119 else if(_intersection_type==INTERP_KERNEL::BarycentricGeo2D)
120 return std::string(BARYCENTRICGEO2D_INTERSECT_STR);
122 return std::string("UNKNOWN_INTERSECT_TYPE");
125 bool INTERP_KERNEL::InterpolationOptions::setOptionDouble(const std::string& key, double value)
127 if(key==PRECISION_STR)
132 if(key==ARC_DETECTION_PRECISION_STR)
134 setArcDetectionPrecision(value);
137 else if(key==MEDIANE_PLANE_STR)
139 setMedianPlane(value);
142 else if(key==BOUNDING_BOX_ADJ_STR)
144 setBoundingBoxAdjustment(value);
147 else if(key==BOUNDING_BOX_ADJ_ABS_STR)
149 setBoundingBoxAdjustmentAbs(value);
152 else if(key==MAX_DISTANCE_3DSURF_INSECT_STR)
154 setMaxDistance3DSurfIntersect(value);
157 else if(key==MIN_DOT_BTW_3DSURF_INSECT_STR)
159 setMinDotBtwPlane3DSurfIntersect(value);
166 bool INTERP_KERNEL::InterpolationOptions::setOptionInt(const std::string& key, int value)
168 if(key==PRINT_LEV_STR)
170 setPrintLevel(value);
173 else if(key==DO_ROTATE_STR)
175 setDoRotate(value != 0);
178 else if(key==ORIENTATION_STR)
180 setOrientation(value);
183 else if(key==MEASURE_ABS_STR)
185 bool valBool=(value!=0);
186 setMeasureAbsStatus(valBool);
193 bool INTERP_KERNEL::InterpolationOptions::setOptionString(const std::string& key, const std::string& value)
195 if(key==INTERSEC_TYPE_STR)
197 if(value==TRIANGULATION_INTERSECT2D_STR)
199 setIntersectionType(INTERP_KERNEL::Triangulation);
202 else if(value==CONVEX_INTERSECT2D_STR)
204 setIntersectionType(INTERP_KERNEL::Convex);
207 else if(value==GEOMETRIC_INTERSECT2D_STR)
209 setIntersectionType(INTERP_KERNEL::Geometric2D);
212 else if(value==POINTLOCATOR_INTERSECT_STR)
214 setIntersectionType(INTERP_KERNEL::PointLocator);
217 else if(value==BARYCENTRIC_INTERSECT_STR)
219 setIntersectionType(INTERP_KERNEL::Barycentric);
222 else if(value==BARYCENTRICGEO2D_INTERSECT_STR)
224 setIntersectionType(INTERP_KERNEL::BarycentricGeo2D);
228 else if(key==SPLITTING_POLICY_STR)
230 if(value==PLANAR_SPLIT_FACE_5_STR)
232 setSplittingPolicy(INTERP_KERNEL::PLANAR_FACE_5);
235 else if(value==PLANAR_SPLIT_FACE_6_STR)
237 setSplittingPolicy(INTERP_KERNEL::PLANAR_FACE_6);
240 else if(value==GENERAL_SPLIT_24_STR)
242 setSplittingPolicy(INTERP_KERNEL::GENERAL_24);
245 else if(value==GENERAL_SPLIT_48_STR)
247 setSplittingPolicy(INTERP_KERNEL::GENERAL_48);
256 std::string INTERP_KERNEL::InterpolationOptions::getSplittingPolicyRepr() const
258 if(_splitting_policy==INTERP_KERNEL::PLANAR_FACE_5)
259 return std::string(PLANAR_SPLIT_FACE_5_STR);
260 else if(_splitting_policy==INTERP_KERNEL::PLANAR_FACE_6)
261 return std::string(PLANAR_SPLIT_FACE_6_STR);
262 else if(_splitting_policy==INTERP_KERNEL::GENERAL_24)
263 return std::string(GENERAL_SPLIT_24_STR);
264 else if(_splitting_policy==INTERP_KERNEL::GENERAL_48)
265 return std::string(GENERAL_SPLIT_48_STR);
267 return std::string("UNKNOWN_SPLITTING_POLICY");
270 std::string INTERP_KERNEL::InterpolationOptions::filterInterpolationMethod(const std::string& meth) const
272 return std::string(meth);
275 bool INTERP_KERNEL::InterpolationOptions::setInterpolationOptions(long print_level,
276 std::string intersection_type,
280 double bounding_box_adjustment,
281 double bounding_box_adjustment_abs,
282 double max_distance_for_3Dsurf_intersect,
285 std::string splitting_policy)
287 _print_level=print_level;
288 _precision=precision;
289 _median_plane=median_plane;
290 _do_rotate=do_rotate;
291 _bounding_box_adjustment=bounding_box_adjustment;
292 _bounding_box_adjustment_abs=bounding_box_adjustment_abs;
293 _max_distance_for_3Dsurf_intersect=max_distance_for_3Dsurf_intersect;
294 _orientation=orientation;
295 _measure_abs=measure_abs;
296 return(setOptionString(INTERSEC_TYPE_STR,intersection_type) && setOptionString(SPLITTING_POLICY_STR,splitting_policy));
299 std::string INTERP_KERNEL::InterpolationOptions::printOptions() const
301 std::ostringstream oss; oss.precision(15); oss << "Interpolation Options ******" << std::endl;
302 oss << "Print level : " << _print_level << std::endl;
303 oss << "Intersection type : " << getIntersectionTypeRepr() << std::endl;
304 oss << "Precision : " << _precision << std::endl;
305 oss << "Arc Detection Precision : " << getArcDetectionPrecision() << std::endl;
306 oss << "Median plane : " << _median_plane << std::endl;
307 oss << "Do Rotate status : " << std::boolalpha << _do_rotate << std::endl;
308 oss << "Bounding box adj : " << _bounding_box_adjustment << std::endl;
309 oss << "Bounding box adj abs : " << _bounding_box_adjustment_abs << std::endl;
310 oss << "Max distance for 3DSurf intersect : " << _max_distance_for_3Dsurf_intersect << std::endl;
311 oss << "Min dot between plane for 3DSurf intersect : " << _min_dot_btw_3Dsurf_intersect << std::endl;
312 oss << "Orientation : " << _orientation << std::endl;
313 oss << "Measure abs : " << _measure_abs << std::endl;
314 oss << "Splitting policy : " << getSplittingPolicyRepr() << std::endl;
315 oss << "****************************" << std::endl;
319 void INTERP_KERNEL::InterpolationOptions::CheckAndSplitInterpolationMethod(const std::string& method, std::string& srcMeth, std::string& trgMeth)
321 const int NB_OF_METH_MANAGED=4;
322 const char *METH_MANAGED[NB_OF_METH_MANAGED]={"P0P0","P0P1","P1P0","P1P1"};
324 for(int i=0;i<NB_OF_METH_MANAGED && !found;i++)
325 found=(method==METH_MANAGED[i]);
328 std::string msg("The interpolation method : \'"); msg+=method; msg+="\' not managed by INTERP_KERNEL interpolators ! Supported are \"P0P0\", \"P0P1\", \"P1P0\" and \"P1P1\".";
329 throw INTERP_KERNEL::Exception(msg.c_str());
331 srcMeth=method.substr(0,2);
332 trgMeth=method.substr(2);