]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Bug NPAL12872 - EDF189 GEOM, SMESH : Visualization of groups with many colors
authorouv <ouv@opencascade.com>
Tue, 6 Nov 2007 08:54:55 +0000 (08:54 +0000)
committerouv <ouv@opencascade.com>
Tue, 6 Nov 2007 08:54:55 +0000 (08:54 +0000)
15 files changed:
idl/GEOM_Gen.idl
src/GEOM/GEOM_Engine.cxx
src/GEOM/GEOM_Object.cxx
src/GEOM/GEOM_Object.hxx
src/GEOMGUI/GEOMGUI_Selection.cxx
src/GEOMGUI/GEOMGUI_Selection.h
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GEOM_Displayer.h
src/GEOMGUI/GEOM_msg_en.po
src/GEOMGUI/GeometryGUI.cxx
src/GEOMToolsGUI/GEOMToolsGUI.cxx
src/GEOMToolsGUI/GEOMToolsGUI.h
src/GEOMToolsGUI/GEOMToolsGUI_1.cxx
src/GEOM_I/GEOM_Object_i.cc
src/GEOM_I/GEOM_Object_i.hh

index fa99c0db3d1e4f90a883c1f65d43952993d68a95..e4343a52a1f76d6a538b71050cd410c3bdfade43 100644 (file)
@@ -26,6 +26,7 @@
 #include "SALOME_Exception.idl"
 #include "SALOME_Component.idl"
 #include "SALOMEDS.idl"
+#include "SALOMEDS_Attributes.idl"
 
 #include "SALOME_GenericObj.idl"
 
@@ -121,6 +122,28 @@ module GEOM
      */
     string GetName();
 
+    /*!
+     *  Set color of the object.
+     *  \param theColor is a color of the object.
+     */
+    void SetColor(in SALOMEDS::Color theColor);
+
+    /*!
+     *  Get color of the object.
+     */
+    SALOMEDS::Color GetColor();
+
+    /*!
+     *  Toggle auto color mode on the object.
+     *  \param theAtoColor is a flag which toggles auto color mode.
+     */
+    void SetAutoColor(in boolean theAutoColor);
+
+    /*!
+     *  Get flag of object's auto color mode.
+     */
+    boolean GetAutoColor();
+
     /*!
      *  Set a Study entry where this object was published.
      */
index 2475cce34c953459e64ac8556087ffd52a0e5f31..3ac30e5ab278290a3290f74e1b87562b62897be4 100644 (file)
@@ -379,7 +379,8 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
   if(aDoc.IsNull()) return TCollection_AsciiString("def RebuildData(theStudy): pass\n");
  
   aScript = "import geompy\n";
-  aScript += "import math\n\n";
+  aScript += "import math\n";
+  aScript += "import SALOMEDS\n\n";
   aScript += "def RebuildData(theStudy):";
   aScript += "\n\tgeompy.init_geom(theStudy)";
   
@@ -480,6 +481,40 @@ TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID,
   //Add final part of the script
   if(aLen && aSeq->Value(aLen) < aScriptLength)  anUpdatedScript += aScript.SubString(aSeq->Value(aLen)+1, aScriptLength); // mkr : IPAL11865
  
