Salome HOME
Implementation of the "20830: EDF 1357 GUI : Hide/Show Icon"
authorrnv <rnv@opencascade.com>
Thu, 17 Feb 2011 08:12:24 +0000 (08:12 +0000)
committerrnv <rnv@opencascade.com>
Thu, 17 Feb 2011 08:12:24 +0000 (08:12 +0000)
(at the moment implemeted only in GEOM and SMESH modules).

src/OBJECT/SMESH_Actor.cxx
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_Displayer.cxx
src/SMESHGUI/SMESHGUI_VTKUtils.cxx
src/SMESHGUI/SMESHGUI_VTKUtils.h

index d392cbe0d6e28dce3bd24e5442094f88cb5514c1..c86639b640903b8dcfa304620e34d0b804d5316a 100644 (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;
 }
 
index 28137a3541c9f92ed04dab95ab3a0a4e6d6f6bea..b32af368153134843fef8708b71afc1e8fcf4b41 100644 (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){
index 0f355c606d2066e85b016dcef7fbf1752008f922..50b8edcf86828269adc190ad1c7e685ca8130040 100644 (file)
 // 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>
 #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;
 }
index 9c23918907b57f25b93a8dd32ad765cb827115e7..52274c685ddfbafa024e3e936789ae5fc45473ea 100644 (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 {
index 084d1abe39b1cb63d71ac00b731f957a68835237..88bffa0de5399fdda6e25ca6f06447e6b83fb1c7 100644 (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