Salome HOME
Merge from V5_1_4_BR 07/05/2010
[modules/smesh.git] / src / StdMeshersGUI / StdMeshersGUI_NbSegmentsCreator.cxx
index f190fb2cadf89be7b3b8fc888e2eb8a341622bfc..9fce3fe98541f13ac13c4fbfd1a1e2e4ff64a001 100644 (file)
@@ -1,27 +1,61 @@
-
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// File   : StdMeshersGUI_NbSegmentsCreator.cxx
+// Author : Open CASCADE S.A.S.
+// SMESH includes
+//
 #include "StdMeshersGUI_NbSegmentsCreator.h"
 #include "StdMeshersGUI_DistrTable.h"
 #include "StdMeshersGUI_DistrPreview.h"
+#include "StdMeshersGUI_SubShapeSelectorWdg.h"
 
+#include <SMESHGUI.h>
 #include <SMESHGUI_Utils.h>
 #include <SMESHGUI_HypothesesUtils.h>
+#include <SMESHGUI_SpinBox.h>
 
+// IDL includes
 #include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
 
+// SALOME GUI includes
 #include <SalomeApp_Tools.h>
-
-#include <QtxIntSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
 #include <QtxComboBox.h>
-#include <QtxDblValidator.h>
-#include <SMESHGUI_SpinBox.h>
 
-#include <qlabel.h>
-#include <qgroupbox.h>
-#include <qframe.h>
-#include <qlayout.h>
-#include <qlineedit.h>
-#include <qbuttongroup.h>
-#include <qradiobutton.h>
+// Qt includes
+#include <QLabel>
+#include <QGroupBox>
+#include <QFrame>
+#include <QLineEdit>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QApplication>
+
+#define SPACING 6
+#define MARGIN  11
 
 StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
 : StdMeshersGUI_StdHypothesisCreator( "NumberOfSegments" ),
@@ -31,11 +65,11 @@ StdMeshersGUI_NbSegmentsCreator::StdMeshersGUI_NbSegmentsCreator()
   myTable( 0 ),
   myPreview( 0 ),
   myExpr( 0 ),
+  myConvBox( 0 ),
   myConv( 0 ),
   myLScale( 0 ),
   myLTable( 0 ),
   myLExpr( 0 ),
-  myLConv( 0 ),
   myInfo( 0 ),
   myGroupLayout( 0 ),
   myTableRow( 0 ),
@@ -47,38 +81,40 @@ StdMeshersGUI_NbSegmentsCreator::~StdMeshersGUI_NbSegmentsCreator()
 {
 }
 
-bool StdMeshersGUI_NbSegmentsCreator::checkParams() const
+bool StdMeshersGUI_NbSegmentsCreator::checkParams( QString& msg ) const
 {
+  if( !SMESHGUI_GenericHypothesisCreator::checkParams( msg ) )
+    return false;
   NbSegmentsHypothesisData data_old, data_new;
   readParamsFromHypo( data_old );
   readParamsFromWidgets( data_new );
   bool res = storeParamsToHypo( data_new );
   storeParamsToHypo( data_old );
+  res = myNbSeg->isValid( msg, true ) && res;
+  res = myScale->isValid( msg, true ) && res;
   return res;
 }
 
 QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
 {
-  QFrame* fr = new QFrame( 0, "myframe" );
-  QVBoxLayout* lay = new QVBoxLayout( fr, 5, 0 );
+  QFrame* fr = new QFrame();
 
-  QGroupBox* GroupC1 = new QGroupBox( fr, "GroupC1" );
+  QVBoxLayout* lay = new QVBoxLayout( fr );
+  lay->setMargin( 0 );
+  lay->setSpacing( SPACING );
+
+  QGroupBox* GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), fr );
   lay->addWidget( GroupC1 );
 
   StdMeshers::StdMeshers_NumberOfSegments_var h =
     StdMeshers::StdMeshers_NumberOfSegments::_narrow( hypothesis() );
   myPreview = new StdMeshersGUI_DistrPreview( GroupC1, h.in() );
 
-  GroupC1->setTitle( tr( "SMESH_ARGUMENTS"  ) );
-  GroupC1->setColumnLayout(0, Qt::Vertical );
-  GroupC1->layout()->setSpacing( 0 );
-  GroupC1->layout()->setMargin( 0 );
-  myGroupLayout = new QGridLayout( GroupC1->layout() );
-  myGroupLayout->setAlignment( Qt::AlignTop );
-  myGroupLayout->setSpacing( 6 );
-  myGroupLayout->setMargin( 11 );
-  myGroupLayout->setColStretch( 0, 0 );
-  myGroupLayout->setColStretch( 1, 1 );
+  myGroupLayout = new QGridLayout( GroupC1 );
+  myGroupLayout->setSpacing( SPACING );
+  myGroupLayout->setMargin( MARGIN );
+  myGroupLayout->setColumnStretch( 0, 0 );
+  myGroupLayout->setColumnStretch( 1, 1 );
 
   int row = 0;
   // 0)  name
