00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "StdMeshersGUI_NbSegmentsCreator.h"
00028 #include "StdMeshersGUI_DistrTable.h"
00029 #include "StdMeshersGUI_DistrPreview.h"
00030 #include "StdMeshersGUI_SubShapeSelectorWdg.h"
00031
00032 #include <SMESHGUI.h>
00033 #include <SMESHGUI_Utils.h>
00034 #include <SMESHGUI_HypothesesUtils.h>
00035 #include <SMESHGUI_SpinBox.h>
00036
00037
00038 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
00039
00040
00041 #include <SalomeApp_Tools.h>
00042 #include <SalomeApp_IntSpinBox.h>
00043 #include <QtxComboBox.h>
00044
00045
00046 #include <QLabel>
00047 #include <QGroupBox>
00048 #include <QFrame>
00049 #include <QLineEdit>
00050 #include <QButtonGroup>
00051 #include <QRadioButton>
00052 #include <QGridLayout>
00053 #include <QVBoxLayout>
00054 #include <QHBoxLayout>
00055 #include <QApplication>
00056
00057 #define SPACING 6
00058 #define MARGIN 11
00059
00060 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
00061 : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ),
00062 myNbSeg( 0 ),
00063 myDistr( 0 ),
00064 myScale( 0 ),
00065 myTable( 0 ),
00066 myPreview( 0 ),
00067 myExpr( 0 ),
00068 myConvBox( 0 ),
00069 myConv( 0 ),
00070 myLScale( 0 ),
00071 myLTable( 0 ),
00072 myLExpr( 0 ),
00073 myInfo( 0 ),
00074 myGroupLayout( 0 ),
00075 myTableRow( 0 ),
00076 myPreviewRow( 0 )
00077 {
00078 }
00079
00080 StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator()
00081 {
00082 }
00083
00084 bool StdMeshersGUI_NbSegmentsCreator::checkParams( QString& msg ) const
00085 {
00086 if( !SMESHGUI_GenericHypothesisCreator::checkParams( msg ) )
00087 return false;
00088 NbSegmentsHypothesisData data_old, data_new;
00089 readParamsFromHypo( data_old );
00090 readParamsFromWidgets( data_new );
00091 bool res = storeParamsToHypo( data_new );
00092 storeParamsToHypo( data_old );
00093 res = myNbSeg->isValid( msg, true ) && res;
00094 res = myScale->isValid( msg, true ) && res;
00095 return res;
00096 }
00097
00098 QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
00099 {
00100 QFrame* fr = new QFrame();
00101 fr->setMinimumWidth(460);
00102
00103 QVBoxLayout* lay = new QVBoxLayout( fr );
00104 lay->setMargin( 0 );
00105 lay->setSpacing( SPACING );
00106
00107 QGroupBox* GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), fr );
00108 lay->addWidget( GroupC1 );
00109
00110 StdMeshers::StdMeshers_NumberOfSegments_var h =
00111 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
00112
00113 myGroupLayout = new QGridLayout( GroupC1 );
00114 myGroupLayout->setSpacing( SPACING );
00115 myGroupLayout->setMargin( MARGIN );
00116 myGroupLayout->setColumnStretch( 0, 0 );
00117 myGroupLayout->setColumnStretch( 1, 1 );
00118
00119 int row = 0;
00120
00121 myName = 0;
00122 if( isCreation() )
00123 {
00124 myName = new QLineEdit( GroupC1 );
00125 myGroupLayout->addWidget( new QLabel( tr( "SMESH_NAME" ), GroupC1 ), row, 0 );
00126 myGroupLayout->addWidget( myName, row, 1 );
00127 row++;
00128 }
00129
00130
00131
00132 myGroupLayout->addWidget( new QLabel( tr( "SMESH_NB_SEGMENTS_PARAM" ), GroupC1 ), row, 0 );
00133 myNbSeg = new SalomeApp_IntSpinBox( GroupC1 );
00134 myNbSeg->setMinimum( 1 );
00135 myNbSeg->setMaximum( 9999 );
00136 myGroupLayout->addWidget( myNbSeg, row, 1 );
00137 row++;
00138
00139
00140
00141 myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 );
00142 myDistr = new QtxComboBox( GroupC1 );
00143 QStringList types;
00144 types.append( tr( "SMESH_DISTR_REGULAR" ) );
00145 types.append( tr( "SMESH_DISTR_SCALE" ) );
00146 types.append( tr( "SMESH_DISTR_TAB" ) );
00147 types.append( tr( "SMESH_DISTR_EXPR" ) );
00148 myDistr->addItems( types );
00149 myGroupLayout->addWidget( myDistr, row, 1 );
00150 row++;
00151
00152
00153
00154 myGroupLayout->addWidget( myLScale = new QLabel( tr( "SMESH_NB_SEGMENTS_SCALE_PARAM" ), GroupC1 ), row, 0 );
00155 myScale = new SMESHGUI_SpinBox( GroupC1 );
00156 myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, "parametric_precision" );
00157 myGroupLayout->addWidget( myScale, row, 1 );
00158 row++;
00159
00160
00161
00162 QGridLayout* myDistLayout = new QGridLayout(GroupC1);
00163 myGroupLayout->addLayout( myDistLayout, row, 0, 1, 2 );
00164 myGroupLayout->setRowStretch( row, 1 );
00165 row ++;
00166
00167
00168 QHBoxLayout* myExprLayout = new QHBoxLayout(GroupC1);
00169 myExprLayout->addWidget( myLExpr = new QLabel( "f(t)=", GroupC1 ), 0);
00170 myExpr = new QLineEdit( GroupC1 );
00171 myExprLayout->addWidget( myExpr,1);
00172 myDistLayout->addLayout(myExprLayout,1 ,0);
00173 myDistLayout->setRowStretch(2, 1);
00174
00175
00176 myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 );
00177 myDistLayout->addWidget( myInfo, 0, 0, 1, 2);
00178
00179
00180 myTable = new StdMeshersGUI_DistrTableFrame( GroupC1 );
00181 myDistLayout->addWidget( myTable, 1, 0, 2, 1 );
00182
00183
00184 myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() );
00185 myPreview->setMinimumHeight(220);
00186 myDistLayout->addWidget( myPreview, 1, 1, 2, 1 );
00187
00188
00189 myConvBox = new QGroupBox( tr( "SMESH_CONV_MODE" ), GroupC1 );
00190 myConv = new QButtonGroup( GroupC1 );
00191
00192 QHBoxLayout* convLay = new QHBoxLayout( myConvBox );
00193 convLay->setMargin( MARGIN );
00194 convLay->setSpacing( SPACING );
00195
00196 QRadioButton* rbExp = new QRadioButton( tr( "SMESH_EXP_MODE" ), myConvBox );
00197 QRadioButton* myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConvBox );
00198
00199 convLay->addWidget( rbExp );
00200 convLay->addWidget( myCutNeg );
00201 myConv->addButton( rbExp, 0 );
00202 myConv->addButton( myCutNeg, 1 );
00203
00204 myGroupLayout->addWidget( myConvBox, row, 0, 1, 2 );
00205 row++;
00206
00207
00208
00209 myReversedEdgesBox = new QGroupBox(tr( "SMESH_REVERSED_EDGES" ), fr);
00210 QHBoxLayout* edgeLay = new QHBoxLayout( myReversedEdgesBox );
00211
00212 myDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg( myReversedEdgesBox );
00213 QString aGeomEntry = getShapeEntry();
00214 QString aMainEntry = getMainShapeEntry();
00215 if ( aGeomEntry == "" )
00216 aGeomEntry = h->GetObjectEntry();
00217 myDirectionWidget->SetGeomShapeEntry( aGeomEntry );
00218 myDirectionWidget->SetMainShapeEntry( aMainEntry );
00219 myDirectionWidget->SetListOfIDs( h->GetReversedEdges() );
00220 edgeLay->addWidget( myDirectionWidget );
00221
00222 lay->addWidget( myReversedEdgesBox );
00223 lay->setStretchFactor( GroupC1, 2);
00224 lay->setStretchFactor( myReversedEdgesBox, 1);
00225
00226 connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
00227 connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) );
00228 connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) );
00229 connect( myExpr, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
00230 connect( myConv, SIGNAL( buttonClicked( int ) ), this, SLOT( onValueChanged() ) );
00231
00232 return fr;
00233 }
00234
00235 void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const
00236 {
00237 NbSegmentsHypothesisData data;
00238 readParamsFromHypo( data );
00239
00240 if( myName )
00241 myName->setText( data.myName );
00242 if(data.myNbSegVarName.isEmpty())
00243 myNbSeg->setValue( data.myNbSeg );
00244 else
00245 myNbSeg->setText( data.myNbSegVarName );
00246
00247 myDistr->setCurrentIndex( data.myDistrType );
00248 if(data.myScaleVarName.isEmpty())
00249 myScale->setValue( data.myScale );
00250 else
00251 myScale->setText( data.myScaleVarName );
00252 myConv->button( data.myConv )->setChecked( true );
00253 myTable->setFuncMinValue(myConv->checkedId()==0 ? -1E20 : 0);
00254 myTable->setData( data.myTable );
00255 myExpr->setText( data.myExpr );
00256
00257 if ( dlg() )
00258 dlg()->setMinimumSize( dlg()->minimumSizeHint().width(), dlg()->minimumSizeHint().height() );
00259 }
00260
00261 QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
00262 {
00263 NbSegmentsHypothesisData data;
00264 readParamsFromWidgets( data );
00265 storeParamsToHypo( data );
00266
00267 QString valStr = QString::number( data.myNbSeg ) += "; ";
00268
00269 enum DistrType
00270 {
00271 Regular,
00272 Scale,
00273 TabFunc,
00274 ExprFunc
00275 };
00276 bool hasConv = false;
00277 switch ( data.myDistrType ) {
00278 case Regular :
00279 valStr += tr("SMESH_DISTR_REGULAR");
00280 break;
00281 case Scale :
00282 valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );\
00283 break;
00284 case TabFunc : {
00285
00286 bool param = true;
00287 for( int i=0; i < data.myTable.length(); i++, param = !param ) {
00288 if ( param )
00289 valStr += "[";
00290 valStr += QString::number( data.myTable[ i ]);
00291 valStr += ( param ? "," : "]" );
00292 }
00293 hasConv = true;
00294 break;
00295 }
00296 case ExprFunc:
00297 valStr += data.myExpr;
00298 hasConv = true;
00299 break;
00300 }
00301 if ( hasConv )
00302 {
00303 if ( data.myConv )
00304 valStr += "; " + tr("SMESH_CUT_NEG_MODE");
00305 else
00306 valStr += "; " + tr("SMESH_EXP_MODE");
00307 }
00308
00309 return valStr;
00310 }
00311
00312 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisData& h_data ) const
00313 {
00314 StdMeshers::StdMeshers_NumberOfSegments_var h =
00315 StdMeshers::StdMeshers_NumberOfSegments::_narrow( initParamsHypothesis() );
00316
00317 h_data.myName = hypName();
00318
00319 h_data.myNbSeg = (int) h->GetNumberOfSegments();
00320
00321 SMESH::ListOfParameters_var aParameters = h->GetLastParameters();
00322
00323 h_data.myNbSegVarName = (aParameters->length() > 0) ? QString(aParameters[0].in()) : QString("");
00324
00325 int distr = (int) h->GetDistrType();
00326 h_data.myDistrType = distr;
00327 h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0;
00328
00329 if(distr==1){
00330 h_data.myScaleVarName = (aParameters->length() > 1) ? QString(aParameters[1].in()) : QString("");
00331 }
00332 else
00333 h_data.myScaleVarName = QString("");
00334
00335 if( distr==2 )
00336 {
00337 SMESH::double_array* a = h->GetTableFunction();
00338 h_data.myTable = *a;
00339 delete a;
00340 }
00341 else
00342 {
00343 SMESH::double_array& a = h_data.myTable;
00344
00345 a.length( 4 );
00346 a[0] = 0.0; a[1] = 1.0;
00347 a[2] = 1.0; a[3] = 1.0;
00348 }
00349
00350 h_data.myExpr = distr==3 ? h->GetExpressionFunction() : "1";
00351 h_data.myConv = distr==2 || distr==3 ? h->ConversionMode() : 1;
00352
00353 return true;
00354 }
00355
00356 bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothesisData& h_data ) const
00357 {
00358 StdMeshers::StdMeshers_NumberOfSegments_var h =
00359 StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
00360
00361 bool ok = true;
00362 try
00363 {
00364 if( isCreation() )
00365 SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.toLatin1().data() );
00366
00367 QStringList aVariablesList;
00368 aVariablesList.append(h_data.myNbSegVarName);
00369
00370 h->SetNumberOfSegments( h_data.myNbSeg );
00371 int distr = h_data.myDistrType;
00372 h->SetDistrType( distr );
00373
00374 if( distr==1 ) {
00375 h->SetScaleFactor( h_data.myScale );
00376 aVariablesList.append(h_data.myScaleVarName);
00377 }
00378 if( distr==2 || distr==3 )
00379 h->SetConversionMode( h_data.myConv );
00380
00381 if( distr==1 || distr==2 || distr==3 ) {
00382 h->SetReversedEdges( myDirectionWidget->GetListOfIDs() );
00383 h->SetObjectEntry( myDirectionWidget->GetMainShapeEntry() );
00384 }
00385
00386 if( distr==2 )
00387 h->SetTableFunction( h_data.myTable );
00388
00389 if( distr==3 )
00390 h->SetExpressionFunction( h_data.myExpr.toLatin1().data() );
00391
00392
00393
00394
00395 h->SetParameters(aVariablesList.join(":").toLatin1().constData());
00396 }
00397 catch(const SALOME::SALOME_Exception& ex)
00398 {
00399 SalomeApp_Tools::QtCatchCorbaException(ex);
00400 ok = false;
00401 }
00402 return ok;
00403 }
00404
00405 bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesisData& h_data ) const
00406 {
00407 h_data.myName = myName ? myName->text() : "";
00408 h_data.myNbSeg = myNbSeg->value();
00409 h_data.myNbSegVarName = myNbSeg->text();
00410 h_data.myScaleVarName = myScale->text();
00411 h_data.myDistrType = myDistr->currentIndex();
00412 h_data.myConv = myConv->checkedId();
00413 h_data.myScale = myScale->value();
00414 myTable->data( h_data.myTable );
00415 h_data.myExpr = myExpr->text();
00416 return true;
00417 }
00418
00419 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
00420 {
00421 int distr = myDistr->currentIndex();
00422
00423
00424
00425
00426
00427
00428 if( distr==2 && sender()==myConv )
00429 {
00430 myTable->setFuncMinValue( myConv->checkedId()==0 ? -1E20 : 0 );
00431 SMESH::double_array arr;
00432 myTable->data( arr );
00433 myTable->setData( arr );
00434 }
00435
00436 myScale->setShown( distr==1 );
00437 myLScale->setShown( distr==1 );
00438 myReversedEdgesBox->setShown( !distr==0 );
00439 myDirectionWidget->showPreview( !distr==0 );
00440
00441 bool isFunc = distr==2 || distr==3;
00442 myPreview->setShown( isFunc );
00443 myConvBox->setShown( isFunc );
00444
00445 myTable->setShown( distr==2 );
00446 myExpr->setShown( distr==3 );
00447 myLExpr->setShown( distr==3 );
00448 myInfo->setShown( distr==3);
00449
00450
00451 int nbSeg = myNbSeg->value();
00452 if( distr==2 )
00453 {
00454 SMESH::double_array a;
00455 myTable->data( a );
00456 myPreview->setParams( a, nbSeg, false );
00457 }
00458 else if( distr==3 )
00459 myPreview->setParams( myExpr->text(), nbSeg, 100, false );
00460
00461 if( isFunc )
00462 myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->checkedId() ) );
00463
00464 if ( (QtxComboBox*)sender() == myDistr && dlg() ) {
00465 QApplication::instance()->processEvents();
00466 myGroupLayout->invalidate();
00467 dlg()->layout()->invalidate();
00468 dlg()->updateGeometry();
00469 dlg()->setMinimumSize( dlg()->minimumSizeHint() );
00470 dlg()->resize( dlg()->minimumSize() );
00471 QApplication::instance()->processEvents();
00472 }
00473 }