Salome HOME
*** empty log message ***
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MoveNodesDlg.cxx
index f249535c87a3e4a6521ab88218941b9aa069233b..3b36976fcbeabef71e4003c65d81272c792fab3c 100644 (file)
 //  $Header$
 
 #include "SMESHGUI_MoveNodesDlg.h"
+#include <SMESHGUI_SpinBox.h>
 
-#include "SMESHGUI.h"
-#include "SMESHGUI_SpinBox.h"
-#include "SMESHGUI_IdValidator.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
+#include <SUIT_ResourceMgr.h>
 
-#include "SMESH_Actor.h"
-#include "SMDS_Mesh.hxx"
-#include "SMDS_MeshNode.hxx"
+#include <SMDSAbs_ElementType.hxx>
 
-#include "SalomeApp_SelectionMgr.h"
-#include "SUIT_ResourceMgr.h"
-#include "SUIT_Desktop.h"
-
-#include "SVTK_Selector.h"
-#include "SVTK_ViewModel.h"
-#include "SVTK_ViewWindow.h"
-#include "SALOME_ListIO.hxx"
-
-#include "SVTK_ViewWindow.h"
-
-#include "utilities.h"
-
-// OCCT includes
-#include <TColStd_MapOfInteger.hxx>
-
-// VTK includes
-#include <vtkCell.h>
-#include <vtkIdList.h>
-#include <vtkIntArray.h>
-#include <vtkCellArray.h>
-#include <vtkUnsignedCharArray.h>
-#include <vtkUnstructuredGrid.h>
-#include <vtkDataSetMapper.h>
-
-// QT includes
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qradiobutton.h>
 #include <qlayout.h>
-#include <qpixmap.h>
-#include <qmessagebox.h>
 #include <qbuttongroup.h>
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-#define MARGIN  10
-#define SPACING 5
-
+#include <qradiobutton.h>
+#include <qlabel.h>
 
 //=================================================================================
 // name    : SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg
 // Purpose :
 //=================================================================================
-SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg (SMESHGUI* theModule, 
-                                             const char* theName):
-  QDialog(SMESH::GetDesktop(theModule), 
-         theName, 
-         false,
-         WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
-  mySelector(SMESH::GetViewWindow(theModule)->GetSelector()),
-  mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
-  myViewWindow(SMESH::GetViewWindow(theModule)),
-  mySMESHGUI(theModule)
-{
-  myPreviewActor = 0;
-  myBusy = false;
-
-  setCaption(tr("CAPTION"));
-
-  QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);
-
-  QFrame* aMainFrame = createMainFrame  (this);
-  QFrame* aBtnFrame  = createButtonFrame(this);
-
-  aDlgLay->addWidget(aMainFrame);
-  aDlgLay->addWidget(aBtnFrame);
-
-  aDlgLay->setStretchFactor(aMainFrame, 1);
-
-  Init();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::createButtonFrame
-// Purpose : Create frame containing buttons
-//=======================================================================
-QFrame* SMESHGUI_MoveNodesDlg::createButtonFrame (QWidget* theParent)
-{
-  QFrame* aFrame = new QFrame(theParent);
-  aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);
-
-  myOkBtn     = new QPushButton(tr("SMESH_BUT_OK"   ), aFrame);
-  myApplyBtn  = new QPushButton(tr("SMESH_BUT_APPLY"), aFrame);
-  myCloseBtn  = new QPushButton(tr("SMESH_BUT_CLOSE"), aFrame);
-
-  QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
-
-  QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);
-
-  aLay->addWidget(myOkBtn);
-  aLay->addWidget(myApplyBtn);
-  aLay->addItem(aSpacer);
-  aLay->addWidget(myCloseBtn);
-
-  connect(myOkBtn,    SIGNAL(clicked()), SLOT(onOk()));
-  connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
-  connect(myApplyBtn, SIGNAL(clicked()), SLOT(onApply()));
-
-  return aFrame;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::createMainFrame
-// Purpose : Create frame containing dialog's input fields
-//=======================================================================
-QFrame* SMESHGUI_MoveNodesDlg::createMainFrame (QWidget* theParent)
+SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg()
+: SMESHGUI_Dialog()
 {
-  QFrame* aFrame = new QFrame(theParent);
+  setCaption( tr( "CAPTION" ) );
 
-  QPixmap iconMoveNode (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MOVE_NODE")));
-  QPixmap iconSelect   (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
+  QVBoxLayout* main = new QVBoxLayout( mainFrame() );
 
-  QButtonGroup* aPixGrp = new QButtonGroup(1, Qt::Vertical, tr("MESH_NODE"), aFrame);
+  QPixmap iconMoveNode( resMgr()->loadPixmap( "SMESH", tr( "ICON_DLG_MOVE_NODE" ) ) );
+  
+  QButtonGroup* aPixGrp = new QButtonGroup(1, Qt::Vertical, tr("MESH_NODE"), mainFrame() );
   aPixGrp->setExclusive(TRUE);
   QRadioButton* aRBut = new QRadioButton(aPixGrp);
   aRBut->setPixmap(iconMoveNode);
   aRBut->setChecked(TRUE);
 
-  QGroupBox* anIdGrp = new QGroupBox(1, Qt::Vertical, tr("SMESH_MOVE"), aFrame);
-  new QLabel(tr("NODE_ID"), anIdGrp);
-  (new QPushButton(anIdGrp))->setPixmap(iconSelect);
-  myId = new QLineEdit(anIdGrp);
-  myId->setValidator(new SMESHGUI_IdValidator(this, "validator", 1));
+  main->addWidget( aPixGrp );
+
+  QGroupBox* anIdGrp = new QGroupBox( 3, Qt::Horizontal, tr( "SMESH_MOVE" ), mainFrame() );
+  createObject( tr( "NODE_ID" ), anIdGrp, 0 );
+  setNameIndication( 0, OneName );
+  setObjectType( 0, prefix( "SMESH element" ) + SMDSAbs_Node, -1 );
 
-  QGroupBox* aCoordGrp = new QGroupBox(1, Qt::Vertical, tr("SMESH_COORDINATES"), aFrame);
+  main->addWidget( anIdGrp );
+
+  QGroupBox* aCoordGrp = new QGroupBox(1, Qt::Vertical, tr("SMESH_COORDINATES"), mainFrame() );
   new QLabel(tr("SMESH_X"), aCoordGrp);
   myX = new SMESHGUI_SpinBox(aCoordGrp);
   new QLabel(tr("SMESH_Y"), aCoordGrp);
@@ -176,378 +74,43 @@ QFrame* SMESHGUI_MoveNodesDlg::createMainFrame (QWidget* theParent)
   new QLabel(tr("SMESH_Z"), aCoordGrp);
   myZ = new SMESHGUI_SpinBox(aCoordGrp);
 
+  main->addWidget( aCoordGrp );
+
   myX->RangeStepAndValidator(-999999.999, +999999.999, 25.0, 3);
   myY->RangeStepAndValidator(-999999.999, +999999.999, 25.0, 3);
-  myZ->RangeStepAndValidator(-999999.999, +999999.999, 25.0, 3);
+  myZ->RangeStepAndValidator(-999999.999, +999999.999, 25.0, 3); 
 
-  QVBoxLayout* aLay = new QVBoxLayout(aFrame);
-  aLay->addWidget(aPixGrp);
-  aLay->addWidget(anIdGrp);
-  aLay->addWidget(aCoordGrp);
-
-  // connect signale and slots
-  connect(myX, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myY, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myZ, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myId, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
-
-  return aFrame;
+  connect( myX, SIGNAL( valueChanged( double ) ), this, SIGNAL( valueChanged() ) );
+  connect( myY, SIGNAL( valueChanged( double ) ), this, SIGNAL( valueChanged() ) );
+  connect( myZ, SIGNAL( valueChanged( double ) ), this, SIGNAL( valueChanged() ) );
 }
 
-//=======================================================================
+//=================================================================================
 // name    : SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg
 // Purpose :
-//=======================================================================
+//=================================================================================
 SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg()
 {
-  erasePreview();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::Init
-// Purpose : Init dialog fields
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::Init()
-{
-  myPreviewActor = 0;
-  myMeshActor = 0;
-  myBusy = false;
-
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
-  // selection and SMESHGUI
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
-  connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
-  connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
-
-  reset();
-  setEnabled(true);
-
-  int x, y;
-  mySMESHGUI->DefineDlgPosition(this, x, y);
-  this->move(x, y);
-  this->show();
-
-  // set selection mode
-  SMESH::SetPointRepresentation(true);
-  myViewWindow->SetSelectionMode(NodeSelection);
-
-  onSelectionDone();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::isValid
-// Purpose : Verify validity of entry information
-//=======================================================================
-bool SMESHGUI_MoveNodesDlg::isValid (const bool theMess) const
-{
-  if (myId->text().isEmpty()) {
-    if (theMess)
-      QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"),
-                               tr("NODE_ID_IS_NOT_DEFINED"), QMessageBox::Ok);
-    return false;
-  }
-  return true;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::reset
-// Purpose : Reset the dialog state
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::reset()
-{
-  myId->clear();
-  myX->SetValue(0);
-  myY->SetValue(0);
-  myZ->SetValue(0);
-  redisplayPreview();
-  updateButtons();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onApply
-// Purpose : SLOT called when "Apply" button pressed.
-//=======================================================================
-bool SMESHGUI_MoveNodesDlg::onApply()
-{
-  if (mySMESHGUI->isActiveStudyLocked())
-    return false;
-
-  if (!isValid(true))
-    return false;
-
-  SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(myMeshActor->getIO());
-  if (aMesh->_is_nil()) {
-    QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
-                             tr("SMESHG_NO_MESH"), QMessageBox::Ok);
-    return false;
-  }
-
-  SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
-  if (aMeshEditor->_is_nil())
-    return false;
-
-  int anId = myId->text().toInt();
-  bool aResult = false;
-  try {
-    aResult = aMeshEditor->MoveNode(anId, myX->GetValue(), myY->GetValue(), myZ->GetValue());
-  } catch (...) {
-  }
-
-  if (aResult) {
-    SALOME_ListIO aList;
-    aList.Append(myMeshActor->getIO());
-    mySelectionMgr->setSelectedObjects(aList,false);
-    SMESH::UpdateView();
-    reset();
-  }
-
-  return aResult;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onOk
-// Purpose : SLOT called when "Ok" button pressed.
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onOk()
-{
-  if (onApply())
-    onClose();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onClose
-// Purpose : SLOT called when "Close" button pressed. Close dialog
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onClose()
-{
-  mySelectionMgr->clearSelected();
-  SMESH::SetPointRepresentation(false);
-  myViewWindow->SetSelectionMode(ActorSelection);
-  disconnect(mySelectionMgr, 0, this, 0);
-  disconnect(mySMESHGUI, 0, this, 0);
-  mySMESHGUI->ResetState();
-  reject();
 }
 
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onTextChange
+//=================================================================================
+// name    : SMESHGUI_MoveNodesDlg::setCoords
 // Purpose :
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onTextChange (const QString& theNewText)
-{
-  if (myBusy) return;
-
-  myOkBtn->setEnabled(false);
-  myApplyBtn->setEnabled(false);
-  erasePreview();
-
-  // select entered node
-  if(myMeshActor){
-    if(SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh()){
-      myBusy = true;
-      Handle(SALOME_InteractiveObject) anIO = myMeshActor->getIO();
-      SALOME_ListIO aList;
-      aList.Append(anIO);
-      mySelectionMgr->setSelectedObjects(aList,false);
-      myBusy = false;
-
-      if(const SMDS_MeshElement *anElem = aMesh->FindElement(theNewText.toInt())) {
-       TColStd_MapOfInteger aListInd;
-       aListInd.Add(anElem->GetID());
-       mySelector->AddOrRemoveIndex(anIO,aListInd, false);
-       myViewWindow->highlight(anIO,true,true);
-       
-       onSelectionDone();
-      }
-    }
-  }
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onSelectionDone
-// Purpose : SLOT called when selection changed
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onSelectionDone()
-{
-  if (myBusy) return;
-  myMeshActor = 0;
-
-  SALOME_ListIO aList;
-  mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
-  if (aList.Extent() == 1) {
-    Handle(SALOME_InteractiveObject) anIO = aList.First();
-    myMeshActor = SMESH::FindActorByEntry(anIO->getEntry());
-    if(myMeshActor){
-      QString aText;
-      if (SMESH::GetNameOfSelectedNodes(mySelector,anIO,aText) == 1) {
-        if(SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh()) {
-          if(const SMDS_MeshNode* aNode = aMesh->FindNode(aText.toInt())) {
-            myBusy = true;
-            myId->setText(aText);
-            myX->SetValue(aNode->X());
-            myY->SetValue(aNode->Y());
-            myZ->SetValue(aNode->Z());
-            myBusy = false;
-            erasePreview(); // avoid overlapping of a selection and a preview
-            updateButtons();
-            return;
-          }
-        }
-      }
-    }
-  }
-
-  reset();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onDeactivate
-// Purpose : SLOT called when dialog must be deativated
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onDeactivate()
-{
-  setEnabled(false);
-  erasePreview();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::enterEvent
-// Purpose : Event filter
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::enterEvent (QEvent*)
+//=================================================================================
+void SMESHGUI_MoveNodesDlg::setCoords( const double x, const double y, const double z )
 {
-  if (!isEnabled()) {
-    mySMESHGUI->EmitSignalDeactivateDialog();
-
-    // set selection mode
-    SMESH::SetPointRepresentation(true);
-    myViewWindow->SetSelectionMode(NodeSelection);
-
-    redisplayPreview();
-
-    setEnabled(true);
-  }
+  myX->setValue( x );
+  myY->setValue( y );
+  myZ->setValue( z );
 }
 
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::closeEvent
+//=================================================================================
+// name    : SMESHGUI_MoveNodesDlg::coords
 // Purpose :
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::closeEvent (QCloseEvent*)
-{
-  onClose();
-  myViewWindow->Repaint();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::hideEvent
-// Purpose : may be caused by ESC key
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::hideEvent (QHideEvent*)
-{
-  if (!isMinimized())
-    onClose();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::updateButtons
-// Purpose : Update buttons state
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::updateButtons()
-{
-  bool isEnabled = isValid(false);
-  myOkBtn->setEnabled(isEnabled);
-  myApplyBtn->setEnabled(isEnabled);
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::erasePreview
-// Purpose : Erase preview
-//=======================================================================
-void  SMESHGUI_MoveNodesDlg::erasePreview()
-{
-  if (myPreviewActor == 0)
-    return;
-
-  myViewWindow->RemoveActor(myPreviewActor);
-  myPreviewActor->Delete();
-  myPreviewActor = 0;
-  myViewWindow->Repaint();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::redisplayPreview
-// Purpose : Redisplay preview
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::redisplayPreview()
+//=================================================================================
+void SMESHGUI_MoveNodesDlg::coords( double& x, double& y, double& z ) const
 {
-  if (myBusy)
-    return;
-
-  if (myPreviewActor != 0)
-    erasePreview();
-
-  if (!isValid(false))
-    return;
-
-  vtkUnstructuredGrid* aGrid = vtkUnstructuredGrid::New();
-
-  vtkPoints* aPoints = vtkPoints::New();
-  aPoints->SetNumberOfPoints(1);
-  aPoints->SetPoint(0, myX->GetValue(), myY->GetValue(), myZ->GetValue());
-
-  // Create cells
-
-  vtkIdList *anIdList = vtkIdList::New();
-  anIdList->SetNumberOfIds(1);
-
-  vtkCellArray *aCells = vtkCellArray::New();
-  aCells->Allocate(2, 0);
-
-  vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
-  aCellTypesArray->SetNumberOfComponents(1);
-  aCellTypesArray->Allocate(1);
-
-  anIdList->SetId(0, 0);
-  aCells->InsertNextCell(anIdList);
-  aCellTypesArray->InsertNextValue(VTK_VERTEX);
-  anIdList->Delete();
-
-  vtkIntArray* aCellLocationsArray = vtkIntArray::New();
-  aCellLocationsArray->SetNumberOfComponents(1);
-  aCellLocationsArray->SetNumberOfTuples(1);
-
-  aCells->InitTraversal();
-  vtkIdType npts;
-  aCellLocationsArray->SetValue(0, aCells->GetTraversalLocation(npts));
-
-  aGrid->SetPoints(aPoints);
-  aPoints->Delete();
-
-  aGrid->SetCells(aCellTypesArray,aCellLocationsArray,aCells);
-  aCellLocationsArray->Delete();
-  aCellTypesArray->Delete();
-  aCells->Delete();
-
-  // Create and display actor
-  vtkDataSetMapper* aMapper = vtkDataSetMapper::New();
-  aMapper->SetInput(aGrid);
-  aGrid->Delete();
-
-  myPreviewActor = SALOME_Actor::New();
-  myPreviewActor->PickableOff();
-  myPreviewActor->SetMapper(aMapper);
-  aMapper->Delete();
-
-  vtkProperty* aProp = vtkProperty::New();
-  aProp->SetRepresentationToWireframe();
-  aProp->SetColor(250, 0, 250);
-  aProp->SetPointSize(5);
-  myPreviewActor->SetProperty(aProp);
-  aProp->Delete();
-
-  myViewWindow->AddActor(myPreviewActor);
-  myViewWindow->Repaint();
+  x = myX->value();
+  y = myY->value();
+  z = myZ->value();
 }