+  // ouv : NPAL12872
+  for (anEntryToNameIt.Initialize( theObjectNames );
+       anEntryToNameIt.More();
+       anEntryToNameIt.Next())
+  {
+    const TCollection_AsciiString& aEntry = anEntryToNameIt.Key();
+    const TCollection_AsciiString& aName = anEntryToNameIt.Value();
+
+    TDF_Label L;
+    TDF_Tool::Label( aDoc->GetData(), aEntry, L );
+    if ( L.IsNull() )
+      continue;
+
+    Handle(GEOM_Object) obj = GEOM_Object::GetObject( L );
+    if ( obj.IsNull() )
+      continue;
+
+    bool anAutoColor = obj->GetAutoColor();
+    if ( anAutoColor )
+    {
+      TCollection_AsciiString aCommand( "\n\t" );
+      aCommand += aName + ".SetAutoColor(1)";
+      anUpdatedScript += aCommand.ToCString();
+    }
+
+    SALOMEDS::Color aColor = obj->GetColor();
+    if ( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 )
+    {
+      TCollection_AsciiString aCommand( "\n\t" );
+      aCommand += aName + ".SetColor(SALOMEDS.Color(" + aColor.R + "," + aColor.G + "," + aColor.B + "))";
+      anUpdatedScript += aCommand.ToCString();
+    }
+  }
+
   // Make script to publish in study
   if ( isPublished )
   {
index 5c91868fea89bb79eda6739752353302d0ece9e0..6d5174d4d1245b31f7d14f888cbc973e8e103e26 100644 (file)
@@ -33,6 +33,8 @@
 #include <TDataStd_UAttribute.hxx>
 #include <TDataStd_Name.hxx>
 #include <TDataStd_Comment.hxx>
+#include <TDataStd_RealArray.hxx>
+#include <TColStd_HArray1OfReal.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
@@ -42,6 +44,8 @@
 #define TYPE_LABEL 2
 #define FREE_LABEL 3
 #define TIC_LABEL  4
+#define COLOR_LABEL      5
+#define AUTO_COLOR_LABEL 6
 
 //=======================================================================
 //function : GetObjectID
@@ -289,6 +293,65 @@ char* GEOM_Object::GetName()
   return strdup(aName.ToCString());
 }
 
