Salome HOME
Update the "Colors / Size" dialog.
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ExtrusionDlg.cxx
index beb2e3f24b17c3f2e4f9a7f3dc7244f1077083ea..ab65f0570410e1cb813e8d95481cd01f566af8b9 100644 (file)
@@ -1,24 +1,25 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2011  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
+// 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 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.
+// 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
+// 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
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // SMESH SMESHGUI : GUI for SMESH component
 // File   : SMESHGUI_ExtrusionDlg.cxx
 // Author : Michael ZORIN, Open CASCADE S.A.S.
@@ -33,6 +34,7 @@
 #include "SMESHGUI_SpinBox.h"
 #include "SMESHGUI_IdValidator.h"
 #include "SMESHGUI_FilterDlg.h"
+#include "SMESHGUI_MeshEditPreview.h"
 
 #include <SMESH_Actor.h>
 #include <SMESH_TypeFilter.hxx>
@@ -87,8 +89,7 @@
 // purpose  : constructor
 //=================================================================================
 SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
-  : QDialog( SMESH::GetDesktop( theModule ) ),
-    mySMESHGUI( theModule ),
+  : SMESHGUI_PreviewDlg( theModule ),
     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
     myFilterDlg( 0 ),
     mySelectedObject(SMESH::SMESH_IDSource::_nil())
@@ -96,6 +97,7 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
   QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
   QPixmap image2 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
+  QPixmap image3 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_NODE")));
 
   setModal( false );
   setAttribute( Qt::WA_DeleteOnClose, true );
@@ -113,16 +115,20 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   ConstructorsBoxLayout->setSpacing(SPACING);
   ConstructorsBoxLayout->setMargin(MARGIN);
 
+  RadioButton0= new QRadioButton(ConstructorsBox);
+  RadioButton0->setIcon(image3);
   RadioButton1= new QRadioButton(ConstructorsBox);
   RadioButton1->setIcon(image0);
   RadioButton2= new QRadioButton(ConstructorsBox);
   RadioButton2->setIcon(image1);
 
+  ConstructorsBoxLayout->addWidget(RadioButton0);
   ConstructorsBoxLayout->addWidget(RadioButton1);
   ConstructorsBoxLayout->addWidget(RadioButton2);
 
-  GroupConstructors->addButton(RadioButton1, 0);
-  GroupConstructors->addButton(RadioButton2, 1);
+  GroupConstructors->addButton(RadioButton0, 0);
+  GroupConstructors->addButton(RadioButton1, 1);
+  GroupConstructors->addButton(RadioButton2, 2);
 
   /***************************************************************/
   GroupButtons = new QGroupBox(this);
@@ -149,7 +155,7 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   GroupButtonsLayout->addWidget(buttonHelp);
 
   /***************************************************************/
-  GroupArguments = new QGroupBox(tr("EXTRUSION_1D"), this);
+  GroupArguments = new QGroupBox(tr("EXTRUSION_0D"), this);
   QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
   GroupArgumentsLayout->setSpacing(SPACING);
   GroupArgumentsLayout->setMargin(MARGIN);
@@ -164,6 +170,7 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
 
   LineEditElements = new QLineEdit(GroupArguments);
   LineEditElements->setValidator(myIdValidator);
+  LineEditElements->setMaxLength(-1);
   myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), GroupArguments );
   connect(myFilterBtn,   SIGNAL(clicked()), this, SLOT(setFilters()));
 
@@ -213,6 +220,9 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   // CheckBox for groups generation
   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
 
+  //Preview check box
+  myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), GroupArguments);
+
   GroupArgumentsLayout->addWidget(TextLabelElements,    0, 0);
   GroupArgumentsLayout->addWidget(SelectElementsButton, 0, 1);
   GroupArgumentsLayout->addWidget(LineEditElements,     0, 2, 1, 5);
@@ -239,7 +249,8 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   GroupArgumentsLayout->addWidget(SpinBox_VDist,         5, 3);
   GroupArgumentsLayout->addWidget(TextLabelNbSteps,     6, 0, 1, 3);
   GroupArgumentsLayout->addWidget(SpinBox_NbSteps,      6, 3);
-  GroupArgumentsLayout->addWidget(MakeGroupsCheck,      7, 0, 1, 8);
+  GroupArgumentsLayout->addWidget(myPreviewCheckBox,    7, 0, 1, 8);
+  GroupArgumentsLayout->addWidget(MakeGroupsCheck,      8, 0, 1, 8);
   GroupArgumentsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 8, 0);
 
 
