-using namespace std;
-// File : SMESHGUI_MoveNodesDlg.cxx
-// Created : Thu Jun 20 22:30:09 2002
-// Author : Nicolas REJNERI
-
-// Project : SALOME
-// Module : SMESH
-// Copyright : Open CASCADE 2002
+// SMESH SMESHGUI : GUI for SMESH component
+//
+// Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+// File : SMESHGUI_MoveNodesDlg.cxx
+// Author : Nicolas REJNERI
+// Module : SMESH
// $Header$
#include "SMESHGUI_MoveNodesDlg.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 "SMESH_Actor.h"
+#include "SMDS_Mesh.hxx"
+#include "SMDS_MeshNode.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 "QAD_Application.h"
-#include "QAD_Desktop.h"
-#include "QAD_MessageBox.h"
#include "utilities.h"
-// QT Includes
-#include <qbuttongroup.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 <qvariant.h>
-#include <qtooltip.h>
-#include <qwhatsthis.h>
-#include <qimage.h>
#include <qpixmap.h>
+#include <qmessagebox.h>
+#include <qbuttongroup.h>
-// Open CASCADE Include
-#include <TColStd_MapIteratorOfMapOfInteger.hxx>
+// IDL Headers
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+
+#define MARGIN 10
+#define SPACING 5
-// VTK Include
-#include <vtkActor.h>
//=================================================================================
-// class : SMESHGUI_MoveNodesDlg()
-// purpose :
+// name : SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg
+// Purpose :
//=================================================================================
-SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg( QWidget* parent, const char* name, SALOME_Selection* Sel,
- bool modal, WFlags fl )
- : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+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)
{
- QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_DLG_MOVE_NODE")));
- QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT")));
-
- if ( !name )
- setName( "SMESHGUI_MoveNodesDlg" );
- resize( 303, 185 );
- setCaption( tr( "SMESH_MOVE_NODES_TITLE" ) );
- setSizeGripEnabled( TRUE );
- SMESHGUI_MoveNodesDlgLayout = new QGridLayout( this );
- SMESHGUI_MoveNodesDlgLayout->setSpacing( 6 );
- SMESHGUI_MoveNodesDlgLayout->setMargin( 11 );
-
- /***************************************************************/
- GroupConstructors = new QButtonGroup( this, "GroupConstructors" );
- GroupConstructors->setTitle( tr( "SMESH_NODES" ) );
- GroupConstructors->setExclusive( TRUE );
- GroupConstructors->setColumnLayout(0, Qt::Vertical );
- GroupConstructors->layout()->setSpacing( 0 );
- GroupConstructors->layout()->setMargin( 0 );
- GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() );
- GroupConstructorsLayout->setAlignment( Qt::AlignTop );
- GroupConstructorsLayout->setSpacing( 6 );
- GroupConstructorsLayout->setMargin( 11 );
- Constructor1 = new QRadioButton( GroupConstructors, "Constructor1" );
- Constructor1->setText( tr( "" ) );
- Constructor1->setPixmap( image0 );
- Constructor1->setChecked( TRUE );
- Constructor1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth() ) );
- Constructor1->setMinimumSize( QSize( 50, 0 ) );
- GroupConstructorsLayout->addWidget( Constructor1, 0, 0 );
- QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
- GroupConstructorsLayout->addItem( spacer, 0, 1 );
- SMESHGUI_MoveNodesDlgLayout->addWidget( GroupConstructors, 0, 0 );
-
- /***************************************************************/
- GroupButtons = new QGroupBox( this, "GroupButtons" );
- GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) );
- GroupButtons->setTitle( tr( "" ) );
- GroupButtons->setColumnLayout(0, Qt::Vertical );
- GroupButtons->layout()->setSpacing( 0 );
- GroupButtons->layout()->setMargin( 0 );
- GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
- GroupButtonsLayout->setAlignment( Qt::AlignTop );
- GroupButtonsLayout->setSpacing( 6 );
- GroupButtonsLayout->setMargin( 11 );
- buttonCancel = new QPushButton( GroupButtons, "buttonCancel" );
- buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) );
- buttonCancel->setAutoDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonCancel, 0, 3 );
- buttonApply = new QPushButton( GroupButtons, "buttonApply" );
- buttonApply->setText( tr( "SMESH_BUT_APPLY" ) );
- buttonApply->setAutoDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonApply, 0, 1 );
- QSpacerItem* spacer_9 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
- GroupButtonsLayout->addItem( spacer_9, 0, 2 );
- buttonOk = new QPushButton( GroupButtons, "buttonOk" );
- buttonOk->setText( tr( "SMESH_BUT_OK" ) );
- buttonOk->setAutoDefault( TRUE );
- buttonOk->setDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonOk, 0, 0 );
- SMESHGUI_MoveNodesDlgLayout->addWidget( GroupButtons, 3, 0 );
-
- /***************************************************************/
- GroupC1 = new QGroupBox( this, "GroupC1" );
- GroupC1->setTitle( tr( "SMESH_MOVE" ) );
- GroupC1->setMinimumSize( QSize( 0, 0 ) );
- GroupC1->setFrameShape( QGroupBox::Box );
- GroupC1->setFrameShadow( QGroupBox::Sunken );
- GroupC1->setColumnLayout(0, Qt::Vertical );
- GroupC1->layout()->setSpacing( 0 );
- GroupC1->layout()->setMargin( 0 );
- GroupC1Layout = new QGridLayout( GroupC1->layout() );
- GroupC1Layout->setAlignment( Qt::AlignTop );
- GroupC1Layout->setSpacing( 6 );
- GroupC1Layout->setMargin( 11 );
- TextLabelC1A1 = new QLabel( GroupC1, "TextLabelC1A1" );
- TextLabelC1A1->setText( tr( "SMESH_ID_NODES" ) );
- TextLabelC1A1->setMinimumSize( QSize( 50, 0 ) );
- TextLabelC1A1->setFrameShape( QLabel::NoFrame );
- TextLabelC1A1->setFrameShadow( QLabel::Plain );
- GroupC1Layout->addWidget( TextLabelC1A1, 0, 0 );
- SelectButtonC1A1 = new QPushButton( GroupC1, "SelectButtonC1A1" );
- SelectButtonC1A1->setText( tr( "" ) );
- SelectButtonC1A1->setPixmap( image1 );
- SelectButtonC1A1->setToggleButton( FALSE );
- GroupC1Layout->addWidget( SelectButtonC1A1, 0, 1 );
- LineEditC1A1 = new QLineEdit( GroupC1, "LineEditC1A1" );
- GroupC1Layout->addWidget( LineEditC1A1, 0, 2 );
-
- SMESHGUI_MoveNodesDlgLayout->addWidget( GroupC1, 1, 0 );
-
- /***************************************************************/
- GroupCoordinates = new QGroupBox( this, "GroupCoordinates" );
- GroupCoordinates->setTitle( tr( "SMESH_COORDINATES" ) );
- GroupCoordinates->setColumnLayout(0, Qt::Vertical );
- GroupCoordinates->layout()->setSpacing( 0 );
- GroupCoordinates->layout()->setMargin( 0 );
- GroupCoordinatesLayout = new QGridLayout( GroupCoordinates->layout() );
- GroupCoordinatesLayout->setAlignment( Qt::AlignTop );
- GroupCoordinatesLayout->setSpacing( 6 );
- GroupCoordinatesLayout->setMargin( 11 );
- TextLabel_X = new QLabel( GroupCoordinates, "TextLabel_X" );
- TextLabel_X->setText( tr( "SMESH_X" ) );
- GroupCoordinatesLayout->addWidget( TextLabel_X, 0, 0 );
- TextLabel_Y = new QLabel( GroupCoordinates, "TextLabel_Y" );
- TextLabel_Y->setText( tr( "SMESH_Y" ) );
- GroupCoordinatesLayout->addWidget( TextLabel_Y, 0, 2 );
-
- SpinBox_X = new SMESHGUI_SpinBox( GroupCoordinates, "SpinBox_X" ) ;
- GroupCoordinatesLayout->addWidget( SpinBox_X, 0, 1 );
-
- SpinBox_Y = new SMESHGUI_SpinBox( GroupCoordinates, "SpinBox_Y" ) ;
- GroupCoordinatesLayout->addWidget( SpinBox_Y, 0, 3 );
-
- SpinBox_Z = new SMESHGUI_SpinBox( GroupCoordinates, "SpinBox_Z" ) ;
- GroupCoordinatesLayout->addWidget( SpinBox_Z, 0, 5 );
-
-
- TextLabel_Z = new QLabel( GroupCoordinates, "TextLabel_Z" );
- TextLabel_Z->setText( tr( "SMESH_Z" ) );
- GroupCoordinatesLayout->addWidget( TextLabel_Z, 0, 4 );
-
- SMESHGUI_MoveNodesDlgLayout->addWidget( GroupCoordinates, 2, 0 );
-
- Init(Sel) ; /* Initialisations */
+ 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();
}
-//=================================================================================
-// function : ~SMESHGUI_MoveNodesDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::createButtonFrame
+// Purpose : Create frame containing buttons
+//=======================================================================
+QFrame* SMESHGUI_MoveNodesDlg::createButtonFrame (QWidget* theParent)
{
- // no need to delete child widgets, Qt does it all for us
-}
+ 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);
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::Init( SALOME_Selection* Sel )
-{
+ QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
- /* Get setting of step value from file configuration */
- double step ;
- // QString St = QAD_CONFIG->getSetting( "xxxxxxxxxxxxx" ) ; TODO
- // step = St.toDouble() ; TODO
- step = 25.0 ;
-
- GroupC1->show();
- myConstructorId = 0 ;
- Constructor1->setChecked( TRUE );
- myEditCurrentArgument = LineEditC1A1 ;
- mySelection = Sel;
- this->myOkNodes = false ;
- mySMESHGUI = SMESHGUI::GetSMESHGUI() ;
- mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
-
- /* min, max, step and decimals for spin boxes */
- SpinBox_X->RangeStepAndValidator( -999.999, +999.999, step, 3 ) ;
- SpinBox_Y->RangeStepAndValidator( -999.999, +999.999, step, 3 ) ;
- SpinBox_Z->RangeStepAndValidator( -999.999, +999.999, step, 3 ) ;
- SpinBox_X->SetValue( 0.0 ) ;
- SpinBox_Y->SetValue( 0.0 ) ;
- SpinBox_Z->SetValue( 0.0 ) ;
-
- /* signals and slots connections */
- connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
- connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ;
- connect( buttonApply, SIGNAL( clicked() ), this, SLOT(ClickOnApply() ) );
- connect( GroupConstructors, SIGNAL(clicked(int) ), SLOT( ConstructorsClicked(int) ) );
-
- connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ;
- connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ;
- connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
- /* to close dialog if study change */
- connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ;
-
- connect( SpinBox_X, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- connect( SpinBox_Y, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- connect( SpinBox_Z, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
-
- /* Move widget on the botton right corner of main widget */
- int x, y ;
- mySMESHGUI->DefineDlgPosition( this, x, y ) ;
- this->move( x, y ) ;
- this->show() ; /* displays Dialog */
-
- SelectionIntoArgument();
-
- return ;
-}
+ QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);
+ aLay->addWidget(myOkBtn);
+ aLay->addWidget(myApplyBtn);
+ aLay->addItem(aSpacer);
+ aLay->addWidget(myCloseBtn);
-//=================================================================================
-// function : ConstructorsClicked()
-// purpose : Radio button management
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ConstructorsClicked(int constructorId)
-{
- return ;
-}
+ connect(myOkBtn, SIGNAL(clicked()), SLOT(onOk()));
+ connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
+ connect(myApplyBtn, SIGNAL(clicked()), SLOT(onApply()));
+ return aFrame;
+}
-//=================================================================================
-// function : ClickOnApply()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ClickOnApply()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::createMainFrame
+// Purpose : Create frame containing dialog's input fields
+//=======================================================================
+QFrame* SMESHGUI_MoveNodesDlg::createMainFrame (QWidget* theParent)
{
- switch(myConstructorId)
- {
- case 0 :
- {
- if(myOkNodes) {
- mySMESHGUI->EraseSimulationActors();
-// mySMESHGUI->MoveNode( myMesh, myIdnode, LineEdit_X->text().toFloat(), LineEdit_Y->text().toFloat(), LineEdit_Z->text().toFloat() ) ;
-// mySelection->ClearIObjects();
- }
- break ;
- }
- }
- return ;
+ QFrame* aFrame = new QFrame(theParent);
+
+ QPixmap iconMoveNode (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MOVE_NODE")));
+ QPixmap iconSelect (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
+
+ QButtonGroup* aPixGrp = new QButtonGroup(1, Qt::Vertical, tr("MESH_NODE"), aFrame);
+ 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));
+
+ QGroupBox* aCoordGrp = new QGroupBox(1, Qt::Vertical, tr("SMESH_COORDINATES"), aFrame);
+ new QLabel(tr("SMESH_X"), aCoordGrp);
+ myX = new SMESHGUI_SpinBox(aCoordGrp);
+ new QLabel(tr("SMESH_Y"), aCoordGrp);
+ myY = new SMESHGUI_SpinBox(aCoordGrp);
+ new QLabel(tr("SMESH_Z"), aCoordGrp);
+ myZ = new SMESHGUI_SpinBox(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);
+
+ 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;
}
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ClickOnOk()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg
+// Purpose :
+//=======================================================================
+SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg()
{
- this->ClickOnApply() ;
- this->ClickOnCancel() ;
-
- return ;
+ erasePreview();
}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ClickOnCancel()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::Init
+// Purpose : Init dialog fields
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::Init()
{
- QAD_Application::getDesktop()->SetSelectionMode( 4 );
- disconnect( mySelection, 0, this, 0 );
- mySMESHGUI->ResetState() ;
- mySMESHGUI->EraseSimulationActors();
- reject() ;
- return ;
-}
+ myPreviewActor = 0;
+ myMeshActor = 0;
+ myBusy = false;
+ mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::SelectionIntoArgument()
-{
+ // selection and SMESHGUI
+ connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
+ connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
+ connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
- disconnect( SpinBox_X, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- disconnect( SpinBox_Y, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- disconnect( SpinBox_Z, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
+ reset();
+ setEnabled(true);
- mySMESHGUI->EraseSimulationActors();
+ int x, y;
+ mySMESHGUI->DefineDlgPosition(this, x, y);
+ this->move(x, y);
+ this->show();
- myEditCurrentArgument->setText("") ;
- myOkNodes = false;
- QString aString = "";
+ // set selection mode
+ SMESH::SetPointRepresentation(true);
+ myViewWindow->SetSelectionMode(NodeSelection);
- int nbSel = mySelection->IObjectCount();
- if(nbSel != 1)
- return ;
+ onSelectionDone();
+}
- int nbNodes = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aString) ;
- if(nbNodes != 1) {
- SpinBox_X->SetValue(0.0) ;
- SpinBox_Y->SetValue(0.0) ;
- SpinBox_Z->SetValue(0.0) ;
- return ;
- }
-
- if ( mySelection->SelectionMode() != 1 ){
- QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"),
- tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") );
- return;
+//=======================================================================
+// 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;
+}
- myEditCurrentArgument->setText(aString) ;
- Standard_Boolean res;
- myMesh = mySMESHGUI->ConvertIOinMesh( mySelection->firstIObject(), res );
- if (!res)
- return ;
+//=======================================================================
+// 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();
+}
- SMESH_Actor* ac = mySMESHGUI->FindActorByEntry( mySelection->firstIObject()->getEntry(), res, false );
- if ( !res )
- return ;
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::onApply
+// Purpose : SLOT called when "Apply" button pressed.
+//=======================================================================
+bool SMESHGUI_MoveNodesDlg::onApply()
+{
+ if (mySMESHGUI->isActiveStudyLocked())
+ return false;
- mySelection->GetIndex( mySelection->firstIObject(), myMapIndex);
+ if (!isValid(true))
+ return false;
- TColStd_MapIteratorOfMapOfInteger ite( myMapIndex );
- if ( ite.More() ) {
- myIdnode = ite.Key();
- mySimulationActor = mySMESHGUI->SimulationMoveNode( ac, myIdnode );
- } else
- return ;
+ 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;
+ }
- MESSAGE ( " myIdnode " << myIdnode );
+ SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
+ if (aMeshEditor->_is_nil())
+ return false;
- float *pt = ac->GetMapper()->GetInput()->GetPoint(myIdnode);
- MESSAGE ( " pt " << pt[0] << ";" << pt[1] << ";" << pt[2] )
+ int anId = myId->text().toInt();
+ bool aResult = false;
+ try {
+ aResult = aMeshEditor->MoveNode(anId, myX->GetValue(), myY->GetValue(), myZ->GetValue());
+ } catch (...) {
+ }
- SpinBox_X->SetValue( (double)pt[0] ) ;
- SpinBox_Y->SetValue( (double)pt[1] ) ;
- SpinBox_Z->SetValue( (double)pt[2] ) ;
+ if (aResult) {
+ SALOME_ListIO aList;
+ aList.Append(myMeshActor->getIO());
+ mySelectionMgr->setSelectedObjects(aList,false);
+ SMESH::UpdateView();
+ reset();
+ }
- connect( SpinBox_X, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- connect( SpinBox_Y, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
- connect( SpinBox_Z, SIGNAL ( valueChanged( double) ), this, SLOT( ValueChangedInSpinBox( double) ) ) ;
+ return aResult;
+}
- myOkNodes = true ;
- return ;
+//=======================================================================
+// 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();
+}
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::SetEditCurrentArgument()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::onTextChange
+// Purpose :
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::onTextChange (const QString& theNewText)
{
- QPushButton* send = (QPushButton*)sender();
- switch (myConstructorId)
- {
- case 0: /* default constructor */
- {
- if(send == SelectButtonC1A1) {
- LineEditC1A1->setFocus() ;
- myEditCurrentArgument = LineEditC1A1;
- }
- SelectionIntoArgument() ;
- break;
+ 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();
}
}
- return ;
+ }
}
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::DeactivateActiveDialog()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::onSelectionDone
+// Purpose : SLOT called when selection changed
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::onSelectionDone()
{
- if ( GroupConstructors->isEnabled() ) {
- GroupConstructors->setEnabled(false) ;
- GroupC1->setEnabled(false) ;
- GroupButtons->setEnabled(false) ;
- mySMESHGUI->EraseSimulationActors() ;
- mySMESHGUI->ResetState() ;
- mySMESHGUI->SetActiveDialogBox(0) ;
+ 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;
+ }
+ }
+ }
+ }
}
- return ;
-}
+ reset();
+}
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ActivateThisDialog()
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::onDeactivate
+// Purpose : SLOT called when dialog must be deativated
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::onDeactivate()
{
- /* Emit a signal to deactivate the active dialog */
- mySMESHGUI->EmitSignalDeactivateDialog() ;
- GroupConstructors->setEnabled(true) ;
- GroupC1->setEnabled(true) ;
- GroupButtons->setEnabled(true) ;
-
- mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ;
- return ;
+ setEnabled(false);
+ erasePreview();
}
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::enterEvent
+// Purpose : Event filter
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::enterEvent (QEvent*)
+{
+ if (!isEnabled()) {
+ mySMESHGUI->EmitSignalDeactivateDialog();
-//=================================================================================
-// function : enterEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::enterEvent(QEvent* e)
+ // set selection mode
+ SMESH::SetPointRepresentation(true);
+ myViewWindow->SetSelectionMode(NodeSelection);
+
+ redisplayPreview();
+
+ setEnabled(true);
+ }
+}
+
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::closeEvent
+// Purpose :
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::closeEvent (QCloseEvent*)
{
- if ( GroupConstructors->isEnabled() )
- return ;
- ActivateThisDialog() ;
- return ;
+ onClose();
+ myViewWindow->Repaint();
}
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::hideEvent
+// Purpose : may be caused by ESC key
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::hideEvent (QHideEvent*)
+{
+ if (!isMinimized())
+ onClose();
+}
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::closeEvent( QCloseEvent* e )
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::updateButtons
+// Purpose : Update buttons state
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::updateButtons()
{
- /* same than click on cancel button */
- this->ClickOnCancel() ;
- return ;
+ 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;
-//=================================================================================
-// function : ValueChangedInSpinBox()
-// purpose :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::ValueChangedInSpinBox( double newValue )
+ myViewWindow->RemoveActor(myPreviewActor);
+ myPreviewActor->Delete();
+ myPreviewActor = 0;
+ myViewWindow->Repaint();
+}
+
+//=======================================================================
+// name : SMESHGUI_MoveNodesDlg::redisplayPreview
+// Purpose : Redisplay preview
+//=======================================================================
+void SMESHGUI_MoveNodesDlg::redisplayPreview()
{
- double vx = SpinBox_X->GetValue() ;
- double vy = SpinBox_Y->GetValue() ;
- double vz = SpinBox_Z->GetValue() ;
-
- mySMESHGUI->DisplaySimulationMoveNode( mySimulationActor, myIdnode, vx, vy , vz );
+ 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();
}