+//=============================================================================
+/*!
+ *  SetColor
+ */
+//=============================================================================
+void GEOM_Object::SetColor(const SALOMEDS::Color& theColor)
+{
+  Handle(TDataStd_RealArray) anArray = new TDataStd_RealArray();
+  anArray->Init( 1, 3 );
+  anArray->SetValue( 1, theColor.R );
+  anArray->SetValue( 2, theColor.G );
+  anArray->SetValue( 3, theColor.B );
+
+  Handle(TDataStd_RealArray) anAttr =
+    TDataStd_RealArray::Set(_label.FindChild(COLOR_LABEL), anArray->Lower(), anArray->Upper());
+  anAttr->ChangeArray(anArray->Array());
+}
+
+//=============================================================================
+/*!
+ *  GetColor
+ */
+//=============================================================================
+SALOMEDS::Color GEOM_Object::GetColor()
+{
+  Handle(TDataStd_RealArray) anArray;
+  bool isFound = _label.FindChild(COLOR_LABEL).FindAttribute(TDataStd_RealArray::GetID(), anArray);
+
+  SALOMEDS::Color aColor;
+  aColor.R = isFound ? anArray->Value( 1 ) : 0.f;
+  aColor.G = isFound ? anArray->Value( 2 ) : 0.f;
+  aColor.B = isFound ? anArray->Value( 3 ) : 0.f;
+
+  return aColor;
+}
+
+//=============================================================================
+/*!
+ *  SetAutoColor
+ */
+//=============================================================================
+void GEOM_Object::SetAutoColor(CORBA::Boolean theAutoColor)
+{
+  TDataStd_Integer::Set(_label.FindChild(AUTO_COLOR_LABEL), (int)theAutoColor);
+}
+
+//=============================================================================
+/*!
+ *  GetAutoColor
+ */
+//=============================================================================
+CORBA::Boolean GEOM_Object::GetAutoColor()
+{
+  Handle(TDataStd_Integer) anAutoColor;
+  if(!_label.FindChild(AUTO_COLOR_LABEL).FindAttribute(TDataStd_Integer::GetID(), anAutoColor)) return false;
+
+  return anAutoColor->Get();
+}
+
 //=============================================================================
 /*!
  *  SetAuxData
index 154798f65c0cc2014b6d27cd3c7d981e732a15e7..7d8eda71bdde9c29a32249209cf8b876428419ad 100644 (file)
 #include <TCollection_AsciiString.hxx>
 #endif
 
+#include "SALOMEconfig.h"
+#include CORBA_SERVER_HEADER(SALOMEDS)
+#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
+
 class Handle_TColStd_HSequenceOfTransient;
 class Standard_Transient;
 class Handle_Standard_Type;
@@ -197,6 +201,18 @@ class GEOM_Object : public MMgt_TShared
   //Returns a name of this GEOM_Object
   Standard_EXPORT char* GetName();
 
+  //Sets a color of this GEOM_Object
+  Standard_EXPORT void SetColor(const SALOMEDS::Color& theColor);
+
+  //Returns a color of this GEOM_Object
+  Standard_EXPORT SALOMEDS::Color GetColor();
+
+  //Toggles an auto color mode on this GEOM_Object
+  Standard_EXPORT void SetAutoColor(CORBA::Boolean theAutoColor);
+
+  //Returns a flag of auto color mode of this GEOM_Object
+  Standard_EXPORT CORBA::Boolean GetAutoColor();
+
   //Sets an auxiliary data
   Standard_EXPORT void SetAuxData(const char* theData);
 
index 029e8922a080e14c14e832cd475b2a8af7a81f99..70cb563b5414aa1a3621dd24dd4972a798cb88a2 100644 (file)
@@ -82,6 +82,8 @@ QtxValue GEOMGUI_Selection::param( const int ind, const QString& p ) const
     return QtxValue( typeName( ind ) );
   else if ( p == "displaymode" )
     return QtxValue( displayMode( ind ) );
+  else if ( p == "isAutoColor" )
+    return QtxValue( isAutoColor( ind ) );
   else
     return LightApp_Selection::param( ind, p );
 }
@@ -112,6 +114,14 @@ bool GEOMGUI_Selection::isVisible( const int index ) const
   return false;
 }
 
+bool GEOMGUI_Selection::isAutoColor( const int index ) const
+{
+  GEOM::GEOM_Object_var obj = getObject( index );
+  if ( !CORBA::is_nil( obj ) )
+    return obj->GetAutoColor();
+  return false;
+}
+
 QString GEOMGUI_Selection::displayMode( const int index ) const
 {
   SALOME_View* view = GEOM_Displayer::GetActiveView();
index adca786b3293c95db5707128d6e554485d76ff7e..5690229b4bacff5de3235b43cefb90bf5345c9e0 100644 (file)
@@ -47,6 +47,7 @@ public:
 
 private:
   bool                  isVisible( const int ) const;
+  bool                  isAutoColor( const int ) const;
   QString               typeName( const int ) const;  
   QString               displayMode( const int ) const;
   QString               selectionMode() const;
index 5b1c41de5fa809992169771bfbbd9f32b42a632a..fdceadb4d2fdb2898b2be6de0e382ca027d34f1d 100644 (file)
@@ -634,6 +634,81 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs )
           AISShape->setIO( anObj );
           AISShape->SetOwner( anObj );
         }
+
+       // Get color from GEOM_Object
+       SUIT_Session* session = SUIT_Session::session();
+       SUIT_Application* app = session->activeApplication();
+       if ( app )
+       {
+         SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+         if ( study )
+         {
+           Handle( SALOME_InteractiveObject ) anIO = AISShape->getIO();
+           if ( !anIO.IsNull() )
+           {
+             _PTR(SObject) SO ( study->studyDS()->FindObjectID( anIO->getEntry() ) );
+             if ( SO )
+             {
+               // get CORBA reference to data object
+               CORBA::Object_var object = GeometryGUI::ClientSObjectToObject(SO);
+               if ( !CORBA::is_nil( object ) )
+               {
+                 // downcast to GEOM object
+                 GEOM::GEOM_Object_var aGeomObject = GEOM::GEOM_Object::_narrow( object );
+                 if ( !aGeomObject->_is_nil() )
+                 {
+                   SALOMEDS::Color aSColor = aGeomObject->GetColor();
+                   bool hasColor = aSColor.R > 0 || aSColor.G > 0 || aSColor.B > 0;
+                   if( !hasColor && aGeomObject->GetType() == GEOM_GROUP ) // auto color for group
+                   {
+                     GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen();
+                     GEOM::GEOM_IGroupOperations_var anOperations = aGeomGen->GetIGroupOperations( study->id() );
+                     GEOM::GEOM_Object_var aMainObject = anOperations->GetMainShape( aGeomObject );
+                     if ( !aMainObject->_is_nil() && aMainObject->GetAutoColor() )
+                     {
+                       QValueList<SALOMEDS::Color> aReservedColors;
+
+                       SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( app );
+                       CORBA::String_var IOR = app->orb()->object_to_string( aMainObject );
+                       if ( strcmp(IOR.in(), "") != 0 )
+                       {
+                         _PTR(Study) aStudy = study->studyDS();
+                         _PTR(SObject) aMainSObject( aStudy->FindObjectIOR( string(IOR) ) );
+                         _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) );
+                         for( ; it->More(); it->Next() )
+                         {
+                           _PTR(SObject) aChildSObject( it->Value() );
+                           GEOM::GEOM_Object_var aChildObject =
+                             GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject));
+                           if( CORBA::is_nil( aChildObject ) )
+                             continue;
+
+                           if( aChildObject->GetType() != GEOM_GROUP )
+                             continue;
+
+                           SALOMEDS::Color aReservedColor = aChildObject->GetColor();
+                           aReservedColors.append( aReservedColor );
+                         }
+                       }
+
+                       aSColor = getUniqueColor( aReservedColors );
+                       hasColor = true;
+                     }
+                   }
+
+                   if( hasColor )
+                   {
+                     Quantity_Color aQuanColor( aSColor.R, aSColor.G, aSColor.B, Quantity_TOC_RGB );
+                     AISShape->SetColor( aQuanColor );
+                     AISShape->SetShadingColor( aQuanColor );
+                   }
+                 }
+               }
+             }
+           }
+         }
+       }
+
         // AISShape->SetName(???); ??? necessary to set name ???
         occPrs->AddObject( AISShape );
 
@@ -1224,3 +1299,61 @@ int GEOM_Displayer::UnsetDisplayMode()
   myDisplayMode = resMgr->integerValue( "Geometry", "display_mode", 0 );
   return aPrevMode;
 }
+
+SALOMEDS::Color GEOM_Displayer::getUniqueColor( const QValueList<SALOMEDS::Color>& theReservedColors )
+{
+  int aHue = -1;
+  int aTolerance = 64;
+  int anIterations = 0;
+  int aPeriod = 5;
+
+  while( 1 )
+  {
+    anIterations++;
+    if( anIterations % aPeriod == 0 )
+    {
+      aTolerance /= 2;
+      if( aTolerance < 1 )
+       break;
+    }
+    //cout << "Iteration N" << anIterations << " (tolerance=" << aTolerance << ")"<< endl;
+
+    aHue = (int)( 360.0 * rand() / RAND_MAX );
+    //cout << "Hue = " << aHue << endl;
+
+    //cout << "Auto colors : ";
+    bool ok = true;
+    QValueList<SALOMEDS::Color>::const_iterator it = theReservedColors.constBegin();
+    QValueList<SALOMEDS::Color>::const_iterator itEnd = theReservedColors.constEnd();
+    for( ; it != itEnd; ++it )
+    {
+      SALOMEDS::Color anAutoColor = *it;
+      QColor aQColor( (int)( anAutoColor.R * 255.0 ), (int)( anAutoColor.G * 255.0 ), (int)( anAutoColor.B * 255.0 ) );
+
+      int h, s, v;
+      aQColor.getHsv( &h, &s, &v );
+      //cout << h << " ";
+      if( abs( h - aHue ) < aTolerance )
+      {
+       ok = false;
+       //cout << "break (diff = " << abs( h - aHue ) << ")";
+       break;
+      }
+    }
+    //cout << endl;
+
+    if( ok )
+      break;
+  }
+
+  //cout << "Hue of the returned color = " << aHue << endl;
+  QColor aColor;
+  aColor.setHsv( aHue, 255, 255 );
+
+  SALOMEDS::Color aSColor;
+  aSColor.R = (double)aColor.red() / 255.0;
+  aSColor.G = (double)aColor.green() / 255.0;
+  aSColor.B = (double)aColor.blue() / 255.0;
+
+  return aSColor;
+}
index 878274ae41d5f4641c928b8b72f9f64180b48107..dc51f139ae70d214359c4ed67d56393ae9885298 100644 (file)
@@ -39,6 +39,8 @@
 #include <LightApp_Displayer.h>
 #include <Aspect_TypeOfMarker.hxx>
 
+#include <qvaluelist.h>
+
 #include <list>
 
 #include <SALOMEconfig.h>
@@ -148,6 +150,8 @@ public:
 
   SalomeApp_Study* getStudy() const;
 
+  static SALOMEDS::Color getUniqueColor( const QValueList<SALOMEDS::Color>& );
+
 protected:
   /* internal methods */
   /* Builds presentation accordint to the current viewer type */