@@ -249,18 +260,18 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   SMESHGUI_ExtrusionDlgLayout->addWidget(GroupButtons);
 
   /* Initialisations */
-  SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, 3);
-  SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, 3);
-  SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, 3);
+  SpinBox_Vx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
+  SpinBox_Vy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
+  SpinBox_Vz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.01, "length_precision");
 
-  SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
-  SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
-  SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
+  SpinBox_Dx->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
+  SpinBox_Dy->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
+  SpinBox_Dz->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
   
   SpinBox_NbSteps->setRange(1, 999999);
-  SpinBox_VDist->RangeStepAndValidator(0, COORD_MAX, 10.0, 3);
+  SpinBox_VDist->RangeStepAndValidator(0, COORD_MAX, 10.0, "length_precision");
 
-  RadioButton1->setChecked(true);
+  RadioButton0->setChecked(true);
   RadioButton3->setChecked(true);
   MakeGroupsCheck->setChecked(true);
 
@@ -311,6 +322,18 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   connect(LineEditElements,     SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
   connect(CheckBoxMesh,         SIGNAL(toggled(bool)),               SLOT(onSelectMesh(bool)));
 
+  connect(SpinBox_Dx,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Dy,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Dz,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Vx,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Vy,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Vz,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_VDist,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_NbSteps,  SIGNAL(valueChanged(int)), this, SLOT(toDisplaySimulation()));
+
+  //To Connect preview check box
+  connectPreviewControl();
+
   /***************************************************************/
   
   ConstructorsClicked(0);
@@ -357,6 +380,8 @@ void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
 
     CheckBoxMesh->setChecked(false);
     onSelectMesh(false);
+    myPreviewCheckBox->setChecked(false);
+    onDisplaySimulation(false);
   }
 
   CheckIsEnable();
@@ -367,8 +392,19 @@ void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
 // purpose  : Check whether the Ok and Apply buttons should be enabled or not
 //=================================================================================
 void SMESHGUI_ExtrusionDlg::CheckIsEnable()
