Salome HOME
Color Number (Color Group) parameter is returned for compatibility
[modules/smesh.git] / src / SMESH_I / SMESH_Group_i.cxx
index 81a4951376d511581ea477481360b89918de73bc..9f4c705f3aadbe423ed1258ec8420e4b540d51ad 100644 (file)
@@ -16,7 +16,7 @@
 //  License along with this library; if not, write to the Free Software 
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 // 
 //  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.org 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
 //
 //
 //
 //  Module : SMESH
 //  $Header$
 
 //  Module : SMESH
 //  $Header$
 
+
 #include "SMESH_Group_i.hxx"
 #include "SMESH_Mesh_i.hxx"
 #include "SMESH_Gen_i.hxx"
 #include "SMESH_Group_i.hxx"
 #include "SMESH_Mesh_i.hxx"
 #include "SMESH_Gen_i.hxx"
-#include <SMESH_Group.hxx>
-#include <SMESHDS_Group.hxx>
-#include <SMDSAbs_ElementType.hxx>
-#include <utilities.h>
+#include "SMESH_Group.hxx"
+#include "SMESHDS_Group.hxx"
+#include "SMESHDS_GroupOnGeom.hxx"
+#include "SMDSAbs_ElementType.hxx"
+
+#include "SMESH_Filter_i.hxx"
+#include "SMESH_PythonDump.hxx"
+
+#include "utilities.h"
+
+using namespace SMESH;
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
  */
 //=============================================================================
 
  */
 //=============================================================================
 
-SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
+SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
 : SALOME::GenericObj_i( thePOA ),
   myMeshServant( theMeshServant ), 
   myLocalID( theLocalID )
 {
 : SALOME::GenericObj_i( thePOA ),
   myMeshServant( theMeshServant ), 
   myLocalID( theLocalID )
 {
-  thePOA->activate_object( this );
+  // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i,
+  // servant activation is performed by SMESH_Mesh_i::createGroup()
+  // thePOA->activate_object( this );
 }
 
 }
 
+SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
+     : SALOME::GenericObj_i( thePOA ),
+       SMESH_GroupBase_i( thePOA, theMeshServant, theLocalID )
+{
+  MESSAGE("SMESH_Group_i; this = "<<this );
+}
+
+SMESH_GroupOnGeom_i::SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID )
+     : SALOME::GenericObj_i( thePOA ),
+       SMESH_GroupBase_i( thePOA, theMeshServant, theLocalID )
+{
+  MESSAGE("SMESH_GroupOnGeom_i; this = "<<this );
+}
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
@@ -54,13 +77,39 @@ SMESH_Group_i::SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theM
  */
 //=============================================================================
 
  */
 //=============================================================================
 
-SMESH_Group_i::~SMESH_Group_i()
+SMESH_GroupBase_i::~SMESH_GroupBase_i()
 {
 {
-  MESSAGE("~SMESH_Group_i;" );
+  MESSAGE("~SMESH_GroupBase_i; this = "<<this );
   if ( myMeshServant )
     myMeshServant->removeGroup(myLocalID);
 }
 
   if ( myMeshServant )
     myMeshServant->removeGroup(myLocalID);
 }
 
+//=======================================================================
+//function : GetSmeshGroup
+//purpose  : 
+//=======================================================================
+
+::SMESH_Group* SMESH_GroupBase_i::GetSmeshGroup() const
+{
+  if ( myMeshServant ) {
+    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
+    return aMesh.GetGroup(myLocalID);
+  }
+  return 0;
+}
+
+//=======================================================================
+//function : GetGroupDS
+//purpose  : 
+//=======================================================================
+
+SMESHDS_GroupBase* SMESH_GroupBase_i::GetGroupDS() const
+{
+  ::SMESH_Group* aGroup = GetSmeshGroup();
+  if ( aGroup )
+    return aGroup->GetGroupDS();
+  return 0;
+}
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
@@ -68,72 +117,59 @@ SMESH_Group_i::~SMESH_Group_i()
  */
 //=============================================================================
 
  */
 //=============================================================================
 
