X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MoveNodesDlg.cxx;h=f249535c87a3e4a6521ab88218941b9aa069233b;hp=8c2c18f2231683fea8cefb3d1d6e5e8c38e8d4a8;hb=0e020f2e93a8acfb51faccf221116530c23871ad;hpb=bef9beee88cac57394b8dc3bc914381c1a2fff83 diff --git a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx index 8c2c18f22..f249535c8 100644 --- a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx @@ -1,467 +1,553 @@ -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 +// OCCT includes +#include + +// VTK includes +#include +#include +#include +#include +#include +#include +#include + +// QT includes #include #include #include #include #include #include -#include -#include -#include -#include #include +#include +#include -// Open CASCADE Include -#include +// IDL Headers +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) + +#define MARGIN 10 +#define SPACING 5 -// VTK Include -#include //================================================================================= -// 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( "SMESHGUI",tr("ICON_DLG_MOVE_NODE"))); - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap( "SMESHGUI",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(); }