+
+//================================================================================
+/*!
+ * \brief Initialize Fineness by the mesh built on the geometry
+ * \param theMesh - the built mesh
+ * \param theShape - the geometry of interest
+ * \retval bool - true if parameter values have been successfully defined
+ */
+//================================================================================
+
+bool StdMeshers_AutomaticLength::SetParametersByMesh(const SMESH_Mesh* theMesh,
+ const TopoDS_Shape& theShape)
+{
+ if ( !theMesh || theShape.IsNull() )
+ return false;
+
+ _fineness = 0;
+
+ SMESHDS_Mesh* aMeshDS = const_cast< SMESH_Mesh* >( theMesh )->GetMeshDS();
+
+ int nbEdges = 0;
+ TopTools_IndexedMapOfShape edgeMap;
+ TopExp::MapShapes( theShape, TopAbs_EDGE, edgeMap );
+ for ( int i = 1; i <= edgeMap.Extent(); ++i )
+ {
+ const TopoDS_Edge& edge = TopoDS::Edge( edgeMap( i ));
+
+ // assure the base automatic length is stored in _TShapeToLength
+ if ( i == 1 )
+ GetLength( theMesh, edge );
+
+ // get current segment length
+ double L = SMESH_Algo::EdgeLength( edge );
+ if ( L <= DBL_MIN )
+ continue;
+ SMESHDS_SubMesh * eSubMesh = aMeshDS->MeshElements( edge );
+ if ( !eSubMesh )
+ return false;
+ int nbSeg = eSubMesh->NbElements();
+ if ( nbSeg < 1 )
+ continue;
+ double segLen = L / nbSeg;
+
+ // get segment length from _TShapeToLength
+ map<const TopoDS_TShape*, double>::iterator tshape_length =
+ _TShapeToLength.find( getTShape( edge ));
+ if ( tshape_length == _TShapeToLength.end() )
+ continue;
+ double autoLen = tshape_length->second;
+
+ // segLen = autoLen / (theCoarseConst + theFineConst * _fineness) -->
+ _fineness += ( autoLen / segLen - theCoarseConst ) / theFineConst;
+
+ ++nbEdges;
+ }
+ if ( nbEdges )
+ _fineness /= nbEdges;
+
+ if (_fineness > 1.0)
+ _fineness = 1.0;
+ else if (_fineness < 0.0)
+ _fineness = 0.0;
+
+ return nbEdges;
+}
+
+//================================================================================
+/*!
+ * \brief Initialize my parameter values by default parameters.
+ * \retval bool - true if parameter values have been successfully defined
+ */
+//================================================================================
+
+bool StdMeshers_AutomaticLength::SetParametersByDefaults(const TDefaults& /*theDflts*/,
+ const SMESH_Mesh* /*theMesh*/)
+{
+ return false;
+
+ // assure the base automatic length is stored in _TShapeToLength
+// GetLength( theMesh, elemLenght );
+
+// // find maximal edge length
+// double maxLen = 0;
+// map<const TopoDS_TShape*, double>::iterator
+// tshape_length = _TShapeToLength.begin(), slEnd = _TShapeToLength.end();
+// for ( ; tshape_length != slEnd; ++tshape_length )
+// if ( tshape_length->second > maxLen )
+// maxLen = tshape_length->second;
+
+// // automatic length for longest element
+// double autoLen = GetLength( theMesh, maxLen );
+
+// // elemLenght = autoLen / (theCoarseConst + theFineConst * _fineness) -->
+// _fineness = ( autoLen / elemLenght - theCoarseConst ) / theFineConst;
+
+// return true;
+}
+
+