-{
-  double aX, aY, aZ, aModule;
+{  
+  bool anIsEnable = myNbOkElements > 0 && isValuesValid();
+
+  buttonOk->setEnabled(anIsEnable);
+  buttonApply->setEnabled(anIsEnable);
+}
+
+//=================================================================================
+// function : isValuesValid()
+// purpose  : Return true in case if values entered into dialog are valid
+//=================================================================================
+bool SMESHGUI_ExtrusionDlg::isValuesValid() {
+  double aX, aY, aZ, aModule = 0;
   if ( RadioButton3->isChecked() ) {
     aX = SpinBox_Dx->GetValue();
     aY = SpinBox_Dy->GetValue();
@@ -380,11 +416,7 @@ void SMESHGUI_ExtrusionDlg::CheckIsEnable()
     aZ = SpinBox_Vz->GetValue();
     aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
   }
-  
-  bool anIsEnable = myNbOkElements > 0 && aModule > 1.0E-38;
-
-  buttonOk->setEnabled(anIsEnable);
-  buttonApply->setEnabled(anIsEnable);
+  return aModule > 1.0E-38;
 }
 
 //=================================================================================
@@ -395,29 +427,43 @@ void SMESHGUI_ExtrusionDlg::ConstructorsClicked (int constructorId)
 {
   disconnect(mySelectionMgr, 0, this, 0);
 
+  hidePreview();
+
   switch (constructorId) {
   case 0:
     {
-      GroupArguments->setTitle(tr("EXTRUSION_1D"));
+      GroupArguments->setTitle(tr("EXTRUSION_0D"));
       if (!CheckBoxMesh->isChecked())
-       {
-         LineEditElements->clear();
-         myIDs.clear();
-         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-           aViewWindow->SetSelectionMode(EdgeSelection);
-       }
+      {
+        LineEditElements->clear();
+        myIDs.clear();
+        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+          aViewWindow->SetSelectionMode(NodeSelection);
+      }
       break;
     }
   case 1:
+    {
+      GroupArguments->setTitle(tr("EXTRUSION_1D"));
+      if (!CheckBoxMesh->isChecked())
+      {
+        LineEditElements->clear();
+        myIDs.clear();
+        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+          aViewWindow->SetSelectionMode(EdgeSelection);
+      }
+      break;
+    }
+  case 2:
     {
       GroupArguments->setTitle(tr("EXTRUSION_2D"));
       if (!CheckBoxMesh->isChecked())
-       {
-         LineEditElements->clear();
-         myIDs.clear();
-         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-           aViewWindow->SetSelectionMode(FaceSelection);
-       }
+      {
+        LineEditElements->clear();
+        myIDs.clear();
+        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+          aViewWindow->SetSelectionMode(FaceSelection);
+      }
       break;
     }
   }
@@ -476,6 +522,7 @@ void SMESHGUI_ExtrusionDlg::ClickOnRadio()
     SpinBox_VDist->show();
     SelectVectorButton->show();
   }
+  onDisplaySimulation(true);
   // AdjustSize
   qApp->processEvents();
   updateGeometry();
@@ -497,29 +544,14 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply()
   if (myNbOkElements) {
 
     SMESH::DirStruct aVector;
+    getExtrusionVector(aVector);
+    
     QStringList aParameters;
-
     if ( RadioButton3->isChecked() ) {
-      aVector.PS.x = SpinBox_Dx->GetValue();
-      aVector.PS.y = SpinBox_Dy->GetValue();
-      aVector.PS.z = SpinBox_Dz->GetValue();
-
       aParameters << SpinBox_Dx->text();
       aParameters << SpinBox_Dy->text();
       aParameters << SpinBox_Dz->text();
     } else if ( RadioButton4->isChecked() ) {
-      gp_XYZ aNormale(SpinBox_Vx->GetValue(),
-                     SpinBox_Vy->GetValue(),
-                     SpinBox_Vz->GetValue());
-    
-     
-      aNormale /= aNormale.Modulus();
-      long aVDist = (long)SpinBox_VDist->value();
-
-      aVector.PS.x = aNormale.X()*aVDist;
-      aVector.PS.y = aNormale.Y()*aVDist;
-      aVector.PS.z = aNormale.Z()*aVDist;
-
       aParameters << SpinBox_Vx->text();
       aParameters << SpinBox_Vy->text();
       aParameters << SpinBox_Vz->text();
@@ -535,27 +567,61 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply()
       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
 
       if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) {
-        if( CheckBoxMesh->isChecked() ) {
-         if( GetConstructorId() == 0 )
-           SMESH::ListOfGroups_var groups = 
-             aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps);
-         else
-           SMESH::ListOfGroups_var groups = 
-             aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps);
-       }
-       else
-         SMESH::ListOfGroups_var groups = 
-           aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps);
+        if( CheckBoxMesh->isChecked() ) 
+          switch (GetConstructorId() ) {
+            case 0:
+              {
+                SMESH::ListOfGroups_var groups = 
+                  aMeshEditor->ExtrusionSweepObject0DMakeGroups(mySelectedObject, aVector, aNbSteps);
+                break;
+              }
+            case 1:
+              {
+                SMESH::ListOfGroups_var groups = 
+                  aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps);
+                break;
+              }
+            case 2:
+              {
+                SMESH::ListOfGroups_var groups = 
+                  aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps);
+                break;
+              }
+          }
+        else
+        {
+          SMESH::ListOfGroups_var groups;
+          if (GetConstructorId() == 0)
+            groups = aMeshEditor->ExtrusionSweepMakeGroups0D(myElementsId.inout(), aVector, aNbSteps);
+          else
+            groups = aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps);
+        }
+
       }
       else {
-       if( CheckBoxMesh->isChecked() ) {
-         if( GetConstructorId() == 0 )
-           aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
-         else
-           aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
-       }
-       else
-         aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
+        if( CheckBoxMesh->isChecked() ) 
+          switch( GetConstructorId() ) {
+            case 0:
+              {
+              aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps);
+                break;
+              }
+            case 1:
+              {
+              aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
+                break;
+              }
+            case 2:
+              {
+              aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
+                break;
+          }
+        }
+        else
+          if (GetConstructorId() == 0)
+            aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps);
+          else
+            aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
       }
 
       myMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
@@ -571,6 +637,8 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply()
     mySelectionMgr->clearSelected();
     mySelectedObject = SMESH::SMESH_IDSource::_nil();
     SelectionIntoArgument();
+
+    SMESHGUI::Modified();
   }
   return true;
 }
