Salome HOME
a071169aea30d1d02833fec9ac8f5d6970cb6fcd
[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 void StdMeshersGUI_NbSegmentsCreator::storeParams() const
180 {
181   NbSegmentsHypothesisData data;
182   readParamsFromWidgets( data );
183   storeParamsToHypo( data );
184 }
185
186 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisData& h_data ) const
187 {
188   StdMeshers::StdMeshers_NumberOfSegments_var h =
189     StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
190
191   HypothesisData* data = SMESH::GetHypothesisData( hypType() );
192   h_data.myName = isCreation() && data ? data->Label : "";
193
194   h_data.myNbSeg = (int) h->GetNumberOfSegments();
195   int distr = (int) h->GetDistrType();
196   h_data.myDistrType = distr;
197   h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0;
198   if( distr==2 )
199   {
200     SMESH::double_array* a = h->GetTableFunction();
201     h_data.myTable = *a;
202     delete a;
203   }
204   else
205   {
206     SMESH::double_array& a = h_data.myTable;
207     // by default, constant table function f(t)=1
208     a.length( 4 );
209     a[0] = 0.0; a[1] = 1.0;
210     a[2] = 1.0; a[3] = 1.0; 
211   }
212
213   h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1";
214   h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1; /*cut negative by default*/
215
216   return true;
217 }
218
219 bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothesisData& h_data ) const
220 {
221   StdMeshers::StdMeshers_NumberOfSegments_var h =
222     StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
223
224   bool ok = true;
225   try
226   {
227     if( isCreation() )
228       SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() );
229
230     h->SetNumberOfSegments( h_data.myNbSeg );
231     int distr = h_data.myDistrType;
232     h->SetDistrType( distr );
233
234     if( distr==1 )
235       h->SetScaleFactor( h_data.myScale );
236
237     if( distr==2 || distr==3 )
238       h->SetConversionMode( h_data.myConv );
239
240     if( distr==2 )
241       h->SetTableFunction( h_data.myTable );
242
243     if( distr==3 )
244       h->SetExpressionFunction( h_data.myExpr.latin1() );
245     //setting of function must follow after setConversionMode, because otherwise
246     //the function will be checked with old conversion mode, so that it may occurs
247     //unexpected errors for user
248   }
249   catch(const SALOME::SALOME_Exception& ex)
250   {
251     SalomeApp_Tools::QtCatchCorbaException(ex);
252     ok = false;
253   }
254   return ok;
255 }
256
257 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesisData& h_data ) const
258 {
259   h_data.myName      = myName ? myName->text() : "";
260   h_data.myNbSeg     = myNbSeg->value();
261   h_data.myDistrType = myDistr->currentItem();
262   h_data.myConv      = myConv->id( myConv->selected() );
263   h_data.myScale     = myScale->value();
264   myTable->table()->data( h_data.myTable );
265   h_data.myExpr      = myExpr->text();
266   return true;
267 }
268
269 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
270 {
271   int distr = myDistr->currentItem();
272
273   myScale->setShown( distr==1 );
274   myLScale->setShown( distr==1 );
275
276   bool isFunc = distr==2 || distr==3;
277   myPreview->setShown( isFunc );
278   myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 );
279
280   myConv->setShown( isFunc );
281   myLConv->setShown( isFunc );
282
283   if( distr==2 )
284     myTable->show();
285   else
286     myTable->hide();
287   myLTable->setShown( distr==2 );
288   myGroupLayout->setRowStretch( myTableRow, distr==2 ? 1 : 0 );
289
290   myExpr->setShown( distr==3 );
291   myLExpr->setShown( distr==3 );
292   myInfo->setShown( isFunc );
293
294   //change of preview
295   int nbSeg = myNbSeg->value();
296   if( distr==2 ) //preview for table-described function
297   {
298     SMESH::double_array a;
299     myTable->table()->data( a );
300     myPreview->setParams( a, nbSeg, false );
301   }
302   else if( distr==3 ) //preview for analytic-described function
303     myPreview->setParams( myExpr->text(), nbSeg, 100, false );
304
305   if( isFunc )
306     myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) );
307 }