From 91084ee58a53b97e38d910bc80cc3a813b177cb7 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 22 Jul 2013 14:27:40 +0000 Subject: [PATCH] SALOME Forum bug: sub-mesh removal leads to an Exception in a re-opened study. Now UnRegister(), corresponding to the Register() called by AttributeIOR, is invoked by an object publisher i.e. by SMESH_Gen_i::publish() but not by GUI because GUI is unable to track publication of all objects created by the Engine: for example groups can be created while mesh.Compute() is called. --- src/SMESHGUI/SMESHGUI.cxx | 30 +++------------- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx | 10 ------ src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx | 13 ++----- src/SMESHGUI/SMESHGUI_Hypotheses.cxx | 11 ++---- src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx | 8 ----- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 41 +++++----------------- src/SMESHGUI/SMESHGUI_RotationDlg.cxx | 15 -------- src/SMESHGUI/SMESHGUI_ScaleDlg.cxx | 16 --------- src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx | 16 --------- src/SMESHGUI/SMESHGUI_TranslationDlg.cxx | 10 ------ 10 files changed, 18 insertions(+), 152 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 4226a8a3f..120e2c803 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -361,11 +361,6 @@ SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() ); anEntryList.append( aMeshSO->GetID().c_str() ); - - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - aMeshes[i]->UnRegister(); } else { isEmpty = true; @@ -1790,7 +1785,7 @@ aSO = aRefSObject; // Delete main Object instead of reference listSO.push_back( aSO ); - std::list< _PTR(SObject) >::iterator itSO = listSO.begin(); + std::list< _PTR(SObject) >::iterator itSO = --listSO.end(); for ( ; itSO != listSO.end(); ++itSO ) { _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO ); for (it->InitEx(false); it->More(); it->Next()) @@ -1835,24 +1830,9 @@ if ( !SO ) continue; std::string anEntry = SO->GetID(); - /** Erase graphical object **/ + /** Erase graphical object and remove all its data **/ if(SO->FindAttribute(anAttr, "AttributeIOR")) { SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true); - // ViewManagerList aViewMenegers = anApp->viewManagers(); - // ViewManagerList::const_iterator it = aViewMenegers.begin(); - // for( ; it != aViewMenegers.end(); it++) { - // SUIT_ViewManager* vm = *it; - // int nbSf = vm ? vm->getViewsCount() : 0; - // if(vm) { - // QVector aViews = vm->getViews(); - // for(int i = 0; i < nbSf; i++){ - // SUIT_ViewWindow *sf = aViews[i]; - // if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ - // SMESH::RemoveActor(sf,anActor); - // } - // } - // } - // } } /** Remove an object from data structures **/ SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); @@ -2529,10 +2509,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (vtkwnd) { SALOME_ListIteratorOfListIO It( to_process ); for ( ; It.More(); It.Next()) { - MESSAGE("---"); + MESSAGE("---"); Handle(SALOME_InteractiveObject) IOS = It.Value(); if (IOS->hasEntry()) { - MESSAGE("---"); + MESSAGE("---"); if (!SMESH::UpdateView(anAction, IOS->getEntry())) { SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); break; // PAL16774 (Crash after display of many groups) @@ -2548,7 +2528,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) // PAL13338 + PAL15161 --> if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) { - MESSAGE("anAction = SMESH::eDisplayOnly"); + MESSAGE("anAction = SMESH::eDisplayOnly"); SMESH::UpdateView(); SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); } diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx index 7fbd6530f..a1cf8baaf 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx @@ -65,10 +65,6 @@ #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================= // name : SMESHGUI_BuildCompoundDlg // Purpose : @@ -347,12 +343,6 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() SMESHGUI::Modified(); - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - if (!CORBA::is_nil(aCompoundMesh)) - aCompoundMesh->UnRegister(); - return true; } return false; diff --git a/src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx index fbb71ea96..88766b619 100644 --- a/src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx @@ -98,10 +98,6 @@ namespace #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================ /*! @@ -338,13 +334,8 @@ bool SMESHGUI_CopyMeshDlg::ClickOnApply() if( !newMesh->_is_nil() ) if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( newMesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - newMesh->UnRegister(); -#endif - } catch (...) { + } + catch (...) { } mySMESHGUI->updateObjBrowser(true); diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx index a6e19527b..77d8ec1b2 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx @@ -88,7 +88,7 @@ void SMESHGUI_GenericHypothesisCreator::create( SMESH::SMESH_Hypothesis_ptr init create( false, theHypName, parent, obj, slot ); } -void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo, +void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo, const QString& theHypName, QWidget* theParent, QObject* obj, const QString& slot ) { @@ -100,27 +100,22 @@ void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo, if (isAlgo) { SMESH::SMESH_Hypothesis_var anAlgo = SMESH::CreateHypothesis( hypType(), theHypName, isAlgo ); - if (!CORBA::is_nil(anAlgo)) - anAlgo->UnRegister(); + anAlgo.out(); // avoid unused variable warning } else { SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::CreateHypothesis( hypType(), theHypName, false ); editHypothesis( aHypothesis.in(), theHypName, theParent, obj, slot ); - if (!CORBA::is_nil(aHypothesis)) - aHypothesis->UnRegister(); } } void SMESHGUI_GenericHypothesisCreator::edit( SMESH::SMESH_Hypothesis_ptr theHypothesis, - const QString& theHypName, + const QString& theHypName, QWidget* theParent, QObject* obj, const QString& slot ) { if( CORBA::is_nil( theHypothesis ) ) return; - MESSAGE("Edition of hypothesis"); - myIsCreate = false; editHypothesis( theHypothesis, theHypName, theParent, obj, slot ); diff --git a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx index b0fba1624..3ae4ac699 100644 --- a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx +++ b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx @@ -466,14 +466,6 @@ bool SMESHGUI_Make2DFrom3DOp::compute2DMesh( QStringList& theEntryList ) if ( !newMesh->_is_nil() ) { if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( newMesh ) ) theEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - newMesh->UnRegister(); -#endif - } - if ( !newGrp->_is_nil() ) { -#ifdef WITHGENERICOBJ - newGrp->UnRegister(); -#endif } ok = true; diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 187f12d9d..42207481c 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -75,10 +75,6 @@ #include #include CORBA_CLIENT_HEADER(SMESH_Gen) -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================ /*! * \brief Constructor @@ -1103,14 +1099,10 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, // Call hypothesis creation server method (without GUI) SMESH::SMESH_Hypothesis_var aHyp = SMESH::CreateHypothesis(theTypeName, aHypName, false); -#ifdef WITHGENERICOBJ - if (!CORBA::is_nil(aHyp)) - aHyp->UnRegister(); -#endif - } else { + aHyp.out(); + } + else { // Get hypotheses creator client (GUI) - // BUG 0020378 - //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName); SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName); // Create hypothesis @@ -1179,10 +1171,7 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, else { SMESH::SMESH_Hypothesis_var aHyp = SMESH::CreateHypothesis(theTypeName, aHypName, false); -#ifdef WITHGENERICOBJ - if (!CORBA::is_nil(aHyp)) - aHyp->UnRegister(); -#endif + aHyp.out(); } } @@ -1653,13 +1642,6 @@ bool SMESHGUI_MeshOp::createMesh( QString& theMess, QStringList& theEntryList ) if ( !anAlgoVar->_is_nil() ) SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); } -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - if (aMeshSO) - aMeshVar->UnRegister(); -#endif } return true; } @@ -1918,32 +1900,25 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) if (aHypData) { QString aClientLibName = aHypData->ClientLibName; - if (aClientLibName == "") + if ( aClientLibName.isEmpty() ) { // Call hypothesis creation server method (without GUI) SMESH::SMESH_Hypothesis_var aHyp = SMESH::CreateHypothesis(aHypName, aHypName, true); -#ifdef WITHGENERICOBJ - if (!CORBA::is_nil(aHyp)) - aHyp->UnRegister(); -#endif + aHyp.out(); } else { // Get hypotheses creator client (GUI) - // BUG 0020378 SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypName); // Create algorithm if (aCreator) - aCreator->create(true, aHypName, myDlg, 0, QString::null ); + aCreator->create( true, aHypName, myDlg, 0, QString::null ); else { SMESH::SMESH_Hypothesis_var aHyp = SMESH::CreateHypothesis(aHypName, aHypName, true); -#ifdef WITHGENERICOBJ - if (!CORBA::is_nil(aHyp)) - aHyp->UnRegister(); -#endif + aHyp.out(); } } QStringList tmpList; diff --git a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx index c451a29c4..c53aa66cb 100644 --- a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx @@ -85,9 +85,6 @@ enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action #define SPACING 8 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ //================================================================================= // class : SMESHGUI_RotationDlg() @@ -494,12 +491,6 @@ bool SMESHGUI_RotationDlg::ClickOnApply() if (!mesh->_is_nil()) { if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } } } @@ -511,12 +502,6 @@ bool SMESHGUI_RotationDlg::ClickOnApply() if (!mesh->_is_nil()) { if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } } break; diff --git a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx index ef39d4373..756255df3 100644 --- a/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ScaleDlg.cxx @@ -100,10 +100,6 @@ private: #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================= // class : SMESHGUI_ScaleDlg() // purpose : @@ -536,12 +532,6 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() aName.toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } } else { @@ -551,12 +541,6 @@ bool SMESHGUI_ScaleDlg::ClickOnApply() LineEditNewMesh->text().toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } break; } diff --git a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx index 3dd0cadc1..66b70585b 100644 --- a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx @@ -85,10 +85,6 @@ enum { MOVE_ELEMS_BUTTON = 0, COPY_ELEMS_BUTTON, MAKE_MESH_BUTTON }; //!< action #define SPACING 6 #define MARGIN 11 -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - //================================================================================= // class : SMESHGUI_SymmetryDlg() // purpose : @@ -556,12 +552,6 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() aName.toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } else { SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor(); @@ -570,12 +560,6 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() LineEditNewMesh->text().toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); -#ifdef WITHGENERICOBJ - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); -#endif } } break; diff --git a/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx b/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx index 29c51666c..3805733db 100644 --- a/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx @@ -559,11 +559,6 @@ bool SMESHGUI_TranslationDlg::ClickOnApply() aName.toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); - - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); } } else { @@ -573,11 +568,6 @@ bool SMESHGUI_TranslationDlg::ClickOnApply() LineEditNewMesh->text().toLatin1().data()); if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) ) anEntryList.append( aSObject->GetID().c_str() ); - - // obj has been published in study. Its refcount has been incremented. - // It is safe to decrement its refcount - // so that it will be destroyed when the entry in study will be removed - mesh->UnRegister(); } break; } -- 2.30.2