Salome HOME
52566]: TC7.5.0: Empty group of Balls at Diameter Equal to filter
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i_1.cxx
index 0dfa3da686f52a6870681ec5bb9676bc657d3bcb..b59479fce561d0c5a843b181968fc5604a4b7b76 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  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
@@ -6,7 +6,7 @@
 // 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.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -43,6 +43,8 @@
 #include <TCollection_AsciiString.hxx>
 #include <TopoDS_Solid.hxx>
 
+#include <cctype>
+
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
 //static int VARIABLE_DEBUG = 0;
@@ -160,7 +162,7 @@ long SMESH_Gen_i::GetBallElementsGroupsTag()
 bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR)
 {
   if(MYDEBUG) MESSAGE("CanPublishInStudy - "<<!CORBA::is_nil(myCurrentStudy));
-  if(CORBA::is_nil(myCurrentStudy))
+  if( GetCurrentStudyID() < 0 )
     return false;
   
   SMESH::SMESH_Mesh_var aMesh       = SMESH::SMESH_Mesh::_narrow(theIOR);
@@ -260,28 +262,35 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr   theStudy,
                                      const bool            theSelectable = true)
 {
   SALOMEDS::SObject_wrap SO = SMESH_Gen_i::ObjectToSObject( theStudy, theIOR );
-  SALOMEDS::StudyBuilder_var    aStudyBuilder = theStudy->NewBuilder();
-  SALOMEDS::UseCaseBuilder_var useCaseBuilder = theStudy->GetUseCaseBuilder();
-  SALOMEDS::SObject_var objAfter;
-  if ( SO->_is_nil() ) {
+  SALOMEDS::StudyBuilder_var     aStudyBuilder = theStudy->NewBuilder();
+  SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
+  SALOMEDS::SObject_wrap objAfter;
+  if ( SO->_is_nil() )
+  {
     if ( theTag == 0 ) {
       SO = aStudyBuilder->NewObject( theFatherObject );
-    } else if ( !theFatherObject->FindSubObject( theTag, SO.inout() )) {
+    }
+    else if ( !theFatherObject->FindSubObject( theTag, SO.inout() ))
+    {
       SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag );
 
-      // define the next tag after given one in the data tree to insert SOobject
+      // define the next tag after given one in the data tree to insert SObject
       std::string anEntry;
       int last2Pnt_pos = -1;
       int tagAfter = -1;
-      SALOMEDS::UseCaseIterator_var anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject);
+      CORBA::String_var entry;
+      SALOMEDS::SObject_wrap curObj;
+      SALOMEDS::UseCaseIterator_wrap anUseCaseIter = useCaseBuilder->GetUseCaseIterator(theFatherObject);
       for ( ; anUseCaseIter->More(); anUseCaseIter->Next() ) {
-       anEntry = anUseCaseIter->Value()->GetID();
-       last2Pnt_pos = anEntry.rfind( ":" );
-       tagAfter = atoi( anEntry.substr( last2Pnt_pos+1 ).c_str() );
-       if ( tagAfter > theTag  ) {
-         theFatherObject->FindSubObject( tagAfter, objAfter.inout() );
-         break;
-       }
+        curObj = anUseCaseIter->Value();
+        entry = curObj->GetID();
+        anEntry = entry.in();
+        last2Pnt_pos = anEntry.rfind( ":" );
+        tagAfter = atoi( anEntry.substr( last2Pnt_pos+1 ).c_str() );
+        if ( tagAfter > theTag  ) {
+          objAfter = curObj;
+          break;
+        }
       }
     }
   }
@@ -313,7 +322,7 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr   theStudy,
   if ( !CORBA::is_nil( objAfter ) ) {
     useCaseBuilder->InsertBefore( SO, objAfter );    // insert at given tag
   } else if ( !useCaseBuilder->IsUseCaseNode( SO ) ) {
-    useCaseBuilder->AppendTo( SO->GetFather(), SO ); // append to the end of list
+    useCaseBuilder->AppendTo( theFatherObject, SO ); // append to the end of list
   }
 
   return SO._retn();
@@ -334,9 +343,15 @@ void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject,
     SALOMEDS::GenericAttribute_wrap   anAttr =
       aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributeName" );
     SALOMEDS::AttributeName_wrap aNameAttr = anAttr;
-    if ( theName && strlen( theName ) != 0 )
-      aNameAttr->SetValue( theName );
-    else {
+    if ( theName && theName[0] ) {
+      std::string name( theName ); // trim trailing white spaces
+      for ( size_t i = name.size()-1; i > 0; --i )
+        if ( isspace( name[i] )) name[i] = '\0';
+        else                     break;
+      aNameAttr->SetValue( name.c_str() );
+    }
+    else
+    {
       CORBA::String_var curName = aNameAttr->Value();
       if ( strlen( curName.in() ) == 0 ) {
         SMESH_Comment aName(theDefaultName);
@@ -348,7 +363,7 @@ void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject,
 
 //=======================================================================
 //function : SetPixMap
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 void SMESH_Gen_i::SetPixMap(SALOMEDS::SObject_ptr theSObject,
@@ -405,11 +420,14 @@ static void addReference (SALOMEDS::Study_ptr   theStudy,
         theTag = tag;
     }
     if ( !theSObject->FindSubObject( theTag, aReferenceSO.inout() ))
+    {
       aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag );
+      // add reference to the use case tree
+      // (to support tree representation customization and drag-n-drop)
+      SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
+      useCaseBuilder->AppendTo( aReferenceSO->GetFather(), aReferenceSO );
+    }
     aStudyBuilder->Addreference( aReferenceSO, aToObjSO );
-    // add reference to the use case tree
-    // (to support tree representation customization and drag-n-drop)
-    theStudy->GetUseCaseBuilder()->AppendTo( aReferenceSO->GetFather(), aReferenceSO );
   }
 }
 
@@ -474,10 +492,19 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent(SALOMEDS::Study_ptr theSt
     return SALOMEDS::SComponent::_nil();
   if(MYDEBUG) MESSAGE("PublishComponent");
 
+  SALOMEDS::StudyBuilder_var    aStudyBuilder  = theStudy->NewBuilder(); 
+  SALOMEDS::UseCaseBuilder_wrap useCaseBuilder = theStudy->GetUseCaseBuilder();
+
   CORBA::String_var   compDataType = ComponentDataType();
   SALOMEDS::SComponent_wrap father = theStudy->FindComponent( compDataType.in() );
-  if ( !CORBA::is_nil( father ) )
+  if ( !CORBA::is_nil( father ) ) {
+    // check that the component is added to the use case browser
+    if ( !useCaseBuilder->IsUseCaseNode( father ) ) {
+      useCaseBuilder->SetRootCurrent();
+      useCaseBuilder->Append( father ); // component object is added as the top level item
+    }
     return father._retn();
+  }
 
   SALOME_ModuleCatalog::ModuleCatalog_var aCat =
     SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") );
@@ -488,8 +515,6 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent(SALOMEDS::Study_ptr theSt
   if ( CORBA::is_nil( aComp ) )
     return father._retn();
 
-  SALOMEDS::StudyBuilder_var      aStudyBuilder = theStudy->NewBuilder(); 
-  SALOMEDS::UseCaseBuilder_var    useCaseBuilder = theStudy->GetUseCaseBuilder();
   SALOMEDS::GenericAttribute_wrap anAttr;
   SALOMEDS::AttributePixMap_wrap  aPixmap;