From b246b24097ae534a2cbe910080312825a3c0055f Mon Sep 17 00:00:00 2001 From: ouv Date: Tue, 6 Nov 2007 08:54:55 +0000 Subject: [PATCH] Bug NPAL12872 - EDF189 GEOM, SMESH : Visualization of groups with many colors --- idl/GEOM_Gen.idl | 23 ++++ src/GEOM/GEOM_Engine.cxx | 37 ++++++- src/GEOM/GEOM_Object.cxx | 63 +++++++++++ src/GEOM/GEOM_Object.hxx | 16 +++ src/GEOMGUI/GEOMGUI_Selection.cxx | 10 ++ src/GEOMGUI/GEOMGUI_Selection.h | 1 + src/GEOMGUI/GEOM_Displayer.cxx | 133 +++++++++++++++++++++++ src/GEOMGUI/GEOM_Displayer.h | 4 + src/GEOMGUI/GEOM_msg_en.po | 18 ++++ src/GEOMGUI/GeometryGUI.cxx | 17 ++- src/GEOMToolsGUI/GEOMToolsGUI.cxx | 10 ++ src/GEOMToolsGUI/GEOMToolsGUI.h | 3 +- src/GEOMToolsGUI/GEOMToolsGUI_1.cxx | 161 +++++++++++++++++++++++++++- src/GEOM_I/GEOM_Object_i.cc | 44 ++++++++ src/GEOM_I/GEOM_Object_i.hh | 8 ++ 15 files changed, 544 insertions(+), 4 deletions(-) diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index fa99c0db3..e4343a52a 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -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. */ diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx index 2475cce34..3ac30e5ab 100644 --- a/src/GEOM/GEOM_Engine.cxx +++ b/src/GEOM/GEOM_Engine.cxx @@ -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 ) { diff --git a/src/GEOM/GEOM_Object.cxx b/src/GEOM/GEOM_Object.cxx index 5c91868fe..6d5174d4d 100644 --- a/src/GEOM/GEOM_Object.cxx +++ b/src/GEOM/GEOM_Object.cxx @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include #include @@ -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 diff --git a/src/GEOM/GEOM_Object.hxx b/src/GEOM/GEOM_Object.hxx index 154798f65..7d8eda71b 100644 --- a/src/GEOM/GEOM_Object.hxx +++ b/src/GEOM/GEOM_Object.hxx @@ -54,6 +54,10 @@ #include #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); diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index 029e8922a..70cb563b5 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -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(); diff --git a/src/GEOMGUI/GEOMGUI_Selection.h b/src/GEOMGUI/GEOMGUI_Selection.h index adca786b3..5690229b4 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.h +++ b/src/GEOMGUI/GEOMGUI_Selection.h @@ -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; diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index 5b1c41de5..fdceadb4d 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -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( 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 aReservedColors; + + SalomeApp_Application* app = dynamic_cast( 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& 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::const_iterator it = theReservedColors.constBegin(); + QValueList::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; +} diff --git a/src/GEOMGUI/GEOM_Displayer.h b/src/GEOMGUI/GEOM_Displayer.h index 878274ae4..dc51f139a 100644 --- a/src/GEOMGUI/GEOM_Displayer.h +++ b/src/GEOMGUI/GEOM_Displayer.h @@ -39,6 +39,8 @@ #include #include +#include + #include #include @@ -148,6 +150,8 @@ public: SalomeApp_Study* getStudy() const; + static SALOMEDS::Color getUniqueColor( const QValueList& ); + protected: /* internal methods */ /* Builds presentation accordint to the current viewer type */ diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po index 722993755..5ef4b2384 100644 --- a/src/GEOMGUI/GEOM_msg_en.po +++ b/src/GEOMGUI/GEOM_msg_en.po @@ -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" diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index f72ed036b..4519aee0d 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -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) ", diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 39a6cd31b..8ee1a8648 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -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(); diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 07dec456e..69ad114d1 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -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 diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 4587ec672..b67d163d3 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -40,6 +40,9 @@ #include "SALOME_ListIO.hxx" #include "SALOME_ListIteratorOfListIO.hxx" +#include + +#include #include #include #include @@ -62,6 +65,8 @@ #include #include +#include + #include "SALOMEDSClient.hxx" #include "utilities.h" @@ -87,6 +92,7 @@ #include #include #include +#include using namespace std; @@ -227,11 +233,151 @@ void GEOMToolsGUI::OnCheckGeometry() pyConsole->exec("from GEOM_usinggeom import *"); } +void GEOMToolsGUI::OnAutoColor() +{ + QPtrList 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( 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 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( 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( window->getViewManager()->getViewModel() ); + Handle(AIS_InteractiveContext) ic = vm->getAISContext(); + + SOCC_Prs* anOCCPrs = dynamic_cast( 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( 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( 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() diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc index 6edeb5dac..d8794d7b9 100644 --- a/src/GEOM_I/GEOM_Object_i.cc +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -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 diff --git a/src/GEOM_I/GEOM_Object_i.hh b/src/GEOM_I/GEOM_Object_i.hh index fa670e45a..43711eacd 100644 --- a/src/GEOM_I/GEOM_Object_i.hh +++ b/src/GEOM_I/GEOM_Object_i.hh @@ -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(); -- 2.39.2