Salome HOME
PAL10953. Add Fineness parameter to Automatic Length hypothesis
[modules/smesh.git] / src / StdMeshers / StdMeshers_AutomaticLength.cxx
index 01e8398abdf8d0640834d55b255dafe69d31ad74..1176ebe185ad5b6c3d2e49f49f2a26ee8402c1b5 100644 (file)
@@ -54,6 +54,7 @@ StdMeshers_AutomaticLength::StdMeshers_AutomaticLength(int hypId, int studyId,
   _param_algo_dim = 1; // is used by SMESH_Regular_1D
 
   _mesh = 0;
+  _fineness = 0;
 }
 
 //=============================================================================
@@ -66,6 +67,32 @@ StdMeshers_AutomaticLength::~StdMeshers_AutomaticLength()
 {
 }
 
+//================================================================================
+/*!
+ * \brief Set Fineness
+ * \param theFineness - The Fineness value [0.0-1.0],
+ *                        0 - coarse mesh
+ *                        1 - fine mesh
+ * 
+ * Raise if theFineness is out of range
+ * The "Initial Number of Elements on the Shortest Edge" (S0)
+ * is divided by (0.5 + 4.5 x theFineness)
+ */
+//================================================================================
+
+void StdMeshers_AutomaticLength::SetFineness(double theFineness)
+  throw(SALOME_Exception)
+{
+  if ( theFineness < 0.0 || theFineness > 1.0 )
+    throw SALOME_Exception(LOCALIZED("theFineness is out of range [0.0-1.0]"));
+
+  if ( _fineness != theFineness )
+  {
+    NotifySubMeshesHypothesisModification();
+    _fineness = theFineness;
+  }
+}
+
 //================================================================================
 /*!
  * \brief Return pointer to TopoDS_TShape
@@ -181,7 +208,7 @@ double StdMeshers_AutomaticLength::GetLength(const SMESH_Mesh*   theMesh,
   if ( tshape_length == _TShapeToLength.end() )
     return 1; // it is a dgenerated edge
 
-  return tshape_length->second;
+  return tshape_length->second / (0.5 + 4.5 * _fineness);
 }
 
 //=============================================================================
@@ -192,6 +219,7 @@ double StdMeshers_AutomaticLength::GetLength(const SMESH_Mesh*   theMesh,
 
 ostream & StdMeshers_AutomaticLength::SaveTo(ostream & save)
 {
+  save << _fineness;
   return save;
 }
 
@@ -203,6 +231,8 @@ ostream & StdMeshers_AutomaticLength::SaveTo(ostream & save)
 
 istream & StdMeshers_AutomaticLength::LoadFrom(istream & load)
 {
+  if ( ! ( load >> _fineness ))
+    load.clear(ios::badbit | load.rdstate());
   return load;
 }