Salome HOME
23437: EDF 14551 - mesh groups missing
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i_1.cxx
index af12566d8698d440e465f1e71397d13257ec5353..b08b7e3e6d35d8b09a536a17ca8b5b5e75a68af5 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "SMESH_Gen_i.hxx"
 
+#include "SMESHDS_Mesh.hxx"
 #include "SMESH_Algo_i.hxx"
 #include "SMESH_Comment.hxx"
 #include "SMESH_Group_i.hxx"
@@ -264,8 +265,7 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr   theStudy,
   SALOMEDS::SObject_wrap SO = SMESH_Gen_i::ObjectToSObject( theStudy, theIOR );
   SALOMEDS::StudyBuilder_var     aStudyBuilder = theStudy->NewBuilder();
   SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
-  SALOMEDS::SObject_wrap objAfter;
-  bool isNewSO = false;
+  bool isNewSO = false, isInUseCaseTree = false;
   if ( SO->_is_nil() )
   {
     if ( theTag == 0 ) {
@@ -276,23 +276,16 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr   theStudy,
     {
       SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag );
       isNewSO = true;
-
-      // define the next tag after given one in the data tree to insert SObject
-      SALOMEDS::SObject_wrap curObj;
-      if ( theFatherObject->GetLastChildTag() > theTag )
-      {
-        SALOMEDS::UseCaseIterator_wrap
-          anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject);
-        for ( ; anUseCaseIter->More(); anUseCaseIter->Next() ) {
-          curObj = anUseCaseIter->Value();
-          if ( curObj->Tag() > theTag  ) {
-            objAfter = curObj;
-            break;
-          }
-        }
-      }
+    }
+    else
+    {
+      isInUseCaseTree = useCaseBuilder->IsUseCaseNode( SO );
     }
   }
+  else
+  {
+    isInUseCaseTree = useCaseBuilder->IsUseCaseNode( SO );
+  }
 
   SALOMEDS::GenericAttribute_wrap anAttr;
   if ( !CORBA::is_nil( theIOR ))
@@ -324,13 +317,30 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr   theStudy,
     selAttr->SetSelectable( false );
   }
 
+  if ( !isNewSO )
+    aStudyBuilder->RemoveReference( SO );// remove garbage reference (23336)
+
   // add object to the use case tree
   // (to support tree representation customization and drag-n-drop)
-  if ( isNewSO )
+  if ( isNewSO || !isInUseCaseTree )
   {
-    if ( !CORBA::is_nil( objAfter ) )
+    // define the next tag after given one in the data tree to insert SObject
+    SALOMEDS::SObject_wrap curObj, objAfter;
+    if ( theFatherObject->GetLastChildTag() > theTag && theTag > 0 )
+    {
+      SALOMEDS::UseCaseIterator_wrap
+        anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject);
+      for ( ; anUseCaseIter->More(); anUseCaseIter->Next() ) {
+        curObj = anUseCaseIter->Value();
+        if ( curObj->Tag() > theTag  ) {
+          objAfter = curObj;
+          break;
+        }
+      }
+    }
+    if ( !CORBA::is_nil( objAfter ))
       useCaseBuilder->InsertBefore( SO, objAfter );    // insert at given tag
-    else if ( !useCaseBuilder->IsUseCaseNode( SO ) )
+    else if ( !isInUseCaseTree )
       useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list
   }
   return SO._retn();
@@ -757,7 +767,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr    theStudy
       "Groups of Faces", "Groups of Volumes", "Groups of 0D Elements",
       "Groups of Balls" };
 
-    // Currently, groups with heterogenous content are not supported
+    // Currently, groups with heterogeneous content are not supported
     if ( aType != SMESH::ALL )
     {
       long aRootTag = GetNodeGroupsTag() + aType - 1;
@@ -911,7 +921,7 @@ bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr         theStudy,
   if ( aMeshSO->_is_nil() || aHypSO->_is_nil())
     return false;
 
-  // Find a mesh or submesh refering to theShape
+  // Find a mesh or submesh referring to theShape
   SALOMEDS::SObject_wrap aMeshOrSubMesh =
     GetMeshOrSubmeshByShape( theStudy, theMesh, theShape );
   if ( aMeshOrSubMesh->_is_nil() )
@@ -1087,7 +1097,7 @@ void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theP
         if ( pos < varStr.size() )
         {
           varFound = ( varStr.compare( pos, myLastParameters[i].size(), myLastParameters[i] ) == 0 &&
-                       // same string begining but is length same?
+                       // same string beginning but is length same?
                        ( pos + myLastParameters[i].size() >= varStr.size() ||
                          separators.find( varStr[ pos+1 ]) != std::string::npos ));
           if ( varFound )