@@ -93,9 +129,9 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
 
   // 1)  number of segments
   myGroupLayout->addWidget( new QLabel( tr( "SMESH_NB_SEGMENTS_PARAM" ), GroupC1 ), row, 0 );
-  myNbSeg = new QtxIntSpinBox( GroupC1 );
-  myNbSeg->setMinValue( 1 );
-  myNbSeg->setMaxValue( 9999 );
+  myNbSeg = new SalomeApp_IntSpinBox( GroupC1 );
+  myNbSeg->setMinimum( 1 );
+  myNbSeg->setMaximum( 9999 );
   myGroupLayout->addWidget( myNbSeg, row, 1 );
   row++;
 
@@ -103,23 +139,23 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
   myGroupLayout->addWidget( new QLabel( tr( "SMESH_DISTR_TYPE" ), GroupC1 ), row, 0 );
   myDistr = new QtxComboBox( GroupC1 );
   QStringList types;
-  types.append( QObject::tr( "SMESH_DISTR_REGULAR" ) );
-  types.append( QObject::tr( "SMESH_DISTR_SCALE"   ) );
-  types.append( QObject::tr( "SMESH_DISTR_TAB"     ) );
-  types.append( QObject::tr( "SMESH_DISTR_EXPR"    ) );
-  myDistr->insertStringList( types );
+  types.append( tr( "SMESH_DISTR_REGULAR" ) );
+  types.append( tr( "SMESH_DISTR_SCALE"   ) );
+  types.append( tr( "SMESH_DISTR_TAB"     ) );
+  types.append( tr( "SMESH_DISTR_EXPR"    ) );
+  myDistr->addItems( types );
   myGroupLayout->addWidget( myDistr, row, 1 );
   row++;
 
   // 3)  scale
   myGroupLayout->addWidget( myLScale = new QLabel( tr( "SMESH_NB_SEGMENTS_SCALE_PARAM" ), GroupC1 ), row, 0 );
   myScale = new SMESHGUI_SpinBox( GroupC1 );
-  myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, 6 );
+  myScale->RangeStepAndValidator( 1E-5, 1E+5, 0.1, "parametric_precision" );
   myGroupLayout->addWidget( myScale, row, 1 );
   row++;
 
   myInfo = new QLabel( tr( "SMESH_FUNC_DOMAIN" ), GroupC1 );
-  myGroupLayout->addMultiCellWidget( myInfo, row, row, 0, 1 );
+  myGroupLayout->addWidget( myInfo, row, 0, 1, 2 );
   row++;
   
   // 4)  table
@@ -137,27 +173,51 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame()
   row++;
 
   // 6)  conversion (radiogroup)
-  myGroupLayout->addWidget( myLConv = new QLabel( tr( "SMESH_CONV_MODE" ), GroupC1 ), row, 0 );
+  myConvBox = new QGroupBox( tr( "SMESH_CONV_MODE" ), GroupC1 );
   myConv = new QButtonGroup( GroupC1 );
-  myConv->setExclusive( true );
-  myConv->setColumnLayout( 0, Qt::Vertical );
-  QGridLayout* convLay = new QGridLayout( myConv->layout() );
-  convLay->addWidget( new QRadioButton( tr( "SMESH_EXP_MODE" ), myConv ), 0, 0 );
-  convLay->addWidget( myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConv ), 1, 0 );
-  myGroupLayout->addWidget( myConv, row, 1 );
+
+  QHBoxLayout* convLay = new QHBoxLayout( myConvBox );
+  convLay->setMargin( MARGIN );
+  convLay->setSpacing( SPACING );
+
+  QRadioButton* rbExp = new QRadioButton( tr( "SMESH_EXP_MODE" ), myConvBox );
+  QRadioButton* myCutNeg = new QRadioButton( tr( "SMESH_CUT_NEG_MODE" ), myConvBox );
+
+  convLay->addWidget( rbExp );
+  convLay->addWidget( myCutNeg );
+  myConv->addButton( rbExp, 0 );
+  myConv->addButton( myCutNeg, 1 );
+
+  myGroupLayout->addWidget( myConvBox, row, 0, 1, 2 );
   row++;
 
   // 7) distribution preview
-  myGroupLayout->addMultiCellWidget( myPreview, row, row, 0, 1 );
+  myGroupLayout->addWidget( myPreview, row, 0, 1, 2 );
   myGroupLayout->setRowStretch( row, 1 );
   myPreviewRow = row;
   row++;
 
