X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_GroupOnShapeDlg.cxx;h=f7dccaff45c6304e29d3f6a81d9533a6d885f68c;hp=c85a269df519848876fedd33013fec7b55d5d1f6;hb=HEAD;hpb=0635c9fc80f67d1e5dc0e94ec85f487286a92070 diff --git a/src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx index c85a269df..746adb994 100644 --- a/src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx @@ -1,24 +1,22 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // -// This library is 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. // -// 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 // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // SMESH SMESHGUI : GUI for SMESH component // File : SMESHGUI_GroupOnShapeDlg.cxx // Created : Wed Sep 17 18:36:51 2008 @@ -29,14 +27,17 @@ #include "SMESHGUI_GroupOnShapeDlg.h" #include "SMESH_TypeFilter.hxx" +#include "SMESHGUI.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_GEOMGenUtils.h" #include #include +#include #include #include +#include #include #include @@ -76,7 +77,8 @@ SMESHGUI_GroupOnShapeDlg::SMESHGUI_GroupOnShapeDlg() // Elem geom - QGroupBox* elemsGrp = new QGroupBox( tr( "SMESH_ELEMENTS" ), mainFrame() ); + QGroupBox* elemsGrp = new QGroupBox( tr( "ELEMENTS" ), mainFrame() ); + elemsGrp->setToolTip( tr("ELEMENTS_TOOLTIP") ); QLabel* label = new QLabel( tr( "SMESH_GEOM" ), elemsGrp ); myElemGeomBtn = new QPushButton( elemsGrp ); myElemGeomBtn->setCheckable(true); @@ -132,7 +134,7 @@ SMESHGUI_GroupOnShapeDlg::~SMESHGUI_GroupOnShapeDlg() //================================================================================ /*! - * \brief slot to enable/diable [Apply] + * \brief slot to enable/disable [Apply] */ //================================================================================ @@ -178,7 +180,7 @@ SMESHGUI_GroupOnShapeOp::SMESHGUI_GroupOnShapeOp() : SMESHGUI_SelectionOp(ActorSelection), myDlg( 0 ) { - myHelpFileName = "creating_groups_page.html"; + myHelpFileName = "create_groups_from_geometry.html"; } SMESHGUI_GroupOnShapeOp::~SMESHGUI_GroupOnShapeOp() @@ -204,11 +206,11 @@ LightApp_Dialog* SMESHGUI_GroupOnShapeOp::dlg() const */ //================================================================================ -static SMESH::ElementType elementType(GEOM::GEOM_Object_var& geom) +SMESH::ElementType SMESHGUI_GroupOnShapeOp::ElementType(GEOM::GEOM_Object_var geom) { if ( !geom->_is_nil() ) { switch ( geom->GetShapeType() ) { - case GEOM::VERTEX: return SMESH::NODE; + case GEOM::VERTEX: return SMESH::ELEM0D; // NODE; -- 0023613 case GEOM::EDGE: return SMESH::EDGE; case GEOM::WIRE: return SMESH::EDGE; case GEOM::FACE: return SMESH::FACE; @@ -218,27 +220,28 @@ static SMESH::ElementType elementType(GEOM::GEOM_Object_var& geom) case GEOM::COMPOUND: break; default: return SMESH::ALL; } - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IShapesOperations_var aShapeOp = - SMESH::GetGEOMGen()->GetIShapesOperations(aStudy->StudyId()); + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen( geom ); + GEOM::GEOM_IShapesOperations_wrap aShapeOp = geomGen->GetIShapesOperations(); - if ( geom->GetType() == 37 ) { // geom group - GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); + if ( geom->GetType() == 37 ) // geom group + { + GEOM::GEOM_IGroupOperations_wrap aGroupOp = geomGen->GetIGroupOperations(); if ( !aGroupOp->_is_nil() ) { + // mainShape is an existing servant => GEOM_Object_var not GEOM_Object_wrap GEOM::GEOM_Object_var mainShape = aGroupOp->GetMainShape( geom ); GEOM::ListOfLong_var ids = aGroupOp->GetObjects( geom ); if ( ids->length() && !mainShape->_is_nil() && !aShapeOp->_is_nil() ) { - GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( mainShape, ids[0] ); - return elementType( member ); + GEOM::GEOM_Object_wrap member = aShapeOp->GetSubShape( mainShape, ids[0] ); + return ElementType( member ); } } } - else if ( !aShapeOp->_is_nil() ) { // just a compoud shape + else if ( !aShapeOp->_is_nil() ) // just a compoud shape + { GEOM::ListOfLong_var ids = aShapeOp->SubShapeAllIDs( geom, GEOM::SHAPE, false ); if ( ids->length() ) { - GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( geom, ids[0] ); - return elementType( member ); + GEOM::GEOM_Object_wrap member = aShapeOp->GetSubShape( geom, ids[0] ); + return ElementType( member ); } } } @@ -294,15 +297,15 @@ bool SMESHGUI_GroupOnShapeOp::onApply() { SUIT_OverrideCursor aWaitCursor; - if (isStudyLocked()) + if (SMESHGUI::isStudyLocked()) return false; // study - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + _PTR(Study) aStudy = SMESH::getStudy(); if ( !aStudy ) return false; // mesh - _PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() ); + _PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toUtf8().data() ); SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( meshSO ); if ( mesh->_is_nil() ) return false; @@ -319,6 +322,7 @@ bool SMESHGUI_GroupOnShapeOp::onApply() // create groups SMESH::SMESH_GroupOnGeom_var group; + QStringList anEntryList; for ( int isNode = 0; isNode < 2; ++isNode ) // elems and then nodes { QStringList::iterator geomID = isNode ? myNodeGeoIDs.begin() : myElemGeoIDs.begin(); @@ -327,12 +331,12 @@ bool SMESHGUI_GroupOnShapeOp::onApply() for ( int i = 0; geomID != geomEnd; ++geomID, ++i ) { // selected geom - _PTR(SObject) geomSO = aStudy->FindObjectID( geomID->toLatin1().data() ); + _PTR(SObject) geomSO = aStudy->FindObjectID( geomID->toUtf8().data() ); GEOM::GEOM_Object_var geom = SMESH::SObjectToInterface(geomSO); if ( geom->_is_nil() ) continue; // group type - SMESH::ElementType elemType = isNode ? SMESH::NODE : elementType( geom ); + SMESH::ElementType elemType = isNode ? SMESH::NODE : ElementType( geom ); if ( elemType == SMESH::ALL ) continue; @@ -346,12 +350,29 @@ bool SMESHGUI_GroupOnShapeOp::onApply() // groupNames.append( name ); //printf( "apply() %s %s\n", (*geomID).latin1(), name.latin1() ); - group = mesh->CreateGroupFromGEOM( elemType, name.toLatin1().data(), geom ); + group = mesh->CreateGroupFromGEOM( elemType, name.toUtf8().data(), geom ); + if( !group->_is_nil() ) + if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( group ) ) + anEntryList.append( aSObject->GetID().c_str() ); } } + SMESHGUI::Modified(); + update( UF_ObjBrowser | UF_Model ); - init(); + // Re-init controls to create the next group + myElemGeoIDs.clear(); + myNodeGeoIDs.clear(); + removeCustomFilters(); + myDlg->myNodeGeomList->clear(); + myDlg->myElemGeomList->clear(); + myDlg->myElemGeomBtn->setChecked(false); + myDlg->myNodeGeomBtn->setChecked(false); + myDlg->updateButtons(); + + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + anApp->browseObjects( anEntryList, isApplyAndClose() ); return !group->_is_nil(); } @@ -401,7 +422,7 @@ SUIT_SelectionFilter* SMESHGUI_GroupOnShapeOp::createFilter( const int theId ) c if ( theId == _ELEM_GEOM || theId == _NODE_GEOM ) return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true ); else if ( theId == _MESH ) - return new SMESH_TypeFilter( MESH ); + return new SMESH_TypeFilter( SMESH::MESH ); else return ( SUIT_SelectionFilter*) 0; } @@ -431,6 +452,7 @@ void SMESHGUI_GroupOnShapeOp::selectionDone() myDlg->myElemGeomBtn->setEnabled( nbSelected == 1 ); myDlg->myNodeGeomList->clear(); myDlg->myNodeGeomBtn->setEnabled( nbSelected == 1 ); + myDlg->myElemGeomBtn->click(); return; } @@ -439,50 +461,44 @@ void SMESHGUI_GroupOnShapeOp::selectionDone() QStringList goodNames, goodIds; if (nbSelected > 0) { // study - if (_PTR(Study) aStudy = SMESH::GetActiveStudyDocument()) { + if (_PTR(Study) aStudy = SMESH::getStudy()) { // mesh - if (_PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() )) { + if (_PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toUtf8().data() )) + { // shape to mesh - _PTR(SObject) anObj, shapeToMesh; - if (meshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(shapeToMesh)) { - // loop on selected - QStringList::iterator name = names.begin(), id = ids.begin(), idEnd = ids.end(); - for (; id != idEnd; ++id, ++name ) { - // shape SO - if (_PTR(SObject) shapeSO = aStudy->FindObjectID( id->toLatin1().data() )) { - // check if shape SO is a child of shape to mesh - while ( shapeSO && shapeSO->GetID() != shapeToMesh->GetID() ) - if ( shapeSO->Depth() < 2 ) - shapeSO.reset(); - else - shapeSO = shapeSO->GetFather(); - if ( shapeSO ) { - //printf( "selectionDone() %s %s\n", (*id).latin1(), (*name).latin1() ); - if ( !goodIds.contains( *id )) { - goodIds.append( *id ); - goodNames.append( *name ); - } - } - } + GEOM::GEOM_Object_var mainGeom = SMESH::GetGeom( meshSO ); + // loop on selected + QStringList::iterator name = names.begin(), id = ids.begin(), idEnd = ids.end(); + for (; id != idEnd; ++id, ++name ) + { + if ( goodIds.contains( *id )) + continue; + // shape SO + _PTR(SObject) shapeSO = aStudy->FindObjectID( id->toUtf8().data() ); + GEOM::GEOM_Object_var subGeom = SMESH::GetGeom( shapeSO ); + if ( SMESH::ContainsSubShape( mainGeom, subGeom )) + { + goodIds.append( *id ); + goodNames.append( *name ); } } } } } - if ( myDlg->myElemGeomBtn->isChecked() ) // elem geomerty selection + if ( myDlg->myElemGeomBtn->isChecked() ) // elem geometry selection { myDlg->myElemGeomList->clear(); myDlg->myElemGeomList->addItems( goodNames ); myElemGeoIDs = goodIds; } - else if ( myDlg->myNodeGeomBtn->isChecked() ) // Node geomerty selection + else if ( myDlg->myNodeGeomBtn->isChecked() ) // Node geometry selection { myDlg->myNodeGeomList->clear(); myDlg->myNodeGeomList->addItems( goodNames ); myNodeGeoIDs = goodIds; } - // enable/diable Apply, which can change at selection + // enable/disable Apply, which can change at selection myDlg->updateButtons(); }