X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MultiEditDlg.cxx;h=d311b490e3900dfd661fbdb8dbd5d9c9d65c6145;hp=b1662d8e64175f0d3ba5ec06e0e5553e415327ab;hb=29b9e89cb624eea575ae743d291a63a7379ff187;hpb=090aff07266d376ae028ae43434bdea7c0a0f9bb diff --git a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx index b1662d8e6..d311b490e 100755 --- a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx @@ -47,7 +47,9 @@ #include "SALOME_ListIteratorOfListIO.hxx" #include "VTKViewer_InteractorStyleSALOME.h" -#include +#include +#include +#include #include #include #include @@ -69,6 +71,8 @@ #include #include #include +#include +#include // IDL Headers #include "SALOMEconfig.h" @@ -90,18 +94,21 @@ SMESHGUI_MultiEditDlg::SMESHGUI_MultiEditDlg( QWidget* theParent, SALOME_Selection* theSelection, const int theMode, + const bool the3d2d, const char* theName ) : QDialog( theParent, theName, false, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) { myFilterDlg = 0; mySubmeshFilter = new SMESH_TypeFilter( SUBMESH ); myGroupFilter = new SMESH_TypeFilter( GROUP ); + myEntityType = 0; + myFilterType = theMode; QVBoxLayout* aDlgLay = new QVBoxLayout( this, MARGIN, SPACING ); - QFrame* aMainFrame = createMainFrame ( this ); + QFrame* aMainFrame = createMainFrame ( this, the3d2d ); QFrame* aBtnFrame = createButtonFrame( this ); aDlgLay->addWidget( aMainFrame ); @@ -116,7 +123,7 @@ SMESHGUI_MultiEditDlg::SMESHGUI_MultiEditDlg( QWidget* theParent, // name : SMESHGUI_MultiEditDlg::createMainFrame // Purpose : Create frame containing dialog's input fields //======================================================================= -QFrame* SMESHGUI_MultiEditDlg::createMainFrame( QWidget* theParent ) +QFrame* SMESHGUI_MultiEditDlg::createMainFrame( QWidget* theParent, const bool the3d2d ) { QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, theParent ); aMainGrp->setFrameStyle( QFrame::NoFrame ); @@ -126,12 +133,22 @@ QFrame* SMESHGUI_MultiEditDlg::createMainFrame( QWidget* theParent ) // "Selected cells" group mySelGrp = new QGroupBox( 1, Qt::Horizontal, aMainGrp ); + + myEntityTypeGrp = 0; + if ( the3d2d ) { + myEntityTypeGrp = new QHButtonGroup( tr("SMESH_ELEMENTS_TYPE"), mySelGrp ); + (new QRadioButton( tr("SMESH_FACE"), myEntityTypeGrp ))->setChecked( true ); + (new QRadioButton( tr("SMESH_VOLUME"), myEntityTypeGrp )); + myEntityType = myEntityTypeGrp->id( myEntityTypeGrp->selected() ); + } + QFrame* aFrame = new QFrame( mySelGrp ); myListBox = new QListBox( aFrame ); myListBox->setSelectionMode( QListBox::Extended ); myListBox->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding) ); // myListBox->setColumnMode( QListBox::FitToHeight ); + myListBox->installEventFilter( this ); myFilterBtn = new QPushButton( tr( "FILTER" ) , aFrame ); myAddBtn = new QPushButton( tr( "ADD" ) , aFrame ); @@ -216,6 +233,20 @@ SMESHGUI_MultiEditDlg::~SMESHGUI_MultiEditDlg() } } +//======================================================================= +// name : SMESHGUI_MultiEditDlg::eventFilter +// Purpose : event filter +//======================================================================= +bool SMESHGUI_MultiEditDlg::eventFilter( QObject* object, QEvent* event ) +{ + if ( object == myListBox && event->type() == QEvent::KeyPress ) { + QKeyEvent* ke = (QKeyEvent*)event; + if ( ke->key() == Key_Delete ) + onRemoveBtn(); + } + return QDialog::eventFilter( object, event ); +} + //======================================================================= // name : SMESHGUI_MultiEditDlg::Init // Purpose : Init dialog fields, connect signals and slots, show dialog @@ -251,6 +282,9 @@ void SMESHGUI_MultiEditDlg::Init( SALOME_Selection* theSelection ) connect( myGroupChk , SIGNAL( stateChanged( int ) ), SLOT( onGroupChk() ) ); connect( myToAllChk , SIGNAL( stateChanged( int ) ), SLOT( onToAllChk() ) ); + if ( myEntityTypeGrp ) + connect( myEntityTypeGrp, SIGNAL( clicked(int) ), SLOT( on3d2dChanged(int) ) ); + connect( myListBox, SIGNAL( selectionChanged() ), SLOT( onListSelectionChanged() ) ); onSelectionDone(); @@ -282,9 +316,12 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds() if ( myToAllChk->isChecked() ) { myIds.Clear(); - if ( myActor != 0 ) + SMESH_Actor * anActor = SMESH::FindActorByObject( myMesh ); + if ( !anActor ) + anActor = myActor; + if ( anActor != 0 ) { - TVisualObjPtr aVisualObj = myActor->GetObject(); + TVisualObjPtr aVisualObj = anActor->GetObject(); vtkUnstructuredGrid* aGrid = aVisualObj->GetUnstructuredGrid(); if ( aGrid != 0 ) { @@ -293,10 +330,14 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds() vtkCell* aCell = aGrid->GetCell( i ); if ( aCell != 0 ) { - int nbNodes = aCell->GetNumberOfPoints(); - if ( nbNodes == 3 && myFilterType == SMESHGUI_TriaFilter || - nbNodes == 4 && myFilterType == SMESHGUI_QuadFilter || - ( nbNodes == 4 || nbNodes == 3 ) && myFilterType == SMESHGUI_UnknownFilter ) + vtkTriangle* aTri = vtkTriangle::SafeDownCast(aCell); + vtkQuad* aQua = vtkQuad::SafeDownCast(aCell); + vtkCell3D* a3d = vtkCell3D::SafeDownCast(aCell); + + if ( aTri && myFilterType == SMESHGUI_TriaFilter || + aQua && myFilterType == SMESHGUI_QuadFilter || + ( aTri || aQua ) && myFilterType == SMESHGUI_FaceFilter || + a3d && myFilterType == SMESHGUI_VolumeFilter ) { int anObjId = aVisualObj->GetElemObjId( i ); myIds.Add( anObjId ); @@ -327,10 +368,7 @@ void SMESHGUI_MultiEditDlg::onClose() disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 ); SMESHGUI::GetSMESHGUI()->ResetState(); - SMESH::RemoveFilter(SMESHGUI_EdgeFilter); - SMESH::RemoveFilter(SMESHGUI_FaceFilter); - SMESH::RemoveFilter(SMESHGUI_QuadFilter); - SMESH::RemoveFilter(SMESHGUI_TriaFilter); + SMESH::RemoveFilters(); SMESH::SetPickable(); mySelection->ClearIObjects(); @@ -407,14 +445,11 @@ void SMESHGUI_MultiEditDlg::onSelectionDone() if (!myActor) myActor = SMESH::FindActorByObject( myMesh ); VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle(); - Handle(VTKViewer_Filter) aFilter1 = aStyle->GetFilter( myFilterType ); - Handle(VTKViewer_Filter) aFilter2 = aStyle->GetFilter( SMESHGUI_FaceFilter ); - if ( !aFilter1.IsNull() ) - aFilter1->SetActor( myActor ); - if ( !aFilter2.IsNull() ) - aFilter2->SetActor( myActor ); - if ( myActor ) - SMESH::SetPickable(myActor); + Handle(VTKViewer_Filter) aFilter = aStyle->GetFilter( myFilterType ); + if ( !aFilter.IsNull() ) + aFilter->SetActor( myActor ); +//if ( myActor ) +// SMESH::SetPickable(myActor); } myBusy = false; @@ -472,11 +507,11 @@ void SMESHGUI_MultiEditDlg::onFilterBtn() { if ( myFilterDlg == 0 ) { - myFilterDlg = new SMESHGUI_FilterDlg( (QWidget*)parent(), SMESH::FACE ); + myFilterDlg = new SMESHGUI_FilterDlg( (QWidget*)parent(), entityType() ? SMESH::VOLUME : SMESH::FACE ); connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) ); } else - myFilterDlg->Init( SMESH::FACE ); + myFilterDlg->Init( entityType() ? SMESH::VOLUME : SMESH::FACE ); myFilterDlg->SetSelection( mySelection ); myFilterDlg->SetMesh( myMesh ); @@ -511,18 +546,16 @@ void SMESHGUI_MultiEditDlg::onFilterAccepted() } //======================================================================= -// name : SMESHGUI_MultiEditDlg::onAddBtn +// name : SMESHGUI_MultiEditDlg::isIdValid // Purpose : Verify whether Id of element satisfies to filters from viewer //======================================================================= bool SMESHGUI_MultiEditDlg::isIdValid( const int theId ) const { VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle(); - Handle(SMESHGUI_Filter) aFilter1 = + Handle(SMESHGUI_Filter) aFilter = Handle(SMESHGUI_Filter)::DownCast( aStyle->GetFilter( myFilterType ) ); - Handle(SMESHGUI_Filter) aFilter2 = - Handle(SMESHGUI_Filter)::DownCast( aStyle->GetFilter( SMESHGUI_FaceFilter ) ); - return ( aFilter1.IsNull() || aFilter1->IsObjValid( theId ) ) && - ( aFilter2.IsNull() || aFilter2->IsObjValid( theId ) ); + + return ( !aFilter.IsNull() && aFilter->IsObjValid( theId ) ); } //======================================================================= @@ -570,7 +603,7 @@ void SMESHGUI_MultiEditDlg::onAddBtn() { SMESH::SMESH_GroupBase_var aGroup = SMESH::IObjectToInterface( anIter.Value() ); - if ( !aGroup->_is_nil() && aGroup->GetType() == SMESH::FACE ) + if ( !aGroup->_is_nil() && ( aGroup->GetType() == SMESH::FACE && entityType() == 0 || aGroup->GetType() == SMESH::VOLUME && entityType() == 1 ) ) { if ( aGroup->GetMesh()->GetId() == myMesh->GetId() ) { @@ -810,26 +843,31 @@ void SMESHGUI_MultiEditDlg::onToAllChk() //======================================================================= void SMESHGUI_MultiEditDlg::setSelectionMode() { + SMESH::RemoveFilters(); + mySelection->ClearIObjects(); mySelection->ClearFilters(); - if ( mySubmeshChk->isChecked() ) - { + if ( mySubmeshChk->isChecked() ) { QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true ); mySelection->AddFilter( mySubmeshFilter ); } - else if ( myGroupChk->isChecked() ) - { + else if ( myGroupChk->isChecked() ) { QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true ); mySelection->AddFilter( myGroupFilter ); } - else - { + if ( entityType() ) { + QAD_Application::getDesktop()->SetSelectionMode( VolumeSelection, true ); + SMESH::SetFilter( new SMESHGUI_VolumesFilter() ); + } + else { QAD_Application::getDesktop()->SetSelectionMode( FaceSelection, true ); if ( myFilterType == SMESHGUI_TriaFilter ) SMESH::SetFilter( new SMESHGUI_TriangleFilter() ); else if ( myFilterType == SMESHGUI_QuadFilter ) SMESH::SetFilter( new SMESHGUI_QuadrangleFilter() ); + else + SMESH::SetFilter( new SMESHGUI_FacesFilter() ); } } @@ -848,6 +886,8 @@ bool SMESHGUI_MultiEditDlg::onApply() if ( aMeshEditor->_is_nil() ) return false; + myBusy = true; + SMESH::long_array_var anIds = getIds(); bool aResult = process( aMeshEditor, anIds.inout() ); @@ -867,9 +907,44 @@ bool SMESHGUI_MultiEditDlg::onApply() updateButtons(); } + myBusy = false; return aResult; } +//======================================================================= +// name : SMESHGUI_MultiEditDlg::on3d2dChanged +// Purpose : +//======================================================================= +void SMESHGUI_MultiEditDlg::on3d2dChanged(int type) +{ + if ( myEntityType != type ) { + myEntityType = type; + + myListBox->clear(); + myIds.Clear(); + + emit ListContensChanged(); + + if ( type ) + myFilterType = SMESHGUI_VolumeFilter; + else + myFilterType = SMESHGUI_FaceFilter; + + updateButtons(); + setSelectionMode(); + } +} + +//======================================================================= +// name : SMESHGUI_MultiEditDlg::entityType +// Purpose : +//======================================================================= + +int SMESHGUI_MultiEditDlg::entityType() +{ + return myEntityType; +} + /* Class : SMESHGUI_ChangeOrientationDlg Description : Modification of orientation of faces @@ -878,7 +953,7 @@ bool SMESHGUI_MultiEditDlg::onApply() SMESHGUI_ChangeOrientationDlg::SMESHGUI_ChangeOrientationDlg( QWidget* theParent, SALOME_Selection* theSelection, const char* theName ) -: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_UnknownFilter, theName ) +: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_FaceFilter, true, theName ) { setCaption( tr( "CAPTION" ) ); } @@ -901,7 +976,7 @@ bool SMESHGUI_ChangeOrientationDlg::process( SMESH::SMESH_MeshEditor_ptr theEdit SMESHGUI_UnionOfTrianglesDlg::SMESHGUI_UnionOfTrianglesDlg( QWidget* theParent, SALOME_Selection* theSelection, const char* theName ) -: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_TriaFilter, theName ) +: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_TriaFilter, false, theName ) { setCaption( tr( "CAPTION" ) ); } @@ -924,7 +999,7 @@ bool SMESHGUI_UnionOfTrianglesDlg::process( SMESH::SMESH_MeshEditor_ptr theEdito SMESHGUI_CuttingOfQuadsDlg::SMESHGUI_CuttingOfQuadsDlg( QWidget* theParent, SALOME_Selection* theSelection, const char* theName ) -: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_QuadFilter, theName ) +: SMESHGUI_MultiEditDlg( theParent, theSelection, SMESHGUI_QuadFilter, false, theName ) { setCaption( tr( "CAPTION" ) );