Salome HOME
in createGroup(), make a unique name if no name is provided
[modules/smesh.git] / src / SMESH_I / SMESH_Mesh_i.cxx
index 1733a315eeaacb11721b63ef43917214c1870a7b..ad026374c3e1b4a55b3405ae0bce14f4565c3ae2 100644 (file)
@@ -132,7 +132,7 @@ SMESH_Mesh_i::~SMESH_Mesh_i()
       // this method is called from destructor of group (PAL6331)
       //_impl->RemoveGroup( aGroup->GetLocalID() );
       aGroup->myMeshServant = 0;
-      aGroup->Destroy();
+      aGroup->UnRegister();
     }
   }
   _mapGroups.clear();
@@ -144,7 +144,7 @@ SMESH_Mesh_i::~SMESH_Mesh_i()
       continue;
     SMESH_subMesh_i* aSubMesh = dynamic_cast<SMESH_subMesh_i*>(SMESH_Gen_i::GetServant(itSM->second).in());
     if (aSubMesh) {
-      aSubMesh->Destroy();
+      aSubMesh->UnRegister();
     }
   }
   _mapSubMeshIor.clear();
@@ -156,7 +156,7 @@ SMESH_Mesh_i::~SMESH_Mesh_i()
       continue;
     SMESH_Hypothesis_i* aHypo = dynamic_cast<SMESH_Hypothesis_i*>(SMESH_Gen_i::GetServant(itH->second).in());
     if (aHypo) {
-      aHypo->Destroy();
+      aHypo->UnRegister();
     }
   }
   _mapHypo.clear();
@@ -2070,6 +2070,18 @@ SMESH::SMESH_GroupBase_ptr SMESH_Mesh_i::createGroup (SMESH::ElementType theElem
                                                       const char*         theName,
                                                       const TopoDS_Shape& theShape )
 {
+  std::string newName;
+  if ( !theName || strlen( theName ) == 0 )
+  {
+    std::set< std::string > presentNames;
+    std::map<int, SMESH::SMESH_GroupBase_ptr>::const_iterator i_gr = _mapGroups.begin();
+    for ( ; i_gr != _mapGroups.end(); ++i_gr )
+      presentNames.insert( i_gr->second->GetName() );
+    do {
+      newName = "noname_Group_" + SMESH_Comment( presentNames.size() + 1 );
+    } while ( !presentNames.insert( newName ).second );
+    theName = newName.c_str();
+  }
   int anId;
   SMESH::SMESH_GroupBase_var aGroup;
   if ( _impl->AddGroup( (SMDSAbs_ElementType)theElemType, theName, anId, theShape )) {
@@ -2302,6 +2314,36 @@ CORBA::Boolean SMESH_Mesh_i::HasModificationsToDiscard() throw(SALOME::SALOME_Ex
   return _impl->HasModificationsToDiscard();
 }
 
+static SALOMEDS::Color getUniqueColor( const std::list<SALOMEDS::Color>& theReservedColors )
+{
+  const int MAX_ATTEMPTS = 100;
+  int cnt = 0;
+  double tolerance = 0.5;
+  SALOMEDS::Color col;
+
+  bool ok = false;
+  while ( !ok ) {
+    // generate random color
+    double red    = (double)rand() / RAND_MAX;
+    double green  = (double)rand() / RAND_MAX;
+    double blue   = (double)rand() / RAND_MAX;
+    // check existence in the list of the existing colors
+    bool matched = false;
+    std::list<SALOMEDS::Color>::const_iterator it;
+    for ( it = theReservedColors.begin(); it != theReservedColors.end() && !matched; ++it ) {
+      SALOMEDS::Color color = *it;
+      double tol = fabs( color.R - red ) + fabs( color.G - green ) + fabs( color.B  - blue  );
+      matched = tol < tolerance;
+    }
+    if ( (cnt+1) % 20 == 0 ) tolerance = tolerance/2;
+    ok = ( ++cnt == MAX_ATTEMPTS ) || !matched;
+    col.R = red;
+    col.G = green;
+    col.B = blue;
+  }
+  return col;
+}
+
 //=============================================================================
 /*!
  *
@@ -2311,6 +2353,15 @@ void SMESH_Mesh_i::SetAutoColor(CORBA::Boolean theAutoColor) throw(SALOME::SALOM
 {
   Unexpect aCatch(SALOME_SalomeException);
   _impl->SetAutoColor(theAutoColor);
+
+  std::list<SALOMEDS::Color> aReservedColors;
+  map<int, SMESH::SMESH_GroupBase_ptr>::iterator it = _mapGroups.begin();
+  for ( ; it != _mapGroups.end(); it++ ) {
+    if ( CORBA::is_nil( it->second )) continue;
+    SALOMEDS::Color aColor = getUniqueColor( aReservedColors );
+    it->second->SetColor( aColor );
+    aReservedColors.push_back( aColor );
+  }
 }
 
 //=============================================================================