Salome HOME
PAL10940: return string from storeParams()
[modules/smesh.git] / src / StdMeshersGUI / StdMeshersGUI_NbSegmentsCreator.cxx
1
2 #include "StdMeshersGUI_NbSegmentsCreator.h"
3 #include "StdMeshersGUI_DistrTable.h"
4 #include "StdMeshersGUI_DistrPreview.h"
5
6 #include <SMESHGUI_Utils.h>
7 #include <SMESHGUI_HypothesesUtils.h>
8
9 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
10
11 #include <SalomeApp_Tools.h>
12
13 #include <QtxIntSpinBox.h>
14 #include <QtxComboBox.h>
15 #include <SMESHGUI_SpinBox.h>
16
17 #include <qlabel.h>
18 #include <qgroupbox.h>
19 #include <qframe.h>
20 #include <qlayout.h>
21 #include <qlineedit.h>
22 #include <qbuttongroup.h>
23 #include <qradiobutton.h>
24
25 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
26 : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ),
27   myNbSeg( 0 ),
28   myDistr( 0 ),
29   myScale( 0 ),
30   myTable( 0 ),
31   myPreview( 0 ),
32   myExpr( 0 ),
33   myConv( 0 ),
34   myLScale( 0 ),
35   myLTable( 0 ),
36   myLExpr( 0 ),
37   myLConv( 0 ),
38   myInfo( 0 ),
39   myGroupLayout( 0 ),
40   myTableRow( 0 ),
41   myPreviewRow( 0 )
42 {
43 }
44
45 StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator()
46 {
47 }
48
49 bool StdMeshersGUI_NbSegmentsCreator::checkParams() const
50 {
51   NbSegmentsHypothesisData data_old, data_new;
52   readParamsFromHypo( data_old );
53   readParamsFromWidgets( data_new );
54   bool res = storeParamsToHypo( data_new );
55   storeParamsToHypo( data_old );
56   return res;
57 }
58
59 QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
60 {
61   QFrame* fr = new QFrame( 0, "myframe" );
62   QVBoxLayout* lay = new QVBoxLayout( fr, 5, 0 );
63
64   QGroupBox* GroupC1 = new QGroupBox( fr, "GroupC1" );
65   lay->addWidget( GroupC1 );
66
67   StdMeshers::StdMeshers_NumberOfSegments_var h =
68     StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
69   myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() );
70
71   GroupC1->setTitle( tr( "SMESH_ARGUMENTS"  ) );
72   GroupC1->setColumnLayout(0, Qt::Vertical );
73   GroupC1->layout()->setSpacing( 0 );
74   GroupC1->layout()->setMargin( 0 );
75   myGroupLayout = new QGridLayout( GroupC1->layout() );
76   myGroupLayout->setAlignment( Qt::AlignTop );
77   myGroupLayout->setSpacing( 6 );
78   myGroupLayout->setMargin( 11 );
79   myGroupLayout->setColStretch( 0, 0 );
80   myGroupLayout->setColStretch( 1, 1 );
81
82   int row = 0;
83   // 0)  name
84   myName = 0;
85   if( isCreation() )
86   {
87     myName = new QLineEdit( GroupC1 );
88     myGroupLayout->addWidget( new QLabel( tr( "SMESH_NAME" ), GroupC1 ), row, 0 );
89     myGroupLayout->addWidget( myName, row, 1 );
90     row++;
91   }
92
93   // 1)  number of segments
94   myGroupLayout->addWidget( new QLabel( tr( "SMESH_NB_SEGMENTS_PARAM" ), GroupC1 ), row, 0 );
95   myNbSeg = new QtxIntSpinBox( GroupC1 );
96   myNbSeg->setMinValue( 1 );
97   myNbSeg->setMaxValue( 9999 );
98   myGroupLayout->addWidget( myNbSeg, row, 1 );
99   row++;
100
101   // 2)  type of distribution
102   myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 );
103   myDistr = new QtxComboBox( GroupC1 );
104   QStringList types;
105   types.append( QObject::tr( "SMESH_DISTR_REGULAR" ) );
106   types.append( QObject::tr( "SMESH_DISTR_SCALE"   ) );
107   types.append( QObject::tr( "SMESH_DISTR_TAB"     ) );
108   types.append( QObject::tr( "SMESH_DISTR_EXPR"    ) );
109   myDistr->insertStringList( types );
110   myGroupLayout->addWidget( myDistr, row, 1 );
111   row++;
112
113   // 3)  scale
114   myGroupLayout->addWidget( myLScale = new QLabel( tr( "SMESH_NB_SEGMENTS_SCALE_PARAM" ), GroupC1 ), row, 0 );
115   myScale = new SMESHGUI_SpinBox( GroupC1 );
116   myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, 6 );
117   myGroupLayout->addWidget( myScale, row, 1 );
118   row++;
119
120   myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 );
121   myGroupLayout->addMultiCellWidget( myInfo, row, row, 0, 1 );
122   row++;
123   
124   // 4)  table
125   myGroupLayout->addWidget( myLTable = new QLabel( tr( "SMESH_TAB_FUNC" ), GroupC1 ), row, 0 );
126   myTable = new StdMeshersGUI_DistrTableFrame( GroupC1 );
127   myGroupLayout->addWidget( myTable, row, 1 );
128   myGroupLayout->setRowStretch( row, 1 );
129   myTableRow = row;
130   row++;
131
132   // 5)  expression
133   myGroupLayout->addWidget( myLExpr = new QLabel( tr( "SMESH_EXPR_FUNC" ), GroupC1 ), row, 0 );
134   myExpr = new QLineEdit( GroupC1 );
135   myGroupLayout->addWidget( myExpr, row, 1 );
136   row++;
137
138   // 6)  conversion (radiogroup)
139   myGroupLayout->addWidget( myLConv = new QLabel( tr( "SMESH_CONV_MODE" ), GroupC1 ), row, 0 );
140   myConv = new QButtonGroup( GroupC1 );
141   myConv->setExclusive( true );
142   myConv->setColumnLayout( 0, Qt::Vertical );
143   QGridLayout* convLay = new QGridLayout( myConv->layout() );
144   convLay->addWidget( new QRadioButton( tr( "SMESH_EXP_MODE" ), myConv ), 0, 0 );
145   convLay->addWidget( new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConv ), 1, 0 );
146   myGroupLayout->addWidget( myConv, row, 1 );
147   row++;
148
149   // 7) distribution preview
150   myGroupLayout->addMultiCellWidget( myPreview, row, row, 0, 1 );
151   myGroupLayout->setRowStretch( row, 1 );
152   myPreviewRow = row;
153   row++;
154
155   connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
156   connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) );
157   connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) );
158   connect( myExpr,  SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
159   connect( myConv,  SIGNAL( clicked( int ) ), this, SLOT( onValueChanged() ) );
160
161   return fr;
162 }
163
164 void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const
165 {
166   NbSegmentsHypothesisData data;
167   readParamsFromHypo( data );
168
169   if( myName )
170     myName->setText( data.myName );
171   myNbSeg->setValue( data.myNbSeg );
172   myDistr->setCurrentItem( data.myDistrType );
173   myScale->setValue( data.myScale );
174   myConv->setButton( data.myConv );
175   myTable->table()->setData( data.myTable );
176   myExpr->setText( data.myExpr );
177 }
178
179 QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
180 {
181   NbSegmentsHypothesisData data;
182   readParamsFromWidgets( data );
183   storeParamsToHypo( data );
184
185   QString valStr = QString::number( data.myNbSeg ) += "; ";
186
187   enum DistrType
188   {
189     Regular, //!< equidistant distribution
190     Scale,   //!< scale distribution
191     TabFunc, //!< distribution with density function presented by table
192     ExprFunc //!< distribution with density function presented by expression
193   };
194   bool hasConv = false;
195   switch ( data.myDistrType ) {
196   case Regular :
197     valStr += tr("SMESH_DISTR_REGULAR");
198     break;
199   case Scale   :
200     valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );
201     break;
202   case TabFunc : {
203     //valStr += tr("SMESH_TAB_FUNC");
204     bool param = true;
205     for( int i=0; i < data.myTable.length(); i++, param = !param ) {
206       if ( param )
207         valStr += "[";
208       valStr += QString::number( data.myTable[ i ]);
209       valStr += ( param ? "," : "]" );
210     }
211     hasConv = true;
212     break;
213   }
214   case ExprFunc:
215     valStr += data.myExpr;
216     hasConv = true;
217     break;
218   }
219   if ( hasConv )
220     if ( data.myConv )
221       valStr += "; " + tr("SMESH_CUT_NEG_MODE");
222     else
223       valStr += "; " + tr("SMESH_EXP_MODE");
224
225   return valStr;
226 }
227
228 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisData& h_data ) const
229 {
230   StdMeshers::StdMeshers_NumberOfSegments_var h =
231     StdMeshers::StdMeshers_NumberOfSegments::_narrow( initParamsHypothesis() );
232
233   HypothesisData* data = SMESH::GetHypothesisData( hypType() );
234   h_data.myName = isCreation() && data ? data->Label : "";
235
236   h_data.myNbSeg = (int) h->GetNumberOfSegments();
237   int distr = (int) h->GetDistrType();
238   h_data.myDistrType = distr;
239   h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0;
240   if( distr==2 )
241   {
242     SMESH::double_array* a = h->GetTableFunction();
243     h_data.myTable = *a;
244     delete a;
245   }
246   else
247   {
248     SMESH::double_array& a = h_data.myTable;
249     // by default, constant table function f(t)=1
250     a.length( 4 );
251     a[0] = 0.0; a[1] = 1.0;
252     a[2] = 1.0; a[3] = 1.0; 
253   }
254
255   h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1";
256   h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1; /*cut negative by default*/
257
258   return true;
259 }
260
261 bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothesisData& h_data ) const
262 {
263   StdMeshers::StdMeshers_NumberOfSegments_var h =
264     StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
265
266   bool ok = true;
267   try
268   {
269     if( isCreation() )
270       SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() );
271
272     h->SetNumberOfSegments( h_data.myNbSeg );
273     int distr = h_data.myDistrType;
274     h->SetDistrType( distr );
275
276     if( distr==1 )
277       h->SetScaleFactor( h_data.myScale );
278
279     if( distr==2 || distr==3 )
280       h->SetConversionMode( h_data.myConv );
281
282     if( distr==2 )
283       h->SetTableFunction( h_data.myTable );
284
285     if( distr==3 )
286       h->SetExpressionFunction( h_data.myExpr.latin1() );
287     //setting of function must follow after setConversionMode, because otherwise
288     //the function will be checked with old conversion mode, so that it may occurs
289     //unexpected errors for user
290   }
291   catch(const SALOME::SALOME_Exception& ex)
292   {
293     SalomeApp_Tools::QtCatchCorbaException(ex);
294     ok = false;
295   }
296   return ok;
297 }
298
299 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesisData& h_data ) const
300 {
301   h_data.myName      = myName ? myName->text() : "";
302   h_data.myNbSeg     = myNbSeg->value();
303   h_data.myDistrType = myDistr->currentItem();
304   h_data.myConv      = myConv->id( myConv->selected() );
305   h_data.myScale     = myScale->value();
306   myTable->table()->data( h_data.myTable );
307   h_data.myExpr      = myExpr->text();
308   return true;
309 }
310
311 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
312 {
313   int distr = myDistr->currentItem();
314
315   myScale->setShown( distr==1 );
316   myLScale->setShown( distr==1 );
317
318   bool isFunc = distr==2 || distr==3;
319   myPreview->setShown( isFunc );
320   myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 );
321
322   myConv->setShown( isFunc );
323   myLConv->setShown( isFunc );
324
325   if( distr==2 )
326     myTable->show();
327   else
328     myTable->hide();
329   myLTable->setShown( distr==2 );
330   myGroupLayout->setRowStretch( myTableRow, distr==2 ? 1 : 0 );
331
332   myExpr->setShown( distr==3 );
333   myLExpr->setShown( distr==3 );
334   myInfo->setShown( isFunc );
335
336   //change of preview
337   int nbSeg = myNbSeg->value();
338   if( distr==2 ) //preview for table-described function
339   {
340     SMESH::double_array a;
341     myTable->table()->data( a );
342     myPreview->setParams( a, nbSeg, false );
343   }
344   else if( distr==3 ) //preview for analytic-described function
345     myPreview->setParams( myExpr->text(), nbSeg, 100, false );
346
347   if( isFunc )
348     myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) );
349 }