-void SMESH_Group_i::SetName( const char* theName )
+void SMESH_GroupBase_i::SetName( const char* theName )
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      aGroup->SetName(theName);
-
-      // Update group name in a study
-      SALOMEDS::Study_var aStudy = myMeshServant->GetGen()->GetCurrentStudy();
-      if ( !aStudy->_is_nil() ) {
-       SALOMEDS::SObject_var aGroupSO = aStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( _this() ) );
-       if ( !aGroupSO->_is_nil() ) {
-         SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder();
-         aBuilder->SetName( aGroupSO, theName );
-       }
-      }
-      return;
-    }
+  // Update Python script
+  TPythonDump() <<  _this() << ".SetName( '" << theName << "' )";
+
+  // Perform renaming
+  ::SMESH_Group* aGroup = GetSmeshGroup();
+  if (aGroup) {
+    aGroup->SetName(theName);
+
+    // Update group name in a study
+    SMESH_Gen_i* aGen = myMeshServant->GetGen();
+    aGen->SetName( aGen->ObjectToSObject( aGen->GetCurrentStudy(), _this() ), theName );
+    return;
   }
   MESSAGE("can't set name of a vague group");
 }
 
   }
   MESSAGE("can't set name of a vague group");
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-char* SMESH_Group_i::GetName()
+char* SMESH_GroupBase_i::GetName()
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup)
-      return CORBA::string_dup (aGroup->GetName());
-  }
+  ::SMESH_Group* aGroup = GetSmeshGroup();
+  if (aGroup)
+    return CORBA::string_dup (aGroup->GetName());
   MESSAGE("get name of a vague group");
   return CORBA::string_dup( "NO_NAME" );
 }
 
   MESSAGE("get name of a vague group");
   return CORBA::string_dup( "NO_NAME" );
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-SMESH::ElementType SMESH_Group_i::GetType()
+SMESH::ElementType SMESH_GroupBase_i::GetType()
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
-      SMESH::ElementType aType;
-      switch (aSMDSType) {
-      case SMDSAbs_Node:   aType = SMESH::NODE; break;
-      case SMDSAbs_Edge:   aType = SMESH::EDGE; break;
-      case SMDSAbs_Face:   aType = SMESH::FACE; break;
-      case SMDSAbs_Volume: aType = SMESH::VOLUME; break;
-      default:             aType = SMESH::ALL; break;
-      }
-      return aType;
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS) {
+    SMDSAbs_ElementType aSMDSType = aGroupDS->GetType();
+    SMESH::ElementType aType;
+    switch (aSMDSType) {
+    case SMDSAbs_Node:   aType = SMESH::NODE; break;
+    case SMDSAbs_Edge:   aType = SMESH::EDGE; break;
+    case SMDSAbs_Face:   aType = SMESH::FACE; break;
+    case SMDSAbs_Volume: aType = SMESH::VOLUME; break;
+    default:             aType = SMESH::ALL; break;
     }
     }
+    return aType;
   }
   MESSAGE("get type of a vague group");
   return SMESH::ALL;
   }
   MESSAGE("get type of a vague group");
   return SMESH::ALL;
@@ -146,42 +182,30 @@ SMESH::ElementType SMESH_Group_i::GetType()
  */
 //=============================================================================
 
  */
 //=============================================================================
 
-CORBA::Long SMESH_Group_i::Size()
+CORBA::Long SMESH_GroupBase_i::Size()
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      int aSize = aGroup->GetGroupDS()->Extent();
-      return aSize;
-    }
-  }
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->Extent();
   MESSAGE("get size of a vague group");
   return 0;
 }
 
   MESSAGE("get size of a vague group");
   return 0;
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-CORBA::Boolean SMESH_Group_i::IsEmpty()
+CORBA::Boolean SMESH_GroupBase_i::IsEmpty()
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      bool isEmpty = aGroup->GetGroupDS()->IsEmpty();
-      return isEmpty;
-    }
-  }
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->IsEmpty();
   MESSAGE("checking IsEmpty of a vague group");
   return true;
 }
 
   MESSAGE("checking IsEmpty of a vague group");
   return true;
 }
 
