X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_NodesDlg.cxx;h=69bdb257e5ef71194835e7b50b4b2f256b29f86e;hp=f6925f697f0b27162f789177071b40347f4d832f;hb=6bac08c1a81f34d3f21c550bd92f83654b2546a5;hpb=4791f5b30ea7a9c1247aa551750dc71cb83b99aa diff --git a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx index f6925f697..69bdb257e 100644 --- a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx @@ -1,229 +1,393 @@ -// SMESH SMESHGUI : GUI for SMESH component +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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 +// 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, or (at your option) any later version. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : SMESHGUI_NodesDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ -using namespace std; +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_NodesDlg.cxx +// Author : Nicolas REJNERI, Open CASCADE S.A.S. +// SMESH includes +// #include "SMESHGUI_NodesDlg.h" + #include "SMESHGUI.h" #include "SMESHGUI_SpinBox.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_GroupUtils.h" -#include "QAD_Application.h" -#include "QAD_Desktop.h" -#include "utilities.h" -#include "QAD_MessageBox.h" +#include +#include +#include -#include "SMESH_Actor.h" -#include -#include +#include +#include -// VTK Includes -#include -#include -#include -#include +// SALOME GUI includes +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +// SALOME KERNEL includes +#include +#include + +#include + +// VTK includes #include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) + +#define SPACING 6 +#define MARGIN 11 + +namespace SMESH +{ + long AddNode( SMESH::SMESH_Mesh_ptr theMesh, float x, float y, float z, const QStringList& theParameters ) + { + long aNodeId = -1; + SUIT_OverrideCursor wc; + try { + _PTR(SObject) aSobj = SMESH::FindSObject( theMesh ); + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + theMesh->SetParameters( theParameters.join(":").toLatin1().constData() ); + aNodeId = aMeshEditor->AddNode( x, y, z ); + _PTR(Study) aStudy = GetActiveStudyDocument(); + CORBA::Long anId = aStudy->StudyId(); + if (TVisualObjPtr aVisualObj = SMESH::GetVisualObj( anId, aSobj->GetID().c_str() ) ) { + aVisualObj->Update( true ); + } + } + catch ( SALOME::SALOME_Exception& exc ) { + INFOS( "Follow exception was cought:\n\t" << exc.details.text ); + } + catch ( const std::exception& exc ) { + INFOS( "Follow exception was cought:\n\t" << exc.what() ); + } + catch ( ... ) { + INFOS( "Unknown exception was cought !!!" ); + } + return aNodeId; + } + class TNodeSimulation + { + SVTK_ViewWindow* myViewWindow; + + SALOME_Actor* myPreviewActor; + vtkDataSetMapper* myMapper; + vtkPoints* myPoints; + + public: + TNodeSimulation( SVTK_ViewWindow* theViewWindow ): + myViewWindow( theViewWindow ) + { + vtkUnstructuredGrid* aGrid = vtkUnstructuredGrid::New(); + + // Create points + myPoints = vtkPoints::New(); + myPoints->SetNumberOfPoints( 1 ); + myPoints->SetPoint( 0, 0.0, 0.0, 0.0 ); + + // 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 ); + + VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); + aCellLocationsArray->SetNumberOfComponents( 1 ); + aCellLocationsArray->SetNumberOfTuples( 1 ); + + aCells->InitTraversal(); + vtkIdType npts = 0; + aCellLocationsArray->SetValue( 0, aCells->GetTraversalLocation( npts ) ); + + aGrid->SetCells( aCellTypesArray, aCellLocationsArray, aCells ); + + aGrid->SetPoints( myPoints ); + aGrid->SetCells( aCellTypesArray, aCellLocationsArray, aCells ); + aCellLocationsArray->Delete(); + aCellTypesArray->Delete(); + aCells->Delete(); + anIdList->Delete(); + + // Create and display actor + myMapper = vtkDataSetMapper::New(); + myMapper->SetInputData( aGrid ); + aGrid->Delete(); + + myPreviewActor = SALOME_Actor::New(); + myPreviewActor->SetInfinitive( true ); + myPreviewActor->VisibilityOff(); + myPreviewActor->PickableOff(); + myPreviewActor->SetMapper( myMapper ); + + vtkProperty* aProp = vtkProperty::New(); + aProp->SetRepresentationToPoints(); + + double anRGB[3]; + GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 0 ) ); + aProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); + + double aPointSize = GetFloat( "SMESH:node_size", 3 ); + aProp->SetPointSize( aPointSize ); + + myPreviewActor->SetProperty( aProp ); + aProp->Delete(); + + myViewWindow->AddActor( myPreviewActor ); + } + + void SetPosition( float x, float y, float z ) + { + myPoints->SetPoint( 0, x, y, z ); + myPoints->Modified(); + SetVisibility( true ); + } + + void SetVisibility( bool theVisibility ) + { + myPreviewActor->SetVisibility( theVisibility ); + RepaintCurrentView(); + } + + ~TNodeSimulation() + { + myViewWindow->RemoveActor( myPreviewActor ); + myPreviewActor->Delete(); + + myMapper->RemoveAllInputs(); + myMapper->Delete(); + + myPoints->Delete(); + } + }; +} //================================================================================= // class : SMESHGUI_NodesDlg() -// purpose : +// purpose : //================================================================================= -SMESHGUI_NodesDlg::SMESHGUI_NodesDlg( 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_NodesDlg::SMESHGUI_NodesDlg( SMESHGUI* theModule ): + QDialog( SMESH::GetDesktop( theModule ) ), + mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), + mySMESHGUI( theModule ) { + setModal( false ); + setAttribute( Qt::WA_DeleteOnClose, true ); + setWindowTitle( tr("MESH_NODE_TITLE") ); + setSizeGripEnabled( true ); + + mySimulation = new SMESH::TNodeSimulation( SMESH::GetViewWindow( mySMESHGUI ) ); - QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESHGUI",tr("ICON_DLG_NODE"))); - if ( !name ) - setName( "SMESHGUI_NodesDlg" ); - resize( 303, 185 ); - setCaption( tr( "MESH_NODE_TITLE" ) ); - setSizeGripEnabled( TRUE ); - SMESHGUI_NodesDlgLayout = new QGridLayout( this ); - SMESHGUI_NodesDlgLayout->setSpacing( 6 ); - SMESHGUI_NodesDlgLayout->setMargin( 11 ); + QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", + tr( "ICON_DLG_NODE" ) ) ); + + QVBoxLayout* SMESHGUI_NodesDlgLayout = new QVBoxLayout( this ); + SMESHGUI_NodesDlgLayout->setSpacing( SPACING ); + SMESHGUI_NodesDlgLayout->setMargin( MARGIN ); /***************************************************************/ - 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_NodesDlgLayout->addWidget( GroupButtons, 2, 0 ); + GroupConstructors = new QGroupBox( tr( "MESH_NODE" ), this ); + QButtonGroup* ButtonGroup = new QButtonGroup(this); + QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout( GroupConstructors ); + GroupConstructorsLayout->setSpacing( SPACING ); + GroupConstructorsLayout->setMargin( MARGIN ); + + Constructor1 = new QRadioButton( GroupConstructors ); + Constructor1->setIcon( image0 ); + Constructor1->setChecked( true ); + + GroupConstructorsLayout->addWidget( Constructor1 ); + ButtonGroup->addButton( Constructor1, 0 ); /***************************************************************/ - GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); - GroupConstructors->setTitle( tr( "MESH_NODE" ) ); - 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 ); - GroupConstructorsLayout->addWidget( Constructor1, 0, 0 ); - QSpacerItem* spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupConstructorsLayout->addItem( spacer_2, 0, 1 ); - SMESHGUI_NodesDlgLayout->addWidget( GroupConstructors, 0, 0 ); + GroupCoordinates = new QGroupBox( tr( "SMESH_COORDINATES" ), this ); + QHBoxLayout* GroupCoordinatesLayout = new QHBoxLayout(GroupCoordinates); + GroupCoordinatesLayout->setSpacing(SPACING); + GroupCoordinatesLayout->setMargin(MARGIN); + + TextLabel_X = new QLabel( tr( "SMESH_X" ), GroupCoordinates ); + SpinBox_X = new SMESHGUI_SpinBox( GroupCoordinates ); + + TextLabel_Y = new QLabel( tr( "SMESH_Y" ), GroupCoordinates ); + SpinBox_Y = new SMESHGUI_SpinBox( GroupCoordinates ); + + TextLabel_Z = new QLabel( tr( "SMESH_Z" ), GroupCoordinates ); + SpinBox_Z = new SMESHGUI_SpinBox( GroupCoordinates ); + + GroupCoordinatesLayout->addWidget( TextLabel_X ); + GroupCoordinatesLayout->addWidget( SpinBox_X ); + GroupCoordinatesLayout->addWidget( TextLabel_Y); + GroupCoordinatesLayout->addWidget( SpinBox_Y ); + GroupCoordinatesLayout->addWidget( TextLabel_Z ); + GroupCoordinatesLayout->addWidget( SpinBox_Z ); + GroupCoordinatesLayout->setStretch(1, 1); + GroupCoordinatesLayout->setStretch(3, 1); + GroupCoordinatesLayout->setStretch(5, 1); /***************************************************************/ - 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 ); - - TextLabel_Z = new QLabel( GroupCoordinates, "TextLabel_Z" ); - TextLabel_Z->setText( tr( "SMESH_Z" ) ); - GroupCoordinatesLayout->addWidget( TextLabel_Z, 0, 4 ); - - SpinBox_X = new SMESHGUI_SpinBox( GroupCoordinates, "SpinBox_X" ) ; - GroupCoordinatesLayout->addWidget( SpinBox_X, 0, 1 ); + GroupGroups = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), this ); + GroupGroups->setCheckable( true ); + QHBoxLayout* GroupGroupsLayout = new QHBoxLayout(GroupGroups); + GroupGroupsLayout->setSpacing(SPACING); + GroupGroupsLayout->setMargin(MARGIN); + + TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups ); + ComboBox_GroupName = new QComboBox( GroupGroups ); + ComboBox_GroupName->setEditable( true ); + ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert ); + + GroupGroupsLayout->addWidget( TextLabel_GroupName ); + GroupGroupsLayout->addWidget( ComboBox_GroupName, 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 ); + /***************************************************************/ + GroupButtons = new QGroupBox( this ); + QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons ); + GroupButtonsLayout->setSpacing( SPACING ); + GroupButtonsLayout->setMargin( MARGIN ); + buttonOk = new QPushButton( tr( "SMESH_BUT_APPLY_AND_CLOSE" ), GroupButtons ); + buttonOk->setAutoDefault( true ); + buttonOk->setDefault( true ); + buttonApply = new QPushButton( tr( "SMESH_BUT_APPLY" ), GroupButtons ); + buttonApply->setAutoDefault( true ); + buttonCancel = new QPushButton( tr( "SMESH_BUT_CLOSE" ), GroupButtons ); + buttonCancel->setAutoDefault( true ); + buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), GroupButtons ); + buttonHelp->setAutoDefault( true ); + + GroupButtonsLayout->addWidget( buttonOk ); + GroupButtonsLayout->addSpacing( 10 ); + GroupButtonsLayout->addWidget( buttonApply ); + GroupButtonsLayout->addSpacing( 10 ); + GroupButtonsLayout->addStretch(); + GroupButtonsLayout->addWidget( buttonCancel ); + GroupButtonsLayout->addWidget( buttonHelp ); + + /***************************************************************/ + SMESHGUI_NodesDlgLayout->addWidget( GroupConstructors ); + SMESHGUI_NodesDlgLayout->addWidget( GroupCoordinates ); + SMESHGUI_NodesDlgLayout->addWidget( GroupGroups ); + SMESHGUI_NodesDlgLayout->addWidget( GroupButtons ); + + myHelpFileName = "adding_nodes_and_elements_page.html#adding_nodes_anchor"; - SMESHGUI_NodesDlgLayout->addWidget( GroupCoordinates, 1, 0 ); - /* Initialisation and display */ - Init(Sel) ; + Init(); } - //======================================================================= // function : ~SMESHGUI_NodesDlg() // purpose : Destructor //======================================================================= SMESHGUI_NodesDlg::~SMESHGUI_NodesDlg() -{} - +{ + delete mySimulation; +} //================================================================================= // function : Init() // purpose : //================================================================================= -void SMESHGUI_NodesDlg::Init(SALOME_Selection* Sel) +void SMESHGUI_NodesDlg::Init() { /* Get setting of step value from file configuration */ - double step ; - // QString St = QAD_CONFIG->getSetting( "xxxxxxxxxxxxx" ) ; TODO - // step = St.toDouble() ; TODO - step = 25.0 ; - + double step = 25.0; + /* 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 ) ; - - mySelection = Sel ; - myMeshGUI = SMESHGUI::GetSMESHGUI() ; - myMeshGUI->SetActiveDialogBox( (QDialog*)this ) ; - + SpinBox_X->RangeStepAndValidator( COORD_MIN, COORD_MAX, step, "length_precision" ); + SpinBox_Y->RangeStepAndValidator( COORD_MIN, COORD_MAX, step, "length_precision" ); + SpinBox_Z->RangeStepAndValidator( COORD_MIN, COORD_MAX, step, "length_precision" ); + SpinBox_X->SetValue( 0.0 ); + SpinBox_Y->SetValue( 0.0 ); + SpinBox_Z->SetValue( 0.0 ); + + /* reset "Add to group" control */ + GroupGroups->setChecked( false ); + + mySMESHGUI->SetActiveDialogBox( this ); + /* 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( 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) ) ) ; - - connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - connect( myMeshGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; - /* to close dialog if study change */ - connect( myMeshGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; - - /* Move widget on the botton right corner of main widget */ - int x, y ; - myMeshGUI->DefineDlgPosition( this, x, y ) ; - this->move( x, y ) ; - this->show() ; + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) ); + + connect( SpinBox_X, SIGNAL( valueChanged( double ) ), SLOT( ValueChangedInSpinBox( double ) ) ); + connect( SpinBox_Y, SIGNAL( valueChanged( double ) ), SLOT( ValueChangedInSpinBox( double ) ) ); + connect( SpinBox_Z, SIGNAL( valueChanged( double ) ), SLOT( ValueChangedInSpinBox( double ) ) ); + + connect( mySelectionMgr, SIGNAL( currentSelectionChanged() ), SLOT( SelectionIntoArgument() ) ); + connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT( DeactivateActiveDialog() ) ); + /* to close dialog if study frame change */ + connect( mySMESHGUI, SIGNAL( SignalStudyFrameChanged() ), SLOT( reject() ) ); + connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(reject())); + + // set selection mode + SMESH::SetPointRepresentation( true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ) ) + aViewWindow->SetSelectionMode( NodeSelection ); SelectionIntoArgument(); } @@ -234,13 +398,13 @@ void SMESHGUI_NodesDlg::Init(SALOME_Selection* Sel) //================================================================================= void SMESHGUI_NodesDlg::ValueChangedInSpinBox( double newValue ) { - double vx = SpinBox_X->GetValue() ; - double vy = SpinBox_Y->GetValue() ; - double vz = SpinBox_Z->GetValue() ; - myMeshGUI->DisplaySimulationNode( myMesh, vx, vy, vz ); - //myMeshGUI->ViewNodes(); + if ( !myMesh->_is_nil() ) { + double vx = SpinBox_X->GetValue(); + double vy = SpinBox_Y->GetValue(); + double vz = SpinBox_Z->GetValue(); - return ; + mySimulation->SetPosition( vx, vy, vz ); + } } //================================================================================= @@ -249,49 +413,172 @@ void SMESHGUI_NodesDlg::ValueChangedInSpinBox( double newValue ) //================================================================================= void SMESHGUI_NodesDlg::ClickOnOk() { - this->ClickOnApply() ; - this->ClickOnCancel() ; - - return ; + if ( ClickOnApply() ) + reject(); } -//======================================================================= +//================================================================================= // function : ClickOnApply() // purpose : -//======================================================================= -void SMESHGUI_NodesDlg::ClickOnApply() +//================================================================================= +bool SMESHGUI_NodesDlg::ClickOnApply() { - if ( myMeshGUI->GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK ) { - return; + if ( mySMESHGUI->isActiveStudyLocked() ) + return false; + + if ( myMesh->_is_nil() ) { + SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), + tr( "MESH_IS_NOT_SELECTED" ) ); + return false; } - - if ( Constructor1->isChecked() ) { - /* Recup args and call method */ - double x = SpinBox_X->GetValue() ; - double y = SpinBox_Y->GetValue() ; - double z = SpinBox_Z->GetValue() ; - myMeshGUI->EraseSimulationActors() ; - myMeshGUI->AddNode( myMesh, x, y, z ) ; - myMeshGUI->ViewNodes(); - mySelection->ClearIObjects(); + + if( !isValid() ) + return false; + + /* Recup args and call method */ + double x = SpinBox_X->GetValue(); + double y = SpinBox_Y->GetValue(); + double z = SpinBox_Z->GetValue(); + + QStringList aParameters; + aParameters << SpinBox_X->text(); + aParameters << SpinBox_Y->text(); + aParameters << SpinBox_Z->text(); + + bool addToGroup = GroupGroups->isChecked(); + QString aGroupName; + + SMESH::SMESH_GroupBase_var aGroup; + int idx = 0; + if( addToGroup ) { + aGroupName = ComboBox_GroupName->currentText(); + for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) { + QString aName = ComboBox_GroupName->itemText( i ); + if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) ) + idx = i; + } + if ( idx > 0 && idx <= myGroups.count() ) { + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] ); + if ( !aGeomGroup->_is_nil() ) { + int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ), + tr( "MESH_STANDALONE_GRP_CHOSEN" ).arg( aGroupName ), + tr( "SMESH_BUT_YES" ), tr( "SMESH_BUT_NO" ), 0, 1 ); + if ( res == 1 ) return false; + } + aGroup = myGroups[idx-1]; + } } -} + + mySimulation->SetVisibility( false ); + + long aNodeId = SMESH::AddNode( myMesh, x, y, z, aParameters ); + + SMESH::SetPointRepresentation( true ); + + if ( aNodeId != -1 && addToGroup && !aGroupName.isEmpty() ) { + SMESH::SMESH_Group_var aGroupUsed; + if ( aGroup->_is_nil() ){ + // create new group + aGroupUsed = SMESH::AddGroup( myMesh, SMESH::NODE, aGroupName ); + if ( !aGroupUsed->_is_nil() ) { + myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroupUsed)); + ComboBox_GroupName->addItem( aGroupName ); + } + } + else { + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); + if ( !aGeomGroup->_is_nil() ) { + aGroupUsed = myMesh->ConvertToStandalone( aGeomGroup ); + if ( !aGroupUsed->_is_nil() && idx > 0 ) { + myGroups[idx-1] = SMESH::SMESH_GroupBase::_duplicate(aGroupUsed); + SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser(); + } + } + else + aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup ); + } + if ( !aGroupUsed->_is_nil() ) { + SMESH::long_array_var anIdList = new SMESH::long_array; + anIdList->length( 1 ); + anIdList[0] = aNodeId; + aGroupUsed->Add( anIdList.inout() ); + } + } -//======================================================================= -// function : ClickOnCancel() + // select myMesh + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + if ( aList.Extent() != 1 ) { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView() ) { + VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while ( vtkActor *anAct = aCollection->GetNextActor() ) { + if ( SMESH_Actor *anActor = dynamic_cast( anAct ) ) { + if ( anActor->hasIO() ) { + if ( SMESH_MeshObj *aMeshObj = dynamic_cast( anActor->GetObject().get() ) ) { + if ( myMesh->_is_equivalent( aMeshObj->GetMeshServer() ) ) { + aList.Clear(); + aList.Append( anActor->getIO() ); + mySelectionMgr->setSelectedObjects( aList, false ); + break; + } + } + } + } + } + } + } + + SMESHGUI::Modified(); + SMESH::UpdateView(); + mySimulation->SetVisibility(false); + + return true; +} + +//================================================================================= +// function : reject() // purpose : -//======================================================================= -void SMESHGUI_NodesDlg::ClickOnCancel() +//================================================================================= +void SMESHGUI_NodesDlg::reject() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); - disconnect( mySelection, 0, this, 0 ); - myMeshGUI->ResetState() ; - myMeshGUI->EraseSimulationActors() ; - reject() ; - return ; + disconnect( mySelectionMgr, 0, this, 0 ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ) ) + aViewWindow->SetSelectionMode( ActorSelection ); + + mySimulation->SetVisibility( false ); + SMESH::SetPointRepresentation( false ); + mySMESHGUI->ResetState(); + + QDialog::reject(); } +//================================================================================= +// function : ClickOnHelp() +// purpose : +//================================================================================= +void SMESHGUI_NodesDlg::ClickOnHelp() +{ + LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); + if ( app ) + app->onHelpContextModule( mySMESHGUI ? app->moduleName( mySMESHGUI->moduleName() ) : + QString( "" ), myHelpFileName ); + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning( this, tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", + platform ) ). + arg( myHelpFileName ) ); + } +} //================================================================================= // function : SelectionIntoArgument() @@ -299,91 +586,68 @@ void SMESHGUI_NodesDlg::ClickOnCancel() //================================================================================= void SMESHGUI_NodesDlg::SelectionIntoArgument() { - int nbSel = mySelection->IObjectCount(); - if(nbSel != 1) { - SpinBox_X->SetValue(0.0) ; - SpinBox_Y->SetValue(0.0) ; - SpinBox_Z->SetValue(0.0) ; + if ( !GroupConstructors->isEnabled() ) return; - } - Standard_Boolean res; - myMesh = myMeshGUI->ConvertIOinMesh( mySelection->firstIObject(), res ); - if (!res) { - SpinBox_X->SetValue(0.0) ; - SpinBox_Y->SetValue(0.0) ; - SpinBox_Z->SetValue(0.0) ; - return ; - } - - if ( mySelection->SelectionMode() != 1 ) { - SpinBox_X->SetValue(0.0) ; - SpinBox_Y->SetValue(0.0) ; - SpinBox_Z->SetValue(0.0) ; - QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); - return; + mySimulation->SetVisibility( false ); + SMESH::SetPointRepresentation( true ); + + QString aCurrentEntry = myEntry; + + const SALOME_ListIO& aList = mySelector->StoredIObjects(); + if ( aList.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) anIO = aList.First(); + if ( anIO->hasEntry() ) { + myEntry = anIO->getEntry(); + myMesh = SMESH::GetMeshByIO( anIO ); + if ( myMesh->_is_nil() ) return; + QString aText; + if ( SMESH::GetNameOfSelectedNodes( mySelector, anIO, aText ) == 1 ) { + if ( SMESH_Actor* anActor = SMESH::FindActorByObject( myMesh.in() ) ) { + if ( SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh() ) { + if ( const SMDS_MeshNode* aNode = aMesh->FindNode( aText.toInt() ) ) { + SpinBox_X->SetValue( aNode->X() ); + SpinBox_Y->SetValue( aNode->Y() ); + SpinBox_Z->SetValue( aNode->Z() ); + } + } + } + } + mySimulation->SetPosition( SpinBox_X->GetValue(), + SpinBox_Y->GetValue(), + SpinBox_Z->GetValue() ); + } } - QString aString = ""; - int nbNodes = myMeshGUI->GetNameOfSelectedNodes(mySelection, aString) ; - if(nbNodes != 1) { - SpinBox_X->SetValue(0.0) ; - SpinBox_Y->SetValue(0.0) ; - SpinBox_Z->SetValue(0.0) ; - return ; - } - - if ( nbNodes == 1 ) { - TColStd_MapOfInteger myMapIndex; - mySelection->GetIndex( mySelection->firstIObject(), myMapIndex); - TColStd_MapIteratorOfMapOfInteger ite( myMapIndex ); - int idNodes[1]; - for ( ; ite.More(); ite.Next() ) { - idNodes[0] = ite.Key(); + // process groups + if ( !myMesh->_is_nil() && myEntry != aCurrentEntry ) { + myGroups.clear(); + ComboBox_GroupName->clear(); + ComboBox_GroupName->addItem( QString() ); + SMESH::ListOfGroups aListOfGroups = *myMesh->GetGroups(); + for( int i = 0, n = aListOfGroups.length(); i < n; i++ ) { + SMESH::SMESH_GroupBase_var aGroup = aListOfGroups[i]; + if ( !aGroup->_is_nil() && aGroup->GetType() == SMESH::NODE ) { + QString aGroupName( aGroup->GetName() ); + if ( !aGroupName.isEmpty() ) { + myGroups.append(SMESH::SMESH_GroupBase::_duplicate(aGroup)); + ComboBox_GroupName->addItem( aGroupName ); + } + } } - - Standard_Boolean result; - SMESH_Actor* ac = myMeshGUI->FindActor( myMesh, result, true ); - vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->DataSource ); - float *p0 = ugrid->GetPoint(idNodes[0]); - - SpinBox_X->SetValue( p0[0] ) ; - SpinBox_Y->SetValue( p0[1] ) ; - SpinBox_Z->SetValue( p0[2] ) ; - - myMeshGUI->DisplaySimulationNode( myMesh, p0[0], p0[1], p0[2] ); - // myMeshGUI->ViewNodes(); - } - - return ; -} - - -//======================================================================= -// function : closeEvent() -// purpose : -//======================================================================= -void SMESHGUI_NodesDlg::closeEvent(QCloseEvent* e) -{ - this->ClickOnCancel() ; /* same than click on cancel button */ - return ; + } } - //================================================================================= // function : enterEvent() // purpose : to reactivate this dialog box when mouse enter onto the window //================================================================================= -void SMESHGUI_NodesDlg::enterEvent( QEvent* e) +void SMESHGUI_NodesDlg::enterEvent( QEvent* ) { - if ( GroupConstructors->isEnabled() ) - return ; - ActivateThisDialog() ; - return ; + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); } - //================================================================================= // function : DeactivateActiveDialog() // purpose : public slot to deactivate if active @@ -391,26 +655,72 @@ void SMESHGUI_NodesDlg::enterEvent( QEvent* e) void SMESHGUI_NodesDlg::DeactivateActiveDialog() { if ( GroupConstructors->isEnabled() ) { - GroupConstructors->setEnabled(false) ; - GroupCoordinates->setEnabled(false) ; - GroupButtons->setEnabled(false) ; - myMeshGUI->EraseSimulationActors() ; - myMeshGUI->ResetState() ; - myMeshGUI->SetActiveDialogBox(0) ; + GroupConstructors->setEnabled( false ); + GroupCoordinates->setEnabled( false ); + GroupButtons->setEnabled( false ); + mySimulation->SetVisibility( false ); + mySMESHGUI->ResetState(); + mySMESHGUI->SetActiveDialogBox( 0 ); } - return ; } - //================================================================================= // function : ActivateThisDialog() // purpose : //================================================================================= -void SMESHGUI_NodesDlg::ActivateThisDialog( ) +void SMESHGUI_NodesDlg::ActivateThisDialog() +{ + mySMESHGUI->EmitSignalDeactivateDialog(); + GroupConstructors->setEnabled( true ); + GroupCoordinates->setEnabled( true ); + GroupButtons->setEnabled( true ); + + SMESH::SetPointRepresentation( true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ) ) + aViewWindow->SetSelectionMode( NodeSelection ); + + SelectionIntoArgument(); +} + +//================================================================================= +// function : keyPressEvent() +// purpose : +//================================================================================= +void SMESHGUI_NodesDlg::keyPressEvent( QKeyEvent* e ) +{ + QDialog::keyPressEvent( e ); + if ( e->isAccepted() ) + return; + + if ( e->key() == Qt::Key_F1 ) { + e->accept(); + ClickOnHelp(); + } +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool SMESHGUI_NodesDlg::isValid() { - myMeshGUI->EmitSignalDeactivateDialog() ; - GroupConstructors->setEnabled(true) ; - GroupCoordinates->setEnabled(true) ; - GroupButtons->setEnabled(true) ; - return ; + QString msg; + bool ok = true; + ok = SpinBox_X->isValid( msg, true ) && ok; + ok = SpinBox_Y->isValid( msg, true ) && ok; + ok = SpinBox_Z->isValid( msg, true ) && ok; + + if( !ok ) { + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + return false; + } + + if( GroupGroups->isChecked() && ComboBox_GroupName->currentText().isEmpty() ) { + SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) ); + return false; + } + return true; }