+  // 8) reverce edge parameters
+  myReversedEdgesBox = new QGroupBox(tr( "SMESH_REVERSED_EDGES" ), fr);
+  QHBoxLayout* edgeLay = new QHBoxLayout( myReversedEdgesBox );
+
+  myDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg();
+  QString aGeomEntry = getShapeEntry();
+  QString aMainEntry = getMainShapeEntry();
+  if ( aGeomEntry == "" )
+    aGeomEntry = h->GetObjectEntry();
+  myDirectionWidget->SetGeomShapeEntry( aGeomEntry );
+  myDirectionWidget->SetMainShapeEntry( aMainEntry );
+  myDirectionWidget->SetListOfIDs( h->GetReversedEdges() );
+  edgeLay->addWidget( myDirectionWidget );
+
+  lay->addWidget( myReversedEdgesBox );
+
   connect( myNbSeg, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
   connect( myDistr, SIGNAL( activated( int ) ), this, SLOT( onValueChanged() ) );
   connect( myTable, SIGNAL( valueChanged( int, int ) ), this, SLOT( onValueChanged() ) );
   connect( myExpr,  SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
-  connect( myConv,  SIGNAL( clicked( int ) ), this, SLOT( onValueChanged() ) );
+  connect( myConv,  SIGNAL( buttonClicked( int ) ), this, SLOT( onValueChanged() ) );
 
   return fr;
 }
@@ -169,12 +229,23 @@ void StdMeshersGUI_NbSegmentsCreator::retrieveParams() const
 
   if( myName )
     myName->setText( data.myName );
-  myNbSeg->setValue( data.myNbSeg );
-  myDistr->setCurrentItem( data.myDistrType );
-  myScale->setValue( data.myScale );
-  myConv->setButton( data.myConv );
-  myTable->table()->setData( data.myTable );
+  if(data.myNbSegVarName.isEmpty())
+    myNbSeg->setValue( data.myNbSeg );
+  else
+    myNbSeg->setText( data.myNbSegVarName );
+  
+  myDistr->setCurrentIndex( data.myDistrType );
+  if(data.myScaleVarName.isEmpty())
+    myScale->setValue( data.myScale );
+  else
+    myScale->setText( data.myScaleVarName );
+  myConv->button( data.myConv )->setChecked( true );
+  myTable->setFuncMinValue(myConv->checkedId()==0 ? -1E20 : 0);
+  myTable->setData( data.myTable );
   myExpr->setText( data.myExpr );
+
+  if ( dlg() )
+    dlg()->setMinimumSize( dlg()->minimumSizeHint().width(), dlg()->minimumSizeHint().height() );
 }
 
 QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
@@ -182,7 +253,7 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
   NbSegmentsHypothesisData data;
   readParamsFromWidgets( data );
   storeParamsToHypo( data );
-
+    
   QString valStr = QString::number( data.myNbSeg ) += "; ";
 
   enum DistrType
@@ -197,8 +268,8 @@ QString StdMeshersGUI_NbSegmentsCreator::storeParams() const
   case Regular :
     valStr += tr("SMESH_DISTR_REGULAR");
     break;