index 722993755b16a13c55e51ade2f72a16e0471fdbe..5ef4b2384c0fcb5ffbafd0bf08ae2ec0ce79f535 100644 (file)
@@ -2957,6 +2957,24 @@ msgstr "Shading"
 msgid "STB_POP_SHADING"
 msgstr "Shading"
 
+msgid "TOP_POP_AUTO_COLOR"
+msgstr "Auto color"
+
+msgid "MEN_POP_AUTO_COLOR"
+msgstr "Auto color"
+
+msgid "STB_POP_AUTO_COLOR"
+msgstr "Auto color"
+
+msgid "TOP_POP_DISABLE_AUTO_COLOR"
+msgstr "Disable auto color"
+
+msgid "MEN_POP_DISABLE_AUTO_COLOR"
+msgstr "Disable auto color"
+
+msgid "STB_POP_DISABLE_AUTO_COLOR"
+msgstr "Disable auto color"
+
 msgid "TOP_POP_COLOR"
 msgstr "Color"
 
index f72ed036b6c511ff635a5b2560b1f9b9a8ce5cd5..4519aee0d8e98036ac3a8076d6abd0869471f0ca 100644 (file)
@@ -388,6 +388,8 @@ void GeometryGUI::OnGUIEvent( int id )
       id == 8032 ||  // POPUP VIEWER - COLOR
       id == 8033 ||  // POPUP VIEWER - TRANSPARENCY
       id == 8034 ||  // POPUP VIEWER - ISOS
