2 #include "StdMeshersGUI_NbSegmentsCreator.h"
3 #include "StdMeshersGUI_DistrTable.h"
4 #include "StdMeshersGUI_DistrPreview.h"
6 #include <SMESHGUI_Utils.h>
7 #include <SMESHGUI_HypothesesUtils.h>
9 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
11 #include <SalomeApp_Tools.h>
13 #include <QtxIntSpinBox.h>
14 #include <QtxComboBox.h>
15 #include <SMESHGUI_SpinBox.h>
18 #include <qgroupbox.h>
21 #include <qlineedit.h>
22 #include <qbuttongroup.h>
23 #include <qradiobutton.h>
25 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
26 : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ),
45 StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator()
49 bool StdMeshersGUI_NbSegmentsCreator::checkParams() const
51 NbSegmentsHypothesisData data_old, data_new;
52 readParamsFromHypo( data_old );
53 readParamsFromWidgets( data_new );
54 bool res = storeParamsToHypo( data_new );
55 storeParamsToHypo( data_old );
59 QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
61 QFrame* fr = new QFrame( 0, "myframe" );
62 QVBoxLayout* lay = new QVBoxLayout( fr, 5, 0 );
64 QGroupBox* GroupC1 = new QGroupBox( fr, "GroupC1" );
65 lay->addWidget( GroupC1 );
67 StdMeshers::StdMeshers_NumberOfSegments_var h =
68 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
69 myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() );
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 );
87 myName = new QLineEdit( GroupC1 );
88 myGroupLayout->addWidget( new QLabel( tr( "SMESH_NAME" ), GroupC1 ), row, 0 );
89 myGroupLayout->addWidget( myName, row, 1 );
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 );
101 // 2) type of distribution
102 myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 );
103 myDistr = new QtxComboBox( GroupC1 );
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 );
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 );
120 myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 );
121 myGroupLayout->addMultiCellWidget( myInfo, row, row, 0, 1 );
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 );
133 myGroupLayout->addWidget( myLExpr = new QLabel( tr( "SMESH_EXPR_FUNC" ), GroupC1 ), row, 0 );
134 myExpr = new QLineEdit( GroupC1 );
135 myGroupLayout->addWidget( myExpr, row, 1 );
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 );
149 // 7) distribution preview
150 myGroupLayout->addMultiCellWidget( myPreview, row, row, 0, 1 );
151 myGroupLayout->setRowStretch( row, 1 );
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() ) );
164 void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const
166 NbSegmentsHypothesisData data;
167 readParamsFromHypo( data );
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 );
179 QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
181 NbSegmentsHypothesisData data;
182 readParamsFromWidgets( data );
183 storeParamsToHypo( data );
185 QString valStr = QString::number( data.myNbSeg ) += "; ";
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
194 bool hasConv = false;
195 switch ( data.myDistrType ) {
197 valStr += tr("SMESH_DISTR_REGULAR");
200 valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );
203 //valStr += tr("SMESH_TAB_FUNC");
205 for( int i=0; i < data.myTable.length(); i++, param = !param ) {
208 valStr += QString::number( data.myTable[ i ]);
209 valStr += ( param ? "," : "]" );
215 valStr += data.myExpr;
221 valStr += "; " + tr("SMESH_CUT_NEG_MODE");
223 valStr += "; " + tr("SMESH_EXP_MODE");
228 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisData& h_data ) const
230 StdMeshers::StdMeshers_NumberOfSegments_var h =
231 StdMeshers::StdMeshers_NumberOfSegments::_narrow( initParamsHypothesis() );
233 HypothesisData* data = SMESH::GetHypothesisData( hypType() );
234 h_data.myName = isCreation() && data ? data->Label : "";
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;
242 SMESH::double_array* a = h->GetTableFunction();
248 SMESH::double_array& a = h_data.myTable;
249 // by default, constant table function f(t)=1
251 a[0] = 0.0; a[1] = 1.0;
252 a[2] = 1.0; a[3] = 1.0;
255 h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1";
256 h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1; /*cut negative by default*/
261 bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothesisData& h_data ) const
263 StdMeshers::StdMeshers_NumberOfSegments_var h =
264 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
270 SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() );
272 h->SetNumberOfSegments( h_data.myNbSeg );
273 int distr = h_data.myDistrType;
274 h->SetDistrType( distr );
277 h->SetScaleFactor( h_data.myScale );
279 if( distr==2 || distr==3 )
280 h->SetConversionMode( h_data.myConv );
283 h->SetTableFunction( h_data.myTable );
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
291 catch(const SALOME::SALOME_Exception& ex)
293 SalomeApp_Tools::QtCatchCorbaException(ex);
299 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesisData& h_data ) const
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();
311 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
313 int distr = myDistr->currentItem();
315 myScale->setShown( distr==1 );
316 myLScale->setShown( distr==1 );
318 bool isFunc = distr==2 || distr==3;
319 myPreview->setShown( isFunc );
320 myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 );
322 myConv->setShown( isFunc );
323 myLConv->setShown( isFunc );
329 myLTable->setShown( distr==2 );
330 myGroupLayout->setRowStretch( myTableRow, distr==2 ? 1 : 0 );
332 myExpr->setShown( distr==3 );
333 myLExpr->setShown( distr==3 );
334 myInfo->setShown( isFunc );
337 int nbSeg = myNbSeg->value();
338 if( distr==2 ) //preview for table-described function
340 SMESH::double_array a;
341 myTable->table()->data( a );
342 myPreview->setParams( a, nbSeg, false );
344 else if( distr==3 ) //preview for analytic-described function
345 myPreview->setParams( myExpr->text(), nbSeg, 100, false );
348 myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) );