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,
int theIsClear)
{
SMESH_ActorDef* anActor = SMESH_ActorDef::New();
if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){
anActor->Delete();
anActor = NULL;
SMESH_ActorDef* anActor = NULL;
if(theVisualObj->GetNbEntities(SMDSAbs_Node) > 0 ) {
anActor = SMESH_ActorDef::New();
if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){
anActor->Delete();
anActor = NULL;
}
if( anActor )
anActor->UpdateScalarBar();
}
if( anActor )
anActor->UpdateScalarBar();
return anActor;
}

View File

@ -2869,7 +2869,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
if ( aMesh->_is_nil()) continue;
try {
SMESH::UpdateView(SMESH::eErase, IOS->getEntry());
SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
aMesh->Clear();
_PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
SMESH::ModifiedMesh( aMeshSObj, false, true);
@ -2879,7 +2879,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
for ( anIter->InitEx(true); anIter->More(); anIter->Next() )
{
_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){

View File

@ -25,9 +25,10 @@
// Author : Alexander SOLOVYOV, Open CASCADE S.A.S.
// SMESH includes
//
#include "SMESHGUI_Displayer.h"
#include "SMESHGUI_Displayer.h"
#include "SMESHGUI_VTKUtils.h"
#include "SMESHGUI_Utils.h"
// SALOME GUI includes
#include <SalomeApp_Study.h>
@ -36,6 +37,13 @@
#include <SVTK_ViewModel.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 )
: LightApp_Displayer(),
myApp( app )
@ -81,7 +89,38 @@ SalomeApp_Study* SMESHGUI_Displayer::study() const
return dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
}
bool SMESHGUI_Displayer::canBeDisplayed( const QString& /*entry*/, const QString& viewer_type ) const
{
return viewer_type==SVTK_Viewer::Type();
bool SMESHGUI_Displayer::canBeDisplayed( const QString& entry, const QString& viewer_type ) const {
bool res = false;
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*>
( SUIT_Session::session()->activeApplication() );
SUIT_ViewManager* aViewManager =
app ? app->getViewManager(SVTK_Viewer::Type(), true) : 0;
if ( aViewManager ) {
SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
if(!app)
return;
SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
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();
for ( int iV = 0; iV < views.count(); ++iV ) {
if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV]))
vtkWnd->RemoveActor(actor);
actor->Delete();
}
if ( SMESH_Actor* actor = FindActorByEntry( views[iV], theEntry)) {
if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) {
vtkWnd->RemoveActor(actor);
actorRemoved = true;
}
actor->Delete();
}
}
}
if (aViewManager ) {
int aStudyId = aViewManager->study()->id();
TVisualObjCont::key_type aKey(aStudyId,theEntry);
TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey);
if(anIter != VISUAL_OBJ_CONT.end()) {
// for unknown reason, object destructor is not called, so clear object manually
anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0);
anIter->second->GetUnstructuredGrid()->SetPoints(0);
// for unknown reason, object destructor is not called, so clear object manually
anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0);
anIter->second->GetUnstructuredGrid()->SetPoints(0);
}
VISUAL_OBJ_CONT.erase(aKey);
}
if(actorRemoved)
aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
}
//================================================================================
/*!
@ -686,6 +709,15 @@ namespace SMESH
if (!aViewWnd)
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;
vtkRenderer *aRenderer = aViewWnd->getRenderer();
@ -699,6 +731,13 @@ namespace SMESH
if (SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)) {
MESSAGE("--- display " << anActor);
anActor->SetVisibility(true);
if(anActor->hasIO()){
Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
if(anIO->hasEntry()){
aStudy->setVisibilityState(anIO->getEntry(), Qtx::ShownState);
}
}
}
}
break;
@ -712,6 +751,7 @@ namespace SMESH
anActor->SetVisibility(false);
}
}
aStudy->setVisibilityStateForAll(Qtx::HiddenState);
}
default: {
if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
@ -722,10 +762,12 @@ namespace SMESH
anActor->Update();
anActor->SetVisibility(true);
if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
aStudy->setVisibilityState(theEntry, Qtx::ShownState);
break;
case eErase:
//MESSAGE("--- erase " << anActor);
anActor->SetVisibility(false);
aStudy->setVisibilityState(theEntry, Qtx::HiddenState);
break;
}
} else {
@ -744,6 +786,7 @@ namespace SMESH
if ((anActor = CreateActor(aDocument,theEntry,true))) {
bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
DisplayActor(theWnd,anActor);
aStudy->setVisibilityState(theEntry, Qtx::ShownState);
// FitAll(); - PAL16770(Display of a group performs an automatic fit all)
if (needFitAll) FitAll();
} else {

View File

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