+      id == 8035 ||  // POPUP VIEWER - AUTO COLOR
+      id == 8036 ||  // POPUP VIEWER - DISABLE AUTO COLOR
       id == 804  ||  // POPUP VIEWER - ADD IN STUDY
       id == 901  ||  // OBJECT BROWSER - RENAME
       id == 9024 ) { // OBJECT BROWSER - OPEN
@@ -886,6 +888,8 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( 8032, "POP_COLOR" );
   createGeomAction( 8033, "POP_TRANSPARENCY" );
   createGeomAction( 8034, "POP_ISOS" );
+  createGeomAction( 8035, "POP_AUTO_COLOR" );
+  createGeomAction( 8036, "POP_DISABLE_AUTO_COLOR" );
   createGeomAction( 8001, "POP_CREATE_GROUP" );
 
   // make wireframe-shading items to be exclusive (only one at a time is selected)
@@ -1107,6 +1111,12 @@ void GeometryGUI::initialize( CAM_Application* app )
   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
 
+  QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
+  QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
+
+  QString autoColorPrefix =
+    "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
+
   QtxPopupMgr* mgr = popupMgr();
   mgr->insert( action(  901 ), -1, -1 );  // rename
   mgr->setRule( action( 901 ), "$type in {'Shape' 'Group'} and selcount=1", true );
@@ -1126,12 +1136,17 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->setRule( action( 80312 ), clientOCCorVTK + " and displaymode='Shading'", false );
   mgr->insert( separator(), -1, -1 );     // -----------
   mgr->insert( action(  8032 ), -1, -1 ); // color
-  mgr->setRule( action( 8032 ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", true );
+  mgr->setRule( action( 8032 ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})", true );
   mgr->insert( action(  8033 ), -1, -1 ); // transparency
   mgr->setRule( action( 8033 ), clientOCCorVTK_AndSomeVisible, true );
   mgr->insert( action(  8034 ), -1, -1 ); // isos
   mgr->setRule( action( 8034 ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible", true );
   mgr->insert( separator(), -1, -1 );     // -----------
+  mgr->insert( action(  8035 ), -1, -1 ); // auto color
+  mgr->setRule( action( 8035 ), autoColorPrefix + " and isAutoColor=false", true );
+  mgr->insert( action(  8036 ), -1, -1 ); // disable auto color
+  mgr->setRule( action( 8036 ), autoColorPrefix + " and isAutoColor=true", true );
+  mgr->insert( separator(), -1, -1 );     // -----------
 
 
   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
index 39a6cd31bfd8f84dcb742702c66b6a77b59919ef..8ee1a8648eb5e394a0421d340f84eaa6e559d59d 100644 (file)
@@ -257,6 +257,16 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
        OnNbIsos();
        break;
       }
+    case 8035: // AUTO COLOR - POPUP VIEWER
+      {
+       OnAutoColor();
+       break;
+      }
+    case 8036: // DISABLE AUTO COLOR - POPUP VIEWER
+      {
+       OnDisableAutoColor();
+       break;
+      }
     case 9024 : // OPEN - OBJBROSER POPUP
       {
        OnOpen();
index 07dec456eff32f3a6e2d154a6cdc12623ccf8efd..69ad114d10b9fe86f575b909aed24cbd1cea44d2 100644 (file)
@@ -71,6 +71,8 @@ private:
   void OnCheckGeometry();
 
   // Popup commands
+  void OnAutoColor();
+  void OnDisableAutoColor();
   void OnColor();
   void OnTransparency();
   void OnNbIsos();
@@ -92,7 +94,6 @@ private:
   bool CheckSubObjectInUse(_PTR(SObject) checkobj,
                           _PTR(SObject) remobj,
                           _PTR(Study) aStudy);
-    
 };
 
 #endif
index 4587ec672fc59c45e3b7514173c8c69ffa916dd4..b67d163d331d2a362edfcdf77a5770af41a6f21c 100644 (file)
@@ -40,6 +40,9 @@
 #include "SALOME_ListIO.hxx"
 #include "SALOME_ListIteratorOfListIO.hxx"
 
+#include <SOCC_Prs.h>
+
+#include <SVTK_Prs.h>
 #include <SVTK_ViewModel.h>
 #include <SVTK_ViewWindow.h>
 #include <SVTK_View.h>
@@ -62,6 +65,8 @@
 #include <LightApp_SelectionMgr.h>
 #include <LightApp_NameDlg.h>
 
+#include <GEOMImpl_Types.hxx>
+
 #include "SALOMEDSClient.hxx"
 
 #include "utilities.h"
@@ -87,6 +92,7 @@
 #include <qcolordialog.h>
 #include <qspinbox.h>
 #include <qapplication.h>
+#include <qptrlist.h>
 
 using namespace std;
 
@@ -227,11 +233,151 @@ void GEOMToolsGUI::OnCheckGeometry()
     pyConsole->exec("from GEOM_usinggeom import *");
 }
 
+void GEOMToolsGUI::OnAutoColor()
+{
+  QPtrList<SALOME_Prs> aListOfGroups;
+
+  SALOME_ListIO selected;
+  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  if( !app )
+    return;
+
+  LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+  if( !aSelMgr || !appStudy )
+    return;
+
+  aSelMgr->selectedObjects( selected );
+  if( selected.IsEmpty() )
+    return;
+
+  Handle(SALOME_InteractiveObject) anIObject = selected.First();
+
+  _PTR(Study) aStudy = appStudy->studyDS();
+  _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
+  GEOM::GEOM_Object_var aMainObject = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aMainSObject));
+  if( CORBA::is_nil( aMainObject ) )
+    return;
+
+  aMainObject->SetAutoColor( true );
+
+  QValueList<SALOMEDS::Color> aReservedColors;
+
+  GEOM_Displayer aDisp (appStudy);
+
+  SALOME_View* vf = aDisp.GetActiveView();
+
+  SUIT_ViewWindow* window = app->desktop()->activeWindow();
+  bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
+  bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
+
+  for( _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) ); it->More(); it->Next() )
+  {
+    _PTR(SObject) aChildSObject( it->Value() );
+    GEOM::GEOM_Object_var aChildObject = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject));
+    if( CORBA::is_nil( aChildObject ) )
+      continue;
+
+    if( aChildObject->GetType() != GEOM_GROUP )
+      continue;
+
+    cout << "Group : " << aChildObject->GetName() << endl;
+
+    SALOMEDS::Color aColor = GEOM_Displayer::getUniqueColor( aReservedColors );
+    cout << "Color : " << aColor.R << " " << aColor.G << " " << aColor.B << endl;
+
+    aChildObject->SetColor( aColor );
+    aReservedColors.append( aColor );
+
+    QColor c( (int)( aColor.R * 255.0 ), (int)( aColor.G * 255.0 ), (int)( aColor.B * 255.0 ) );
+
+    SALOME_Prs* aPrs = vf->CreatePrs( aChildSObject->GetID().c_str() );
+
+    if ( isVTK )
+    {
+      SVTK_ViewWindow* vtkVW = dynamic_cast<SVTK_ViewWindow*>( window );
+      if ( !vtkVW )
+       return;
+      SVTK_View* aView = vtkVW->getView();
+      SUIT_OverrideCursor();
+      for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() )
+       aView->SetColor( It.Value(), c );
+    }
+    else if ( isOCC )
+    {
+      OCCViewer_Viewer* vm = dynamic_cast<OCCViewer_Viewer*>( window->getViewManager()->getViewModel() );
+      Handle(AIS_InteractiveContext) ic = vm->getAISContext();
+
+      SOCC_Prs* anOCCPrs = dynamic_cast<SOCC_Prs*>( aPrs );
+      if( !anOCCPrs )
+       continue;
+
+      AIS_ListOfInteractive aList;
+      anOCCPrs->GetObjects( aList );
+      if( !aList.Extent() )
+       continue;
+
+      Handle(AIS_InteractiveObject) io = aList.First();
+      if( io.IsNull() )
+       continue;
+
+      Quantity_Color aQuanColor( c.red() / 255., c.green() / 255., c.blue() / 255., Quantity_TOC_RGB );
+
+      // Set color for a point
+      Handle(AIS_Drawer) aCurDrawer = io->Attributes();
+      Handle(Prs3d_PointAspect) aCurPointAspect = aCurDrawer->PointAspect();
+      Quantity_Color aCurColor;
+      Standard_Real aCurScale;
+      Aspect_TypeOfMarker aCurTypeOfMarker;
+      aCurPointAspect->Aspect()->Values( aCurColor, aCurTypeOfMarker, aCurScale );
+      aCurDrawer->SetPointAspect( new Prs3d_PointAspect( aCurTypeOfMarker, aQuanColor, aCurScale) );
+      ic->SetLocalAttributes( io, aCurDrawer );
+
+      io->SetColor( aQuanColor );
+      if ( io->IsKind( STANDARD_TYPE(GEOM_AISShape) ) )
+       Handle(GEOM_AISShape)::DownCast( io )->SetShadingColor( aQuanColor );
+
+      io->Redisplay( Standard_True );
+    }
+  }
+
+  app->updateActions(); //SRN: To update a Save button in the toolbar
+}
+
+void GEOMToolsGUI::OnDisableAutoColor()
+{
+  SALOME_ListIO selected;
+  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  if( !app )
+    return;
+
+  LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+  if( !aSelMgr || !appStudy )
+    return;
+
+  aSelMgr->selectedObjects( selected );
+  if( selected.IsEmpty() )
+    return;
+
+  Handle(SALOME_InteractiveObject) anIObject = selected.First();
+
+  _PTR(Study) aStudy = appStudy->studyDS();
+  _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
+  GEOM::GEOM_Object_var aMainObject =  GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aMainSObject));
+  if( CORBA::is_nil( aMainObject ) )
+    return;
+
+  aMainObject->SetAutoColor( false );
+
+}
+
 void GEOMToolsGUI::OnColor()
 {
   SALOME_ListIO selected;
   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-  if ( app ) {
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+  if ( app && appStudy ) {
     LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
     if ( aSelMgr ) {
       aSelMgr->selectedObjects( selected );
@@ -283,6 +429,19 @@ void GEOMToolsGUI::OnColor()
                    Handle(GEOM_AISShape)::DownCast( io )->SetShadingColor( aColor );
 
                  io->Redisplay( Standard_True );
+
+                 // store color to GEOM_Object
+                 _PTR(Study) aStudy = appStudy->studyDS();
+                 _PTR(SObject) aSObject( aStudy->FindObjectID( It.Value()->getEntry() ) );
+                 GEOM::GEOM_Object_var anObject =
+                   GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject));
+
+                 SALOMEDS::Color aSColor;
+                 aSColor.R = (double)c.red() / 255.0;
+                 aSColor.G = (double)c.green() / 255.0;
+                 aSColor.B = (double)c.blue() / 255.0;
+                 anObject->SetColor( aSColor );
+                 anObject->SetAutoColor( false );
                }
              }
            } // if c.isValid()