@@ -611,10 +679,10 @@ void SMESHGUI_ExtrusionDlg::ClickOnHelp()
     platform = "application";
 #endif
     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                            tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                            arg(app->resourceMgr()->stringValue("ExternalBrowser", 
-                                                                platform)).
-                            arg(myHelpFileName));
+                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                             arg(app->resourceMgr()->stringValue("ExternalBrowser", 
+                                                                 platform)).
+                             arg(myHelpFileName));
   }
 }
 
@@ -643,9 +711,28 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
     if (send == LineEditElements)
     {
       SMDS_Mesh* aMesh = myActor ? myActor->GetObject()->GetMesh() : 0;
-      SMESH::ElementType SMESHType = GetConstructorId() ? SMESH::FACE : SMESH::EDGE;
-      SMDSAbs_ElementType SMDSType = GetConstructorId() ? SMDSAbs_Face: SMDSAbs_Edge;
-
+      SMESH::ElementType SMESHType;
+      SMDSAbs_ElementType SMDSType;
+      switch (GetConstructorId()) {
+      case 0:
+        {
+          SMESHType = SMESH::NODE;
+          SMDSType = SMDSAbs_Node;
+          break;
+        }
+      case 1:
+        {
+          SMESHType = SMESH::EDGE;
+          SMDSType = SMDSAbs_Edge;
+          break;                 
+        }
+      case 2:
+        {
+          SMESHType = SMESH::FACE;
+          SMDSType = SMDSAbs_Face;
+          break;
+        }
+      }
       myElementsId = new SMESH::long_array;
       myElementsId->length( aListId.count() );
       TColStd_MapOfInteger newIndices;
@@ -654,7 +741,11 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
         bool validId = false;
         if ( id > 0 ) {
           if ( aMesh ) {
-            const SMDS_MeshElement * e = aMesh->FindElement( id );
+            const SMDS_MeshElement * e;
+            if (SMDSType == SMDSAbs_Node)
+              e = aMesh->FindNode( id ); 
+            else
+              e = aMesh->FindElement( id );
             validId = ( e && e->GetType() == SMDSType );
           } else {
             validId = ( myMesh->GetElementType( id, true ) == SMESHType );
@@ -666,12 +757,14 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
       myElementsId->length( myNbOkElements = newIndices.Extent() );
       mySelector->AddOrRemoveIndex(myIO, newIndices, false);
       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-       aViewWindow->highlight( myIO, true, true );
+        aViewWindow->highlight( myIO, true, true );
     }
   }
 
   CheckIsEnable();
 
+  onDisplaySimulation(true);
+
   myBusy = false;
 }
 
@@ -744,7 +837,7 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
       aNbElements = aMapIndex.Extent();
 
       if (aNbElements < 1)
-       return;
+        return;
 
       myElementsId = new SMESH::long_array;
       myElementsId->length( aNbElements );
@@ -782,6 +875,8 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
     
   }
   
+  onDisplaySimulation(true);
+  
   // OK
   CheckIsEnable();
 }
@@ -802,20 +897,30 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
     myEditCurrentArgument = (QWidget*)LineEditElements;
     if (CheckBoxMesh->isChecked()) {
       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-       aViewWindow->SetSelectionMode(ActorSelection);
+        aViewWindow->SetSelectionMode(ActorSelection);
       mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
     } else {
       int aConstructorId = GetConstructorId();
-      if (aConstructorId == 0)
-       {
-         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-           aViewWindow->SetSelectionMode(EdgeSelection);
-       }
-      else if (aConstructorId == 1)
-       {
-         if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-           aViewWindow->SetSelectionMode(FaceSelection);
-       }
+      switch(aConstructorId) {
+          case 0:
+          {   
+            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+              aViewWindow->SetSelectionMode(NodeSelection);
+            break;
+          }
+          case 1:
+          {
+            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+              aViewWindow->SetSelectionMode(EdgeSelection);
+            break;
+          }
+          case 2:
+          {
+            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(FaceSelection);
+            break;
+          }
+      }
     }
   }
   else if (send == SelectVectorButton){
@@ -928,17 +1033,26 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
     LineEditElements->setValidator(0);
   } else {
     int aConstructorId = GetConstructorId();
-    if (aConstructorId == 0)
-      {
-       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-         aViewWindow->SetSelectionMode(EdgeSelection);
-      }
-    else if (aConstructorId == 1)
-      {
-       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-         aViewWindow->SetSelectionMode(FaceSelection);
-      }
-
+    switch(aConstructorId) {
+      case 0:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(NodeSelection);
+          break;
+        }
+      case 1:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(EdgeSelection);
+          break;
+        }
+      case 2:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(FaceSelection);
+          break;
+        }
+    }
     LineEditElements->setReadOnly(false);
     LineEditElements->setValidator(myIdValidator);
     onTextChange(LineEditElements->text());
