1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #include "StdMeshersGUI_NbSegmentsCreator.h"
23 #include "StdMeshersGUI_DistrTable.h"
24 #include "StdMeshersGUI_DistrPreview.h"
26 #include <SMESHGUI_Utils.h>
27 #include <SMESHGUI_HypothesesUtils.h>
29 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
31 #include <SalomeApp_Tools.h>
33 #include <QtxIntSpinBox.h>
34 #include <QtxComboBox.h>
35 #include <QtxDblValidator.h>
36 #include <SMESHGUI_SpinBox.h>
39 #include <qgroupbox.h>
42 #include <qlineedit.h>
43 #include <qbuttongroup.h>
44 #include <qradiobutton.h>
46 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
47 : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ),
66 StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator()
70 bool StdMeshersGUI_NbSegmentsCreator::checkParams() const
72 NbSegmentsHypothesisData data_old, data_new;
73 readParamsFromHypo( data_old );
74 readParamsFromWidgets( data_new );
75 bool res = storeParamsToHypo( data_new );
76 storeParamsToHypo( data_old );
80 QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
82 QFrame* fr = new QFrame( 0, "myframe" );
83 QVBoxLayout* lay = new QVBoxLayout( fr, 5, 0 );
85 QGroupBox* GroupC1 = new QGroupBox( fr, "GroupC1" );
86 lay->addWidget( GroupC1 );
88 StdMeshers::StdMeshers_NumberOfSegments_var h =
89 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
90 myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() );
92 GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) );
93 GroupC1->setColumnLayout(0, Qt::Vertical );
94 GroupC1->layout()->setSpacing( 0 );
95 GroupC1->layout()->setMargin( 0 );
96 myGroupLayout = new QGridLayout( GroupC1->layout() );
97 myGroupLayout->setAlignment( Qt::AlignTop );
98 myGroupLayout->setSpacing( 6 );
99 myGroupLayout->setMargin( 11 );
100 myGroupLayout->setColStretch( 0, 0 );
101 myGroupLayout->setColStretch( 1, 1 );
108 myName = new QLineEdit( GroupC1 );
109 myGroupLayout->addWidget( new QLabel( tr( "SMESH_NAME" ), GroupC1 ), row, 0 );
110 myGroupLayout->addWidget( myName, row, 1 );
114 // 1) number of segments
115 myGroupLayout->addWidget( new QLabel( tr( "SMESH_NB_SEGMENTS_PARAM" ), GroupC1 ), row, 0 );
116 myNbSeg = new QtxIntSpinBox( GroupC1 );
117 myNbSeg->setMinValue( 1 );
118 myNbSeg->setMaxValue( 9999 );
119 myGroupLayout->addWidget( myNbSeg, row, 1 );
122 // 2) type of distribution
123 myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 );
124 myDistr = new QtxComboBox( GroupC1 );
126 types.append( QObject::tr( "SMESH_DISTR_REGULAR" ) );
127 types.append( QObject::tr( "SMESH_DISTR_SCALE" ) );
128 types.append( QObject::tr( "SMESH_DISTR_TAB" ) );
129 types.append( QObject::tr( "SMESH_DISTR_EXPR" ) );
130 myDistr->insertStringList( types );
131 myGroupLayout->addWidget( myDistr, row, 1 );
135 myGroupLayout->addWidget( myLScale = new QLabel( tr( "SMESH_NB_SEGMENTS_SCALE_PARAM" ), GroupC1 ), row, 0 );
136 myScale = new SMESHGUI_SpinBox( GroupC1 );
137 myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, 6 );
138 myGroupLayout->addWidget( myScale, row, 1 );
141 myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 );
142 myGroupLayout->addMultiCellWidget( myInfo, row, row, 0, 1 );
146 myGroupLayout->addWidget( myLTable = new QLabel( tr( "SMESH_TAB_FUNC" ), GroupC1 ), row, 0 );
147 myTable = new StdMeshersGUI_DistrTableFrame( GroupC1 );
148 myGroupLayout->addWidget( myTable, row, 1 );
149 myGroupLayout->setRowStretch( row, 1 );
154 myGroupLayout->addWidget( myLExpr = new QLabel( tr( "SMESH_EXPR_FUNC" ), GroupC1 ), row, 0 );
155 myExpr = new QLineEdit( GroupC1 );
156 myGroupLayout->addWidget( myExpr, row, 1 );
159 // 6) conversion (radiogroup)
160 myGroupLayout->addWidget( myLConv = new QLabel( tr( "SMESH_CONV_MODE" ), GroupC1 ), row, 0 );
161 myConv = new QButtonGroup( GroupC1 );
162 myConv->setExclusive( true );
163 myConv->setColumnLayout( 0, Qt::Vertical );
164 QGridLayout* convLay = new QGridLayout( myConv->layout() );
165 convLay->addWidget( new QRadioButton( tr( "SMESH_EXP_MODE" ), myConv ), 0, 0 );
166 convLay->addWidget( myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConv ), 1, 0 );
167 myGroupLayout->addWidget( myConv, row, 1 );
170 // 7) distribution preview
171 myGroupLayout->addMultiCellWidget( myPreview, row, row, 0, 1 );
172 myGroupLayout->setRowStretch( row, 1 );
176 connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
177 connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) );
178 connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) );
179 connect( myExpr, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
180 connect( myConv, SIGNAL( clicked( int ) ), this, SLOT( onValueChanged() ) );
185 void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const
187 NbSegmentsHypothesisData data;
188 readParamsFromHypo( data );
191 myName->setText( data.myName );
192 myNbSeg->setValue( data.myNbSeg );
193 myDistr->setCurrentItem( data.myDistrType );
194 myScale->setValue( data.myScale );
195 myConv->setButton( data.myConv );
196 myTable->table()->funcValidator()->setBottom(myConv->id( myConv->selected() )==0 ? -1E20 : 0);
197 myTable->table()->setData( data.myTable );
198 myExpr->setText( data.myExpr );
201 QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
203 NbSegmentsHypothesisData data;
204 readParamsFromWidgets( data );
205 storeParamsToHypo( data );
207 QString valStr = QString::number( data.myNbSeg ) += "; ";
211 Regular, //!< equidistant distribution
212 Scale, //!< scale distribution
213 TabFunc, //!< distribution with density function presented by table
214 ExprFunc //!< distribution with density function presented by expression
216 bool hasConv = false;
217 switch ( data.myDistrType ) {
219 valStr += tr("SMESH_DISTR_REGULAR");
222 valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );
225 //valStr += tr("SMESH_TAB_FUNC");
227 for( int i=0; i < data.myTable.length(); i++, param = !param ) {
230 valStr += QString::number( data.myTable[ i ]);
231 valStr += ( param ? "," : "]" );
237 valStr += data.myExpr;
243 valStr += "; " + tr("SMESH_CUT_NEG_MODE");
245 valStr += "; " + tr("SMESH_EXP_MODE");
250 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisData& h_data ) const
252 StdMeshers::StdMeshers_NumberOfSegments_var h =
253 StdMeshers::StdMeshers_NumberOfSegments::_narrow( initParamsHypothesis() );
255 h_data.myName = hypName();
257 h_data.myNbSeg = (int) h->GetNumberOfSegments();
258 int distr = (int) h->GetDistrType();
259 h_data.myDistrType = distr;
260 h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0;
263 SMESH::double_array* a = h->GetTableFunction();
269 SMESH::double_array& a = h_data.myTable;
270 // by default, constant table function f(t)=1
272 a[0] = 0.0; a[1] = 1.0;
273 a[2] = 1.0; a[3] = 1.0;
276 h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1";
277 h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1; /*cut negative by default*/
282 bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothesisData& h_data ) const
284 StdMeshers::StdMeshers_NumberOfSegments_var h =
285 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
291 SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() );
293 h->SetNumberOfSegments( h_data.myNbSeg );
294 int distr = h_data.myDistrType;
295 h->SetDistrType( distr );
298 h->SetScaleFactor( h_data.myScale );
300 if( distr==2 || distr==3 )
301 h->SetConversionMode( h_data.myConv );
304 h->SetTableFunction( h_data.myTable );
307 h->SetExpressionFunction( h_data.myExpr.latin1() );
308 //setting of function must follow after setConversionMode, because otherwise
309 //the function will be checked with old conversion mode, so that it may occurs
310 //unexpected errors for user
312 catch(const SALOME::SALOME_Exception& ex)
314 SalomeApp_Tools::QtCatchCorbaException(ex);
320 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesisData& h_data ) const
322 h_data.myName = myName ? myName->text() : "";
323 h_data.myNbSeg = myNbSeg->value();
324 h_data.myDistrType = myDistr->currentItem();
325 h_data.myConv = myConv->id( myConv->selected() );
326 h_data.myScale = myScale->value();
327 myTable->table()->data( h_data.myTable );
328 h_data.myExpr = myExpr->text();
332 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
334 int distr = myDistr->currentItem();
336 /* if( distr==2 ) //table func
337 myCutNeg->setText( tr( "SMESH_NO_CONV" ) );
339 myCutNeg->setText( tr( "SMESH_CUT_NEG_MODE" ) );*/
341 if( distr==2 && sender()==myConv ) //table func
343 myTable->table()->funcValidator()->setBottom( myConv->id( myConv->selected() )==0 ? -1E20 : 0 );
344 SMESH::double_array arr;
345 myTable->table()->data( arr );
346 myTable->table()->setData( arr ); //update data in table
349 myScale->setShown( distr==1 );
350 myLScale->setShown( distr==1 );
352 bool isFunc = distr==2 || distr==3;
353 myPreview->setShown( isFunc );
354 myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 );
356 myConv->setShown( isFunc );
357 myLConv->setShown( isFunc );
363 myLTable->setShown( distr==2 );
364 myGroupLayout->setRowStretch( myTableRow, distr==2 ? 1 : 0 );
366 myExpr->setShown( distr==3 );
367 myLExpr->setShown( distr==3 );
368 myInfo->setShown( isFunc );
371 int nbSeg = myNbSeg->value();
372 if( distr==2 ) //preview for table-described function
374 SMESH::double_array a;
375 myTable->table()->data( a );
376 myPreview->setParams( a, nbSeg, false );
378 else if( distr==3 ) //preview for analytic-described function
379 myPreview->setParams( myExpr->text(), nbSeg, 100, false );
382 myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) );