X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MeshOp.cxx;h=11d298a6db9ad87391b8a15f3f3075a7a8d470ca;hp=d325f77b27f126198cafbcdb168e14be0f2e56dc;hb=79b1ac2b6df9117f16f11d444b1f165d477a1813;hpb=984c4ffdd7df62aeaedc544cd0b8e64ff8f53f1a diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index d325f77b2..11d298a6d 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -1,18 +1,18 @@ // Copyright (C) 2005 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 +// 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 +// +// 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 +// 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 @@ -44,11 +44,14 @@ #include "SMESH_TypeFilter.hxx" #include "SMESH_NumberFilter.hxx" +#include CORBA_CLIENT_HEADER(SMESH_Gen) + #include "GEOM_SelectionFilter.h" #include "GEOMBase.h" #include "GeometryGUI.h" #include "SalomeApp_Tools.h" +#include "SalomeApp_Application.h" #include "SALOMEDSClient_Study.hxx" #include "SALOMEDSClient_AttributeIOR.hxx" #include "SALOMEDSClient_AttributeName.hxx" @@ -71,17 +74,6 @@ #include #include -enum { GLOBAL_ALGO_TAG =3, - GLOBAL_HYPO_TAG =2, - LOCAL_ALGO_TAG =2, - LOCAL_HYPO_TAG =1, - SUBMESH_ON_EDGE_TAG =5, - SUBMESH_ON_WIRE_TAG =6, - SUBMESH_ON_FACE_TAG =7, - SUBMESH_ON_SHELL_TAG =8, - SUBMESH_ON_SOLID_TAG =9, - SUBMESH_ON_COMPOUND_TAG=10 }; - //================================================================================ /*! * \brief Constructor @@ -100,6 +92,7 @@ SMESHGUI_MeshOp::SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh ) { if ( GeometryGUI::GetGeomGen()->_is_nil() )// check that GEOM_Gen exists GeometryGUI::InitGeomGen(); + myIsOnGeometry = true; } //================================================================================ @@ -135,7 +128,7 @@ LightApp_Dialog* SMESHGUI_MeshOp::dlg() const //================================================================================ bool SMESHGUI_MeshOp::onApply() { - if( isStudyLocked() ) + if (isStudyLocked()) return false; QString aMess; @@ -197,10 +190,10 @@ bool SMESHGUI_MeshOp::onApply() //================================================================================ void SMESHGUI_MeshOp::startOperation() { - if( !myDlg ) + if (!myDlg) { myDlg = new SMESHGUI_MeshDlg( myToCreate, myIsMesh ); - for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + for ( int i = SMESH::DIM_0D; i <= SMESH::DIM_3D; i++ ) { connect( myDlg->tab( i ), SIGNAL( createHyp( const int, const int ) ), this, SLOT( onCreateHyp( const int, const int ) ) ); @@ -212,17 +205,16 @@ void SMESHGUI_MeshOp::startOperation() connect( myDlg, SIGNAL( hypoSet( const QString& )), SLOT( onHypoSet( const QString& ))); connect( myDlg, SIGNAL( geomSelectionByMesh( bool )), SLOT( onGeomSelectionByMesh( bool ))); - if ( myToCreate ) - if ( myIsMesh ) myHelpFileName = "/files/constructing_meshes.htm"; - else myHelpFileName = "/files/constructing_submeshes.htm"; - else myHelpFileName = "files/reassigning_hypotheses_and_algorithms.htm"; + if ( myToCreate ) + if ( myIsMesh ) myHelpFileName = "constructing_meshes_page.html"; + else myHelpFileName = "constructing_submeshes_page.html"; + else myHelpFileName = "editing_meshes_page.html"; } SMESHGUI_SelectionOp::startOperation(); - // iterate through dimensions and get available algoritms, - // set them to the dialog + // iterate through dimensions and get available algoritms, set them to the dialog _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); - for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + for ( int i = SMESH::DIM_0D; i <= SMESH::DIM_3D; i++ ) { SMESHGUI_MeshTab* aTab = myDlg->tab( i ); QStringList hypList; @@ -294,42 +286,57 @@ bool SMESHGUI_MeshOp::isSubshapeOk() const if ( !myToCreate || myIsMesh ) // not submesh creation return false; + // mesh QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); - QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry.latin1() ); - _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); - if ( pMesh && pGeom ) { - SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( pMesh ); - if ( !mesh->_is_nil() ) { - GEOM::GEOM_Object_var mainGeom, subGeom; - mainGeom = mesh->GetShapeToMesh(); - subGeom = SMESH::SObjectToInterface( pGeom ); - if ( !mainGeom->_is_nil() && !subGeom->_is_nil() ) { - TopoDS_Shape mainShape, subShape; - if ( GEOMBase::GetShape( mainGeom, mainShape ) && - GEOMBase::GetShape( subGeom, subShape ) ) - { - int index = GEOMBase::GetIndex( subShape, mainShape, 0 ); - if ( index > 0 ) { - // 1 is index of mainShape itself - return index > 1; // it is a subshape - } - // is it a group? - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - if ( !geomGen->_is_nil() && aStudy ) { - GEOM::GEOM_IGroupOperations_var op = - geomGen->GetIGroupOperations( aStudy->StudyId() ); - if ( ! op->_is_nil() ) { - GEOM::GEOM_Object_var mainObj = op->GetMainShape( subGeom ); - if ( !mainObj->_is_nil() ) - return ( string( mainObj->GetEntry() ) == string( mainGeom->GetEntry() )); - } - } - } + if (!pMesh) return false; + + SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( pMesh ); + if (mesh->_is_nil()) return false; + + // main shape of the mesh + GEOM::GEOM_Object_var mainGeom = mesh->GetShapeToMesh(); + if (mainGeom->_is_nil()) return false; + + // geometry + QStringList aGEOMs; + myDlg->selectedObject(SMESHGUI_MeshDlg::Geom, aGEOMs); + + if (aGEOMs.count() > 0) { + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + if (geomGen->_is_nil() || !aStudy) return false; + + GEOM::GEOM_IGroupOperations_var op = + geomGen->GetIGroupOperations(aStudy->StudyId()); + if (op->_is_nil()) return false; + + // check all selected shapes + QStringList::const_iterator aSubShapesIter = aGEOMs.begin(); + for (; aSubShapesIter != aGEOMs.end(); aSubShapesIter++) { + QString aSubGeomEntry = (*aSubShapesIter); + _PTR(SObject) pSubGeom = studyDS()->FindObjectID(aSubGeomEntry.latin1()); + if (!pSubGeom) return false; + + GEOM::GEOM_Object_var aSubGeomVar = + GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject()); + if (aSubGeomVar->_is_nil()) return false; + + // skl for NPAL14695 - implementation of searching of mainObj + GEOM::GEOM_Object_var mainObj = op->GetMainShape(aSubGeomVar); + //if (mainObj->_is_nil() || + // string(mainObj->GetEntry()) != string(mainGeom->GetEntry())) return false; + while(1) { + if (mainObj->_is_nil()) + return false; + if (string(mainObj->GetEntry()) == string(mainGeom->GetEntry())) + return true; + mainObj = op->GetMainShape(mainObj); } } + //return true; } + return false; } @@ -351,12 +358,13 @@ _PTR(SObject) SMESHGUI_MeshOp::getSubmeshByGeom() const if ( !geom->_is_nil() ) { int tag = -1; switch ( geom->GetShapeType() ) { - case GEOM::EDGE: tag = SUBMESH_ON_EDGE_TAG ; break; - case GEOM::WIRE: tag = SUBMESH_ON_WIRE_TAG ; break; - case GEOM::FACE: tag = SUBMESH_ON_FACE_TAG ; break; - case GEOM::SHELL: tag = SUBMESH_ON_SHELL_TAG ; break; - case GEOM::SOLID: tag = SUBMESH_ON_SOLID_TAG ; break; - case GEOM::COMPOUND: tag = SUBMESH_ON_COMPOUND_TAG; break; + case GEOM::VERTEX: tag = SMESH::Tag_SubMeshOnVertex ; break; + case GEOM::EDGE: tag = SMESH::Tag_SubMeshOnEdge ; break; + case GEOM::WIRE: tag = SMESH::Tag_SubMeshOnWire ; break; + case GEOM::FACE: tag = SMESH::Tag_SubMeshOnFace ; break; + case GEOM::SHELL: tag = SMESH::Tag_SubMeshOnShell ; break; + case GEOM::SOLID: tag = SMESH::Tag_SubMeshOnSolid ; break; + case GEOM::COMPOUND: tag = SMESH::Tag_SubMeshOnCompound; break; default:; } _PTR(GenericAttribute) anAttr; @@ -379,7 +387,7 @@ _PTR(SObject) SMESHGUI_MeshOp::getSubmeshByGeom() const } } } - } + } } return _PTR(SObject)(); } @@ -393,108 +401,161 @@ _PTR(SObject) SMESHGUI_MeshOp::getSubmeshByGeom() const //================================================================================ void SMESHGUI_MeshOp::selectionDone() { - if ( !dlg()->isShown() ) + if (!dlg()->isShown() || !myDlg->isEnabled()) return; SMESHGUI_SelectionOp::selectionDone(); try { - // Enable tabs according to shape dimension - - int shapeDim = 3; + myIsOnGeometry = true; - GEOM::GEOM_Object_var aGeomVar; - QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); - if ( pGeom ) { - aGeomVar = GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); - } - else { - QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.latin1() ); - aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - } - if ( !aGeomVar->_is_nil() ) { - shapeDim = 0; - switch ( aGeomVar->GetShapeType() ) { - case GEOM::SOLID: - case GEOM::SHELL: shapeDim = 3; break; - case GEOM::FACE: shapeDim = 2; break; - case GEOM::WIRE: - case GEOM::EDGE: shapeDim = 1; break; - case GEOM::VERTEX: shapeDim = 0; break; - default: - TopoDS_Shape aShape; - if ( GEOMBase::GetShape(aGeomVar, aShape)) { - TopExp_Explorer exp( aShape, TopAbs_SHELL ); - if ( exp.More() ) - shapeDim = 3; - else if ( exp.Init( aShape, TopAbs_FACE ), exp.More() ) - shapeDim = 2; - else if ( exp.Init( aShape, TopAbs_EDGE ), exp.More() ) - shapeDim = 1; - else - shapeDim = 0; - } + //Check geometry for mesh + QString anObjEntry = myDlg->selectedObject(SMESHGUI_MeshDlg::Obj); + _PTR(SObject) pObj = studyDS()->FindObjectID(anObjEntry.latin1()); + if (pObj) + { + SMESH::SMESH_Mesh_var aMeshVar = + SMESH::SMESH_Mesh::_narrow(_CAST(SObject,pObj)->GetObject()); + if (!aMeshVar->_is_nil()) { + if (!myToCreate && !aMeshVar->HasShapeToMesh()) + myIsOnGeometry = false; } } - myDlg->setMaxHypoDim( shapeDim ); - - if ( !myToCreate ) // edition: read hypotheses + if (myIsOnGeometry) { - QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.latin1() ); - if ( pObj != 0 ) - { - SMESH::SMESH_subMesh_var aVar = - SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); - myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !aVar->_is_nil() ); - myDlg->objectWg( SMESHGUI_MeshDlg::Mesh, SMESHGUI_MeshDlg::Btn )->hide(); - myDlg->updateGeometry(); - myDlg->adjustSize(); - readMesh(); + // Enable tabs according to shape dimension + + int shapeDim = 3; + + QStringList aGEOMs; + myDlg->selectedObject(SMESHGUI_MeshDlg::Geom, aGEOMs); + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + if (aGEOMs.count() > 0) { + // one or more GEOM shape selected + aSeq->length(aGEOMs.count()); + QStringList::const_iterator aSubShapesIter = aGEOMs.begin(); + int iSubSh = 0; + for (; aSubShapesIter != aGEOMs.end(); aSubShapesIter++, iSubSh++) { + QString aSubGeomEntry = (*aSubShapesIter); + _PTR(SObject) pSubGeom = studyDS()->FindObjectID(aSubGeomEntry.latin1()); + GEOM::GEOM_Object_var aSubGeomVar = + GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject()); + aSeq[iSubSh] = aSubGeomVar; + } + } else { + // get geometry by selected sub-mesh + QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.latin1() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + if (!aGeomVar->_is_nil()) { + aSeq->length(1); + aSeq[0] = aGeomVar; + } } - else - myDlg->reset(); - } - else if ( !myIsMesh ) // submesh creation - { - // if a submesh on the selected shape already exist, pass to submesh edition mode - if ( _PTR(SObject) pSubmesh = getSubmeshByGeom() ) { - SMESH::SMESH_subMesh_var sm = - SMESH::SObjectToInterface( pSubmesh ); - bool editSubmesh = ( !sm->_is_nil() && - SUIT_MessageBox::question2( myDlg, tr( "SMESH_WARNING" ), - tr( "EDIT_SUBMESH_QUESTION"), - tr( "SMESH_BUT_YES" ), - tr( "SMESH_BUT_NO" ), 1, 0, 0 )); - if ( editSubmesh ) - { - selectionMgr()->clearFilters(); - selectObject( pSubmesh ); - SMESHGUI::GetSMESHGUI()->switchToOperation(704); - return; + if (aSeq->length() > 0) { + shapeDim = 0; + for (int iss = 0; iss < aSeq->length() && shapeDim < 3; iss++) { + GEOM::GEOM_Object_var aGeomVar = aSeq[iss]; + switch ( aGeomVar->GetShapeType() ) { + case GEOM::SOLID: + case GEOM::SHELL: shapeDim = 3; break; + case GEOM::FACE: shapeDim = (shapeDim < 2) ? 2 : shapeDim; break; + case GEOM::WIRE: + case GEOM::EDGE: shapeDim = (shapeDim < 1) ? 1 : shapeDim; break; + case GEOM::VERTEX: break; + default: + TopoDS_Shape aShape; + if ( GEOMBase::GetShape(aGeomVar, aShape)) { + TopExp_Explorer exp( aShape, TopAbs_SHELL ); + if ( exp.More() ) + shapeDim = 3; + else if ( exp.Init( aShape, TopAbs_FACE ), exp.More() ) + shapeDim = (shapeDim < 2) ? 2 : shapeDim; + else if ( exp.Init( aShape, TopAbs_EDGE ), exp.More() ) + shapeDim = (shapeDim < 1) ? 1 : shapeDim; + else + ;//shapeDim = 0; + } + } } - else + } + myDlg->setMaxHypoDim( shapeDim ); + + + if (!myToCreate) // edition: read hypotheses + { + if (pObj != 0) { - myDlg->selectObject( "", SMESHGUI_MeshDlg::Geom, "" ); - selectObject( _PTR(SObject)() ); - selectionDone(); + SMESH::SMESH_subMesh_var aVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !aVar->_is_nil() ); + myDlg->setObjectShown( SMESHGUI_MeshDlg::Geom, true ); + myDlg->objectWg( SMESHGUI_MeshDlg::Mesh, SMESHGUI_MeshDlg::Btn )->hide(); + myDlg->objectWg( SMESHGUI_MeshDlg::Geom, SMESHGUI_MeshDlg::Btn )->hide(); + myDlg->updateGeometry(); + myDlg->adjustSize(); + readMesh(); } + else + myDlg->reset(); } + else if ( !myIsMesh ) // submesh creation + { + // if a submesh on the selected shape already exist, pass to submesh edition mode + if ( _PTR(SObject) pSubmesh = getSubmeshByGeom() ) { + SMESH::SMESH_subMesh_var sm = + SMESH::SObjectToInterface( pSubmesh ); + bool editSubmesh = ( !sm->_is_nil() && + SUIT_MessageBox::question2( myDlg, tr( "SMESH_WARNING" ), + tr( "EDIT_SUBMESH_QUESTION"), + tr( "SMESH_BUT_YES" ), + tr( "SMESH_BUT_NO" ), 1, 0, 0 )); + if ( editSubmesh ) + { + selectionMgr()->clearFilters(); + selectObject( pSubmesh ); + SMESHGUI::GetSMESHGUI()->switchToOperation(704); + return; + } + else + { + myDlg->selectObject( "", SMESHGUI_MeshDlg::Geom, "" ); + selectObject( _PTR(SObject)() ); + selectionDone(); + } + } - // enable/disable popup for choice of geom selection way - bool enable = false; - QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); - if ( _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry.latin1() )) { - SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( pMesh ); - if ( !mesh->_is_nil() ) - enable = ( shapeDim > 1 ) && ( mesh->NbEdges() > 0 ); + // enable/disable popup for choice of geom selection way + bool enable = false; + QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + if ( _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry.latin1() )) { + SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface( pMesh ); + if ( !mesh->_is_nil() ) + enable = ( shapeDim > 1 ) && ( mesh->NbEdges() > 0 ); + } + myDlg->setGeomPopupEnabled( enable ); + } + } + else { + myDlg->enableTab( SMESH::DIM_3D ); + QStringList hypList; + availableHyps( SMESH::DIM_3D, Algo, hypList, + myAvailableHypData[SMESH::DIM_3D][Algo]); + + SMESHGUI_MeshTab* aTab = myDlg->tab( SMESH::DIM_3D ); + aTab->setAvailableHyps( Algo, hypList ); + for (int i = SMESH::DIM_0D;i < SMESH::DIM_3D; ++i) { + myDlg->disableTab(i); } - myDlg->setGeomPopupEnabled( enable ); + //Hide labels and fields (Mesh ang Geometry) + myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, false ); + myDlg->setObjectShown( SMESHGUI_MeshDlg::Geom, false ); + myDlg->adjustSize(); + readMesh(); } } catch ( const SALOME::SALOME_Exception& S_ex ) @@ -534,7 +595,7 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const return false; } - // Imported mesh, if create sub-mesh or edit mesh +/* // Imported mesh, if create sub-mesh or edit mesh if ( !myToCreate || ( myToCreate && !myIsMesh )) { QString aMeshEntry = myDlg->selectedObject @@ -546,7 +607,7 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const return false; } } - } + }*/ // Geom if ( myToCreate ) @@ -586,7 +647,7 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const } } } - + return true; } @@ -637,7 +698,7 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, theHyps.clear(); bool isAlgo = ( theHypType == Algo ); bool isAux = ( theHypType == AddHyp ); - QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux ); + QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux, myIsOnGeometry ); QStringList::const_iterator anIter; for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter ) @@ -657,7 +718,6 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, * \param theHypType - specifies whether algorims or hypotheses or additional ones * are retrieved (possible values are in HypType enumeration) * \param theFather - start object for finding ( may be component, mesh, or sub-mesh ) - * \param theDataList - output list of hypotheses data * \param theHyps - output list of names. * \param theHypVars - output list of variables. * \param theAlgoData - to select hypos able to be used by this algo (optional) @@ -670,12 +730,12 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, const int theHypType, _PTR(SObject) theFather, QStringList& theHyps, - QValueList& theHypVars, + THypList& theHypList, HypothesisData* theAlgoData) { // Clear hypoheses list theHyps.clear(); - theHypVars.clear(); + theHypList.clear(); if ( !theFather ) return; @@ -690,9 +750,9 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, bool isMesh = !_CAST( SComponent, theFather ); int aPart = -1; if ( isMesh ) - aPart = theHypType == Algo ? GLOBAL_ALGO_TAG : GLOBAL_HYPO_TAG; + aPart = theHypType == Algo ? SMESH::Tag_RefOnAppliedAlgorithms : SMESH::Tag_RefOnAppliedHypothesis; else - aPart = theHypType == Algo ? LOCAL_ALGO_TAG : LOCAL_HYPO_TAG; + aPart = theHypType == Algo ? SMESH::Tag_AlgorithmsRoot : SMESH::Tag_HypothesisRoot; if ( theFather->FindSubObject( aPart, aHypRoot ) ) { @@ -718,15 +778,15 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, SMESH::SMESH_Hypothesis_var aHypVar = SMESH::SMESH_Hypothesis::_narrow( aVar ); if ( !aHypVar->_is_nil() ) { - QString aHypType( aHypVar->GetName() ); + CORBA::String_var aHypType( aHypVar->GetName() ); HypothesisData* aData = SMESH::GetHypothesisData( aHypType ); if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) && ( isCompatible ( theAlgoData, aData, theHypType )) && ( isAux == aData->IsAux )) { - //theDataList.append( aData ); - theHyps.append( aName->Value().c_str() ); - theHypVars.append( aHypVar ); + std::string aHypName = aName->Value(); + theHyps.append( aHypName.c_str() ); + theHypList.append( THypItem( aHypVar, aHypName.c_str() ) ); } } } @@ -756,7 +816,7 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType, const int nbColonsInMeshEntry = 3; bool isSubMesh = myToCreate ? !myIsMesh : - myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ).contains(':') > nbColonsInMeshEntry; + myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ).contains(':') > nbColonsInMeshEntry; if ( isSubMesh ) { @@ -797,7 +857,7 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType, //================================================================================ /*! - * \Brief Returns tab dimention + * \Brief Returns tab dimention * \param tab - the tab in the dlg * \param dlg - my dialogue * \retval int - dimention @@ -807,7 +867,7 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType, static int getTabDim (const QObject* tab, SMESHGUI_MeshDlg* dlg ) { int aDim = -1; - for (int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++) + for (int i = SMESH::DIM_0D; i <= SMESH::DIM_3D; i++) if (tab == dlg->tab(i)) aDim = i; return aDim; @@ -848,21 +908,55 @@ void SMESHGUI_MeshOp::onCreateHyp( const int theHypType, const int theIndex ) * \param theTypeName - specifies hypothesis to be created */ //================================================================================ +namespace +{ + QString GetUniqueName (const QStringList& theHypNames, + const QString& theName, + size_t theIteration = 1) + { + QString aName = theName + "_" + QString::number( theIteration ); + if ( theHypNames.contains( aName ) ) + return GetUniqueName( theHypNames, theName, ++theIteration ); + return aName; + } +} + void SMESHGUI_MeshOp::createHypothesis (const int theDim, const int theType, const QString& theTypeName) { + // During a hypothesis creation we might need to select some objects. + // Main dialog must not update it's own selected objects in this case. + dlg()->deactivateAll(); + HypothesisData* aData = SMESH::GetHypothesisData(theTypeName.latin1()); if (!aData) return; + QStringList aHypNames; + TDim2Type2HypList::const_iterator aDimIter = myExistingHyps.begin(); + for (; aDimIter != myExistingHyps.end(); aDimIter++) { + const TType2HypList& aType2HypList = aDimIter.data(); + TType2HypList::const_iterator aTypeIter = aType2HypList.begin(); + for (; aTypeIter != aType2HypList.end(); aTypeIter++) { + const THypList& aHypList = aTypeIter.data(); + THypList::const_iterator anIter = aHypList.begin(); + for (; anIter != aHypList.end(); anIter++) { + const THypItem& aHypItem = *anIter; + const QString& aHypName = aHypItem.second; + aHypNames.append(aHypName); + } + } + } + QString aHypName = GetUniqueName( aHypNames, aData->Label); + // existing hypos int nbHyp = myExistingHyps[theDim][theType].count(); QString aClientLibName = aData->ClientLibName; if (aClientLibName == "") { // Call hypothesis creation server method (without GUI) - SMESH::CreateHypothesis(theTypeName, aData->Label, false); + SMESH::CreateHypothesis(theTypeName, aHypName, false); } else { // Get hypotheses creator client (GUI) SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName); @@ -873,9 +967,11 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim, // with values used to mesh a subshape SMESH::SMESH_Hypothesis_var initParamHyp = getInitParamsHypothesis(theTypeName, aData->ServerLibName); - aCreator->create(initParamHyp, myDlg); + myDlg->setEnabled( false ); + aCreator->create(initParamHyp, aHypName, myDlg); + myDlg->setEnabled( true ); } else { - SMESH::CreateHypothesis(theTypeName, aData->Label, false); + SMESH::CreateHypothesis(theTypeName, aHypName, false); } } @@ -907,22 +1003,26 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) if (aDim == -1) return; - QValueList aList = myExistingHyps[ aDim ][ theHypType ]; + const THypList& aList = myExistingHyps[ aDim ][ theHypType ]; if ( theIndex < 0 || theIndex >= aList.count() ) return; - SMESH::SMESH_Hypothesis_var aHyp = aList[ theIndex ]; + const THypItem& aHypItem = aList[ theIndex ]; + SMESH::SMESH_Hypothesis_var aHyp = aHypItem.first; if ( aHyp->_is_nil() ) return; - char* aTypeName = aHyp->GetName(); + CORBA::String_var aTypeName = aHyp->GetName(); SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator( aTypeName ); - if ( aCreator ) - aCreator->edit( aHyp.in(), dlg() ); + if ( aCreator ) { + myDlg->setEnabled( false ); + aCreator->edit( aHyp.in(), aHypItem.second, dlg() ); + myDlg->setEnabled( true ); + } } //================================================================================ /*! - * \brief access to hypothesis data + * \brief access to hypothesis data * \param theDim - hyp dimension * \param theHypType - hyp type (Algo,MainHyp or AddHyp) * \param theIndex - index in the list @@ -934,7 +1034,7 @@ HypothesisData* SMESHGUI_MeshOp::hypData( const int theDim, const int theHypType, const int theIndex) { - if ( theDim > -1 && theDim < 3 && + if ( theDim > -1 && theDim <= SMESH::DIM_3D && theHypType > -1 && theHypType < NbHypTypes && theIndex > -1 && theIndex < myAvailableHypData[ theDim ][ theHypType ].count() ) return myAvailableHypData[ theDim ][ theHypType ][ theIndex ]; @@ -960,7 +1060,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, // find highest available dimension, all algos of this dimension are available for choice int aTopDim = -1; - for (int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++) + for (int i = SMESH::DIM_0D; i <= SMESH::DIM_3D; i++) if (isAccessibleDim( i )) aTopDim = i; if (aTopDim == -1) @@ -969,7 +1069,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, const bool isSubmesh = ( myToCreate ? !myIsMesh : myDlg->isObjectShown( SMESHGUI_MeshDlg::Mesh )); HypothesisData* algoData = hypData( aDim, Algo, theIndex ); - HypothesisData* algoByDim[3]; + HypothesisData* algoByDim[4]; algoByDim[ aDim ] = algoData; QStringList anAvailable; @@ -986,11 +1086,11 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, { int dim = aDim + 1, lastDim = SMESH::DIM_3D, dir = 1; if ( !forward ) { - dim = aDim - 1; lastDim = SMESH::DIM_1D; dir = -1; + dim = aDim - 1; lastDim = SMESH::DIM_0D; dir = -1; } HypothesisData* prevAlgo = algoData; bool noCompatible = false; - for ( ; dim * dir <= lastDim * dir ; dim += dir ) + for (; dim * dir <= lastDim * dir; dim += dir) { if ( !isAccessibleDim( dim )) continue; @@ -1020,7 +1120,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, // restore previously selected algo algoIndex = myAvailableHypData[dim][Algo].findIndex( curAlgo ); - if ( !isSubmesh && algoIndex < 0 && soleCompatible ) + if ( !isSubmesh && algoIndex < 0 && soleCompatible && !forward && dim != SMESH::DIM_0D) // select the sole compatible algo algoIndex = myAvailableHypData[dim][Algo].findIndex( soleCompatible ); setCurrentHyp( dim, Algo, algoIndex ); @@ -1034,7 +1134,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, _PTR(SObject) pObj = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + for ( int dim = SMESH::DIM_0D; dim <= SMESH::DIM_3D; dim++ ) { if ( !isAccessibleDim( dim )) continue; @@ -1048,20 +1148,21 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, SMESH::SMESH_Hypothesis_var curHyp; if ( hypIndex >= 0 && hypIndex < myExistingHyps[ dim ][ type ].count() ) - curHyp = myExistingHyps[ dim ][ type ][ hypIndex ]; + curHyp = myExistingHyps[ dim ][ type ][ hypIndex ].first; if ( !myToCreate && !curAlgo && !curHyp->_is_nil() ) { // edition, algo not selected // try to find algo by selected hypothesis in order to keep it selected bool algoDeselectedByUser = ( theDim < 0 && aDim == dim ); - QString curHypType = curHyp->GetName(); + CORBA::String_var curHypType = curHyp->GetName(); if ( !algoDeselectedByUser && myObjHyps[ dim ][ type ].count() > 0 && - curHypType == myObjHyps[ dim ][ type ][ 0 ]->GetName()) + curHypType == myObjHyps[ dim ][ type ].first().first->GetName()) { - HypothesisData* hypData = SMESH::GetHypothesisData( curHyp->GetName() ); - for ( int i = 0 ; i < myAvailableHypData[ dim ][ Algo ].count(); ++i ) { + CORBA::String_var aName = curHyp->GetName(); + HypothesisData* hypData = SMESH::GetHypothesisData( aName ); + for (int i = 0; i < myAvailableHypData[ dim ][ Algo ].count(); ++i) { curAlgo = myAvailableHypData[ dim ][ Algo ][ i ]; - if ( curAlgo && hypData && isCompatible( curAlgo, hypData, type )) + if (curAlgo && hypData && isCompatible(curAlgo, hypData, type)) break; else curAlgo = 0; @@ -1073,7 +1174,8 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, { // check if a selected hyp is compatible with the curAlgo if ( !curHyp->_is_nil() ) { - HypothesisData* hypData = SMESH::GetHypothesisData( curHyp->GetName() ); + CORBA::String_var aName = curHyp->GetName(); + HypothesisData* hypData = SMESH::GetHypothesisData( aName ); if ( !isCompatible( curAlgo, hypData, type )) curHyp = SMESH::SMESH_Hypothesis::_nil(); } @@ -1091,10 +1193,10 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, hypIndex = -1; if ( !isSubmesh && hypIndex < 0 && anExisting.count() == 1 ) { // none is yet selected => select the sole existing if it is not optional - QString hypTypeName = myExistingHyps[ dim ][ type ][ 0 ]->GetName(); + CORBA::String_var hypTypeName = myExistingHyps[ dim ][ type ].first().first->GetName(); bool isOptional = true; if ( algoByDim[ dim ] && - SMESH::IsAvailableHypothesis( algoByDim[ dim ], hypTypeName, isOptional ) && + SMESH::IsAvailableHypothesis( algoByDim[ dim ], hypTypeName.in(), isOptional ) && !isOptional ) hypIndex = 0; } @@ -1105,7 +1207,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, //================================================================================ /*! - * \brief Creates and selects hypothesis of hypotheses set + * \brief Creates and selects hypothesis of hypotheses set * \param theSetName - The name of hypotheses set */ //================================================================================ @@ -1115,7 +1217,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) if (!aHypoSet) return; // clear all hyps - for (int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++) { + for (int dim = SMESH::DIM_0D; dim <= SMESH::DIM_3D; dim++) { setCurrentHyp(dim, Algo, -1); setCurrentHyp(dim, AddHyp, -1); setCurrentHyp(dim, MainHyp, -1); @@ -1130,7 +1232,7 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) const QString& aHypoTypeName = (*aHypoList)[ i ]; HypothesisData* aHypData = SMESH::GetHypothesisData(aHypoTypeName); if (!aHypData) - continue; + continue; int aDim = aHypData->Dim[0]; // create or/and set @@ -1147,6 +1249,9 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) } else { bool mainHyp = true; + QStringList anAvailable; + availableHyps( aDim, MainHyp, anAvailable, myAvailableHypData[aDim][MainHyp] ); + myDlg->tab( aDim )->setAvailableHyps( MainHyp, anAvailable ); int index = myAvailableHypData[aDim][MainHyp].findIndex( aHypData ); if ( index < 0 ) { mainHyp = false; @@ -1172,44 +1277,51 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess ) { theMess = ""; - QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); - GEOM::GEOM_Object_var aGeomVar = - GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); + //QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + //QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); - if ( aSMESHGen->_is_nil() ) - return false; - - SUIT_OverrideCursor aWaitCursor; + QStringList aList; + myDlg->selectedObject( SMESHGUI_MeshDlg::Geom, aList ); + QStringList::Iterator it = aList.begin(); + for (; it!=aList.end(); it++) + { + QString aGeomEntry = *it; + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); + GEOM::GEOM_Object_var aGeomVar = + GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); - // create mesh - SMESH::SMESH_Mesh_var aMeshVar = aSMESHGen->CreateMesh( aGeomVar ); - if ( aMeshVar->_is_nil() ) - return false; - _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar.in() ); - if ( aMeshSO ) - SMESH::SetName( aMeshSO, myDlg->objectText( SMESHGUI_MeshDlg::Obj ).latin1() ); + SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); + if ( aSMESHGen->_is_nil() ) + return false; - for ( int aDim = SMESH::DIM_1D; aDim <= SMESH::DIM_3D; aDim++ ) - { - if ( !isAccessibleDim( aDim )) continue; + SUIT_OverrideCursor aWaitCursor; - // assign hypotheses - for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) - { - int aHypIndex = currentHyp( aDim, aHypType ); - if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) - { - SMESH::SMESH_Hypothesis_var aHypVar = myExistingHyps[ aDim ][ aHypType ][ aHypIndex ]; - if ( !aHypVar->_is_nil() ) - SMESH::AddHypothesisOnMesh( aMeshVar, aHypVar ); + // create mesh + SMESH::SMESH_Mesh_var aMeshVar = aSMESHGen->CreateMesh( aGeomVar ); + if ( aMeshVar->_is_nil() ) + return false; + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar.in() ); + if ( aMeshSO ) + SMESH::SetName( aMeshSO, myDlg->objectText( SMESHGUI_MeshDlg::Obj ).latin1() ); + + for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) { + if ( !isAccessibleDim( aDim )) continue; + + // assign hypotheses + for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) { + int aHypIndex = currentHyp( aDim, aHypType ); + if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) { + SMESH::SMESH_Hypothesis_var aHypVar = myExistingHyps[ aDim ][ aHypType ][ aHypIndex ].first; + if ( !aHypVar->_is_nil() ) + SMESH::AddHypothesisOnMesh( aMeshVar, aHypVar ); + } } + // find or create algorithm + SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( aDim ); + if ( !anAlgoVar->_is_nil() ) + SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); } - // find or create algorithm - SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( aDim ); - if ( !anAlgoVar->_is_nil() ) - SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); + } return true; } @@ -1236,20 +1348,83 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry.latin1() ); SMESH::SMESH_Mesh_var aMeshVar = SMESH::SMESH_Mesh::_narrow( _CAST( SObject,pMesh )->GetObject() ); + if (aMeshVar->_is_nil()) + return false; + + // GEOM shape of the main mesh + GEOM::GEOM_Object_var mainGeom = aMeshVar->GetShapeToMesh(); + + // Name for the new sub-mesh + QString aName = myDlg->objectText(SMESHGUI_MeshDlg::Obj); // get geom object - QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); - GEOM::GEOM_Object_var aGeomVar = - GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); + GEOM::GEOM_Object_var aGeomVar; + QStringList aGEOMs; + myDlg->selectedObject(SMESHGUI_MeshDlg::Geom, aGEOMs); + if (aGEOMs.count() == 1) + { + //QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + QString aGeomEntry = aGEOMs.first(); + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry.latin1() ); + aGeomVar = GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); + } + else if (aGEOMs.count() > 1) + { + // create a GEOM group + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + if (!geomGen->_is_nil() && aStudy) { + GEOM::GEOM_IGroupOperations_var op = + geomGen->GetIGroupOperations(aStudy->StudyId()); + if (!op->_is_nil()) { + // check and add all selected GEOM objects: they must be + // a sub-shapes of the main GEOM and must be of one type + int iSubSh = 0; + TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + aSeq->length(aGEOMs.count()); + QStringList::const_iterator aSubShapesIter = aGEOMs.begin(); + for (; aSubShapesIter != aGEOMs.end(); aSubShapesIter++, iSubSh++) { + QString aSubGeomEntry = (*aSubShapesIter); + _PTR(SObject) pSubGeom = studyDS()->FindObjectID(aSubGeomEntry.latin1()); + GEOM::GEOM_Object_var aSubGeomVar = + GEOM::GEOM_Object::_narrow(_CAST(SObject,pSubGeom)->GetObject()); + TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)aSubGeomVar->GetShapeType(); + if (iSubSh == 0) { + aGroupType = aSubShapeType; + } else { + if (aSubShapeType != aGroupType) + aGroupType = TopAbs_SHAPE; + } + aSeq[iSubSh] = aSubGeomVar; + } + // create a group + GEOM::GEOM_Object_var aGroupVar = op->CreateGroup(mainGeom, aGroupType); + op->UnionList(aGroupVar, aSeq); + + if (op->IsDone()) { + aGeomVar = aGroupVar; + + // publish the GEOM group in study + QString aNewGeomGroupName ("Auto_group_for_"); + aNewGeomGroupName += aName; + SALOMEDS::SObject_var aNewGroupSO = + geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGeomVar, aNewGeomGroupName, mainGeom); + } + } + } + } + else { + } + if (aGeomVar->_is_nil()) + return false; SUIT_OverrideCursor aWaitCursor; // create sub-mesh - QString aName = myDlg->objectText( SMESHGUI_MeshDlg::Obj ); SMESH::SMESH_subMesh_var aSubMeshVar = aMeshVar->GetSubMesh( aGeomVar, aName.latin1() ); - for ( int aDim = SMESH::DIM_1D; aDim <= SMESH::DIM_3D; aDim++ ) + for ( int aDim = SMESH::DIM_0D; aDim <= SMESH::DIM_3D; aDim++ ) { if ( !isAccessibleDim( aDim )) continue; @@ -1264,15 +1439,15 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) { SMESH::SMESH_Hypothesis_var aHypVar = - myExistingHyps[ aDim ][ aHypType ][ aHypIndex ]; + myExistingHyps[ aDim ][ aHypType ][ aHypIndex ].first; if ( !aHypVar->_is_nil() ) SMESH::AddHypothesisOnSubMesh( aSubMeshVar, aHypVar ); } } } - // deselect geometry: next submesh sould be created on other subshape - myDlg->selectObject( "", SMESHGUI_MeshDlg::Geom, "" ); + // deselect geometry: next submesh should be created on other subshape + myDlg->clearSelection( SMESHGUI_MeshDlg::Geom ); selectObject( _PTR(SObject)() ); selectionDone(); @@ -1378,12 +1553,13 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) existingHyps( theDim, Algo, pObj, tmp, myExistingHyps[ theDim ][ Algo ]); // look for anexisting algo of such a type - QValueList& aHypVarList = myExistingHyps[ theDim ][ Algo ]; - QValueList::iterator anIter; - for ( anIter = aHypVarList.begin(); anIter != aHypVarList.end(); anIter++ ) + THypList& aHypVarList = myExistingHyps[ theDim ][ Algo ]; + THypList::iterator anIter = aHypVarList.begin(); + for (; anIter != aHypVarList.end(); anIter++) { - SMESH::SMESH_Hypothesis_var aHypVar = *anIter; - if ( !aHypVar->_is_nil() && aHypName == aHypVar->GetName() ) + SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; + CORBA::String_var aName = aHypVar->GetName(); + if ( !aHypVar->_is_nil() && aHypName == aName ) { anAlgoVar = aHypVar; break; @@ -1403,7 +1579,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) // Create algorithm if (aCreator) - aCreator->create(true, myDlg); + aCreator->create(true, aHypName, myDlg); else SMESH::CreateHypothesis(aHypName, aHypData->Label, true); } @@ -1412,11 +1588,12 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) existingHyps( theDim, Algo, aFather, tmpList, myExistingHyps[ theDim ][ Algo ] ); } - QValueList& aNewHypVarList = myExistingHyps[ theDim ][ Algo ]; + THypList& aNewHypVarList = myExistingHyps[ theDim ][ Algo ]; for ( anIter = aNewHypVarList.begin(); anIter != aNewHypVarList.end(); ++anIter ) { - SMESH::SMESH_Hypothesis_var aHypVar = *anIter; - if ( !aHypVar->_is_nil() && aHypName == aHypVar->GetName() ) + SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; + CORBA::String_var aName = aHypVar->GetName(); + if ( !aHypVar->_is_nil() && aHypName == aName ) { anAlgoVar = aHypVar; break; @@ -1442,32 +1619,35 @@ void SMESHGUI_MeshOp::readMesh() if ( !pObj ) return; - // Get name of mesh if current object is sub-mesh - SMESH::SMESH_subMesh_var aSubMeshVar = + if (myIsOnGeometry) { + // Get name of mesh if current object is sub-mesh + SMESH::SMESH_subMesh_var aSubMeshVar = SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); - if ( !aSubMeshVar->_is_nil() ) - { - SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); - if ( !aMeshVar->_is_nil() ) + if ( !aSubMeshVar->_is_nil() ) { - _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); - QString aMeshName = name( aMeshSO ); - myDlg->setObjectText( SMESHGUI_MeshDlg::Mesh, aMeshName ); + SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); + if ( !aMeshVar->_is_nil() ) + { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); + QString aMeshName = name( aMeshSO ); + myDlg->setObjectText( SMESHGUI_MeshDlg::Mesh, aMeshName ); + } } - } - // Get name of geometry object - GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - if ( !aGeomVar->_is_nil() ) - { - _PTR(SObject) aGeomSO = studyDS()->FindObjectID( aGeomVar->GetStudyEntry() ); - QString aShapeName = name( aGeomSO ); - myDlg->setObjectText( SMESHGUI_MeshDlg::Geom, aShapeName ); + // Get name of geometry object + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + if ( !aGeomVar->_is_nil() ) + { + _PTR(SObject) aGeomSO = studyDS()->FindObjectID( aGeomVar->GetStudyEntry() ); + QString aShapeName = name( aGeomSO ); + myDlg->setObjectText( SMESHGUI_MeshDlg::Geom, aShapeName ); + } } // Get hypotheses and algorithms assigned to the mesh/sub-mesh QStringList anExisting; - for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + const int aDim = ( myIsOnGeometry ) ? SMESH::DIM_0D : SMESH::DIM_3D; + for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) { // get algorithm existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] ); @@ -1475,8 +1655,8 @@ void SMESHGUI_MeshOp::readMesh() int aHypIndex = -1; if ( myObjHyps[ dim ][ Algo ].count() > 0 ) { - SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first(); - QString aHypTypeName = aVar->GetName(); + SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first().first; + CORBA::String_var aHypTypeName = aVar->GetName(); HypothesisData* algoData = SMESH::GetHypothesisData( aHypTypeName ); aHypIndex = myAvailableHypData[ dim ][ Algo ].findIndex ( algoData ); // if ( aHypIndex < 0 && algoData ) { @@ -1492,7 +1672,7 @@ void SMESHGUI_MeshOp::readMesh() // get hypotheses bool hypWithoutAlgo = false; - for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) { for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ ) { @@ -1501,7 +1681,7 @@ void SMESHGUI_MeshOp::readMesh() // find index of requered hypothesis among existing ones for this dimension and type int aHypIndex = -1; if ( myObjHyps[ dim ][ hypType ].count() > 0 ) { - aHypIndex = find( myObjHyps[ dim ][ hypType ].first(), + aHypIndex = find( myObjHyps[ dim ][ hypType ].first().first, myExistingHyps[ dim ][ hypType ] ); if ( aHypIndex < 0 ) { // assigned hypothesis is incompatible with the algorithm @@ -1558,16 +1738,16 @@ QString SMESHGUI_MeshOp::name( _PTR(SObject) theSO ) const */ //================================================================================ int SMESHGUI_MeshOp::find( const SMESH::SMESH_Hypothesis_var& theHyp, - const QValueList& theHypList ) const + const THypList& theHypList ) const { int aRes = -1; if ( !theHyp->_is_nil() ) { int i = 0; - QValueList::const_iterator anIter; - for ( anIter = theHypList.begin(); anIter != theHypList.end(); ++ anIter ) + THypList::const_iterator anIter = theHypList.begin(); + for (; anIter != theHypList.end(); ++ anIter) { - if ( theHyp->_is_equivalent( *anIter ) ) + if ( theHyp->_is_equivalent( (*anIter).first ) ) { aRes = i; break; @@ -1603,41 +1783,42 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) SUIT_OverrideCursor aWaitCursor; // Set new name - SMESH::SetName( pObj, myDlg->objectText( SMESHGUI_MeshDlg::Obj ).latin1() ); + QString aName = myDlg->objectText( SMESHGUI_MeshDlg::Obj ); + SMESH::SetName( pObj, aName.latin1() ); + int aDim = ( myIsOnGeometry ) ? SMESH::DIM_0D : SMESH::DIM_3D; - // Assign new hypotheses and algorithms - for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + // First, remove old algos in order to avoid messages on algorithm hiding + for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) + { + if ( isAccessibleDim( dim ) && myObjHyps[ dim ][ Algo ].count() > 0 ) + { + SMESH::SMESH_Hypothesis_var anOldAlgo = myObjHyps[ dim ][ Algo ].first().first; + SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( dim ); + if ( anAlgoVar->_is_nil() || // no new algo selected or + strcmp(anOldAlgo->GetName(), anAlgoVar->GetName()) ) // algo change + { + // remove old algorithm + SMESH::RemoveHypothesisOrAlgorithmOnMesh ( pObj, myObjHyps[ dim ][ Algo ].first().first ); + myObjHyps[ dim ][ Algo ].clear(); + } + } + } + + // Assign new algorithms and hypotheses + for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) { if ( !isAccessibleDim( dim )) continue; // find or create algorithm - bool toDelete = false, toAdd = true; SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( dim ); - if ( anAlgoVar->_is_nil() ) { - toAdd = false; - } - if ( myObjHyps[ dim ][ Algo ].count() > 0 ) { - SMESH::SMESH_Hypothesis_var anOldAlgo = myObjHyps[ dim ][ Algo ].first(); - if ( toAdd ) { - if ( strcmp(anOldAlgo->GetName(), anAlgoVar->GetName()) == 0 ) { - toAdd = false; - } else { - toDelete = true; - } - } else { - toDelete = true; - } - } - // remove old algorithm - if ( toDelete ) { - SMESH::RemoveHypothesisOrAlgorithmOnMesh ( pObj, myObjHyps[ dim ][ Algo ].first() ); - myObjHyps[ dim ][ Algo ].clear(); - } // assign new algorithm - if ( toAdd ) { - SMESH::SMESH_Mesh_var aMeshVar = - SMESH::SMESH_Mesh::_narrow( _CAST(SObject,pObj)->GetObject() ); + if ( !anAlgoVar->_is_nil() && // some algo selected and + myObjHyps[ dim ][ Algo ].count() == 0 ) // no algo assigned + { + SALOMEDS_SObject* aSObject = _CAST(SObject, pObj); + CORBA::Object_var anObject = aSObject->GetObject(); + SMESH::SMESH_Mesh_var aMeshVar = SMESH::SMESH_Mesh::_narrow( anObject ); bool isMesh = !aMeshVar->_is_nil(); if ( isMesh ) { SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); @@ -1647,7 +1828,7 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) if ( !aVar->_is_nil() ) SMESH::AddHypothesisOnSubMesh( aVar, anAlgoVar ); } - myObjHyps[ dim ][ Algo ].append( anAlgoVar ); + myObjHyps[ dim ][ Algo ].append( THypItem( anAlgoVar, aName) ); } // assign hypotheses @@ -1655,42 +1836,44 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) { int aNewHypIndex = currentHyp( dim, hypType ); int anOldHypIndex = -1; + + // remove old hypotheses if ( myObjHyps[ dim ][ hypType ].count() > 0 ) - anOldHypIndex = find( myObjHyps[ dim ][ hypType ].first(), - myExistingHyps[ dim ][ hypType ] ); - if ( aNewHypIndex != anOldHypIndex ) { - // remove old hypotheses - if ( anOldHypIndex >= 0 ) { - SMESH::RemoveHypothesisOrAlgorithmOnMesh( - pObj, myExistingHyps[ dim ][ hypType ][ anOldHypIndex ] ); + anOldHypIndex = find( myObjHyps[ dim ][ hypType ].first().first , + myExistingHyps[ dim ][ hypType ] ); + if ( aNewHypIndex != anOldHypIndex || // different hyps + anOldHypIndex == -1 ) // hyps of different algos + { + SMESH::RemoveHypothesisOrAlgorithmOnMesh + ( pObj, myObjHyps[ dim ][ hypType ].first().first ); myObjHyps[ dim ][ hypType ].clear(); } + } - // assign new hypotheses - if ( aNewHypIndex != -1 ) + // assign new hypotheses + if ( aNewHypIndex != anOldHypIndex && aNewHypIndex != -1 ) + { + SMESH::SMESH_Mesh_var aMeshVar = + SMESH::SMESH_Mesh::_narrow( _CAST(SObject,pObj)->GetObject() ); + bool isMesh = !aMeshVar->_is_nil(); + if ( isMesh ) { - SMESH::SMESH_Mesh_var aMeshVar = - SMESH::SMESH_Mesh::_narrow( _CAST(SObject,pObj)->GetObject() ); - bool isMesh = !aMeshVar->_is_nil(); - if ( isMesh ) - { - SMESH::AddHypothesisOnMesh( - aMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ] ); - } - else - { - SMESH::SMESH_subMesh_var aVar = - SMESH::SMESH_subMesh::_narrow( _CAST(SObject,pObj)->GetObject() ); - if ( !aVar->_is_nil() ) - SMESH::AddHypothesisOnSubMesh( - aVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ] ); - } + SMESH::AddHypothesisOnMesh + (aMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); + } + else + { + SMESH::SMESH_subMesh_var aVar = + SMESH::SMESH_subMesh::_narrow( _CAST(SObject,pObj)->GetObject() ); + if ( !aVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh + ( aVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); } - // reread all hypotheses of mesh if necessary - QStringList anExisting; - existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); } + // reread all hypotheses of mesh if necessary + QStringList anExisting; + existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); } } @@ -1756,6 +1939,7 @@ void SMESHGUI_MeshOp::onGeomSelectionByMesh( bool theByMesh ) void SMESHGUI_MeshOp::onPublishShapeByMeshDlg(SUIT_Operation* op) { if ( myShapeByMeshOp == op ) { + SMESHGUI::GetSMESHGUI()->getApp()->updateObjectBrowser(); //MZN: 24.11.2006 IPAL13980 - Object Browser update added myDlg->show(); // Select a found geometry object GEOM::GEOM_Object_var aGeomVar = myShapeByMeshOp->GetShape();