X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MeshOp.cxx;h=13ce9224fb829acb78693037661ee828bf7ddf16;hb=253807f5b360eb4b76675270840ed53602fa3edb;hp=48b4fae6e4e507ec06c8c9d22307ab09611cb6c4;hpb=d8f644ca3d4ce62f2ef41d4aacb52f5bb1221df3;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 48b4fae6e..13ce9224f 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -1,25 +1,24 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// 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. +// 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_MeshOp.cxx // Author : Sergey LITONIN, Open CASCADE S.A.S. @@ -45,10 +44,12 @@ // SALOME GUI includes #include #include +#include #include #include #include #include +#include #include #include @@ -146,16 +147,20 @@ bool SMESHGUI_MeshOp::onApply() aMess = ""; try { + QStringList anEntryList; if ( myToCreate && myIsMesh ) - aResult = createMesh( aMess ); + aResult = createMesh( aMess, anEntryList ); if ( myToCreate && !myIsMesh ) - aResult = createSubMesh( aMess ); + aResult = createSubMesh( aMess, anEntryList ); else if ( !myToCreate ) aResult = editMeshOrSubMesh( aMess ); if ( aResult ) { SMESHGUI::Modified(); update( UF_ObjBrowser | UF_Model ); + if( LightApp_Application* anApp = + dynamic_cast( SUIT_Session::session()->activeApplication() ) ) + myObjectToSelect = anApp->browseObjects( anEntryList, isApplyAndClose() ); } } catch ( const SALOME::SALOME_Exception& S_ex ) @@ -240,14 +245,36 @@ void SMESHGUI_MeshOp::startOperation() else myDlg->activateObject( SMESHGUI_MeshDlg::Obj ); - myDlg->setHypoSets( SMESH::GetHypothesesSets() ); - myDlg->setCurrentTab( SMESH::DIM_3D ); myDlg->show(); - + myDlg->setGeomPopupEnabled(false); selectionDone(); myIgnoreAlgoSelection = false; + + myObjectToSelect.clear(); +} + +//================================================================================= +/*! + * \brief Selects a recently created mesh or sub-mesh if necessary + * + * Virtual method redefined from base class called when operation is commited + * selects a recently created mesh or sub-mesh if necessary. Allows to perform + * selection when the custom selection filters are removed. + */ +//================================================================================= +void SMESHGUI_MeshOp::commitOperation() +{ + SMESHGUI_SelectionOp::commitOperation(); + + if ( !myObjectToSelect.isEmpty() ) { + if ( LightApp_SelectionMgr* aSelectionMgr = selectionMgr() ) { + SUIT_DataOwnerPtrList aList; + aList.append( new LightApp_DataOwner( myObjectToSelect ) ); + aSelectionMgr->setSelected( aList ); + } + } } //================================================================================ @@ -279,7 +306,7 @@ SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const //================================================================================ /*! - * \brief check if selected shape is a subshape of the shape to mesh + * \brief check if selected shape is a sub-shape of the shape to mesh * \retval bool - check result */ //================================================================================ @@ -504,48 +531,52 @@ void SMESHGUI_MeshOp::selectionDone() } if (aSeq->length() > 0) { - shapeDim = 0; + shapeDim = -1; for (int iss = 0; iss < aSeq->length() && shapeDim < 3; iss++) { GEOM::GEOM_Object_var aGeomVar = aSeq[iss]; switch ( aGeomVar->GetShapeType() ) { case GEOM::SOLID: shapeDim = 3; break; case GEOM::SHELL: - { - //shapeDim = 3; // Bug 0016155: EDF PAL 447: If the shape is a Shell, disable 3D tab - shapeDim = (shapeDim < 2) ? 2 : shapeDim; - TopoDS_Shape aShape; - if (GEOMBase::GetShape(aGeomVar, aShape)) { - if (/*aShape.Closed()*/BRep_Tool::IsClosed(aShape)) - shapeDim = 3; - } - } - break; - case GEOM::FACE: shapeDim = (shapeDim < 2) ? 2 : shapeDim; break; + // Bug 0016155: EDF PAL 447: If the shape is a Shell, disable 3D tab + // { + // TopoDS_Shape aShape; + // bool isClosed = GEOMBase::GetShape(aGeomVar, aShape) && /*aShape.Closed()*/BRep_Tool::IsClosed(aShape); + // shapeDim = qMax(isClosed ? 3 : 2, shapeDim); + // } + // break; + case GEOM::FACE: shapeDim = qMax(2, shapeDim); break; case GEOM::WIRE: - case GEOM::EDGE: shapeDim = (shapeDim < 1) ? 1 : shapeDim; break; - case GEOM::VERTEX: break; + case GEOM::EDGE: shapeDim = qMax(1, shapeDim); break; + case GEOM::VERTEX: shapeDim = qMax(0, shapeDim); break; default: { TopoDS_Shape aShape; - if (GEOMBase::GetShape(aGeomVar, aShape)) { - TopExp_Explorer exp (aShape, TopAbs_SHELL); + if (GEOMBase::GetShape(aGeomVar, aShape)) + { + TopExp_Explorer exp (aShape, TopAbs_SOLID); if (exp.More()) { - //shapeDim = 3; // Bug 0016155: EDF PAL 447: If the shape is a Shell, disable 3D tab - shapeDim = (shapeDim < 2) ? 2 : shapeDim; - for (; exp.More() && shapeDim == 2; exp.Next()) { - if (/*exp.Current().Closed()*/BRep_Tool::IsClosed(exp.Current())) - shapeDim = 3; - } + shapeDim = 3; } + // Bug 0016155: EDF PAL 447: If the shape is a Shell, disable 3D tab + // else if ( exp.Init( aShape, TopAbs_SHELL ), exp.More() ) + // { + // shapeDim = 2; + // for (; exp.More() && shapeDim == 2; exp.Next()) { + // if (/*exp.Current().Closed()*/BRep_Tool::IsClosed(exp.Current())) + // shapeDim = 3; + // } + // } else if ( exp.Init( aShape, TopAbs_FACE ), exp.More() ) - shapeDim = (shapeDim < 2) ? 2 : shapeDim; + shapeDim = qMax(2, shapeDim); else if ( exp.Init( aShape, TopAbs_EDGE ), exp.More() ) - shapeDim = (shapeDim < 1) ? 1 : shapeDim; - else - ;//shapeDim = 0; + shapeDim = qMax(1, shapeDim); + else if ( exp.Init( aShape, TopAbs_VERTEX ), exp.More() ) + shapeDim = qMax(0, shapeDim); } } } + if ( shapeDim == 3 ) + break; } } for (int i = SMESH::DIM_3D; i > shapeDim; i--) { @@ -553,7 +584,7 @@ void SMESHGUI_MeshOp::selectionDone() onAlgoSelected(-1, i); } myDlg->setMaxHypoDim( shapeDim ); - + myDlg->setHypoSets( SMESH::GetHypothesesSets( shapeDim )); if (!myToCreate) // edition: read hypotheses { @@ -617,13 +648,19 @@ void SMESHGUI_MeshOp::selectionDone() QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); if ( _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() )) { SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( pMesh ); - if ( !mesh->_is_nil() ) + if ( !mesh->_is_nil() ) { + //rnv: issue 21056: EDF 1608 SMESH: Dialog Box "Create Sub Mesh": focus should automatically switch to geometry + QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.toLatin1().data() ); + if ( !pGeom || GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() )->_is_nil() ) + myDlg->activateObject(SMESHGUI_MeshDlg::Geom); enable = ( shapeDim > 1 ) && ( mesh->NbEdges() > 0 ); + } } myDlg->setGeomPopupEnabled( enable ); } } - else { + else { // no geometry defined myDlg->enableTab( SMESH::DIM_3D ); QStringList hypList; availableHyps( SMESH::DIM_3D, Algo, hypList, @@ -879,7 +916,7 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, //================================================================================ /*! * \brief If create or edit a submesh, return a hypothesis holding parameters used - * to mesh a subshape + * to mesh a sub-shape * \param aHypType - The hypothesis type name * \param aServerLib - Server library name * \param hypData - The structure holding the hypothesis type etc. @@ -1029,8 +1066,8 @@ namespace */ //================================================================================ void SMESHGUI_MeshOp::createHypothesis(const int theDim, - const int theType, - const QString& theTypeName) + const int theType, + const QString& theTypeName) { HypothesisData* aData = SMESH::GetHypothesisData(theTypeName); if (!aData) @@ -1065,7 +1102,7 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, SMESH::CreateHypothesis(theTypeName, aHypName, false); #ifdef WITHGENERICOBJ if (!CORBA::is_nil(aHyp)) - aHyp->Destroy(); + aHyp->UnRegister(); #endif } else { // Get hypotheses creator client (GUI) @@ -1089,20 +1126,29 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - if ( aMeshEntry != "" ) { // Get Geom object from Mesh + if ( myToCreate && myIsMesh ) + aMeshEntry = aGeomEntry; + + if ( aMeshEntry != aGeomEntry ) { // Get Geom object from Mesh of a sub-mesh being edited _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); } - if ( aMeshEntry == "" && aGeomEntry == "" ) { + if ( aMeshEntry == "" && aGeomEntry == "" ) { // get geom of an object being edited _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); - GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + bool isMesh; + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj, &isMesh ); if ( !aGeomVar->_is_nil() ) + { aGeomEntry = aGeomVar->GetStudyEntry(); + if ( isMesh ) + aMeshEntry = aGeomEntry; + } } - if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { + // take geometry from submesh being created _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); if ( pObj ) { // if current object is sub-mesh @@ -1132,7 +1178,7 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, SMESH::CreateHypothesis(theTypeName, aHypName, false); #ifdef WITHGENERICOBJ if (!CORBA::is_nil(aHyp)) - aHyp->Destroy(); + aHyp->UnRegister(); #endif } } @@ -1200,8 +1246,6 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) if ( aHyp->_is_nil() ) return; - // BUG 0020378 - //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHyp->GetName()); SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHyp->GetName()); if ( aCreator ) { @@ -1218,20 +1262,29 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - if ( aMeshEntry != "" ) { // Get Geom object from Mesh + if ( myToCreate && myIsMesh ) + aMeshEntry = aGeomEntry; + + if ( aMeshEntry != aGeomEntry ) { // Get Geom object from Mesh of a sub-mesh being edited _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); } - if ( aMeshEntry == "" && aGeomEntry == "" ) { + if ( aMeshEntry == "" && aGeomEntry == "" ) { // get geom of an object being edited _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); - GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + bool isMesh; + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj, &isMesh ); if ( !aGeomVar->_is_nil() ) + { aGeomEntry = aGeomVar->GetStudyEntry(); + if ( isMesh ) + aMeshEntry = aGeomEntry; + } } - if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { + // take geometry from submesh being created _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); if ( pObj ) { // if current object is sub-mesh @@ -1541,12 +1594,13 @@ void SMESHGUI_MeshOp::processSet() /*! * \brief Creates mesh * \param theMess - Output parameter intended for returning error message + * \param theEntryList - List of entries of published objects * \retval bool - TRUE if mesh is created, FALSE otherwise * * Creates mesh */ //================================================================================ -bool SMESHGUI_MeshOp::createMesh( QString& theMess ) +bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList ) { theMess = ""; @@ -1574,8 +1628,10 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess ) if ( aMeshVar->_is_nil() ) return false; _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar.in() ); - if ( aMeshSO ) + if ( aMeshSO ) { SMESH::SetName( aMeshSO, myDlg->objectText( SMESHGUI_MeshDlg::Obj ) ); + theEntryList.append( aMeshSO->GetID().c_str() ); + } for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) { if ( !isAccessibleDim( aDim )) continue; @@ -1599,7 +1655,7 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess ) // It is safe to decrement its refcount // so that it will be destroyed when the entry in study will be removed if (aMeshSO) - aMeshVar->Destroy(); + aMeshVar->UnRegister(); #endif } return true; @@ -1609,12 +1665,13 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess ) /*! * \brief Creates sub-mesh * \param theMess - Output parameter intended for returning error message + * \param theEntryList - List of entries of published objects * \retval bool - TRUE if sub-mesh is created, FALSE otherwise * * Creates sub-mesh */ //================================================================================ -bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) +bool SMESHGUI_MeshOp::createSubMesh( QString& theMess, QStringList& theEntryList ) { theMess = ""; @@ -1704,8 +1761,10 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) // create sub-mesh SMESH::SMESH_subMesh_var aSubMeshVar = aMeshVar->GetSubMesh( aGeomVar, aName.toLatin1().data() ); _PTR(SObject) aSubMeshSO = SMESH::FindSObject( aSubMeshVar.in() ); - if ( aSubMeshSO ) + if ( aSubMeshSO ) { SMESH::SetName( aSubMeshSO, aName.toLatin1().data() ); + theEntryList.append( aSubMeshSO->GetID().c_str() ); + } for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) { @@ -1729,7 +1788,7 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) } } - // deselect geometry: next submesh should be created on other subshape + // deselect geometry: next submesh should be created on other sub-shape myDlg->clearSelection( SMESHGUI_MeshDlg::Geom ); selectObject( _PTR(SObject)() ); selectionDone(); @@ -1862,14 +1921,13 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) SMESH::CreateHypothesis(aHypName, aHypName, true); #ifdef WITHGENERICOBJ if (!CORBA::is_nil(aHyp)) - aHyp->Destroy(); + aHyp->UnRegister(); #endif } else { // Get hypotheses creator client (GUI) // BUG 0020378 - //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypName); SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypName); // Create algorithm @@ -1880,7 +1938,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) SMESH::CreateHypothesis(aHypName, aHypName, true); #ifdef WITHGENERICOBJ if (!CORBA::is_nil(aHyp)) - aHyp->Destroy(); + aHyp->UnRegister(); #endif } }