-
 //=============================================================================
 /*!
  *  
 //=============================================================================
 /*!
  *  
@@ -190,42 +214,33 @@ CORBA::Boolean SMESH_Group_i::IsEmpty()
 
 void SMESH_Group_i::Clear()
 {
 
 void SMESH_Group_i::Clear()
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      // a SMDS group forgets its type after clearing, so we must re-set it
-      SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
-      aGroup->GetGroupDS()->Clear();
-      aGroup->GetGroupDS()->SetType(aSMDSType);
-      return;
-    }
+  // Update Python script
+  TPythonDump() << _this() << ".Clear()";
+
+  // Clear the group
+  SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
+  if (aGroupDS) {
+    aGroupDS->Clear();
+    return;
   }
   MESSAGE("attempt to clear a vague group");
 }
 
   }
   MESSAGE("attempt to clear a vague group");
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-CORBA::Boolean SMESH_Group_i::Contains( CORBA::Long theID )
+CORBA::Boolean SMESH_GroupBase_i::Contains( CORBA::Long theID )
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      bool res = aGroup->GetGroupDS()->Contains(theID);
-      return res;
-    }
-  }
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->Contains(theID);
   MESSAGE("attempt to check contents of a vague group");
   return false;
 }
 
   MESSAGE("attempt to check contents of a vague group");
   return false;
 }
 
-
 //=============================================================================
 /*!
  *  
 //=============================================================================
 /*!
  *  
@@ -234,125 +249,239 @@ CORBA::Boolean SMESH_Group_i::Contains( CORBA::Long theID )
 
 CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs )
 {
 
 CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs )
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
-      int nbAdd = 0;
-      for (int i = 0; i < theIDs.length(); i++) {
-        int anID = (int) theIDs[i];
-        if (aGroupDS->Add(anID))
-          nbAdd++;
-      }
-      return nbAdd;
+  // Update Python script
+  TPythonDump() << "nbAdd = " << _this() << ".Add( " << theIDs << " )";
+
+  // Add elements to the group
+  SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
+  if (aGroupDS) {
+    int nbAdd = 0;
+    for (int i = 0; i < theIDs.length(); i++) {
+      int anID = (int) theIDs[i];
+      if (aGroupDS->Add(anID))
+        nbAdd++;
     }
     }
+    return nbAdd;
   }
   MESSAGE("attempt to add elements to a vague group");
   return 0;
 }
 
   }
   MESSAGE("attempt to add elements to a vague group");
   return 0;
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-CORBA::Long SMESH_Group_i::GetID( CORBA::Long theIndex )
+CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs )
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      int anID = aGroup->GetGroupDS()->GetID(theIndex);
-      return anID;
+  // Update Python script
+  TPythonDump() << "nbDel = " << _this() << ".Remove( " << theIDs << " )";
+
+  // Remove elements from the group
+  SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
+  if (aGroupDS) {
+    int nbDel = 0;
+    for (int i = 0; i < theIDs.length(); i++) {
+      int anID = (int) theIDs[i];
+      if (aGroupDS->Remove(anID))
+        nbDel++;
     }
     }
+    return nbDel;
   }
   }
+  MESSAGE("attempt to remove elements from a vague group");
+  return 0;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+typedef bool (SMESHDS_Group::*TFunChangeGroup)(const int);
+
+CORBA::Long 
+ChangeByPredicate( SMESH::Predicate_i* thePredicate,
+                  SMESHDS_GroupBase* theGroupBase,
+                  TFunChangeGroup theFun)
+{
+  CORBA::Long aNb = 0;
+  if(SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>(theGroupBase)){
+    SMESH::Controls::Filter::TIdSequence aSequence;
+    const SMDS_Mesh* aMesh = theGroupBase->GetMesh();
+    SMESH::Filter_i::GetElementsId(thePredicate,aMesh,aSequence);
+    
+    CORBA::Long i = 0, iEnd = aSequence.size();
+    for(; i < iEnd; i++)
+      if((aGroupDS->*theFun)(aSequence[i]))
+       aNb++;
+    return aNb;
+  }
+  return aNb;
+}
+
+CORBA::Long 
+SMESH_Group_i::
+AddByPredicate( SMESH::Predicate_ptr thePredicate )
+{
+  if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){
+    TPythonDump()<<_this()<<".AddByPredicate("<<aPredicate<<")";
+    return ChangeByPredicate(aPredicate,GetGroupDS(),&SMESHDS_Group::Add);
+  }
+  return 0;
+}
+
+CORBA::Long 
+SMESH_Group_i::
+RemoveByPredicate( SMESH::Predicate_ptr thePredicate )
+{
+  if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){
+    TPythonDump()<<_this()<<".RemoveByPredicate("<<aPredicate<<")";
+    return ChangeByPredicate(aPredicate,GetGroupDS(),&SMESHDS_Group::Remove);
+  }
+  return 0;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+CORBA::Long SMESH_GroupBase_i::GetID( CORBA::Long theIndex )
+{
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->GetID(theIndex);
   MESSAGE("attempt to iterate on a vague group");
   return -1;
 }
 
   MESSAGE("attempt to iterate on a vague group");
   return -1;
 }
 
-
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
-SMESH::long_array* SMESH_Group_i::GetListOfID()
+SMESH::long_array* SMESH_GroupBase_i::GetListOfID()
 {
   SMESH::long_array_var aRes = new SMESH::long_array();
 {
   SMESH::long_array_var aRes = new SMESH::long_array();
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
-      int aSize = aGroupDS->Extent();
-      aRes->length(aSize);
-      for (int i = 0; i < aSize; i++)
-        aRes[i] = aGroupDS->GetID(i+1);
-      return aRes._retn();
-    }
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS) {
+    int aSize = aGroupDS->Extent();
+    aRes->length(aSize);
+    for (int i = 0; i < aSize; i++)
+      aRes[i] = aGroupDS->GetID(i+1);
+    return aRes._retn();
   }
   MESSAGE("get list of IDs of a vague group");
   return aRes._retn();
 }
 
   }
   MESSAGE("get list of IDs of a vague group");
   return aRes._retn();
 }
 
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+SMESH::SMESH_Mesh_ptr SMESH_GroupBase_i::GetMesh()
+{
+  SMESH::SMESH_Mesh_var aMesh;
+  if ( myMeshServant )
+    aMesh = SMESH::SMESH_Mesh::_narrow( myMeshServant->_this() );
+  return aMesh._retn();
+}
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *  
  */
 //=============================================================================
