X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ShapeByMeshDlg.cxx;h=bc0f7877965b48d3bb341789130d8dd9ac789729;hp=ba07781952344b6699b2d74f19b1cb30a9de3d95;hb=9d11375af40826e967ab2c3bcb77d1f9d439c90c;hpb=4b8b3b4a281e64c16ceaa81647631c6e3bf1c730 diff --git a/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx index ba0778195..bc0f78779 100644 --- a/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx @@ -70,6 +70,7 @@ #define SPACING 5 #define MARGIN 10 + enum { EDGE = 0, FACE, VOLUME }; /*! @@ -114,7 +115,10 @@ QFrame* SMESHGUI_ShapeByMeshDlg::createMainFrame (QWidget* theParent) QLabel* anIdLabel = new QLabel( aMainGrp, "element id label"); anIdLabel->setText( tr("ELEMENT_ID") ); myElementId = new QLineEdit( aMainGrp, "element id"); - myElementId->setValidator( new SMESHGUI_IdValidator( theParent, "id validator", 1 )); + if (!myIsMultipleAllowed) + myElementId->setValidator( new SMESHGUI_IdValidator( theParent, "id validator", 1 )); + else + myElementId->setValidator( new SMESHGUI_IdValidator( theParent, "id validator" )); // shape name QLabel* aNameLabel = new QLabel( aMainGrp, "geom name label"); @@ -148,12 +152,14 @@ SMESHGUI_ShapeByMeshDlg::~SMESHGUI_ShapeByMeshDlg() * Initialize operation */ //================================================================================ -SMESHGUI_ShapeByMeshOp::SMESHGUI_ShapeByMeshOp() +SMESHGUI_ShapeByMeshOp::SMESHGUI_ShapeByMeshOp(bool isMultipleAllowed): + myIsMultipleAllowed(isMultipleAllowed) { if ( GeometryGUI::GetGeomGen()->_is_nil() )// check that GEOM_Gen exists GeometryGUI::InitGeomGen(); myDlg = new SMESHGUI_ShapeByMeshDlg; + myDlg->setMultipleAllowed(myIsMultipleAllowed); connect(myDlg->myElemTypeGroup, SIGNAL(clicked(int)), SLOT(onTypeChanged(int))); connect(myDlg->myElementId, SIGNAL(textChanged(const QString&)), SLOT(onElemIdChanged(const QString&))); @@ -282,9 +288,85 @@ void SMESHGUI_ShapeByMeshOp::commitOperation() { SMESHGUI_SelectionOp::commitOperation(); try { - int elemID = myDlg->myElementId->text().toInt(); - myGeomObj = SMESHGUI::GetSMESHGen()->GetGeometryByMeshElement - ( myMesh.in(), elemID, myDlg->myGeomName->text().latin1()); + QStringList aListId = QStringList::split( " ", myDlg->myElementId->text(), false); + if (aListId.count() == 1) + { + int elemID = (aListId.first()).toInt(); + myGeomObj = SMESHGUI::GetSMESHGen()->GetGeometryByMeshElement + ( myMesh.in(), elemID, myDlg->myGeomName->text().latin1()); + } + else + { + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + + if (geomGen->_is_nil() || !aStudy) + return; + + GEOM::GEOM_IShapesOperations_var aShapesOp = + geomGen->GetIShapesOperations(aStudy->StudyId()); + if (aShapesOp->_is_nil() ) + return; + + TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; + + std::map aGeomObjectsMap; + GEOM::GEOM_Object_var aGeomObject; + + GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh(); + + for ( int i = 0; i < aListId.count(); i++ ) + { + aGeomObject = + SMESHGUI::GetSMESHGen()->FindGeometryByMeshElement(myMesh.in(), aListId[i].toInt()); + + if (aGeomObject->_is_nil()) continue; + + double anId = aShapesOp->GetSubShapeIndex(aMeshShape, aGeomObject); + if (aShapesOp->IsDone() && aGeomObjectsMap.find(anId) == aGeomObjectsMap.end()) + { + aGeomObjectsMap[anId] = aGeomObject; + + TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)aGeomObject->GetShapeType(); + if (i == 0) + aGroupType = aSubShapeType; + else if (aSubShapeType != aGroupType) + aGroupType = TopAbs_SHAPE; + } + } + + int aNumberOfGO = aGeomObjectsMap.size(); + if (aNumberOfGO == 1) + myGeomObj = (*aGeomObjectsMap.begin()).second; + else if (aNumberOfGO > 1) + { + GEOM::GEOM_IGroupOperations_var aGroupOp = + geomGen->GetIGroupOperations(aStudy->StudyId()); + if(aGroupOp->_is_nil()) + return; + + GEOM::ListOfGO_var aGeomObjects = new GEOM::ListOfGO(); + aGeomObjects->length( aNumberOfGO ); + + int i = 0; + std::map::iterator anIter; + for (anIter = aGeomObjectsMap.begin(); anIter!=aGeomObjectsMap.end(); anIter++) + aGeomObjects[i++] = (*anIter).second; + + //create geometry group + myGeomObj = aGroupOp->CreateGroup(aMeshShape, aGroupType); + aGroupOp->UnionList(myGeomObj, aGeomObjects); + + if (!aGroupOp->IsDone()) + return; + } + + // publish the GEOM object in study + QString aNewGeomGroupName ( myDlg->myGeomName->text().latin1() ); + + SALOMEDS::SObject_var aNewGroupSO = + geomGen->AddInStudy(SMESHGUI::GetSMESHGen()->GetCurrentStudy(), myGeomObj, aNewGeomGroupName, aMeshShape); + } } catch (const SALOME::SALOME_Exception& S_ex) { SalomeApp_Tools::QtCatchCorbaException(S_ex); @@ -306,7 +388,7 @@ void SMESHGUI_ShapeByMeshOp::onSelectionDone() try { SALOME_ListIO aList; selectionMgr()->selectedObjects(aList, SVTK_Viewer::Type()); - if (aList.Extent() != 1) + if (!myIsMultipleAllowed && aList.Extent() != 1) return; SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(aList.First()); @@ -316,7 +398,9 @@ void SMESHGUI_ShapeByMeshOp::onSelectionDone() QString aString; int nbElems = SMESH::GetNameOfSelectedElements(selector(),//myViewWindow->GetSelector(), aList.First(), aString); - if ( nbElems == 1 ) { + if (nbElems > 0) { + if (!myIsMultipleAllowed && nbElems != 1 ) + return; setElementID( aString ); myDlg->setButtonEnabled( true, QtxDialog::OK ); } @@ -392,12 +476,16 @@ void SMESHGUI_ShapeByMeshOp::onElemIdChanged(const QString& theNewText) newIndices.Add( e->GetID() ); } - if ( !newIndices.IsEmpty() && newIndices.Extent() == 1 ) - if ( SVTK_Selector* s = selector() ) { - s->AddOrRemoveIndex( actor->getIO(), newIndices, false ); - viewWindow()->highlight( actor->getIO(), true, true ); - myDlg->setButtonEnabled( true, QtxDialog::OK ); - } + if ( !newIndices.IsEmpty() ) + { + if (!myIsMultipleAllowed && newIndices.Extent() != 1) + return; + if ( SVTK_Selector* s = selector() ) { + s->AddOrRemoveIndex( actor->getIO(), newIndices, false ); + viewWindow()->highlight( actor->getIO(), true, true ); + myDlg->setButtonEnabled( true, QtxDialog::OK ); + } + } } }