index 6edeb5dacd450a41e5b4f2d89dd1cf7cab98edbf..d8794d7b99738dc4bd57169c2973a09933d89fe4 100644 (file)
@@ -135,6 +135,50 @@ char* GEOM_Object_i::GetName()
   return strdup("");
 }
 
+//=============================================================================
+/*!
+ *  SetColor
+ */
+//=============================================================================
+void GEOM_Object_i::SetColor(const SALOMEDS::Color& theColor)
+{
+  _impl->SetColor(theColor);
+}
+
+
+//=============================================================================
+/*!
+ *  GetColor
+ */
+//=============================================================================
+SALOMEDS::Color GEOM_Object_i::GetColor()
+{
+  return _impl->GetColor();
+}
+
+
+//=============================================================================
+/*!
+ *  SetAutoColor
+ */
+//=============================================================================
+void GEOM_Object_i::SetAutoColor(CORBA::Boolean theAutoColor)
+{
+  _impl->SetAutoColor(theAutoColor);
+}
+
+
+//=============================================================================
+/*!
+ *  GetAutoColor
+ */
+//=============================================================================
+CORBA::Boolean GEOM_Object_i::GetAutoColor()
+{
+  return _impl->GetAutoColor();
+}
+
+
 //=============================================================================
 /*!
  *  SetStudyEntry
index fa670e45a9abc2578e0daf1bfab6337511f3a0df..43711eacd2c94c6ba8da3bc4ba57adf8e3a0838a 100644 (file)
@@ -53,6 +53,14 @@ class GEOM_I_EXPORT GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public
 
   virtual char* GetName();
 
+  virtual void SetColor(const SALOMEDS::Color& theColor);
+
+  virtual SALOMEDS::Color GetColor();
+
+  virtual void SetAutoColor(CORBA::Boolean theAutoColor);
+
+  virtual CORBA::Boolean GetAutoColor();
+
   virtual void SetStudyEntry(const char* theEntry);
 
   virtual char* GetStudyEntry();