@@ -983,18 +1097,36 @@ void SMESHGUI_ExtrusionDlg::setFilters()
 {
   if(myMesh->_is_nil()) {
     SUIT_MessageBox::critical(this,
-                             tr("SMESH_ERROR"),
-                             tr("NO_MESH_SELECTED"));
+                              tr("SMESH_ERROR"),
+                              tr("NO_MESH_SELECTED"));
    return;
   }
   if ( !myFilterDlg )
   {
     QList<int> types;  
+    types.append( SMESH::NODE );
     types.append( SMESH::EDGE );
     types.append( SMESH::FACE );
     myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, types );
   }
-  myFilterDlg->Init( GetConstructorId() ? SMESH::FACE : SMESH::EDGE );
+  switch( GetConstructorId() ){
+    case 0: 
+      {
+      myFilterDlg->Init( SMESH::NODE );
+        break;
+      }
+    case 1:
+      {
+      myFilterDlg->Init( SMESH::EDGE );
+        break;
+      }
+    case 2:
+      {
+      myFilterDlg->Init( SMESH::FACE );
+        break;
+      }
+  }
+  
 
   myFilterDlg->SetSelection();
   myFilterDlg->SetMesh( myMesh );
@@ -1032,3 +1164,82 @@ bool SMESHGUI_ExtrusionDlg::isValid()
   }
   return true;
 }
+
+//=================================================================================
+// function : onDisplaySimulation
+// purpose  : Show/Hide preview
+//=================================================================================
+void SMESHGUI_ExtrusionDlg::onDisplaySimulation( bool toDisplayPreview ) {
+  if (myPreviewCheckBox->isChecked() && toDisplayPreview) {
+    if (myNbOkElements && isValid() && isValuesValid()) {
+      //Get input vector
+      SMESH::DirStruct aVector;
+      getExtrusionVector(aVector);
+
+      //Get Number of the steps 
+      long aNbSteps = (long)SpinBox_NbSteps->value();
+      
+      try {
+        SUIT_OverrideCursor aWaitCursor;
+        SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
+        if( CheckBoxMesh->isChecked() ) {
+          switch (GetConstructorId()) {
+            case 0:
+              {
+                aMeshEditor->ExtrusionSweepObject0D(mySelectedObject, aVector, aNbSteps);
+                                       break;
+              }
+            case 1:
+              {
+                aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps);
+                                       break;
+              }
+            case 2:
+              {
+                aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps);
+                                       break;
+              }
+          }
+        }
+        else
+          if(GetConstructorId() == 0)
+            aMeshEditor->ExtrusionSweep0D(myElementsId.inout(), aVector, aNbSteps);
+          else
+            aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps);
+        
+        SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
+        mySimulation->SetData(aMeshPreviewStruct._retn());
+      } catch (...) {
+        hidePreview();
+      }
+    } else {
+      hidePreview();
+    }
+  } else {
+    hidePreview();
+  }
+}
+
+//=================================================================================
+// function : getExtrusionVector()
+// purpose  : get direction of the extrusion
+//=================================================================================
+void SMESHGUI_ExtrusionDlg::getExtrusionVector(SMESH::DirStruct& aVector) {
+  if ( RadioButton3->isChecked() ) {
+    aVector.PS.x = SpinBox_Dx->GetValue();
+    aVector.PS.y = SpinBox_Dy->GetValue();
+    aVector.PS.z = SpinBox_Dz->GetValue();      
+  } else if ( RadioButton4->isChecked() ) {
+    gp_XYZ aNormale(SpinBox_Vx->GetValue(),
+                    SpinBox_Vy->GetValue(),
+                    SpinBox_Vz->GetValue());
+    
+    
+    aNormale /= aNormale.Modulus();
+    long aVDist = (long)SpinBox_VDist->value();
+    
+    aVector.PS.x = aNormale.X()*aVDist;
+    aVector.PS.y = aNormale.Y()*aVDist;
+    aVector.PS.z = aNormale.Z()*aVDist;
+  }
+}