Implementation of the "20830: EDF 1357 GUI : Hide/Show Icon"

(at the moment implemeted only in GEOM and SMESH modules).
This commit is contained in:
rnv 2011-02-17 08:12:24 +00:00
parent bd6b92b1da
commit fbd01b197c
5 changed files with 113 additions and 26 deletions

View File

@ -103,13 +103,16 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj,
const char* theName, const char* theName,
int theIsClear) int theIsClear)
{ {
SMESH_ActorDef* anActor = SMESH_ActorDef::New(); SMESH_ActorDef* anActor = NULL;
if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){ if(theVisualObj->GetNbEntities(SMDSAbs_Node) > 0 ) {
anActor->Delete(); anActor = SMESH_ActorDef::New();
anActor = NULL; if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){
anActor->Delete();
anActor = NULL;
}
if( anActor )
anActor->UpdateScalarBar();
} }
if( anActor )
anActor->UpdateScalarBar();
return anActor; return anActor;
} }

View File

@ -2869,7 +2869,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS); SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
if ( aMesh->_is_nil()) continue; if ( aMesh->_is_nil()) continue;
try { try {
SMESH::UpdateView(SMESH::eErase, IOS->getEntry()); SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
aMesh->Clear(); aMesh->Clear();
_PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh); _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
SMESH::ModifiedMesh( aMeshSObj, false, true); SMESH::ModifiedMesh( aMeshSObj, false, true);
@ -2879,7 +2879,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
for ( anIter->InitEx(true); anIter->More(); anIter->Next() ) for ( anIter->InitEx(true); anIter->More(); anIter->Next() )
{ {
_PTR(SObject) so = anIter->Value(); _PTR(SObject) so = anIter->Value();
SMESH::UpdateView(SMESH::eErase, so->GetID().c_str()); SMESH::RemoveVisualObjectWithActors(so->GetID().c_str(), true);
} }
} }
catch (const SALOME::SALOME_Exception& S_ex){ catch (const SALOME::SALOME_Exception& S_ex){

View File

@ -25,9 +25,10 @@
// Author : Alexander SOLOVYOV, Open CASCADE S.A.S. // Author : Alexander SOLOVYOV, Open CASCADE S.A.S.
// SMESH includes // SMESH includes
// //
#include "SMESHGUI_Displayer.h"
#include "SMESHGUI_Displayer.h"
#include "SMESHGUI_VTKUtils.h" #include "SMESHGUI_VTKUtils.h"
#include "SMESHGUI_Utils.h"
// SALOME GUI includes // SALOME GUI includes
#include <SalomeApp_Study.h> #include <SalomeApp_Study.h>
@ -36,6 +37,13 @@
#include <SVTK_ViewModel.h> #include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h> #include <SVTK_ViewWindow.h>
// IDL includes
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_Mesh)
SMESHGUI_Displayer::SMESHGUI_Displayer( SalomeApp_Application* app ) SMESHGUI_Displayer::SMESHGUI_Displayer( SalomeApp_Application* app )
: LightApp_Displayer(), : LightApp_Displayer(),
myApp( app ) myApp( app )
@ -81,7 +89,38 @@ SalomeApp_Study* SMESHGUI_Displayer::study() const
return dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() ); return dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
} }
bool SMESHGUI_Displayer::canBeDisplayed( const QString& /*entry*/, const QString& viewer_type ) const bool SMESHGUI_Displayer::canBeDisplayed( const QString& entry, const QString& viewer_type ) const {
{ bool res = false;
return viewer_type==SVTK_Viewer::Type(); if(viewer_type != SVTK_Viewer::Type())
return res;
SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
if( !study )
return res;
_PTR(SObject) obj = study->studyDS()->FindObjectID( (const char*)entry.toLatin1() );
CORBA::Object_var anObj = SMESH::SObjectToObject( obj );
/*
if( !CORBA::is_nil( anObj ) ) {
SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( anObj );
if ( ! mesh->_is_nil() )
res = (mesh->NbNodes() > 0);
SMESH::SMESH_subMesh_var aSubMeshObj = SMESH::SMESH_subMesh::_narrow( anObj );
if ( !aSubMeshObj->_is_nil() )
res = (aSubMeshObj->GetNumberOfNodes(true) > 0);
SMESH::SMESH_GroupBase_var aGroupObj = SMESH::SMESH_GroupBase::_narrow( anObj );
if ( !aGroupObj->_is_nil() )
res = !aGroupObj->IsEmpty();
}*/
if( !CORBA::is_nil( anObj ) ) {
if(!SMESH::SMESH_Mesh::_narrow( anObj )->_is_nil() ||
!SMESH::SMESH_subMesh::_narrow( anObj )->_is_nil() ||
!SMESH::SMESH_GroupBase::_narrow( anObj )->_is_nil())
res = true;
}
return res;
} }

View File

