Salome HOME
- FitAll();
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_VTKUtils.cxx
index b918db58dd3b97815a6eda2571f020e04a26a026..f86da0094535f78fa772288fb83307e53f318859 100644 (file)
 //  License along with this library; if not, write to the Free Software
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 
 
 #include "SMESHGUI_VTKUtils.h"
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_Filter.h"
 
-#include <vtkRenderer.h>
-#include <vtkActorCollection.h>
-
-#include <TColStd_IndexedMapOfInteger.hxx>
+#include "SMESHGUI.h"
+#include "SMESH_Actor.h"
+#include "SMESH_ObjectDef.h"
 
 #include <SUIT_Desktop.h>
 #include <SUIT_Session.h>
 #include <SUIT_Study.h>
 
-#include "SalomeApp_SelectionMgr.h"
+#include <SALOME_ListIO.hxx>
+#include <SALOME_ListIteratorOfListIO.hxx>
 
-#include "SVTK_Selector.h"
-#include "SVTK_ViewModel.h"
-#include "SVTK_ViewWindow.h"
-#include "SVTK_RenderWindow.h"
-#include "SVTK_InteractorStyle.h"
-#include "SVTK_RenderWindowInteractor.h"
+#include <SVTK_Selector.h>
+#include <SVTK_ViewModel.h>
+#include <SVTK_ViewWindow.h>
 
-#include "utilities.h"
+#include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Application.h>
+#include <SalomeApp_Study.h>
 
-#include "SALOMEconfig.h"
+#include <utilities.h>
+
+#include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SMESH_Gen)
 #include CORBA_CLIENT_HEADER(SMESH_Mesh)
 #include CORBA_CLIENT_HEADER(SMESH_Group)
 #include CORBA_CLIENT_HEADER(SMESH_Hypothesis)
 
-#include "SMESHGUI.h"
-#include "SMESH_Actor.h"
-#include "SMESH_ObjectDef.h"
-
-#include <SalomeApp_Application.h>
-#include <SalomeApp_SelectionMgr.h>
-#include <SalomeApp_Study.h>
-
 #include <SALOMEDSClient_Study.hxx>
 #include <SALOMEDSClient_SObject.hxx>
 
-#include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
+// VTK
+#include <vtkRenderer.h>
+#include <vtkActorCollection.h>
 
+// OCCT
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+// STL
 #include <set>
 using namespace std;
 