-  case Scale   :
-    valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );
+  case Scale   : 
+    valStr += tr("SMESH_NB_SEGMENTS_SCALE_PARAM") + " = " + QString::number( data.myScale );\
     break;
   case TabFunc : {
     //valStr += tr("SMESH_TAB_FUNC");
@@ -231,13 +302,24 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromHypo( NbSegmentsHypothesisDa
   StdMeshers::StdMeshers_NumberOfSegments_var h =
     StdMeshers::StdMeshers_NumberOfSegments::_narrow( initParamsHypothesis() );
 
-  HypothesisData* data = SMESH::GetHypothesisData( hypType() );
-  h_data.myName = isCreation() && data ? data->Label : "";
+  h_data.myName = hypName();
 
   h_data.myNbSeg = (int) h->GetNumberOfSegments();
+  
+  SMESH::ListOfParameters_var aParameters = h->GetLastParameters();
+
+  h_data.myNbSegVarName  = (aParameters->length() > 0) ? QString(aParameters[0].in()) : QString("");
+
   int distr = (int) h->GetDistrType();
   h_data.myDistrType = distr;
   h_data.myScale = distr==1 ? h->GetScaleFactor() : 1.0;
+  
+  if(distr==1){
+    h_data.myScaleVarName  = (aParameters->length() > 1) ? QString(aParameters[1].in()) : QString("");
+  }
+  else 
+    h_data.myScaleVarName = QString("");
+
   if( distr==2 )
   {
     SMESH::double_array* a = h->GetTableFunction();
@@ -268,26 +350,37 @@ bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothe
   try
   {
     if( isCreation() )
-      SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.latin1() );
+      SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.toLatin1().data() );
+
+    QStringList aVariablesList;
+    aVariablesList.append(h_data.myNbSegVarName);
 
     h->SetNumberOfSegments( h_data.myNbSeg );
     int distr = h_data.myDistrType;
     h->SetDistrType( distr );
-
-    if( distr==1 )
+    
+    if( distr==1 ) {
       h->SetScaleFactor( h_data.myScale );
-
+      aVariablesList.append(h_data.myScaleVarName);
+    }
     if( distr==2 || distr==3 )
       h->SetConversionMode( h_data.myConv );
 
+    if( distr==1 || distr==2 || distr==3 ) {
+      h->SetReversedEdges( myDirectionWidget->GetListOfIDs() );
+      h->SetObjectEntry( myDirectionWidget->GetMainShapeEntry() );
+    }
+
     if( distr==2 )
       h->SetTableFunction( h_data.myTable );
 
     if( distr==3 )
-      h->SetExpressionFunction( h_data.myExpr.latin1() );
+      h->SetExpressionFunction( h_data.myExpr.toLatin1().data() );
     //setting of function must follow after setConversionMode, because otherwise
     //the function will be checked with old conversion mode, so that it may occurs
     //unexpected errors for user
+
+    h->SetParameters(aVariablesList.join(":").toLatin1().constData());
   }
   catch(const SALOME::SALOME_Exception& ex)
   {
@@ -301,17 +394,19 @@ bool StdMeshersGUI_NbSegmentsCreator::readParamsFromWidgets( NbSegmentsHypothesi
 {
   h_data.myName      = myName ? myName->text() : "";
   h_data.myNbSeg     = myNbSeg->value();
-  h_data.myDistrType = myDistr->currentItem();
-  h_data.myConv      = myConv->id( myConv->selected() );
+  h_data.myNbSegVarName =  myNbSeg->text();
+  h_data.myScaleVarName =  myScale->text();
+  h_data.myDistrType = myDistr->currentIndex();
+  h_data.myConv      = myConv->checkedId();
   h_data.myScale     = myScale->value();
-  myTable->table()->data( h_data.myTable );
+  myTable->data( h_data.myTable );
   h_data.myExpr      = myExpr->text();
   return true;
 }
 
 void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
 {
-  int distr = myDistr->currentItem();
+  int distr = myDistr->currentIndex();
 
 /*  if( distr==2 ) //table func
     myCutNeg->setText( tr( "SMESH_NO_CONV" ) );
@@ -320,21 +415,22 @@ void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
 
   if( distr==2 && sender()==myConv ) //table func
   {
-    myTable->table()->funcValidator()->setBottom( myConv->id( myConv->selected() )==0 ? -1E20 : 0 );
+    myTable->setFuncMinValue( myConv->checkedId()==0 ? -1E20 : 0 );
     SMESH::double_array arr;
-    myTable->table()->data( arr );
-    myTable->table()->setData( arr ); //update data in table
+    myTable->data( arr );
+    myTable->setData( arr ); //update data in table
   }
 
   myScale->setShown( distr==1 );
   myLScale->setShown( distr==1 );
+  myReversedEdgesBox->setShown( !distr==0 );
+  myDirectionWidget->showPreview( !distr==0 );
 
   bool isFunc = distr==2 || distr==3;
   myPreview->setShown( isFunc );
   myGroupLayout->setRowStretch( myPreviewRow, isFunc ? 1 : 0 );
 
-  myConv->setShown( isFunc );
-  myLConv->setShown( isFunc );
+  myConvBox->setShown( isFunc );
 
   if( distr==2 )
     myTable->show();
@@ -352,12 +448,22 @@ void StdMeshersGUI_NbSegmentsCreator::onValueChanged()
   if( distr==2 ) //preview for table-described function
   {
     SMESH::double_array a;
-    myTable->table()->data( a );
+    myTable->data( a );
     myPreview->setParams( a, nbSeg, false );
   }
   else if( distr==3 ) //preview for analytic-described function
     myPreview->setParams( myExpr->text(), nbSeg, 100, false );
 
   if( isFunc )
-    myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->id( myConv->selected() ) ) );
+    myPreview->setConversion( StdMeshersGUI_DistrPreview::Conversion( myConv->checkedId() ) );
+
+  if ( (QtxComboBox*)sender() == myDistr && dlg() ) {
+    QApplication::instance()->processEvents();
+    myGroupLayout->invalidate();
+    dlg()->layout()->invalidate();
+    dlg()->updateGeometry();
+    dlg()->setMinimumSize( dlg()->minimumSizeHint() );
+    dlg()->resize( dlg()->minimumSize() );
+    QApplication::instance()->processEvents();
+  }
 }