X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_GroupDlg.cxx;h=a83f360b5c664175e151c595341b5dc8699de69e;hp=d6928d67326b5ed997ec1fa5091cd7afbdd08782;hb=72598d17882a440afe96df9731407ce1bf241c70;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8 diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx index d6928d673..a83f360b5 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx @@ -26,14 +26,20 @@ // Module : SMESH // $Header$ -using namespace std; #include "SMESHGUI_GroupDlg.h" #include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_Filter.h" #include "SMESHGUI.h" +#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 "SALOMEGUI_QtCatchCorbaException.hxx" #include "SALOME_ListIteratorOfListIO.hxx" -#include "VTKViewer_InteractorStyleSALOME.h" #include "VTKViewer_ViewFrame.h" #include "QAD_Application.h" #include "QAD_Desktop.h" @@ -43,6 +49,8 @@ using namespace std; #include "SMESH_Actor.h" +#include "GEOMBase.h" + // QT Includes #include #include @@ -57,11 +65,14 @@ using namespace std; #include #include #include +#include // STL includes #include #include +using namespace std; + //================================================================================= // class : SMESHGUI_GroupDlg() // purpose : @@ -72,8 +83,15 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_ { if ( !name ) setName( "SMESHGUI_GroupDlg" ); initDialog(theSel, true); - init(theMesh); - + if (!theMesh->_is_nil()) + init(theMesh); + else { + mySelectSubMesh->setEnabled(false); + mySelectGroup->setEnabled(false); + myGeomGroupBtn->setEnabled(false); + myGeomGroupLine->setEnabled(false); + } + /* Move widget on the botton right corner of main widget */ int x, y ; mySMESHGUI->DefineDlgPosition(this, x, y); @@ -86,8 +104,13 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_ { if ( !name ) setName( "SMESHGUI_GroupDlg" ); initDialog(theSel, false); - init(theGroup); - + if (!theGroup->_is_nil()) + init(theGroup); + else { + mySelectSubMesh->setEnabled(false); + mySelectGroup->setEnabled(false); + } + /* Move widget on the botton right corner of main widget */ int x, y ; mySMESHGUI->DefineDlgPosition(this, x, y); @@ -97,17 +120,31 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( QWidget* parent, const char* name, SALOME_ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) { myFilterDlg = 0; + myCreate = create; + myCurrentLineEdit = 0; QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT"))); if (create) setCaption( tr( "SMESH_CREATE_GROUP_TITLE" ) ); - else + else setCaption( tr( "SMESH_EDIT_GROUP_TITLE" ) ); + setSizeGripEnabled( TRUE ); - QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6); + QGridLayout* aMainLayout = new QGridLayout(this, 7, 3, 11, 6); + /***************************************************************/ + QLabel* meshGroupLab = new QLabel(this, "mesh/group label"); + if (create) + 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); + /***************************************************************/ myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types"); myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE")); @@ -126,14 +163,27 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool 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 +194,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,13 +217,10 @@ 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"); mySelectSubMesh->setText(tr("SMESH_SUBMESH")); mySelectSubMesh->setMinimumSize(50, 0); @@ -184,7 +230,7 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) mySubMeshLine = new QLineEdit(aSelectBox, "submesh line"); mySubMeshLine->setReadOnly(true); onSelectSubMesh(false); - + mySelectGroup = new QCheckBox(aSelectBox, "group checkbox"); mySelectGroup->setText(tr("SMESH_GROUP")); mySelectGroup->setMinimumSize(50, 0); @@ -194,10 +240,36 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) myGroupLine = new QLineEdit(aSelectBox, "group line"); myGroupLine->setReadOnly(true); onSelectGroup(false); + + /***************************************************************/ + QGridLayout* wg1Layout = new QGridLayout( wg1, 3, 1, 0, 6 ); + wg1Layout->addWidget(aContentBox, 0, 0); + wg1Layout->addWidget(aSelectBox, 1, 0); + wg1Layout->setRowStretch(2, 5); - aSelectBox->setMinimumHeight(mySubMeshBtn->sizeHint().height() + - myGroupBtn->sizeHint().height() + - aSelectBox->sizeHint().height()); + /***************************************************************/ + 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 +294,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,6 +324,7 @@ 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())); @@ -255,13 +337,20 @@ void SMESHGUI_GroupDlg::initDialog(SALOME_Selection* theSel, bool create) 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())); + myGrpTypeGroup->setButton(myGrpTypeGroup->id(rb1)); // VSR !!! + onGrpTypeChanged(myGrpTypeGroup->id(rb1)); // VSR!!! + + if (myMesh->_is_nil() ) + myTypeGroup->setButton(0); + updateButtons(); } @@ -271,7 +360,12 @@ 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; + } } @@ -284,10 +378,15 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Mesh_ptr theMesh) /* init data from current selection */ myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh); myGroup = SMESH::SMESH_Group::_nil(); + + myActor = SMESH::FindActorByObject(myMesh); + SMESH::SetPickable(myActor); + + QString aName = mySelection->firstIObject()->getName(); + myMeshGroupLine->setText(aName) ; + myMeshGroupLine->home( false ); - Standard_Boolean aResult; - myActor = mySMESHGUI->FindActor(myMesh, aResult, true); - mySMESHGUI->SetPickable(myActor); + myCurrentLineEdit = 0; myTypeGroup->setButton(0); onTypeChanged(0); @@ -299,16 +398,14 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Mesh_ptr theMesh) //================================================================================= 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()) { case SMESH::NODE: aType= 0; break; @@ -316,12 +413,18 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup) 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(); @@ -340,7 +443,12 @@ void SMESHGUI_GroupDlg::init(SMESH::SMESH_Group_ptr theGroup) //================================================================================= 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); @@ -359,7 +467,7 @@ void SMESHGUI_GroupDlg::onNameChanged(const QString& text) //================================================================================= // function : onTypeChanged() -// purpose : Radio button management +// purpose : Group elements type radio button management //================================================================================= void SMESHGUI_GroupDlg::onTypeChanged(int id) { @@ -367,34 +475,53 @@ void SMESHGUI_GroupDlg::onTypeChanged(int 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) { + // PAL7314 + if (myMesh->_is_nil()) + return; + if (mySelectionMode != theMode) { mySelection->ClearIObjects(); mySelection->ClearFilters(); - if (mySelectionMode == 0) - mySMESHGUI->EraseSimulationActors(); + SMESH::SetPointRepresentation(false); if (theMode < 4) { - if (theMode == 0) { - mySMESHGUI->ViewNodes(); + switch(theMode){ + case 0: + if ( myActor ) + myActor->SetPointRepresentation(true); + else + SMESH::SetPointRepresentation(true); QAD_Application::getDesktop()->SetSelectionMode(NodeSelection, true); - } - else if (theMode == 1) { + break; + case 1: QAD_Application::getDesktop()->SetSelectionMode(EdgeSelection, true); - } - else if (theMode == 2) { + break; + case 2: QAD_Application::getDesktop()->SetSelectionMode(FaceSelection, true); - } - else { + break; + default: QAD_Application::getDesktop()->SetSelectionMode(VolumeSelection, true); } } @@ -404,6 +531,8 @@ void SMESHGUI_GroupDlg::setSelectionMode(int theMode) mySelection->AddFilter(mySubMeshFilter); else if (theMode == 5) mySelection->AddFilter(myGroupFilter); + else if (theMode == 6) + mySelection->AddFilter(myMeshFilter); } mySelectionMode = theMode; } @@ -415,7 +544,10 @@ void SMESHGUI_GroupDlg::setSelectionMode(int theMode) //================================================================================= bool SMESHGUI_GroupDlg::onApply() { - if (!myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0) { + if (mySMESHGUI->ActiveStudyLocked()) + return false; + + if ( myGrpTypeId == 0 && !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0) { mySelection->ClearIObjects(); if (myGroup->_is_nil()) { SMESH::ElementType aType = SMESH::ALL; @@ -433,9 +565,9 @@ 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(); @@ -447,6 +579,7 @@ bool SMESHGUI_GroupDlg::onApply() 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 +593,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 +601,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(); @@ -477,9 +610,32 @@ bool SMESHGUI_GroupDlg::onApply() } mySMESHGUI->GetActiveStudy()->updateObjBrowser(true); + SMESH::UpdateView(); // asv: fix of BUG PAL5515 mySelection->ClearIObjects(); 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; + } + + SALOMEDS::Study_var 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->GetActiveStudy()->updateObjBrowser(true); + mySelection->ClearIObjects(); + /* init for next operation */ + myName->setText(""); + return true; + } + return false; } @@ -493,16 +649,6 @@ void SMESHGUI_GroupDlg::onOK() onClose(); } -//================================================================================= -// function : onClose() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onClose() -{ - close(); -} - - static bool busy = false; //================================================================================= // function : onListSelectionChanged() @@ -520,18 +666,8 @@ void SMESHGUI_GroupDlg::onListSelectionChanged() 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); @@ -546,39 +682,178 @@ void SMESHGUI_GroupDlg::onListSelectionChanged() //================================================================================= void SMESHGUI_GroupDlg::onObjectSelectionChanged() { - if (busy) return; + if (busy || !isEnabled()) return; busy = true; int aNbSel = mySelection->IObjectCount(); myElements->clearSelection(); - + if (myCurrentLineEdit) { myCurrentLineEdit->setText("") ; QString aString = ""; + + 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(); + busy = false; + return; + } + Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject(); + + if (myCreate) + { + myMesh = SMESH::IObjectToInterface(IO); + if(myMesh->_is_nil()) + return; + myGroup = SMESH::SMESH_Group::_nil(); + + myActor = SMESH::FindActorByObject(myMesh); + SMESH::SetPickable(myActor); + + aString = mySelection->firstIObject()->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()) + return; + busy = false; + myCurrentLineEdit = 0; + init(aGroup); + busy = true; + mySelectSubMesh->setEnabled(true); + mySelectGroup->setEnabled(true); + myGeomGroupBtn->setEnabled(true); + myGeomGroupLine->setEnabled(true); + } + myCurrentLineEdit = 0; + busy = false; + if (!myCreate) + return; + + if (myTypeId == -1) + onTypeChanged(0); + else + { + myElements->clear(); + setSelectionMode(myTypeId); + } + + return; + } + else if (myCurrentLineEdit == myGeomGroupLine) + { + + if(aNbSel != 1) + { + myGeomGroup = GEOM::GEOM_Object::_nil(); + busy = false; + return; + } + + Standard_Boolean testResult = Standard_False; + myGeomGroup = GEOMBase::ConvertIOinGEOMObject(mySelection->firstIObject(), testResult ); + + // Check if the object is a geometry group + if(!testResult || CORBA::is_nil( myGeomGroup )) + { + myGeomGroup = GEOM::GEOM_Object::_nil(); + busy = false; + return; + } + // Check if group constructed on the same shape as a mesh or on its child + SALOMEDS::Study_var 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); + SALOMEDS::SObject_var aGroupMainShapeSO = aStudy->FindObjectIOR( aStudy->ConvertObjectToIOR(aGroupMainShape) ); + // The mesh SObject + SALOMEDS::SObject_var aMeshSO = aStudy->FindObjectIOR( aStudy->ConvertObjectToIOR(myMesh) ); + if ( aMeshSO->_is_nil() ) { + myGeomGroup = GEOM::GEOM_Object::_nil(); + busy = false; + return; + } + SALOMEDS::SObject_var anObj, aRef; + bool isRefOrSubShape = false; + if ( aMeshSO->FindSubObject( 1, anObj ) && anObj->ReferencedObject( aRef )) { + if ( strcmp( aRef->GetID(), aGroupMainShapeSO->GetID() ) == 0 ) + isRefOrSubShape = true; + else + { + SALOMEDS::SObject_var aFather = aGroupMainShapeSO->GetFather(); + SALOMEDS::SComponent_var aComponent = aGroupMainShapeSO->GetFatherComponent(); + while ( !isRefOrSubShape && strcmp( aFather->GetID(), aComponent->GetID() ) != 0 ) + { + if (strcmp( aRef->GetID(), aFather->GetID() ) == 0) + isRefOrSubShape = true; + else + aFather = aFather->GetFather(); + } + } + } + if ( !isRefOrSubShape ) + { + myGeomGroup = GEOM::GEOM_Object::_nil(); + busy = false; + return; + } + } + if (aNbSel >= 1) { if (aNbSel > 1) { - if (myCurrentLineEdit = mySubMeshLine) + if (myCurrentLineEdit == mySubMeshLine) aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel); - else if (myCurrentLineEdit = myGroupLine) + else if (myCurrentLineEdit == myGroupLine || myCurrentLineEdit == myGeomGroupLine) aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel); } else { aString = mySelection->firstIObject()->getName(); } } - + myCurrentLineEdit->setText(aString) ; myCurrentLineEdit->home( false ); + + updateButtons(); } else { if (aNbSel == 1) { QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedNodes(mySelection, aListStr); } else { - aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedElements(mySelection, aListStr); } if (aNbItems > 0) { QStringList anElements = QStringList::split(" ", aListStr); @@ -590,6 +865,14 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() } } } + + if ( !myActor ) { + if ( !myGroup->_is_nil() ) + myActor = SMESH::FindActorByObject(myGroup); + else + myActor = SMESH::FindActorByObject(myMesh); + } + busy = false; } @@ -603,7 +886,10 @@ void SMESHGUI_GroupDlg::onSelectSubMesh(bool on) if (on) { if (mySelectGroup->isChecked()) { mySelectGroup->setChecked(false); - } + } + //VSR: else if (mySelectGeomGroup->isChecked()) { + //VSR: mySelectGeomGroup->setChecked(false); + //VSR: } myCurrentLineEdit = mySubMeshLine; setSelectionMode(4); } @@ -617,6 +903,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 +927,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 +961,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,6 +977,11 @@ void SMESHGUI_GroupDlg::setCurrentSelection() myCurrentLineEdit = myGroupLine; onObjectSelectionChanged(); } + else if (send == myGeomGroupBtn) { + myCurrentLineEdit = myGeomGroupLine; + setSelectionMode(7); + onObjectSelectionChanged(); + } } @@ -674,9 +1000,12 @@ 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( (QWidget*)parent(), aType ); + connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) ); + } else myFilterDlg->Init( aType ); @@ -684,9 +1013,16 @@ void SMESHGUI_GroupDlg::setFilters() 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; @@ -702,7 +1038,7 @@ void SMESHGUI_GroupDlg::setFilters() void SMESHGUI_GroupDlg::onAdd() { int aNbSel = mySelection->IObjectCount(); - if (aNbSel == 0) return; + if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; busy = true; @@ -715,14 +1051,14 @@ void SMESHGUI_GroupDlg::onAdd() } if (myCurrentLineEdit == 0) { - if (aNbSel != 1) { busy = false; return; } + //if (aNbSel != 1) { busy = false; return; } QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = mySMESHGUI->GetNameOfSelectedNodes(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedNodes(mySelection, myActor->getIO(), aListStr); } else { - aNbItems = mySMESHGUI->GetNameOfSelectedElements(mySelection, aListStr); + aNbItems = SMESH::GetNameOfSelectedElements(mySelection, myActor->getIO(), aListStr); } if (aNbItems > 0) { QStringList anElements = QStringList::split(" ", aListStr); @@ -738,52 +1074,30 @@ void SMESHGUI_GroupDlg::onAdd() } } else if (myCurrentLineEdit == mySubMeshLine) { - Standard_Boolean aRes; SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); 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) { + QtCatchCorbaException(ex); + } + } } } mySelectSubMesh->setChecked(false); @@ -791,11 +1105,10 @@ void SMESHGUI_GroupDlg::onAdd() onListSelectionChanged(); } else if (myCurrentLineEdit == myGroupLine) { - Standard_Boolean aRes; SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); 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(); @@ -817,6 +1130,50 @@ void SMESHGUI_GroupDlg::onAdd() busy = false; onListSelectionChanged(); } + else if (myCurrentLineEdit == myGeomGroupLine && !CORBA::is_nil(myGeomGroup)) { + + SALOMEDS::Study_var 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: return; + } + + if (aGroupType == aType) { + SALOMEDS::SObject_var aGroupSO = aStudy->FindObjectIOR( aStudy->ConvertObjectToIOR(myGeomGroup) ); + // 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()); + 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); + busy = false; + onListSelectionChanged(); + } busy = false; // mySelection->ClearIObjects(); updateButtons(); @@ -849,11 +1206,10 @@ void SMESHGUI_GroupDlg::onRemove() } if (myCurrentLineEdit == mySubMeshLine) { - Standard_Boolean aRes; SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); 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) { @@ -892,7 +1248,7 @@ void SMESHGUI_GroupDlg::onRemove() Standard_Boolean aRes; SALOME_ListIteratorOfListIO anIt(mySelection->StoredIObjects()); 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()) { @@ -954,18 +1310,26 @@ void SMESHGUI_GroupDlg::onSort() // purpose : //================================================================================= void SMESHGUI_GroupDlg::closeEvent( QCloseEvent* e ) +{ + onClose(); +} + +//======================================================================= +// name : SMESHGUI_GroupDlg::onClose +// Purpose : SLOT called when "Close" button pressed. Close dialog +//======================================================================= +void SMESHGUI_GroupDlg::onClose() { QAD_StudyFrame* aStudyFrame = mySMESHGUI->GetActiveStudy()->getActiveStudyFrame(); if (aStudyFrame->getTypeView() == VIEW_VTK) { - mySMESHGUI->SetPickable(); - if (mySelectionMode == 0) - mySMESHGUI->EraseSimulationActors(); + SMESH::SetPointRepresentation(false); + SMESH::SetPickable(); // remove filters from viewer - VTKViewer_InteractorStyleSALOME* aStyle = ((VTKViewer_ViewFrame*)aStudyFrame->getRightFrame()->getViewFrame())->getRWInteractor()->GetInteractorStyleSALOME(); - aStyle->RemoveEdgeFilter(); - aStyle->RemoveFaceFilter(); - + if(VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle()){ + SMESH::RemoveFilter(SMESHGUI_EdgeFilter,aStyle); + SMESH::RemoveFilter(SMESHGUI_FaceFilter,aStyle); + } } mySelection->ClearIObjects(); @@ -973,5 +1337,42 @@ void SMESHGUI_GroupDlg::closeEvent( QCloseEvent* e ) mySelection->ClearFilters(); mySMESHGUI->ResetState(); - QDialog::closeEvent( e ); + reject(); +} + +//======================================================================= +// name : SMESHGUI_GroupDlg::onDeactivate +// Purpose : SLOT called when dialog must be deativated +//======================================================================= +void SMESHGUI_GroupDlg::onDeactivate() +{ + mySMESHGUI->ResetState(); + setEnabled( false ); +} + +//======================================================================= +// name : SMESHGUI_GroupDlg::enterEvent +// Purpose : Event filter +//======================================================================= +void SMESHGUI_GroupDlg::enterEvent( QEvent* ) +{ + if ( !isEnabled() ) { + SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); + setEnabled( true ); + mySelectionMode = -1; + setSelectionMode( myTypeId ); + mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ; + mySMESHGUI->SetState(800); + } +} + +//======================================================================= +//function : hideEvent +//purpose : caused by ESC key +//======================================================================= + +void SMESHGUI_GroupDlg::hideEvent ( QHideEvent * e ) +{ + if ( !isMinimized() ) + onClose(); }