-namespace SMESH{
+
+namespace SMESH {
 
   typedef map<TKeyOfVisualObj,TVisualObjPtr> TVisualObjCont;
   static TVisualObjCont VISUAL_OBJ_CONT;
@@ -78,7 +77,8 @@ namespace SMESH{
       if(anIter != VISUAL_OBJ_CONT.end()){
        aVisualObj = anIter->second;
       }else{
-        SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SMESHGUI::activeStudy()->application() );
+        SalomeApp_Application* app =
+          dynamic_cast<SalomeApp_Application*>( SMESHGUI::activeStudy()->application() );
        _PTR(Study) aStudy = SMESHGUI::activeStudy()->studyDS();
        _PTR(SObject) aSObj = aStudy->FindObjectID(theEntry);
        if(aSObj){
@@ -93,7 +93,7 @@ namespace SMESH{
              if(!aMesh->_is_nil()){
                aVisualObj.reset(new SMESH_MeshObj(aMesh));
                aVisualObj->Update();
-               TVisualObjCont::value_type aValue(aKey,aVisualObj); 
+               TVisualObjCont::value_type aValue(aKey,aVisualObj);
                VISUAL_OBJ_CONT.insert(aValue);
                return aVisualObj;
              }
@@ -142,23 +142,41 @@ namespace SMESH{
   }
 
 
-  SVTK_ViewWindow*
-  GetViewWindow(const SalomeApp_Module* theModule)
+  /*! Return active view window, if it instantiates SVTK_ViewWindow class,
+   *  overwise find or create corresponding view window, make it active and return it.
+   *  \note Active VVTK_ViewWindow can be returned, because it inherits SVTK_ViewWindow.
+   */
+  SVTK_ViewWindow* GetViewWindow (const SalomeApp_Module* theModule,
+                                  bool createIfNotFound)
   {
-    if(SalomeApp_Application* anApp = theModule->getApp()){
-      if(SUIT_ViewManager* aViewManager = anApp->activeViewManager()){
-       if(aViewManager->getType() == SVTK_Viewer::Type()){
-         if(SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()){
-           return dynamic_cast<SVTK_ViewWindow*>(aViewWindow);
-         }
-       }
+    SalomeApp_Application* anApp;
+    if (theModule)
+      anApp = theModule->getApp();
+    else
+      anApp = dynamic_cast<SalomeApp_Application*>
+        (SUIT_Session::session()->activeApplication());
+
+    if (anApp) {
+      if (SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(anApp->desktop()->activeWindow()))
+       return aView;
+
+      SUIT_ViewManager* aViewManager =
+        anApp->getViewManager(SVTK_Viewer::Type(), createIfNotFound);
+      if (aViewManager) {
+        if (SUIT_ViewWindow* aViewWindow = aViewManager->getActiveView()) {
+          if (SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)) {
+            aViewWindow->raise();
+            aViewWindow->setFocus();
+            return aView;
+          }
+        }
       }
     }
     return NULL;
   }
 
-  SVTK_ViewWindow* FindVtkViewWindowSUIT_ViewManager* theMgr,
-                                          SUIT_ViewWindow* theWindow )
+  SVTK_ViewWindow* FindVtkViewWindow (SUIT_ViewManager* theMgr,
+                                      SUIT_ViewWindow * theWindow)
   {
     if( !theMgr )
       return NULL;
@@ -170,12 +188,10 @@ namespace SMESH{
       return NULL;
   }
 
-
   SVTK_ViewWindow* GetVtkViewWindow(SUIT_ViewWindow* theWindow){
     return dynamic_cast<SVTK_ViewWindow*>(theWindow);
   }
 
-
 /*  SUIT_ViewWindow* GetActiveWindow()
   {
     SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
@@ -192,8 +208,19 @@ namespace SMESH{
     return GetVtkViewWindow( GetActiveWindow() );
   }
 
+
+  void RepaintCurrentView()
+  {
+    if (SVTK_ViewWindow* wnd = GetCurrentVtkView())
+      {
+       wnd->getRenderer()->Render();
+       wnd->Repaint(false);
+      }
+  }
+
   void RepaintViewWindow(SVTK_ViewWindow* theWindow)
   {
+    theWindow->getRenderer()->Render();
     theWindow->Repaint();
   }
 
@@ -203,6 +230,14 @@ namespace SMESH{
     theWindow->Repaint();
   }
 
+  void FitAll(){
+    if(SVTK_ViewWindow* wnd = GetCurrentVtkView() ){
+      wnd->onFitAll();
+      wnd->Repaint();
+    }
+  }
+
+
   SMESH_Actor* FindActorByEntry(SUIT_ViewWindow *theWindow,
                                const char* theEntry)
   {
@@ -296,25 +331,6 @@ namespace SMESH{
   }
 
 
-  void FitAll(){
-    if(SVTK_ViewWindow* wnd = GetCurrentVtkView() ){
-      wnd->onFitAll();
-      wnd->Repaint();
-    }
-  }
-
-  vtkRenderer* GetCurrentRenderer(){
-    if(SVTK_ViewWindow* wnd = GetCurrentVtkView() )
-      return wnd->getRenderer();
-    return NULL;
-  }
-
-  void RepaintCurrentView(){
-    if(SVTK_ViewWindow* wnd = GetCurrentVtkView() )
-      wnd->getRenderer()->Render();
-      //wnd->Repaint();
-  }
-
   void UpdateView(SUIT_ViewWindow *theWnd, EDisplaing theAction, const char* theEntry)
   {
     if(SVTK_ViewWindow* aViewWnd = GetVtkViewWindow(theWnd)){
@@ -344,6 +360,7 @@ namespace SMESH{
            case eDisplay:
            case eDisplayOnly:
              anActor->SetVisibility(true);
+             if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange();
              break;
            case eErase:
              anActor->SetVisibility(false);
@@ -357,7 +374,7 @@ namespace SMESH{
            _PTR(Study) aDocument = aStudy->studyDS();
            if((anActor = CreateActor(aDocument,theEntry,true))) {
              DisplayActor(theWnd,anActor);
-             FitAll();
+             // FitAll(); - PAL16770(Display of a group performs an automatic fit all)
            }
            break;
          }
@@ -378,7 +395,7 @@ namespace SMESH{
 
   void UpdateView(){
     if(SVTK_ViewWindow* aWnd = SMESH::GetCurrentVtkView()){
-      SalomeApp_SelectionMgr* mgr = SMESHGUI::selectionMgr();
+      LightApp_SelectionMgr* mgr = SMESHGUI::selectionMgr();
       SALOME_ListIO selected; mgr->selectedObjects( selected );
 
       if( selected.Extent() == 0){
@@ -416,102 +433,120 @@ namespace SMESH{
   }
 
 
-  void UpdateSelectionProp() {
-    SUIT_Study* aStudy = GetActiveStudy();
-    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( aStudy->application() );
+  void UpdateSelectionProp( SMESHGUI* theModule ) {
+    if( !theModule )
+      return;
+
+    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( theModule->application() );
+    if( !app )
+    {
+      MESSAGE( "UpdateSelectionProp: Application is null" );
+      return;
+    }
+
     SUIT_ViewManager* vm = app->activeViewManager();
+    if( !vm )
+    {
+      MESSAGE( "UpdateSelectionProp: View manager is null" );
+      return;
+    }
+
     QPtrVector<SUIT_ViewWindow> views = vm->getViews();
 
-    SUIT_ResourceMgr* mgr = SMESHGUI::resourceMgr();
-
-    QColor aHiColor = mgr->colorValue( "SMESH", "SettingsSelectColor", Qt::white ),
-           aSelColor = mgr->colorValue( "SMESH", "SettingsItemSelectColor", Qt::yellow ),
-          aPreColor = mgr->colorValue( "SMESH", "SettingsPreSelectColor", Qt::cyan );
-
-    int SW = mgr->integerValue( "SMESH", "SettingsItemSelectWidth", 5 ),
-        PW = mgr->integerValue( "SMESH", "SettingsPreSelectWidth", 5 );
-
-    double SP1 = mgr->doubleValue( "SMESH", "SettingsNodeSelectTol", 0.025 ),
-           SP2 = mgr->doubleValue( "SMESH", "SettingsElementsSelectTol", 0.001 );
-
-    for ( int i=0, n=views.count(); i<n; i++ ) {
-        SVTK_ViewWindow* aVtkView = GetVtkViewWindow( views[i] );
-       if (!aVtkView) continue;
-       // update VTK viewer properties
-       SVTK_RenderWindowInteractor* anInteractor = aVtkView->getRWInteractor();
-       if (anInteractor) {
-         // mesh element selection
-         anInteractor->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255.,
-                                        aSelColor.blue()/255., SW );
-
-         // tolerances
-         anInteractor->SetSelectionTolerance(SP1, SP2);
-
-         // pre-selection
-         SVTK_InteractorStyle* aStyle =
-           dynamic_cast<SVTK_InteractorStyle*>( anInteractor->GetInteractorStyle() );
-         if (aStyle) {
-           aStyle->setPreselectionProp(aPreColor.red()/255., aPreColor.green()/255.,
-                                       aPreColor.blue()/255., PW);
-         }
-       }
+    SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( theModule );
+    if( !mgr )
+    {
+      MESSAGE( "UpdateSelectionProp: Resource manager is null" );
+      return;
+    }
+
+    QColor aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ),
+           aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ),
+          aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan );
+
+    int SW = mgr->integerValue( "SMESH", "selection_width", 5 ),
+        PW = mgr->integerValue( "SMESH", "highlight_width", 5 );
+
+    double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ),
+           SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 );
+
+    for ( int i=0, n=views.count(); i<n; i++ ){
+      // update VTK viewer properties
+      if(SVTK_ViewWindow* aVtkView = GetVtkViewWindow( views[i] )){
+       // mesh element selection
+       aVtkView->SetSelectionProp(aSelColor.red()/255.,
+                                  aSelColor.green()/255.,
+                                  aSelColor.blue()/255.,
+                                  SW );
+       // tolerances
+       aVtkView->SetSelectionTolerance(SP1, SP2);
+
+       // pre-selection
+       aVtkView->SetPreselectionProp(aPreColor.red()/255.,
+                                     aPreColor.green()/255.,
+                                     aPreColor.blue()/255.,
+                                     PW);
        // update actors
        vtkRenderer* aRenderer = aVtkView->getRenderer();
        vtkActorCollection *aCollection = aRenderer->GetActors();
        aCollection->InitTraversal();
        while(vtkActor *anAct = aCollection->GetNextActor()){
          if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
-           anActor->SetHighlightColor(aHiColor.red()/255., aHiColor.green()/255.,
+           anActor->SetHighlightColor(aHiColor.red()/255.,
+                                      aHiColor.green()/255.,
                                       aHiColor.blue()/255.);
-           anActor->SetPreHighlightColor(aPreColor.red()/255., aPreColor.green()/255.,
+           anActor->SetPreHighlightColor(aPreColor.red()/255.,
+                                         aPreColor.green()/255.,
                                          aPreColor.blue()/255.);
          }
        }
+      }
     }
   }
 
 
   //----------------------------------------------------------------------------
-  SVTK_InteractorStyle* GetInteractorStyle(SUIT_ViewWindow *theWindow){
-    if(SVTK_ViewWindow* aWnd = GetVtkViewWindow(theWindow)){
-      if(SVTK_RenderWindowInteractor* anInteractor = aWnd->getRWInteractor()){
-       return dynamic_cast<SVTK_InteractorStyle*>( anInteractor->GetInteractorStyle() );
-      }
-    }
+  SVTK_Selector*
+  GetSelector(SUIT_ViewWindow *theWindow)
+  {
+    if(SVTK_ViewWindow* aWnd = GetVtkViewWindow(theWindow))
+      return aWnd->GetSelector();
+
     return NULL;
   }
 
   void SetFilter(const Handle(VTKViewer_Filter)& theFilter,
-                SVTK_InteractorStyle* theStyle)
+                SVTK_Selector* theSelector)
   {
-    theStyle->SetFilter(theFilter);
+    if (theSelector)
+      theSelector->SetFilter(theFilter);
   }
 
-  Handle(VTKViewer_Filter) GetFilter(int theId, SVTK_InteractorStyle* theStyle)
+  Handle(VTKViewer_Filter) GetFilter(int theId, SVTK_Selector* theSelector)
   {
-    return theStyle->GetFilter(theId);
+    return theSelector->GetFilter(theId);
   }
 
-  bool IsFilterPresent(int theId, SVTK_InteractorStyle* theStyle)
+  bool IsFilterPresent(int theId, SVTK_Selector* theSelector)
   {
-    return theStyle->IsFilterPresent(theId);
+    return theSelector->IsFilterPresent(theId);
   }
 
-  void RemoveFilter(int theId, SVTK_InteractorStyle* theStyle)
+  void RemoveFilter(int theId, SVTK_Selector* theSelector)
   {
-    theStyle->RemoveFilter(theId);
+    theSelector->RemoveFilter(theId);
   }
 
-  void RemoveFilters(SVTK_InteractorStyle* theStyle)
+  void RemoveFilters(SVTK_Selector* theSelector)
   {
-    for ( int id = SMESHGUI_NodeFilter; theStyle && id < SMESHGUI_LastFilter; id++ )
-      theStyle->RemoveFilter( id );
+    for ( int id = SMESHGUI_NodeFilter; theSelector && id < SMESHGUI_LastFilter; id++ )
+      theSelector->RemoveFilter( id );
   }
 
   bool IsValid(SALOME_Actor* theActor, int theCellId,
-              SVTK_InteractorStyle* theStyle)
+              SVTK_Selector* theSelector)
   {
-    return theStyle->IsValid(theActor,theCellId);
+    return theSelector->IsValid(theActor,theCellId);
   }
 
 
@@ -554,8 +589,8 @@ namespace SMESH{
 
 
   //----------------------------------------------------------------------------
-  int GetNameOfSelectedNodes(SVTK_Selector* theSelector, 
-                            const Handle(SALOME_InteractiveObject)& theIO, 
+  int GetNameOfSelectedNodes(SVTK_Selector* theSelector,
+                            const Handle(SALOME_InteractiveObject)& theIO,
                             QString& theName)
   {
     theName = "";
@@ -568,8 +603,8 @@ namespace SMESH{
     return aMapIndex.Extent();
   }
 
-  int GetNameOfSelectedElements(SVTK_Selector* theSelector, 
-                               const Handle(SALOME_InteractiveObject)& theIO, 
+  int GetNameOfSelectedElements(SVTK_Selector* theSelector,
+                               const Handle(SALOME_InteractiveObject)& theIO,
                                QString& theName)
   {
     theName = "";
@@ -589,12 +624,12 @@ namespace SMESH{
   }
 
 
-  int GetEdgeNodes(SVTK_Selector* theSelector, 
+  int GetEdgeNodes(SVTK_Selector* theSelector,
                   const TVisualObjPtr& theVisualObject,
-                  int& theId1, 
+                  int& theId1,
                   int& theId2)
   {
-    const SALOME_ListIO& selected = theSelector->StoredIObjects(); 
+    const SALOME_ListIO& selected = theSelector->StoredIObjects();
 
     if ( selected.Extent() != 1 )
       return -1;
@@ -624,7 +659,7 @@ namespace SMESH{
   }
 
   //----------------------------------------------------------------------------
-  int GetNameOfSelectedNodes(SalomeApp_SelectionMgr *theMgr,
+  int GetNameOfSelectedNodes(LightApp_SelectionMgr *theMgr,
                             const Handle(SALOME_InteractiveObject)& theIO,
                             QString& theName)
   {
@@ -642,7 +677,7 @@ namespace SMESH{
     return -1;
   }
 
-  int GetNameOfSelectedNodes(SalomeApp_SelectionMgr *theMgr, QString& theName){
+  int GetNameOfSelectedNodes(LightApp_SelectionMgr *theMgr, QString& theName){
     theName = "";
     SALOME_ListIO selected; theMgr->selectedObjects( selected );
     if(selected.Extent() == 1){
@@ -651,9 +686,9 @@ namespace SMESH{
     }
     return -1;
   }
-  
 
-  int GetNameOfSelectedElements(SalomeApp_SelectionMgr *theMgr,
+
+  int GetNameOfSelectedElements(LightApp_SelectionMgr *theMgr,
                                const Handle(SALOME_InteractiveObject)& theIO,
                                QString& theName)
   {
@@ -677,7 +712,7 @@ namespace SMESH{
   }
 
 
-  int GetNameOfSelectedElements(SalomeApp_SelectionMgr *theMgr, QString& theName)
+  int GetNameOfSelectedElements(LightApp_SelectionMgr *theMgr, QString& theName)
   {
     theName = "";
     SALOME_ListIO selected; theMgr->selectedObjects( selected );
@@ -689,7 +724,7 @@ namespace SMESH{
     return -1;
   }
 
-  int GetSelected(SalomeApp_SelectionMgr*      theMgr,
+  int GetSelected(LightApp_SelectionMgr*       theMgr,
                  TColStd_IndexedMapOfInteger& theMap,
                  const bool                   theIsElement)
   {
@@ -707,7 +742,7 @@ namespace SMESH{
   }
 
 
-  int GetEdgeNodes( SalomeApp_SelectionMgr* theMgr, int& theId1, int& theId2 )
+  int GetEdgeNodes( LightApp_SelectionMgr* theMgr, int& theId1, int& theId2 )
   {
     SALOME_ListIO selected; theMgr->selectedObjects( selected );
 
@@ -749,7 +784,7 @@ namespace SMESH{
       vtkRenderer *aRenderer = aWnd->getRenderer();
       vtkActorCollection *aCollection = aRenderer->GetActors();
       aCollection->InitTraversal();
-      
+
       while ( vtkActor *anAct = aCollection->GetNextActor())
       {
         if ( SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>( anAct ) )