X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MeshOp.cxx;h=9ad1a47fc5ae4d4a5ae928f3d6d315ce80107e92;hb=bc65599349c226d86c8782ff3163efa43aff6a35;hp=0519f99ff62001c7949208cd4355868f90313d9a;hpb=77270c3d825ea00e7c417347131ad4bc9a1ad7a8;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 0519f99ff..9ad1a47fc 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-2012 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 ) @@ -246,6 +251,30 @@ void SMESHGUI_MeshOp::startOperation() 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 ); + } + } } //================================================================================ @@ -277,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 */ //================================================================================ @@ -508,13 +537,13 @@ void SMESHGUI_MeshOp::selectionDone() 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 - TopoDS_Shape aShape; - bool isClosed = GEOMBase::GetShape(aGeomVar, aShape) && /*aShape.Closed()*/BRep_Tool::IsClosed(aShape); - shapeDim = qMax(isClosed ? 3 : 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 = qMax(1, shapeDim); break; @@ -522,16 +551,21 @@ void SMESHGUI_MeshOp::selectionDone() 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 = qMax(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 = qMax(2, shapeDim); else if ( exp.Init( aShape, TopAbs_EDGE ), exp.More() ) @@ -541,6 +575,8 @@ void SMESHGUI_MeshOp::selectionDone() } } } + if ( shapeDim == 3 ) + break; } } for (int i = SMESH::DIM_3D; i > shapeDim; i--) { @@ -880,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. @@ -1558,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 = ""; @@ -1591,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; @@ -1626,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 = ""; @@ -1721,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++ ) { @@ -1746,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();