+SMESH::long_array* SMESH_GroupBase_i::GetIDs()
+{
+  SMESH::long_array_var aResult = GetListOfID();
+  return aResult._retn();
+}
 
 
-CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs )
+//=======================================================================
+//function : GetShape
+//purpose  : 
+//=======================================================================
+
+GEOM::GEOM_Object_ptr SMESH_GroupOnGeom_i::GetShape()
 {
 {
-  if ( myMeshServant ) {
-    ::SMESH_Mesh& aMesh = myMeshServant->GetImpl();
-    ::SMESH_Group* aGroup = aMesh.GetGroup(myLocalID);
-    if (aGroup) {
-      // a SMDS group forgets its type after clearing, so we must re-set it
-      // if the group becomes empty
-      SMDSAbs_ElementType aSMDSType = aGroup->GetGroupDS()->GetType();
-      SMESHDS_Group* aGroupDS = aGroup->GetGroupDS();
-      int nbDel = 0;
-      for (int i = 0; i < theIDs.length(); i++) {
-        int anID = (int) theIDs[i];
-        if (aGroupDS->Remove(anID))
-          nbDel++;
-      }
-      if (aGroupDS->IsEmpty())
-        aGroupDS->SetType(aSMDSType);
-      return nbDel;
-    }
+  GEOM::GEOM_Object_var aGeomObj;
+  SMESHDS_GroupOnGeom* aGroupDS = dynamic_cast<SMESHDS_GroupOnGeom*>( GetGroupDS() );
+  if ( aGroupDS ) {
+    SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+    aGeomObj = aGen->ShapeToGeomObject( aGroupDS->GetShape() );
   }
   }
-  MESSAGE("attempt to remove elements from a vague group");
-  return 0;
+  return aGeomObj._retn();
 }
 
 }
 
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+SALOMEDS::Color SMESH_GroupBase_i::GetColor()
+{
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+  {
+    Quantity_Color aQColor = aGroupDS->GetColor();
+    SALOMEDS::Color aColor;
+    aColor.R = aQColor.Red();
+    aColor.G = aQColor.Green();
+    aColor.B = aQColor.Blue();
+
+    return aColor;
+  }
+  MESSAGE("get color of a group");
+  return SALOMEDS::Color();
+}
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
- *  
+ *
  */
 //=============================================================================
  */
 //=============================================================================
-SMESH::SMESH_Mesh_ptr SMESH_Group_i::GetMesh()
+void SMESH_GroupBase_i::SetColor(const SALOMEDS::Color& color)
 {
 {
-  MESSAGE("SMESH_Group_i::GetMesh(): mesh servant = " << myMeshServant );
-  SMESH::SMESH_Mesh_var aMesh;
-  if ( myMeshServant )
-    aMesh = SMESH::SMESH_Mesh::_narrow( myMeshServant->_this() );
-  return aMesh._retn();
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+  {
+    Quantity_Color aQColor( color.R, color.G, color.B, Quantity_TOC_RGB );
+    return aGroupDS->SetColor(aQColor);
+  }
+  MESSAGE("set color of a group");
+  return ;
 }
 
 }
 
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+CORBA::Long SMESH_GroupBase_i::GetColorNumber()
+{
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->GetColorGroup();
+  MESSAGE("get color number of a group");
+  return 0;
+}
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
- *  
+ *
  */
 //=============================================================================
  */
 //=============================================================================
-int SMESH_Group_i::GetLocalID()
+void SMESH_GroupBase_i::SetColorNumber(CORBA::Long color)
 {
 {
-  return myLocalID;
+  SMESHDS_GroupBase* aGroupDS = GetGroupDS();
+  if (aGroupDS)
+    return aGroupDS->SetColorGroup(color);
+  MESSAGE("set color number of a group");
+  return ;
 }
 }