X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_GroupDlg.cxx;h=9bf9e43f5f9758ef141072521b10a0dc6155ae0f;hb=f87e54ae3a450f6adeee75d1b42c3b17e9c6250c;hp=d6928d67326b5ed997ec1fa5091cd7afbdd08782;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx index d6928d673..9bf9e43f5 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx @@ -1,23 +1,23 @@ // 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.salome-platform.org or email : webmaster.salome@opencascade.org +// 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.salome-platform.org or email : webmaster.salome@opencascade.org // // // @@ -26,22 +26,36 @@ // Module : SMESH // $Header$ -using namespace std; #include "SMESHGUI_GroupDlg.h" #include "SMESHGUI_FilterDlg.h" #include "SMESHGUI.h" -#include "SALOMEGUI_QtCatchCorbaException.hxx" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_GroupUtils.h" +#include "SMESHGUI_FilterUtils.h" +#include "SMESHGUI_GEOMGenUtils.h" + +#include "SMESH_TypeFilter.hxx" +#include "SMESH_Actor.h" +#include "GEOMBase.h" + +#include "SUIT_Desktop.h" +#include "SUIT_ResourceMgr.h" + +#include "SalomeApp_Tools.h" +#include "SALOMEDSClient_Study.hxx" +#include "SALOME_ListIO.hxx" #include "SALOME_ListIteratorOfListIO.hxx" -#include "VTKViewer_InteractorStyleSALOME.h" -#include "VTKViewer_ViewFrame.h" -#include "QAD_Application.h" -#include "QAD_Desktop.h" -#include "QAD_MessageBox.h" -#include "QAD_RightFrame.h" + +#include "SVTK_ViewWindow.h" +#include "SVTK_Selector.h" + #include "utilities.h" -#include "SMESH_Actor.h" +// OCCT Includes +#include // QT Includes #include @@ -57,22 +71,39 @@ using namespace std; #include #include #include +#include // STL includes #include #include +using namespace std; + //================================================================================= -// class : SMESHGUI_GroupDlg() -// purpose : +// function : SMESHGUI_GroupDlg() +// purpose : //================================================================================= -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_Selection* theSel, - SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) +SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, + SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl) + : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | + WStyle_Title | WStyle_SysMenu | WDestructiveClose), + mySMESHGUI( theModule ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), + myIsBusy( false ), + myActor( 0 ) { - if ( !name ) setName( "SMESHGUI_GroupDlg" ); - initDialog(theSel, true); - init(theMesh); + if (!name) setName("SMESHGUI_GroupDlg"); + initDialog(true); + if (!theMesh->_is_nil()) + init(theMesh); + else { + mySelectSubMesh->setEnabled(false); + mySelectGroup->setEnabled(false); + myGeomGroupBtn->setEnabled(false); + myGeomGroupLine->setEnabled(false); + } + + mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); /* Move widget on the botton right corner of main widget */ int x, y ; @@ -80,34 +111,71 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_ this->move(x, y); } -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_Selection* theSel, - SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) +//================================================================================= +// function : SMESHGUI_GroupDlg() +// purpose : +//================================================================================= +SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, + SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl) + : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | + WStyle_Title | WStyle_SysMenu | WDestructiveClose), + mySMESHGUI( theModule ), + mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), + myIsBusy( false ) { - if ( !name ) setName( "SMESHGUI_GroupDlg" ); - initDialog(theSel, false); - init(theGroup); + if (!name) setName("SMESHGUI_GroupDlg"); + + mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); + initDialog(false); + if (!theGroup->_is_nil()) + init(theGroup); + else { + mySelectSubMesh->setEnabled(false); + mySelectGroup->setEnabled(false); + + myCurrentLineEdit = myMeshGroupLine; + setSelectionMode(5); + } + /* Move widget on the botton right corner of main widget */ int x, y ; mySMESHGUI->DefineDlgPosition(this, x, y); this->move(x, y); } -void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) +//================================================================================= +// function : SMESHGUI_GroupDlg() +// purpose : +//================================================================================= +void SMESHGUI_GroupDlg::initDialog(bool create) { myFilterDlg = 0; - - QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT"))); + myCreate = create; + myCurrentLineEdit = 0; + + QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); + + if (create) + setCaption(tr("SMESH_CREATE_GROUP_TITLE")); + else + setCaption(tr("SMESH_EDIT_GROUP_TITLE")); + + setSizeGripEnabled(TRUE); + QGridLayout* aMainLayout = new QGridLayout(this, 7, 3, 11, 6); + + /***************************************************************/ + QLabel* meshGroupLab = new QLabel(this, "mesh/group label"); if (create) - setCaption( tr( "SMESH_CREATE_GROUP_TITLE" ) ); - else - setCaption( tr( "SMESH_EDIT_GROUP_TITLE" ) ); - setSizeGripEnabled( TRUE ); + meshGroupLab->setText(tr("SMESH_MESH")); + else + meshGroupLab->setText(tr("SMESH_GROUP")); + myMeshGroupBtn = new QPushButton(this, "mesh/group button"); + myMeshGroupBtn->setPixmap(image0); + myMeshGroupLine = new QLineEdit(this, "mesh/group line"); + myMeshGroupLine->setReadOnly(true); - QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6); - /***************************************************************/ myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types"); myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE")); @@ -124,16 +192,29 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) } myTypeGroup->setEnabled(create); myTypeId = -1; - + /***************************************************************/ - QHBox* aNameBox = new QHBox(this, "name box"); - QLabel* aName = new QLabel(aNameBox, "name label"); + QLabel* aName = new QLabel(this, "name label"); aName->setText(tr("SMESH_NAME")); aName->setMinimumSize(50,0); - myName = new QLineEdit(aNameBox, "name"); - + myName = new QLineEdit(this, "name"); + + /***************************************************************/ + myGrpTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Type of group"); + myGrpTypeGroup->setTitle(tr("SMESH_GROUP_TYPE")); + myGrpTypeGroup->setExclusive(true); + QRadioButton* rb1 = new QRadioButton( tr("SMESH_GROUP_STANDALONE"), myGrpTypeGroup); + QRadioButton* rb2 = new QRadioButton( tr("SMESH_GROUP_GEOMETRY"), myGrpTypeGroup); + myGrpTypeGroup->setEnabled(create); + myGrpTypeId = -1; + /***************************************************************/ - QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, this, "content box"); + myWGStack = new QWidgetStack( this, "widget stack"); + QWidget* wg1 = new QFrame( myWGStack, "first widget" ); + QWidget* wg2 = new QFrame( myWGStack, "second widget" ); + + /***************************************************************/ + QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, wg1, "content box"); aContentBox->setTitle(tr("SMESH_CONTENT")); QFrame* aContent = new QFrame(aContentBox, "content"); QGridLayout* aLayout = new QGridLayout(aContent, 7, 4); @@ -144,7 +225,6 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) aLabel->setText(tr("SMESH_ID_ELEMENTS")); myElements = new QListBox(aContent, "elements list"); myElements->setSelectionMode(QListBox::Extended); - // myElements->setMinimumHeight(150); myFilter = new QPushButton(aContent, "filter"); myFilter->setText(tr("SMESH_BUT_FILTER")); @@ -168,11 +248,8 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) aLayout->setRowStretch(2, 1); aLayout->setRowStretch(5, 1); - aContentBox->setMinimumHeight(aContent->sizeHint().height() + - aContentBox->sizeHint().height()); - /***************************************************************/ - QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, this, "select box"); + QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, wg1, "select box"); aSelectBox->setTitle(tr("SMESH_SELECT_FROM")); mySelectSubMesh = new QCheckBox(aSelectBox, "submesh checkbox"); @@ -195,9 +272,35 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) myGroupLine->setReadOnly(true); onSelectGroup(false); - aSelectBox->setMinimumHeight(mySubMeshBtn->sizeHint().height() + - myGroupBtn->sizeHint().height() + - aSelectBox->sizeHint().height()); + /***************************************************************/ + QGridLayout* wg1Layout = new QGridLayout( wg1, 3, 1, 0, 6 ); + wg1Layout->addWidget(aContentBox, 0, 0); + wg1Layout->addWidget(aSelectBox, 1, 0); + wg1Layout->setRowStretch(2, 5); + + /***************************************************************/ + QLabel* geomObject = new QLabel(wg2, "geometry object label"); + geomObject->setText(tr("SMESH_OBJECT_GEOM")); + myGeomGroupBtn = new QPushButton(wg2, "geometry group button"); + myGeomGroupBtn->setText(""); + myGeomGroupBtn->setPixmap(image0); + myGeomGroupLine = new QLineEdit(wg2, "geometry group line"); + myGeomGroupLine->setReadOnly(true); //VSR ??? + onSelectGeomGroup(false); + + /***************************************************************/ + QGridLayout* wg2Layout = new QGridLayout( wg2, 2, 3, 0, 6 ); + wg2Layout->addWidget(geomObject, 0, 0); + wg2Layout->addWidget(myGeomGroupBtn, 0, 1); + wg2Layout->addWidget(myGeomGroupLine,0, 2); + wg2Layout->setRowStretch(1, 5); + + /***************************************************************/ + QVBoxLayout* dumb = new QVBoxLayout(myWGStack); + dumb->addWidget(wg1); + dumb->addWidget(wg2); + myWGStack->addWidget( wg1, myGrpTypeGroup->id(rb1) ); + myWGStack->addWidget( wg2, myGrpTypeGroup->id(rb2) ); /***************************************************************/ QFrame* aButtons = new QFrame(this, "button box"); @@ -222,13 +325,22 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) aBtnLayout->addWidget(aCloseBtn); /***************************************************************/ - aMainLayout->addWidget(myTypeGroup); - aMainLayout->addWidget(aNameBox); - aMainLayout->addWidget(aContentBox); - aMainLayout->addWidget(aSelectBox); - aMainLayout->addWidget(aButtons); + aMainLayout->addWidget(meshGroupLab, 0, 0); + aMainLayout->addWidget(myMeshGroupBtn, 0, 1); + aMainLayout->addWidget(myMeshGroupLine, 0, 2); + aMainLayout->addMultiCellWidget(myTypeGroup, 1, 1, 0, 2); + aMainLayout->addWidget(aName, 2, 0); + aMainLayout->addWidget(myName, 2, 2); + aMainLayout->addMultiCellWidget(myGrpTypeGroup, 3, 3, 0, 2); + aMainLayout->addMultiCellWidget(myWGStack, 4, 4, 0, 2); + aMainLayout->setRowStretch( 5, 5 ); + aMainLayout->addMultiCellWidget(aButtons, 6, 6, 0, 2); /* signals and slots connections */ + connect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); + + connect(myGrpTypeGroup, SIGNAL(clicked(int)), this, SLOT(onGrpTypeChanged(int))); + connect(myTypeGroup, SIGNAL(clicked(int)), this, SLOT(onTypeChanged(int))); connect(myName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&))); @@ -243,24 +355,30 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) connect(mySelectGroup, SIGNAL(toggled(bool)), this, SLOT(onSelectGroup(bool))); connect(mySubMeshBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); connect(myGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); + connect(myGeomGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); connect(aOKBtn, SIGNAL(clicked()), this, SLOT(onOK())); connect(aApplyBtn, SIGNAL(clicked()), this, SLOT(onApply())); connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose())); /* Init selection */ - mySelection = theSel; - mySMESHGUI = SMESHGUI::GetSMESHGUI(); mySMESHGUI->SetActiveDialogBox(this); mySMESHGUI->SetState(800); mySelectionMode = -1; + myMeshFilter = new SMESH_TypeFilter(MESH); mySubMeshFilter = new SMESH_TypeFilter(SUBMESH); myGroupFilter = new SMESH_TypeFilter(GROUP); - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onClose())); + connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose())); - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); + + myGrpTypeGroup->setButton(myGrpTypeGroup->id(rb1)); // VSR !!! + onGrpTypeChanged(myGrpTypeGroup->id(rb1)); // VSR!!! + + if (myMesh->_is_nil() ) + myTypeGroup->setButton(0); updateButtons(); } @@ -271,23 +389,39 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) //================================================================================= SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg() { - // no need to delete child widgets, Qt does it all for us + // no need to delete child widgets, Qt does it all for us + if ( myFilterDlg != 0 ) + { + myFilterDlg->reparent( 0, QPoint() ); + delete myFilterDlg; + } } - //================================================================================= // function : Init() // purpose : //================================================================================= -void SMESHGUI_GroupDlg::init(SMESH::SMESH_Mesh_ptr theMesh) +void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh) { + mySelectionMgr->installFilter(myMeshFilter); + /* init data from current selection */ myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh); myGroup = SMESH::SMESH_Group::_nil(); - Standard_Boolean aResult; - myActor = mySMESHGUI->FindActor(myMesh, aResult, true); - mySMESHGUI->SetPickable(myActor); + myActor = SMESH::FindActorByObject(myMesh); + SMESH::SetPickable(myActor); + + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + if( !aList.IsEmpty() ) + { + QString aName = aList.First()->getName(); + myMeshGroupLine->setText(aName) ; + myMeshGroupLine->home( false ); + } + + myCurrentLineEdit = 0; myTypeGroup->setButton(0); onTypeChanged(0); @@ -297,17 +431,15 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Mesh_ptr theMesh) // function : Init() // purpose : //================================================================================= -void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup) +void SMESHGUI_GroupDlg::init (SMESH::SMESH_Group_ptr theGroup) { - myMesh = theGroup->GetMesh(); myGroup = SMESH::SMESH_Group::_duplicate(theGroup); - Standard_Boolean aResult; - myActor = mySMESHGUI->FindActor(myMesh, aResult, true); + myActor = SMESH::FindActorByObject(myMesh); if ( !myActor ) - myActor = mySMESHGUI->FindActor(myGroup, aResult, true); - mySMESHGUI->SetPickable(myActor); + myActor = SMESH::FindActorByObject(myGroup); + SMESH::SetPickable(myActor); int aType = 0; switch(theGroup->GetType()) { @@ -315,13 +447,19 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup) case SMESH::EDGE: aType = 1; break; case SMESH::FACE: aType = 2; break; case SMESH::VOLUME: aType = 3; break; - } - myTypeGroup->setButton(aType); - onTypeChanged(aType); + } myName->setText(myGroup->GetName()); myName->home(false); + myMeshGroupLine->setText(myGroup->GetName()); + + myCurrentLineEdit = 0; + myTypeGroup->setButton(aType); + myElements->clear(); + setSelectionMode(aType); + myTypeId = aType; + myIdList.clear(); if (!theGroup->IsEmpty()) { SMESH::long_array_var anElements = myGroup->GetListOfID(); int k = anElements->length(); @@ -333,14 +471,18 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup) } } - //================================================================================= // function : updateButtons() -// purpose : +// purpose : //================================================================================= void SMESHGUI_GroupDlg::updateButtons() { - bool enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0; + bool enable; + + if (myGrpTypeId == 0) + enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0; + else if (myGrpTypeId == 1) + enable = !myName->text().stripWhiteSpace().isEmpty() && !CORBA::is_nil( myGeomGroup ); QPushButton* aBtn; aBtn = (QPushButton*) child("ok", "QPushButton"); if (aBtn) aBtn->setEnabled(enable); @@ -350,64 +492,89 @@ void SMESHGUI_GroupDlg::updateButtons() //================================================================================= // function : onNameChanged() -// purpose : +// purpose : //================================================================================= -void SMESHGUI_GroupDlg::onNameChanged(const QString& text) +void SMESHGUI_GroupDlg::onNameChanged (const QString& text) { updateButtons(); } //================================================================================= // function : onTypeChanged() -// purpose : Radio button management +// purpose : Group elements type radio button management //================================================================================= -void SMESHGUI_GroupDlg::onTypeChanged(int id) +void SMESHGUI_GroupDlg::onTypeChanged (int id) { if (myTypeId != id) { myElements->clear(); if (myCurrentLineEdit == 0) setSelectionMode(id); - myFilter->setEnabled(id == 1 || id == 2); } myTypeId = id; } +//================================================================================= +// function : onGrpTypeChanged() +// purpose : Group type radio button management +//================================================================================= +void SMESHGUI_GroupDlg::onGrpTypeChanged (int id) +{ + if (myGrpTypeId != id) { + myWGStack->raiseWidget( id ); + onSelectGeomGroup(id == 1); + } + myGrpTypeId = id; +} + //================================================================================= // function : setSelectionMode() // purpose : Radio button management //================================================================================= -void SMESHGUI_GroupDlg::setSelectionMode(int theMode) +void SMESHGUI_GroupDlg::setSelectionMode (int theMode) { + // PAL7314 + if (myMesh->_is_nil()) + return; + if (mySelectionMode != theMode) { - mySelection->ClearIObjects(); - mySelection->ClearFilters(); - if (mySelectionMode == 0) - mySMESHGUI->EraseSimulationActors(); + mySelectionMgr->clearSelected(); + mySelectionMgr->clearFilters(); + SMESH::SetPointRepresentation(false); if (theMode < 4) { - if (theMode == 0) { - mySMESHGUI->ViewNodes(); - QAD_Application::getDesktop()->SetSelectionMode(NodeSelection, true); - } - else if (theMode == 1) { - QAD_Application::getDesktop()->SetSelectionMode(EdgeSelection, true); - } - else if (theMode == 2) { - QAD_Application::getDesktop()->SetSelectionMode(FaceSelection, true); - } - else { - QAD_Application::getDesktop()->SetSelectionMode(VolumeSelection, true); + switch (theMode) { + case 0: + if (myActor) + myActor->SetPointRepresentation(true); + else + SMESH::SetPointRepresentation(true); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + break; + case 1: + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + break; + case 2: + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + break; + default: + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(VolumeSelection); } - } - else { - QAD_Application::getDesktop()->SetSelectionMode(ActorSelection, true); + } else { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); if (theMode == 4) - mySelection->AddFilter(mySubMeshFilter); + mySelectionMgr->installFilter(mySubMeshFilter); else if (theMode == 5) - mySelection->AddFilter(myGroupFilter); + mySelectionMgr->installFilter(myGroupFilter); + else if (theMode == 6) + mySelectionMgr->installFilter(myMeshFilter); } mySelectionMode = theMode; } -} +} //================================================================================= // function : onApply() @@ -415,8 +582,13 @@ void SMESHGUI_GroupDlg::setSelectionMode(int theMode) //================================================================================= bool SMESHGUI_GroupDlg::onApply() { - if (!myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0) { - mySelection->ClearIObjects(); + if (mySMESHGUI->isActiveStudyLocked()) + return false; + + if (myGrpTypeId == 0 && + !myName->text().stripWhiteSpace().isEmpty() && + myElements->count() > 0) { + mySelectionMgr->clearSelected(); if (myGroup->_is_nil()) { SMESH::ElementType aType = SMESH::ALL; switch(myTypeId) { @@ -433,20 +605,21 @@ bool SMESHGUI_GroupDlg::onApply() anIdList[i] = anItem->text().toInt(); } - myGroup = mySMESHGUI->AddGroup(myMesh, aType, myName->text()); - myGroup->Add(anIdList); + myGroup = SMESH::AddGroup(myMesh, aType, myName->text()); + myGroup->Add(anIdList.inout()); /* init for next operation */ myName->setText(""); myElements->clear(); myGroup = SMESH::SMESH_Group::_nil(); - } - else { + + } else { myGroup->SetName(myName->text()); QValueList aAddList; QValueList::iterator anIt; QListBoxItem* anItem; + for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { int anId = anItem->text().toInt(); if ((anIt = myIdList.find(anId)) == myIdList.end()) @@ -460,7 +633,7 @@ bool SMESHGUI_GroupDlg::onApply() int i; for (i = 0, anIt = aAddList.begin(); anIt != aAddList.end(); anIt++, i++) anIdList[i] = *anIt; - myGroup->Add(anIdList); + myGroup->Add(anIdList.inout()); } if (!myIdList.empty()) { SMESH::long_array_var anIdList = new SMESH::long_array; @@ -468,7 +641,7 @@ bool SMESHGUI_GroupDlg::onApply() int i; for (i = 0, anIt = myIdList.begin(); anIt != myIdList.end(); anIt++, i++) anIdList[i] = *anIt; - myGroup->Remove(anIdList); + myGroup->Remove(anIdList.inout()); } /* init for next operation */ myIdList.clear(); @@ -476,10 +649,36 @@ bool SMESHGUI_GroupDlg::onApply() myIdList.append(anItem->text().toInt()); } - mySMESHGUI->GetActiveStudy()->updateObjBrowser(true); - mySelection->ClearIObjects(); + mySMESHGUI->updateObjBrowser(true); + SMESH::UpdateView(); // asv: fix of BUG PAL5515 + mySelectionMgr->clearSelected(); + return true; + } else if (myGrpTypeId == 1 && + !myName->text().stripWhiteSpace().isEmpty() && + !CORBA::is_nil(myGeomGroup)) + { + SMESH::ElementType aType = SMESH::ALL; + switch (myTypeId) { + case 0: aType = SMESH::NODE; break; + case 1: aType = SMESH::EDGE; break; + case 2: aType = SMESH::FACE; break; + case 3: aType = SMESH::VOLUME; break; + } + + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + GEOM::GEOM_IGroupOperations_var aGroupOp = + SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); + + SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = + myMesh->CreateGroupFromGEOM(aType, myName->text(),myGeomGroup); + + mySMESHGUI->updateObjBrowser(true); + mySelectionMgr->clearSelected(); + /* init for next operation */ + myName->setText(""); return true; } + return false; } @@ -493,17 +692,6 @@ void SMESHGUI_GroupDlg::onOK() onClose(); } -//================================================================================= -// function : onClose() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onClose() -{ - close(); -} - - -static bool busy = false; //================================================================================= // function : onListSelectionChanged() // purpose : Called when selection in element list is changed @@ -511,33 +699,27 @@ static bool busy = false; void SMESHGUI_GroupDlg::onListSelectionChanged() { // MESSAGE("SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor); - if (busy || !myActor) return; - busy = true; + if( myIsBusy || !myActor) return; + myIsBusy = true; if (myCurrentLineEdit == 0) { - mySelection->ClearIObjects(); + mySelectionMgr->clearSelected(); TColStd_MapOfInteger aIndexes; QListBoxItem* anItem; for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { if (anItem->isSelected()) { - std::vector aVtkList; - if (myTypeId == 0) - aVtkList = myActor->GetNodeVtkId(anItem->text().toInt()); - else - aVtkList = myActor->GetElemVtkId(anItem->text().toInt()); - - if (aVtkList.size() > 0) { - std::vector::iterator it; - for (it = aVtkList.begin(); it != aVtkList.end(); ++it) { - aIndexes.Add(*it); - } - } + int anId = anItem->text().toInt(); + aIndexes.Add(anId); } } - mySelection->AddOrRemoveIndex(myActor->getIO(), aIndexes, false, false); - mySelection->AddIObject(myActor->getIO()); + mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false); + SALOME_ListIO aList; + aList.Append(myActor->getIO()); + mySelectionMgr->setSelectedObjects(aList,false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( myActor->getIO(), true, true ); } - busy = false; + myIsBusy = false; } //================================================================================= @@ -546,39 +728,181 @@ void SMESHGUI_GroupDlg::onListSelectionChanged() //================================================================================= void SMESHGUI_GroupDlg::onObjectSelectionChanged() { - if (busy) return; - busy = true; + if ( myIsBusy || !isEnabled()) return; + myIsBusy = true; - int aNbSel = mySelection->IObjectCount(); + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + int aNbSel = aList.Extent(); myElements->clearSelection(); if (myCurrentLineEdit) { - myCurrentLineEdit->setText("") ; + myCurrentLineEdit->setText(""); QString aString = ""; - if (aNbSel >= 1) { - if (aNbSel > 1) { - if (myCurrentLineEdit = mySubMeshLine) - aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel); - else if (myCurrentLineEdit = myGroupLine) - aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel); + + if (myCurrentLineEdit == myMeshGroupLine) { + mySelectSubMesh->setEnabled(false); + mySelectGroup->setEnabled(false); + myGroupLine->setText(""); + mySubMeshLine->setText(""); + + myGeomGroupBtn->setEnabled(false); + myGeomGroupLine->setEnabled(false); + myGeomGroupLine->setText(""); + if (!myCreate) + myName->setText(""); + + myElements->clear(); + + if (aNbSel != 1 ) { + myGroup = SMESH::SMESH_Group::_nil(); + myMesh = SMESH::SMESH_Mesh::_nil(); + myIsBusy = false; + return; + } + Handle(SALOME_InteractiveObject) IO = aList.First(); + + if (myCreate) { + myMesh = SMESH::IObjectToInterface(IO); + if (myMesh->_is_nil()) + { + myIsBusy = false; + return; + } + myGroup = SMESH::SMESH_Group::_nil(); + + myActor = SMESH::FindActorByObject(myMesh); + SMESH::SetPickable(myActor); + + aString = aList.First()->getName(); + myMeshGroupLine->setText(aString) ; + myMeshGroupLine->home( false ); + + mySelectSubMesh->setEnabled(true); + mySelectGroup->setEnabled(true); + myGeomGroupBtn->setEnabled(true); + myGeomGroupLine->setEnabled(true); + updateButtons(); + } else { + SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(IO); + if (aGroup->_is_nil()) + { + myIsBusy = false; + return; + } + myIsBusy = false; + myCurrentLineEdit = 0; + init(aGroup); + myIsBusy = true; + mySelectSubMesh->setEnabled(true); + mySelectGroup->setEnabled(true); + myGeomGroupBtn->setEnabled(true); + myGeomGroupLine->setEnabled(true); } + myCurrentLineEdit = 0; + myIsBusy = false; + if (!myCreate) + return; + + if (myTypeId == -1) + onTypeChanged(0); else { - aString = mySelection->firstIObject()->getName(); + myElements->clear(); + setSelectionMode(myTypeId); + } + + myIsBusy = false; + return; + + } else if (myCurrentLineEdit == myGeomGroupLine) { + if (aNbSel != 1) { + myGeomGroup = GEOM::GEOM_Object::_nil(); + myIsBusy = false; + return; + } + + Standard_Boolean testResult = Standard_False; + myGeomGroup = GEOMBase::ConvertIOinGEOMObject(aList.First(), testResult); + + // Check if the object is a geometry group + if (!testResult || CORBA::is_nil(myGeomGroup)) { + myGeomGroup = GEOM::GEOM_Object::_nil(); + myIsBusy = false; + return; + } + // Check if group constructed on the same shape as a mesh or on its child + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + GEOM::GEOM_IGroupOperations_var anOp = + SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); + + // The main shape of the group + GEOM::GEOM_Object_var aGroupMainShape; + if (myGeomGroup->GetType() == 37) + aGroupMainShape = anOp->GetMainShape(myGeomGroup); + else + aGroupMainShape = GEOM::GEOM_Object::_duplicate(myGeomGroup); + _PTR(SObject) aGroupMainShapeSO = + //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(aGroupMainShape)); + aStudy->FindObjectIOR(aGroupMainShape->GetStudyEntry()); + + // The mesh SObject + _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh); + if (!aMeshSO) { + myGeomGroup = GEOM::GEOM_Object::_nil(); + myIsBusy = false; + return; + } + _PTR(SObject) anObj, aRef; + bool isRefOrSubShape = false; + if (aMeshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(aRef)) { + //if (strcmp(aRef->GetID(), aGroupMainShapeSO->GetID()) == 0) { + if (aRef->GetID() == aGroupMainShapeSO->GetID()) { + isRefOrSubShape = true; + } else { + _PTR(SObject) aFather = aGroupMainShapeSO->GetFather(); + _PTR(SComponent) aComponent = aGroupMainShapeSO->GetFatherComponent(); + //while (!isRefOrSubShape && strcmp(aFather->GetID(), aComponent->GetID()) != 0) { + while (!isRefOrSubShape && aFather->GetID() != aComponent->GetID()) { + //if (strcmp(aRef->GetID(), aFather->GetID()) == 0) + if (aRef->GetID() == aFather->GetID()) + isRefOrSubShape = true; + else + aFather = aFather->GetFather(); + } + } + } + if (!isRefOrSubShape) { + myGeomGroup = GEOM::GEOM_Object::_nil(); + myIsBusy = false; + return; } } - myCurrentLineEdit->setText(aString) ; - myCurrentLineEdit->home( false ); - } - else { - if (aNbSel == 1) { + if(aNbSel >= 1) { + if(aNbSel > 1) { + if(myCurrentLineEdit == mySubMeshLine) + aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel); + else if(myCurrentLineEdit == myGroupLine || myCurrentLineEdit == myGeomGroupLine) + aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel); + } else { + aString = aList.First()->getName(); + } + } + + myCurrentLineEdit->setText(aString); + myCurrentLineEdit->home(false); + + updateButtons(); + + } else { + if (aNbSel == 1 && myActor ) { QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr); - } - else { - aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); + } else { + aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); } if (aNbItems > 0) { QStringList anElements = QStringList::split(" ", aListStr); @@ -590,9 +914,16 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() } } } - busy = false; -} + if (!myActor) { + if (!myGroup->_is_nil()) + myActor = SMESH::FindActorByObject(myGroup); + else + myActor = SMESH::FindActorByObject(myMesh); + } + + myIsBusy = false; +} //================================================================================= // function : onSelectSubMesh() @@ -604,6 +935,9 @@ void SMESHGUI_GroupDlg::onSelectSubMesh(bool on) if (mySelectGroup->isChecked()) { mySelectGroup->setChecked(false); } + //VSR: else if (mySelectGeomGroup->isChecked()) { + //VSR: mySelectGeomGroup->setChecked(false); + //VSR: } myCurrentLineEdit = mySubMeshLine; setSelectionMode(4); } @@ -617,6 +951,7 @@ void SMESHGUI_GroupDlg::onSelectSubMesh(bool on) mySubMeshLine->setEnabled(on); } + //================================================================================= // function : (onSelectGroup) // purpose : Called when selection in 3D view or ObjectBrowser is changed @@ -640,6 +975,32 @@ void SMESHGUI_GroupDlg::onSelectGroup(bool on) myGroupLine->setEnabled(on); } + +//================================================================================= +// function : (onSelectGeomGroup) +// purpose : Called when selection in 3D view or ObjectBrowser is changed +//================================================================================= +void SMESHGUI_GroupDlg::onSelectGeomGroup(bool on) +{ + if (on) { + if (mySelectSubMesh->isChecked()) { + mySelectSubMesh->setChecked(false); + } + else if (mySelectGroup->isChecked()) { + mySelectGroup->setChecked(false); + } + myCurrentLineEdit = myGeomGroupLine; + setSelectionMode(7); + } + else { + myGeomGroupLine->setText(""); + myCurrentLineEdit = 0; + if (myTypeId != -1) + setSelectionMode(myTypeId); + } +} + + //================================================================================= // function : setCurrentSelection() // purpose : @@ -648,7 +1009,15 @@ void SMESHGUI_GroupDlg::setCurrentSelection() { QPushButton* send = (QPushButton*)sender(); myCurrentLineEdit = 0; - if (send == mySubMeshBtn) { + if (send == myMeshGroupBtn) { + myCurrentLineEdit = myMeshGroupLine; + if (myCreate) + setSelectionMode(6); + else + setSelectionMode(5); + onObjectSelectionChanged(); + } + else if (send == mySubMeshBtn) { myCurrentLineEdit = mySubMeshLine; onObjectSelectionChanged(); } @@ -656,12 +1025,17 @@ void SMESHGUI_GroupDlg::setCurrentSelection() myCurrentLineEdit = myGroupLine; onObjectSelectionChanged(); } + else if (send == myGeomGroupBtn) { + myCurrentLineEdit = myGeomGroupLine; + setSelectionMode(7); + onObjectSelectionChanged(); + } } //================================================================================= // function : setFilters() -// purpose : SLOT. Called when "Filter" button pressed. +// purpose : SLOT. Called when "Filter" button pressed. //================================================================================= void SMESHGUI_GroupDlg::setFilters() { @@ -674,19 +1048,29 @@ void SMESHGUI_GroupDlg::setFilters() case 3 : aType = SMESH::VOLUME; break; default: return; } - + if ( myFilterDlg == 0 ) - myFilterDlg = new SMESHGUI_FilterDlg( this, aType, true ); + { + myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, aType ); + connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) ); + } else myFilterDlg->Init( aType ); - myFilterDlg->SetSelection( mySelection ); + myFilterDlg->SetSelection(); myFilterDlg->SetMesh( myMesh ); myFilterDlg->SetSourceWg( myElements ); - if ( myFilterDlg->exec() != QDialog::Accepted ) - return; + myFilterDlg->show(); +} +//================================================================================= +// function : onFilterAccepted() +// purpose : SLOT. Called when Filter dlg closed with OK button. +// Uncheck "Select submesh" and "Select group" checkboxes +//================================================================================= +void SMESHGUI_GroupDlg::onFilterAccepted() +{ if ( mySelectSubMesh->isChecked() || mySelectGroup->isChecked() ) { mySelectionMode = myTypeId; @@ -701,10 +1085,14 @@ void SMESHGUI_GroupDlg::setFilters() //================================================================================= void SMESHGUI_GroupDlg::onAdd() { - int aNbSel = mySelection->IObjectCount(); - if (aNbSel == 0) return; + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + int aNbSel = aList.Extent(); - busy = true; + if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; + + myIsBusy = true; SMESH::ElementType aType = SMESH::ALL; switch(myTypeId) { @@ -715,14 +1103,14 @@ void SMESHGUI_GroupDlg::onAdd() } if (myCurrentLineEdit == 0) { - if (aNbSel != 1) { busy = false; return; } + //if (aNbSel != 1) { myIsBusy = false; return; } QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); } else { - aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); } if (aNbItems > 0) { QStringList anElements = QStringList::split(" ", aListStr); @@ -736,66 +1124,53 @@ void SMESHGUI_GroupDlg::onAdd() myElements->setSelected(anItem, true); } } - } - else if (myCurrentLineEdit == mySubMeshLine) { - Standard_Boolean aRes; - SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); + } else if (myCurrentLineEdit == mySubMeshLine) { + //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); + + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + SALOME_ListIteratorOfListIO anIt (aList); for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = mySMESHGUI->ConvertIOinSubMesh(anIt.Value(), aRes); - if (aRes && !aSubMesh->_is_nil()) { + SMESH::SMESH_subMesh_var aSubMesh = + SMESH::IObjectToInterface(anIt.Value()); + if (!aSubMesh->_is_nil()) { // check if mesh is the same if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { - if (aType == SMESH::NODE) { - try { - SMESH::long_array_var anElements = aSubMesh->GetNodesId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - catch (const SALOME::SALOME_Exception& ex) { - QtCatchCorbaException(ex); - } - } - else { - try { - SMESH::long_array_var anElements = aSubMesh->GetElementsId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - catch (const SALOME::SALOME_Exception& ex) { - QtCatchCorbaException(ex); - } - } - } + try { + SMESH::long_array_var anElements = aSubMesh->GetElementsByType(aType); + int k = anElements->length(); + QListBoxItem* anItem = 0; + for (int i = 0; i < k; i++) { + QString aText = QString::number(anElements[i]); + anItem = myElements->findItem(aText, Qt::ExactMatch); + if (!anItem) { + anItem = new QListBoxText(aText); + myElements->insertItem(anItem); + } + myElements->setSelected(anItem, true); + } + } + catch (const SALOME::SALOME_Exception& ex) { + SalomeApp_Tools::QtCatchCorbaException(ex); + } + } } } mySelectSubMesh->setChecked(false); - busy = false; + myIsBusy = false; onListSelectionChanged(); - } - else if (myCurrentLineEdit == myGroupLine) { - Standard_Boolean aRes; - SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); + + } else if (myCurrentLineEdit == myGroupLine) { + //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + SALOME_ListIteratorOfListIO anIt (aList); for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = mySMESHGUI->ConvertIOinSMESHGroup(anIt.Value(), aRes); - if (aRes && !aGroup->_is_nil()) { + SMESH::SMESH_Group_var aGroup = + SMESH::IObjectToInterface(anIt.Value()); + if (!aGroup->_is_nil()) { // check if mesh is the same if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { SMESH::long_array_var anElements = aGroup->GetListOfID(); @@ -814,11 +1189,57 @@ void SMESHGUI_GroupDlg::onAdd() } } mySelectGroup->setChecked(false); - busy = false; + myIsBusy = false; + onListSelectionChanged(); + + } else if (myCurrentLineEdit == myGeomGroupLine && !CORBA::is_nil(myGeomGroup)) { + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + GEOM::GEOM_IGroupOperations_var aGroupOp = + SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); + + SMESH::ElementType aGroupType = SMESH::ALL; + switch(aGroupOp->GetType(myGeomGroup)) { + case 7: aGroupType = SMESH::NODE; break; + case 6: aGroupType = SMESH::EDGE; break; + case 4: aGroupType = SMESH::FACE; break; + case 2: aGroupType = SMESH::VOLUME; break; + default: myIsBusy = false; return; + } + + if (aGroupType == aType) { + _PTR(SObject) aGroupSO = + //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomGroup)); + aStudy->FindObjectIOR(myGeomGroup->GetStudyEntry()); + // Construct filter + SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); + SMESH::Filter_var aFilter = aFilterMgr->CreateFilter(); + SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();; + aBelongToGeom->SetGeom(myGeomGroup); + aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str()); + aBelongToGeom->SetElementType(aType); + aFilter->SetPredicate(aBelongToGeom); + + SMESH::long_array_var anElements = aFilter->GetElementsId(myMesh); + + int k = anElements->length(); + QListBoxItem* anItem = 0; + for (int i = 0; i < k; i++) { + QString aText = QString::number(anElements[i]); + anItem = myElements->findItem(aText, Qt::ExactMatch); + if (!anItem) { + anItem = new QListBoxText(aText); + myElements->insertItem(anItem); + } + myElements->setSelected(anItem, true); + } + } + + //VSR: mySelectGeomGroup->setChecked(false); + myIsBusy = false; onListSelectionChanged(); } - busy = false; - // mySelection->ClearIObjects(); + myIsBusy = false; + // mySelectionMgr->clearSelected(); updateButtons(); } @@ -828,18 +1249,21 @@ void SMESHGUI_GroupDlg::onAdd() //================================================================================= void SMESHGUI_GroupDlg::onRemove() { - busy = true; + myIsBusy = true; if (myCurrentLineEdit == 0) { for (int i = myElements->count(); i > 0; i--) { if (myElements->isSelected(i-1)) { myElements->removeItem(i-1); } } - } - else { - int aNbSel = mySelection->IObjectCount(); - if (aNbSel == 0) { busy = false; return; } - + } else { + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + int aNbSel = aList.Extent(); + + if (aNbSel == 0) { myIsBusy = false; return; } + SMESH::ElementType aType = SMESH::ALL; switch(myTypeId) { case 0: aType = SMESH::NODE; break; @@ -849,11 +1273,14 @@ void SMESHGUI_GroupDlg::onRemove() } if (myCurrentLineEdit == mySubMeshLine) { - Standard_Boolean aRes; - SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); + //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + SALOME_ListIteratorOfListIO anIt (aList); for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = mySMESHGUI->ConvertIOinSubMesh(anIt.Value(), aRes); - if (aRes && !aSubMesh->_is_nil()) { + SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(anIt.Value()); + if (!aSubMesh->_is_nil()) { // check if mesh is the same if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { if (aType == SMESH::NODE) { @@ -867,7 +1294,7 @@ void SMESHGUI_GroupDlg::onRemove() } } catch (const SALOME::SALOME_Exception& ex) { - QtCatchCorbaException(ex); + SalomeApp_Tools::QtCatchCorbaException(ex); } } else { @@ -881,7 +1308,7 @@ void SMESHGUI_GroupDlg::onRemove() } } catch (const SALOME::SALOME_Exception& ex) { - QtCatchCorbaException(ex); + SalomeApp_Tools::QtCatchCorbaException(ex); } } } @@ -890,9 +1317,13 @@ void SMESHGUI_GroupDlg::onRemove() } else if (myCurrentLineEdit == myGroupLine) { Standard_Boolean aRes; - SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); + //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); + SALOME_ListIO aList; + mySelectionMgr->selectedObjects( aList ); + + SALOME_ListIteratorOfListIO anIt (aList); for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = mySMESHGUI->ConvertIOinSMESHGroup(anIt.Value(), aRes); + SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(anIt.Value()); if (aRes && !aGroup->_is_nil()) { // check if mesh is the same if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { @@ -908,7 +1339,7 @@ void SMESHGUI_GroupDlg::onRemove() } } } - busy = false; + myIsBusy = false; updateButtons(); } @@ -923,7 +1354,7 @@ void SMESHGUI_GroupDlg::onSort() // myElements->update(); int i, k = myElements->count(); if (k > 0) { - busy = true; + myIsBusy = true; QStringList aSelected; std::vector anArray(k); // QMemArray anArray(k); @@ -931,7 +1362,7 @@ void SMESHGUI_GroupDlg::onSort() // fill the array for (anItem = myElements->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++) { anArray[i] = anItem->text().toInt(); - if (anItem->isSelected()) + if (anItem->isSelected()) aSelected.append(anItem->text()); } // sort & update list @@ -945,7 +1376,7 @@ void SMESHGUI_GroupDlg::onSort() anItem = myElements->findItem(*it, Qt::ExactMatch); if (anItem) myElements->setSelected(anItem, true); } - busy = false; + myIsBusy = false; } } @@ -953,25 +1384,65 @@ void SMESHGUI_GroupDlg::onSort() // function : closeEvent() // purpose : //================================================================================= -void SMESHGUI_GroupDlg::closeEvent( QCloseEvent* e ) +void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*) { - QAD_StudyFrame* aStudyFrame = mySMESHGUI->GetActiveStudy()->getActiveStudyFrame(); - if (aStudyFrame->getTypeView() == VIEW_VTK) { - mySMESHGUI->SetPickable(); - if (mySelectionMode == 0) - mySMESHGUI->EraseSimulationActors(); - - // remove filters from viewer - VTKViewer_InteractorStyleSALOME* aStyle = ((VTKViewer_ViewFrame*)aStudyFrame->getRightFrame()->getViewFrame())->getRWInteractor()->GetInteractorStyleSALOME(); - aStyle->RemoveEdgeFilter(); - aStyle->RemoveFaceFilter(); + onClose(); +} +//================================================================================= +// function : SMESHGUI_GroupDlg::onClose +// purpose : SLOT called when "Close" button pressed. Close dialog +//================================================================================= +void SMESHGUI_GroupDlg::onClose() +{ + if (SMESH::GetCurrentVtkView()) { + SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters + SMESH::SetPointRepresentation(false); + SMESH::SetPickable(); } - - mySelection->ClearIObjects(); - QAD_Application::getDesktop()->SetSelectionMode(ActorSelection); - mySelection->ClearFilters(); + + mySelectionMgr->clearSelected(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + mySelectionMgr->clearFilters(); + mySMESHGUI->ResetState(); + + reject(); +} + +//================================================================================= +// function : SMESHGUI_GroupDlg::onDeactivate +// purpose : SLOT called when dialog must be deativated +//================================================================================= +void SMESHGUI_GroupDlg::onDeactivate() +{ mySMESHGUI->ResetState(); + setEnabled(false); +} + +//================================================================================= +// function : SMESHGUI_GroupDlg::enterEvent +// purpose : Event filter +//================================================================================= +void SMESHGUI_GroupDlg::enterEvent (QEvent*) +{ + if (!isEnabled()) { + mySMESHGUI->EmitSignalDeactivateDialog(); + setEnabled(true); + mySelectionMode = -1; + setSelectionMode(myTypeId); + //mySMESHGUI->SetActiveDialogBox((QDialog*)this); + mySMESHGUI->SetActiveDialogBox(this); + mySMESHGUI->SetState(800); + } +} - QDialog::closeEvent( e ); +//================================================================================= +// function : hideEvent +// purpose : caused by ESC key +//================================================================================= +void SMESHGUI_GroupDlg::hideEvent (QHideEvent*) +{ + if (!isMinimized()) + onClose(); }