Salome HOME
#18963 Minimize compiler warnings
[modules/smesh.git] / src / StdMeshers / StdMeshers_NumberOfSegments.hxx
1 // Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SMESH SMESH : implementation of SMESH idl descriptions
24 //  File   : StdMeshers_NumberOfSegments.hxx
25 //           Moved here from SMESH_NumberOfSegments.hxx
26 //  Author : Paul RASCLE, EDF
27 //  Module : SMESH
28 //
29 #ifndef _SMESH_NUMBEROFSEGMENTS_HXX_
30 #define _SMESH_NUMBEROFSEGMENTS_HXX_
31
32 #include "StdMeshers_Reversible1D.hxx"
33 #include "SMESH_Hypothesis.hxx"
34 #include "Utils_SALOME_Exception.hxx"
35
36 #include <vector>
37
38 /*!
39  * \brief This class represents hypothesis for 1d algorithm
40  * 
41  * It provides parameters for subdivision an edge by various
42  * distribution types, considering the given number of resulting segments
43  */
44 class STDMESHERS_EXPORT StdMeshers_NumberOfSegments: public StdMeshers_Reversible1D
45 {
46 public:
47   StdMeshers_NumberOfSegments(int hypId, SMESH_Gen* gen);
48   virtual ~StdMeshers_NumberOfSegments();
49
50   // Builds point distribution according to passed function
51   const std::vector<double>& BuildDistributionExpr( const char*, int, int );
52   const std::vector<double>& BuildDistributionTab( const std::vector<double>&, int, int );
53
54   /*!
55    * \brief Set the number of segments
56     * \param segmentsNumber - must be greater than zero
57    */
58   void SetNumberOfSegments(int segmentsNumber);
59
60   /*!
61    * \brief Get the number of segments
62    */
63   int GetNumberOfSegments() const;
64
65   /*!
66    * \brief This enumeration presents available types of distribution
67    */
68   enum DistrType
69   {
70     DT_Regular, //!< equidistant distribution
71     DT_Scale,   //!< scale distribution
72     DT_TabFunc, //!< distribution with density function presented by table
73     DT_ExprFunc //!< distribution with density function presented by expression
74   };
75
76   /*!
77    * \brief Set distribution type
78    */
79   void SetDistrType(DistrType typ);
80
81   /*!
82    * \brief Get distribution type
83    */
84   DistrType GetDistrType() const;
85
86   /*!
87    * \brief Set scale factor for scale distribution
88    * \param scaleFactor - positive value different from 1
89    * 
90    * Throws SALOME_Exception if distribution type is not DT_Scale,
91    * or scaleFactor is not a positive value different from 1
92    */
93   virtual void SetScaleFactor(double scaleFactor);
94
95   /*!
96    * \brief Get scale factor for scale distribution
97    * 
98    * Throws SALOME_Exception if distribution type is not DT_Scale
99    */
100   double GetScaleFactor() const;
101
102   /*!
103    * \brief Set table function for distribution DT_TabFunc
104     * \param table - this vector contains the pairs (parameter, value)
105    * following each by other, so the number of elements in the vector
106    * must be even. The parameters must be in range [0,1] and sorted in
107    * increase order. The values of function must be positive.
108    * 
109    * Throws SALOME_Exception if distribution type is not DT_TabFunc
110    */
111   void SetTableFunction(const std::vector<double>& table);
112
113   /*!
114    * \brief Get table function for distribution DT_TabFunc
115    * 
116    * Throws SALOME_Exception if distribution type is not DT_TabFunc
117    */
118   const std::vector<double>& GetTableFunction() const;
119
120   /*!
121    * \brief Set expression function for distribution DT_ExprFunc
122     * \param expr - string containing the expression of the function
123     *               f(t), e.g. "sin(t)"
124    * 
125    * Throws SALOME_Exception if distribution type is not DT_ExprFunc
126    */
127   void SetExpressionFunction( const char* expr);
128
129   /*!
130    * \brief Get expression function for distribution DT_ExprFunc
131    * 
132    * Throws SALOME_Exception if distribution type is not DT_ExprFunc
133    */
134   const char* GetExpressionFunction() const;
135
136   /*!
137    * \brief Checks validity of  the expression of the function f(t), e.g. "sin(t)".
138    *        In case of validity returns a cleaned expression
139    *  \param convMode - 0 for "Exponent mode", 1 for "Cut negative mode"
140    */
141   static std::string CheckExpressionFunction( const std::string& expr,
142                                               const int          convMode);
143
144   /*!
145    * \brief Set conversion mode. When it is 0, it means "exponent mode":
146    * the function of distribution of density is used as an exponent of 10, i,e, 10^f(t).
147    * When it is 1, it means "cut negative mode". The function of distribution is used as
148    * F(t), where F(t0)=f(t0), if f(t0)>=0, otherwise F(t0) = 0.
149    * This mode is sensible only when function distribution is used (DT_TabFunc or DT_ExprFunc)
150    * 
151    * Throws SALOME_Exception if distribution type is not functional
152    */
153   void SetConversionMode( int conv );
154
155   /*!
156    * \brief Returns conversion mode
157    * 
158    * Throws SALOME_Exception if distribution type is not functional
159    */
160   int ConversionMode() const;
161
162   /*!
163    * \brief Initialize number of segments by the mesh built on the geometry
164    * \param theMesh - the built mesh
165    * \param theShape - the geometry of interest
166    * \retval bool - true if parameter values have been successfully defined
167    */
168   virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
169
170   /*!
171    * \brief Initialize my parameter values by default parameters.
172    *  \retval bool - true if parameter values have been successfully defined
173    */
174   virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
175
176   virtual std::ostream & SaveTo(std::ostream & save);
177   virtual std::istream & LoadFrom(std::istream & load);
178   friend std::ostream& operator << (std::ostream & save, StdMeshers_NumberOfSegments & hyp);
179   friend std::istream& operator >> (std::istream & load, StdMeshers_NumberOfSegments & hyp);
180
181 protected:
182   int                 _numberOfSegments; //!< an edge will be split on to this number of segments
183   DistrType           _distrType;        //!< the type of distribution of density function
184   double              _scaleFactor;      //!< the scale parameter for DT_Scale
185   std::vector<double> _table, _distr;    //!< the table for DT_TabFunc, a sequence of pairs of numbers
186   std::string         _func;             //!< the expression of the function for DT_ExprFunc
187   int                 _convMode;         //!< flag of conversion mode: 0=exponent, 1=cut negative
188 };
189
190 #endif