@ -103,31 +103,54 @@ namespace SMESH
*/ */
//================================================================================ //================================================================================
void RemoveVisualObjectWithActors( const char* theEntry ) void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews )
{ {
SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*> SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
( SUIT_Session::session()->activeApplication() ); if(!app)
SUIT_ViewManager* aViewManager = return;
app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0; SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
if ( aViewManager ) { if(!aStudy)
return;
ViewManagerList aList;
if(fromAllViews) {
app->viewManagers(SVTK_Viewer::Type() , aList);
} else {
SUIT_ViewManager* aVM = app->getViewManager(SVTK_Viewer::Type(), true);
if(aVM)
aList.append(aVM);
}
bool actorRemoved = false;
ViewManagerList::ConstIterator it = aList.begin();
SUIT_ViewManager* aViewManager = 0;
for( ; it!=aList.end();it++) {
aViewManager = *it;
QVector<SUIT_ViewWindow*> views = aViewManager->getViews(); QVector<SUIT_ViewWindow*> views = aViewManager->getViews();
for ( int iV = 0; iV < views.count(); ++iV ) { for ( int iV = 0; iV < views.count(); ++iV ) {
if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) { if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
vtkWnd->RemoveActor(actor); vtkWnd->RemoveActor(actor);
actor->Delete(); actorRemoved = true;
} }
actor->Delete();
}
} }
}
if (aViewManager ) {
int aStudyId = aViewManager->study()->id(); int aStudyId = aViewManager->study()->id();
TVisualObjCont::key_type aKey(aStudyId,theEntry); TVisualObjCont::key_type aKey(aStudyId,theEntry);
TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey);
if(anIter != VISUAL_OBJ_CONT.end()) { if(anIter != VISUAL_OBJ_CONT.end()) {
// for unknown reason, object destructor is not called, so clear object manually // for unknown reason, object destructor is not called, so clear object manually
anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0);
anIter->second->GetUnstructuredGrid()->SetPoints(0); anIter->second->GetUnstructuredGrid()->SetPoints(0);
} }
VISUAL_OBJ_CONT.erase(aKey); VISUAL_OBJ_CONT.erase(aKey);
} }
if(actorRemoved)
aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
} }
//================================================================================ //================================================================================
/*! /*!
@ -686,6 +709,15 @@ namespace SMESH
if (!aViewWnd) if (!aViewWnd)
return OK; return OK;
SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd);
if (!vtkWnd)
return OK;
SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( vtkWnd->getViewManager()->study() );
if (!aStudy)
return OK;
{ {
OK = true; OK = true;
vtkRenderer *aRenderer = aViewWnd->getRenderer(); vtkRenderer *aRenderer = aViewWnd->getRenderer();
@ -699,6 +731,13 @@ namespace SMESH
if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) { if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) {
MESSAGE("--- display " << anActor); MESSAGE("--- display " << anActor);
anActor->SetVisibility(true); anActor->SetVisibility(true);
if(anActor->hasIO()){
Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
if(anIO->hasEntry()){
aStudy->setVisibilityState(anIO->getEntry(), Qtx::ShownState);
}
}
} }
} }
break; break;
@ -712,6 +751,7 @@ namespace SMESH
anActor->SetVisibility(false); anActor->SetVisibility(false);
} }
} }
aStudy->setVisibilityStateForAll(Qtx::HiddenState);
} }
default: { default: {
if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
@ -722,10 +762,12 @@ namespace SMESH
anActor->Update(); anActor->Update();
anActor->SetVisibility(true); anActor->SetVisibility(true);
if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
aStudy->setVisibilityState(theEntry, Qtx::ShownState);
break; break;
case eErase: case eErase:
//MESSAGE("--- erase " << anActor); //MESSAGE("--- erase " << anActor);
anActor->SetVisibility(false); anActor->SetVisibility(false);
aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
break; break;
} }
} else { } else {
@ -744,6 +786,7 @@ namespace SMESH
if ((anActor = CreateActor(aDocument,theEntry,true))) { if ((anActor = CreateActor(aDocument,theEntry,true))) {
bool needFitAll = noSmeshActors(theWnd); // fit for the first object only bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
DisplayActor(theWnd,anActor); DisplayActor(theWnd,anActor);
aStudy->setVisibilityState(theEntry, Qtx::ShownState);
// FitAll(); - PAL16770(Display of a group performs an automatic fit all) // FitAll(); - PAL16770(Display of a group performs an automatic fit all)
if (needFitAll) FitAll(); if (needFitAll) FitAll();
} else { } else {

View File

@ -203,6 +203,8 @@ SMESHGUI_EXPORT
vtkFloatingPointType theDist, vtkFloatingPointType theDist,
vtkFloatingPointType theBounds[6], vtkFloatingPointType theBounds[6],
vtkFloatingPointType theOrigin[3] ); vtkFloatingPointType theOrigin[3] );
SMESHGUI_EXPORT
void RemoveVisualObjectWithActors( const char* theEntry, bool fromAllViews = false );
}; };
#endif // SMESHGUI_VTKUTILS_H #endif // SMESHGUI_VTKUTILS_H