Salome HOME
0af344fb2650d03296c254a57d7d77398d67c77b
[modules/smesh.git] / src / StdMeshersGUI / StdMeshersGUI_Parameters.cxx
1 //  SMESH StdMeshersGUI : GUI for standard meshers
2 //
3 //  Copyright (C) 2003  CEA
4 // 
5 //  This library is free software; you can redistribute it and/or 
6 //  modify it under the terms of the GNU Lesser General Public 
7 //  License as published by the Free Software Foundation; either 
8 //  version 2.1 of the License. 
9 // 
10 //  This library is distributed in the hope that it will be useful, 
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
13 //  Lesser General Public License for more details. 
14 // 
15 //  You should have received a copy of the GNU Lesser General Public 
16 //  License along with this library; if not, write to the Free Software 
17 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
18 // 
19 //  See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
20 //
21 //
22 //
23 //  File   : StdMeshersGUI_Parameters.cxx
24 //  Module : SMESH
25 //  $Header$
26
27 #include "StdMeshersGUI_Parameters.h"
28
29 #include <qobject.h>
30
31 using namespace std;
32
33 //=======================================================================
34 //function : HasParameters
35 //purpose  : 
36 //=======================================================================
37
38 bool StdMeshersGUI_Parameters::HasParameters (const QString& hypType)
39 {
40   return ((hypType.compare("LocalLength") == 0) ||
41           (hypType.compare("NumberOfSegments") == 0) ||
42           (hypType.compare("MaxElementArea") == 0) ||
43           (hypType.compare("MaxElementVolume") == 0) ||
44           (hypType.compare("StartEndLength") == 0) ||
45           (hypType.compare("Deflection1D") == 0) ||
46           (hypType.compare("Arithmetic1D") == 0));
47 }
48
49 //=======================================================================
50 //function : SetInitValue
51 //purpose  : 
52 //=======================================================================
53
54 void StdMeshersGUI_Parameters::SetInitValue(SMESHGUI_aParameterPtr param,
55                                             int                    initValue)
56 {
57   SMESHGUI_intParameter* p = dynamic_cast<SMESHGUI_intParameter*>(param.get());
58   if ( p ) p->InitValue() = initValue;
59 }
60
61 //=======================================================================
62 //function : SetInitValue
63 //purpose  : 
64 //=======================================================================
65
66 void StdMeshersGUI_Parameters::SetInitValue(SMESHGUI_aParameterPtr param,
67                                             double                 initValue)
68 {
69   SMESHGUI_doubleParameter* p = dynamic_cast<SMESHGUI_doubleParameter*>(param.get());
70   if ( p ) p->InitValue() = initValue;
71 }
72
73 //=======================================================================
74 //function : SetInitValue
75 //purpose  : 
76 //=======================================================================
77
78 void StdMeshersGUI_Parameters::SetInitValue(SMESHGUI_aParameterPtr param,
79                                             const char*            initValue)
80 {
81   SMESHGUI_strParameter* p = dynamic_cast<SMESHGUI_strParameter*>(param.get());
82   if ( p ) p->InitValue() = initValue;
83 }
84
85 //=======================================================================
86 //function : GetParameters
87 //purpose  : 
88 //=======================================================================
89
90 // SMESHGUI_doubleParameter( initValue, label, bottom, top, step, decimals )
91 #define DOUBLE_PARAM(v,l,b,t,s,d) SMESHGUI_aParameterPtr(new SMESHGUI_doubleParameter(v,l,b,t,s,d))
92 #define INT_PARAM(v,l,b,t) SMESHGUI_aParameterPtr(new SMESHGUI_intParameter(v,l,b,t))
93
94 void StdMeshersGUI_Parameters::GetParameters (const QString&                 hypType,
95                                               list<SMESHGUI_aParameterPtr> & paramList )
96 {
97   paramList.clear();
98
99   if (hypType.compare("LocalLength") == 0)
100   {
101     paramList.push_back( DOUBLE_PARAM (1.0,
102                                        QObject::tr("SMESH_LOCAL_LENGTH_PARAM"),
103                                        1E-3, 999.999, 1.0, 6));
104   }
105   else if (hypType.compare("NumberOfSegments") == 0)
106   {
107     paramList.push_back ( INT_PARAM (3,
108                                      QObject::tr("SMESH_NB_SEGMENTS_PARAM"),
109                                      1, 9999 ));
110   }
111   else if (hypType.compare("Arithmetic1D") == 0)
112   {
113     paramList.push_back( DOUBLE_PARAM ( 1.0,
114                                       QObject::tr("SMESH_START_LENGTH_PARAM"), 
115                                       1E-3, 999.999, 1, 6));
116     paramList.push_back( DOUBLE_PARAM ( 10.0,
117                                        QObject::tr("SMESH_END_LENGTH_PARAM"),
118                                        1E-3, 999.999, 1, 6));
119   }
120   else if (hypType.compare("MaxElementArea") == 0)
121   {
122     paramList.push_back( DOUBLE_PARAM (1.0,
123                                        QObject::tr("SMESH_MAX_ELEMENT_AREA_PARAM"), 
124                                        1.E-6, 999999.999, 1.0, 6));
125   }
126   else if (hypType.compare("MaxElementVolume") == 0)
127   {
128     paramList.push_back( DOUBLE_PARAM ( 1.0,
129                                        QObject::tr("SMESH_MAX_ELEMENT_VOLUME_PARAM"), 
130                                        1.E-9, 1.E9, 1.0, 6));
131   }
132   else if (hypType.compare("StartEndLength") == 0)
133   {
134     paramList.push_back( DOUBLE_PARAM ( 1.0,
135                                       QObject::tr("SMESH_START_LENGTH_PARAM"), 
136                                       1.0E-3, 999.999, 1, 6));
137     paramList.push_back( DOUBLE_PARAM ( 10.0,
138                                        QObject::tr("SMESH_END_LENGTH_PARAM"),
139                                        1.0E-3, 999.999, 1, 6));
140   }
141   else if (hypType.compare("Deflection1D") == 0)
142   {
143     paramList.push_back( DOUBLE_PARAM ( 1.0,
144                                        QObject::tr("SMESH_DEFLECTION1D_PARAM"), 
145                                        1.0E-3, 999.999, 1, 6));
146   }
147 }
148   
149 //=======================================================================
150 //function : GetParameters
151 //purpose  : 
152 //=======================================================================
153
154 void StdMeshersGUI_Parameters::GetParameters (SMESH::SMESH_Hypothesis_ptr    theHyp,
155                                               list<SMESHGUI_aParameterPtr> & paramList )
156 {
157   paramList.clear();
158
159   if (theHyp->_is_nil()) return;
160
161   QString hypType = theHyp->GetName();
162   GetParameters( hypType, paramList ); // get default parameters
163   if ( paramList.empty() )
164     return;
165
166   // set current values
167   if (hypType.compare("LocalLength") == 0)
168   {
169     StdMeshers::StdMeshers_LocalLength_var LL =
170       StdMeshers::StdMeshers_LocalLength::_narrow(theHyp);
171     SetInitValue( paramList.front(), LL->GetLength() );
172   }
173   else if (hypType.compare("NumberOfSegments") == 0)
174   {
175     StdMeshers::StdMeshers_NumberOfSegments_var NOS =
176       StdMeshers::StdMeshers_NumberOfSegments::_narrow(theHyp);
177     SetInitValue( paramList.front(), (int) NOS->GetNumberOfSegments());
178   }
179   else if (hypType.compare("Arithmetic1D") == 0)
180   {
181     StdMeshers::StdMeshers_Arithmetic1D_var hyp =
182       StdMeshers::StdMeshers_Arithmetic1D::_narrow(theHyp);
183     SetInitValue( paramList.front(), hyp->GetLength( true )) ;
184     SetInitValue( paramList.back(), hyp->GetLength( false )) ;
185   }
186   else if (hypType.compare("MaxElementArea") == 0)
187   {
188     StdMeshers::StdMeshers_MaxElementArea_var MEA =
189       StdMeshers::StdMeshers_MaxElementArea::_narrow(theHyp);
190     SetInitValue( paramList.front(), MEA->GetMaxElementArea() );
191   }
192   else if (hypType.compare("MaxElementVolume") == 0)
193   {
194     StdMeshers::StdMeshers_MaxElementVolume_var MEV =
195       StdMeshers::StdMeshers_MaxElementVolume::_narrow(theHyp);
196     SetInitValue( paramList.front(), MEV->GetMaxElementVolume() );
197   }
198   else if (hypType.compare("StartEndLength") == 0)
199   {
200     StdMeshers::StdMeshers_StartEndLength_var hyp =
201       StdMeshers::StdMeshers_StartEndLength::_narrow(theHyp);
202     SetInitValue( paramList.front(), hyp->GetLength( true ));
203     SetInitValue( paramList.back(),  hyp->GetLength( false ));
204   }
205   else if (hypType.compare("Deflection1D") == 0)
206   {
207     StdMeshers::StdMeshers_Deflection1D_var hyp =
208       StdMeshers::StdMeshers_Deflection1D::_narrow(theHyp);
209     SetInitValue( paramList.back(),  hyp->GetDeflection()) ;
210   }
211 }
212
213 //=======================================================================
214 //function : GetParameters
215 //purpose  : 
216 //=======================================================================  
217 void StdMeshersGUI_Parameters::GetParameters (SMESH::SMESH_Hypothesis_ptr         hyp,
218                                               list<SMESHGUI_aParameterPtr> &      paramList,
219                                               QString&                            params)
220 {
221   params = "";
222   list<SMESHGUI_aParameterPtr>::iterator paramIt = paramList.begin();
223   for ( ; paramIt != paramList.end(); paramIt++) {
224     if (params.compare("")) params += " ; ";
225
226     if ((*paramIt)->GetType() == SMESHGUI_aParameter::DOUBLE ) {
227       double aDoubleValue = 0.;
228       (*paramIt)->GetNewDouble(aDoubleValue);
229       params += QString::number(aDoubleValue);
230     }
231     else if ((*paramIt)->GetType() == SMESHGUI_aParameter::TEXT ) {
232       QString aStrValue( "" );
233       (*paramIt)->GetNewText(aStrValue);
234       params += aStrValue.simplifyWhiteSpace();
235     }
236     else {
237       int aIntValue = 0;
238       (*paramIt)->GetNewInt(aIntValue);
239       params += QString::number(aIntValue);;
240     }
241   }
242 }
243
244 //=======================================================================
245 //function : SetParameters
246 //purpose  : 
247 //=======================================================================
248
249 bool StdMeshersGUI_Parameters::SetParameters(SMESH::SMESH_Hypothesis_ptr          theHyp,
250                                              const list<SMESHGUI_aParameterPtr> & paramList )
251 {
252   if (theHyp->_is_nil() || paramList.empty()) return false;
253
254   bool modified = false;
255
256   QString hypType = theHyp->GetName();
257
258   if (hypType.compare("LocalLength") == 0)
259   {
260     StdMeshers::StdMeshers_LocalLength_var LL =
261       StdMeshers::StdMeshers_LocalLength::_narrow(theHyp);
262     double length = LL->GetLength();
263     modified = paramList.front()->GetNewDouble( length );
264     LL->SetLength(length);
265   }
266   else if (hypType.compare("NumberOfSegments") == 0)
267   {
268     StdMeshers::StdMeshers_NumberOfSegments_var NOS =
269       StdMeshers::StdMeshers_NumberOfSegments::_narrow(theHyp);
270     int NbSeg = NOS->GetNumberOfSegments();
271     modified = paramList.front()->GetNewInt( NbSeg );
272     NOS->SetNumberOfSegments(NbSeg);
273   }
274   else if (hypType.compare("Arithmetic1D") == 0)
275   {
276     if ( paramList.size() != 2 )
277       return false;
278     StdMeshers::StdMeshers_Arithmetic1D_var hyp =
279       StdMeshers::StdMeshers_Arithmetic1D::_narrow(theHyp);
280     double begLength = hyp->GetLength( true ) ;
281     double endLength = hyp->GetLength( false ) ;
282     modified = paramList.front()->GetNewDouble( begLength );
283     modified = paramList.back()->GetNewDouble( endLength ) || modified;
284     hyp->SetLength( begLength, true );
285     hyp->SetLength( endLength, false );
286   }
287   else if (hypType.compare("MaxElementArea") == 0)
288   {
289     StdMeshers::StdMeshers_MaxElementArea_var MEA =
290       StdMeshers::StdMeshers_MaxElementArea::_narrow(theHyp);
291     double MaxArea = MEA->GetMaxElementArea();
292     modified = paramList.front()->GetNewDouble( MaxArea );
293     MEA->SetMaxElementArea(MaxArea);
294   }
295   else if (hypType.compare("MaxElementVolume") == 0)
296   {
297     StdMeshers::StdMeshers_MaxElementVolume_var MEV =
298       StdMeshers::StdMeshers_MaxElementVolume::_narrow(theHyp);
299     double MaxVolume = MEV->GetMaxElementVolume() ;
300     modified = paramList.front()->GetNewDouble( MaxVolume );
301     MEV->SetMaxElementVolume(MaxVolume);
302   }
303   else if (hypType.compare("StartEndLength") == 0)
304   {
305     if ( paramList.size() != 2 )
306       return false;
307     StdMeshers::StdMeshers_StartEndLength_var hyp =
308       StdMeshers::StdMeshers_StartEndLength::_narrow(theHyp);
309     double begLength = hyp->GetLength( true ) ;
310     double endLength = hyp->GetLength( false ) ;
311     modified = paramList.front()->GetNewDouble( begLength );
312     modified = paramList.back()->GetNewDouble( endLength ) || modified;
313     hyp->SetLength( begLength, true );
314     hyp->SetLength( endLength, false );
315   }
316   else if (hypType.compare("Deflection1D") == 0)
317   {
318     StdMeshers::StdMeshers_Deflection1D_var hyp =
319       StdMeshers::StdMeshers_Deflection1D::_narrow(theHyp);
320     double value = hyp->GetDeflection() ;
321     modified = paramList.front()->GetNewDouble( value );
322     hyp->SetDeflection( value );
323   }
324   return modified ;
325 }
326