Salome HOME
SALOME Forum bug: sub-mesh removal leads to an Exception in a re-opened study.
authoreap <eap@opencascade.com>
Mon, 22 Jul 2013 14:27:40 +0000 (14:27 +0000)
committereap <eap@opencascade.com>
Mon, 22 Jul 2013 14:27:40 +0000 (14:27 +0000)
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
src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx
src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx
src/SMESHGUI/SMESHGUI_Hypotheses.cxx
src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx
src/SMESHGUI/SMESHGUI_MeshOp.cxx
src/SMESHGUI/SMESHGUI_RotationDlg.cxx
src/SMESHGUI/SMESHGUI_ScaleDlg.cxx
src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx
src/SMESHGUI/SMESHGUI_TranslationDlg.cxx

index 4226a8a3f10cf2a12a6d905a6a24451332dbdc80..120e2c8038c0ad379b2489e4f8bd271107eaec2e 100644 (file)
               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;
           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())
       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<SUIT_ViewWindow*> 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();
         }
index 7fbd6530fff32c777f394783906701a20aaabd66..a1cf8baafa8a2f54a8971c0946b072b20235c033 100644 (file)
 #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;
index fbb71ea96ee44b24bc8e648273a1d55643fba967..88766b61928ec17907e1afa6e5536f7ef16a5402 100644 (file)
@@ -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);
index a6e19527bbb9695a2ca4d184186aae4cfa39760b..77d8ec1b22e5ce2fe69a559b03a9b611596d987f 100644 (file)
@@ -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 );
index b0fba16247a1bfa04f92c9d1a612e1c9a19a4f40..3ae4ac699ad9a69a44484d872b0ed820e957af5a 100644 (file)
@@ -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;
 
index 187f12d9d67d40c7d946caa633501ff91f9725df..42207481c258926c3acfb252f3aa914321ed9d73 100644 (file)
 #include <SALOMEconfig.h>
 #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;
index c451a29c4653085edb1a164a6f716bb822fc1410..c53aa66cbcfa1d39ee9f26c603a75401d7124916 100644 (file)
@@ -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;
index ef39d43731cee40668d2dcab5a34809309833221..756255df38b23374d45ab4acbce8dd3ddeb6e2fa 100644 (file)
@@ -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;
       }
index 3dd0cadc17b3d22f34d884be9ecda80fb1402252..66b70585bd810c2e77c4f1ecba079eb7895194dd 100644 (file)
@@ -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;
index 29c51666cda4ee5e42adc998654e9fcffec3ebee..3805733db5912da061bd25fe6cce73aab363cfad 100644 (file)
@@ -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;
       }