Salome HOME
PAL9391
[modules/gui.git] / src / SVTK / SVTK_ViewModel.cxx
1 #include <qpopupmenu.h>
2 #include <qcolordialog.h>
3
4 #include <vtkCamera.h>
5 #include <vtkRenderer.h>
6 #include <vtkActorCollection.h>
7
8 #include "SUIT_Session.h"
9
10 #include "SVTK_Selection.h"
11 #include "SVTK_ViewModel.h"
12 #include "SVTK_ViewWindow.h"
13 #include "SVTK_Prs.h"
14
15 #include "SVTK_RenderWindowInteractor.h"
16 #include "SVTK_RenderWindow.h"
17
18 #include "ToolsGUI.h"
19
20 #include "SALOME_Actor.h"
21 #include "SALOME_InteractiveObject.hxx"
22
23 #include "Utils_ORB_INIT.hxx"
24 #include "Utils_SINGLETON.hxx"
25 #include "SALOME_ModuleCatalog_impl.hxx"
26 #include "SALOME_NamingService.hxx"
27
28 #include "SALOMEDSClient.hxx"
29 #include "SALOMEDS_StudyManager.hxx"
30
31 // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
32 // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from 
33 // SALOMEDS::StudyManager - no linkage with SalomeApp. 
34
35 static _PTR(Study) getStudyDS() 
36 {
37   SALOMEDSClient_Study* aStudy = NULL;
38   _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
39
40   // get id of SUIT_Study, if it's a SalomeApp_Study, it will return
41   //    id of its underlying SALOMEDS::Study
42   SUIT_Application* app = SUIT_Session::session()->activeApplication();
43   if ( !app )  return _PTR(Study)(aStudy); 
44   SUIT_Study* stud = app->activeStudy();
45   if ( !stud ) return _PTR(Study)(aStudy);  
46   const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
47   // get SALOMEDS_Study with this id from StudyMgr
48   return aMgr->GetStudyByID( id );
49 }
50
51 //==========================================================
52 SVTK_Viewer::SVTK_Viewer()
53 {
54   myTrihedronSize = 100;
55 }
56
57 //==========================================================
58 SVTK_Viewer::~SVTK_Viewer() 
59 {
60 }
61
62 QColor SVTK_Viewer::backgroundColor() const
63 {
64   return myBgColor;
65 }
66
67 void SVTK_Viewer::setBackgroundColor( const QColor& c )
68 {
69   if ( c.isValid() )
70     myBgColor = c;
71 }
72
73 //==========================================================
74 SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
75 {
76   SVTK_ViewWindow* vw = new SVTK_ViewWindow( theDesktop, this );
77   vw->setBackgroundColor( backgroundColor() );
78   vw->SetTrihedronSize( trihedronSize() );
79   return vw;
80 }
81
82 int SVTK_Viewer::trihedronSize() const
83 {
84   return myTrihedronSize;
85 }
86
87 void SVTK_Viewer::setTrihedronSize( const int sz )
88 {
89   myTrihedronSize = sz;
90
91   SUIT_ViewManager* vm = getViewManager();
92   if ( !vm )
93     return;
94
95   QPtrVector<SUIT_ViewWindow> vec = vm->getViews();
96   for ( int i = 0; i < vec.count(); i++ )
97   {
98     SUIT_ViewWindow* win = vec.at( i );
99     if ( !win || !win->inherits( "SVTK_ViewWindow" ) )
100       continue;
101
102     SVTK_ViewWindow* vw = (SVTK_ViewWindow*)win;
103     vw->SetTrihedronSize( sz );
104   }
105 }
106
107 //==========================================================
108 void SVTK_Viewer::setViewManager(SUIT_ViewManager* theViewManager)
109 {
110   SUIT_ViewModel::setViewManager(theViewManager);
111
112   if ( !theViewManager )
113     return;
114
115   connect(theViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), 
116           this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*)));
117   
118   connect(theViewManager, SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)), 
119           this, SLOT(onMouseMove(SUIT_ViewWindow*, QMouseEvent*)));
120   
121   connect(theViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), 
122           this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
123 }
124
125 //==========================================================
126 void SVTK_Viewer::contextMenuPopup( QPopupMenu* thePopup )
127 {
128   thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_DUMP_VIEW" ), this, SLOT( onDumpView() ) );
129   thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_CHANGE_BACKGROUD" ), this, SLOT( onChangeBgColor() ) );
130
131   thePopup->insertSeparator();
132
133   SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
134   if ( aView && !aView->getToolBar()->isVisible() )
135     thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_SHOW_TOOLBAR" ), this, SLOT( onShowToolbar() ) );
136 }
137
138 //==========================================================
139 void SVTK_Viewer::onMousePress(SUIT_ViewWindow* vw, QMouseEvent* event)
140 {
141   if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
142     if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
143       switch(event->button()) {
144       case LeftButton:
145         aRWI->LeftButtonPressed(event) ;
146         break ;
147       case MidButton:
148         aRWI->MiddleButtonPressed(event) ;
149         break ;
150       case RightButton:
151         aRWI->RightButtonPressed(event) ;
152         break;
153       default:
154         break ;
155       }
156     }
157   }
158 }
159
160 //==========================================================
161 void 
162 SVTK_Viewer
163 ::onMouseMove(SUIT_ViewWindow* vw, QMouseEvent* event)
164 {
165   if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
166     if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
167       aRWI->MouseMove( event );
168     }
169   }
170 }
171
172 //==========================================================
173 void 
174 SVTK_Viewer
175 ::onMouseRelease(SUIT_ViewWindow* vw, QMouseEvent* event)
176 {
177   if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
178     if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
179       switch(event->button()) {
180       case LeftButton:
181         aRWI->LeftButtonReleased(event) ;
182         break ;
183       case MidButton:
184         aRWI->MiddleButtonReleased(event) ;
185         break ;
186       case RightButton:
187         aRWI->RightButtonReleased(event) ;
188         break;
189       default:
190         break ;
191       }
192     }
193   }
194 }
195
196 //==========================================================
197 void 
198 SVTK_Viewer
199 ::enableSelection(bool isEnabled)
200 {
201   mySelectionEnabled = isEnabled;
202   //!! To be done for view windows
203 }
204
205 //==========================================================
206 void
207 SVTK_Viewer
208 ::enableMultiselection(bool isEnable)
209 {
210   myMultiSelectionEnabled = isEnable;
211   //!! To be done for view windows
212 }
213
214 void SVTK_Viewer::onDumpView()
215 {
216   SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
217   if ( aView )
218     aView->onDumpView();
219 }
220
221 //==========================================================
222 void SVTK_Viewer::onChangeBgColor()
223 {
224   QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
225   for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
226     if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
227       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
228         QColor aColor = QColorDialog::getColor( aView->backgroundColor(), aView);
229         if ( aColor.isValid() )
230           aView->setBackgroundColor(aColor);
231       }
232 }
233
234 //==========================================================
235 void
236 SVTK_Viewer
237 ::onShowToolbar() 
238 {
239   QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
240   for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
241     if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
242       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
243         aView->getToolBar()->show();    
244 }
245
246 //==========================================================
247 void
248 SVTK_Viewer
249 ::Display( const SALOME_VTKPrs* prs )
250 {
251   // try do downcast object
252   if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
253     if(aPrs->IsNull())
254       return;
255     if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
256       // get SALOMEDS Study
257       _PTR(Study) aStudy(getStudyDS());
258       anActorCollection->InitTraversal();
259       while(vtkActor* anActor = anActorCollection->GetNextActor()){
260         if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
261           // Set visibility flag
262           Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
263           if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
264             ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this);
265           }
266           // just display the object
267           QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
268           for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
269             if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
270               if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
271                 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor()){
272                   aRWI->Display(anAct,false);
273                   if(anAct->IsSetCamera()){
274                     vtkRenderer* aRenderer =  aView->getRenderer();
275                     anAct->SetCamera( aRenderer->GetActiveCamera() );
276                   }
277                 }
278               }
279             }
280           }
281         }
282       }
283     }
284   }
285 }
286
287 //==========================================================
288 void
289 SVTK_Viewer
290 ::Erase( const SALOME_VTKPrs* prs, const bool forced )
291 {
292   // try do downcast object
293   if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
294     if(aPrs->IsNull())
295       return;
296     if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
297       // get SALOMEDS Study
298       _PTR(Study) aStudy(getStudyDS());
299       anActorCollection->InitTraversal();
300       while(vtkActor* anActor = anActorCollection->GetNextActor())
301         if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
302           // Set visibility flag
303           Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
304           if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
305             ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
306           }
307           // just display the object
308           QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
309           for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
310             if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
311               if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
312                 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
313                   if ( forced )
314                     aRWI->Remove(anAct,false);
315                   else
316                     aRWI->Erase(anAct,forced);
317           }
318         }
319     }
320   }
321 }
322   
323 //==========================================================
324 void
325 SVTK_Viewer
326 ::EraseAll( const bool forced )
327 {
328   _PTR(Study) aStudy(getStudyDS());
329   QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
330   for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
331     if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
332       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
333         vtkRenderer* aRenderer =  aView->getRenderer();
334         vtkActorCollection* anActorCollection = aRenderer->GetActors();
335         anActorCollection->InitTraversal();
336         while(vtkActor* anActor = anActorCollection->GetNextActor()){
337           if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
338             // Set visibility flag
339             Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
340             if(!anObj.IsNull() && anObj->hasEntry() && aStudy)
341               ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
342             if(forced)
343               aRenderer->RemoveActor(anAct);
344             else{
345               // just erase actor
346               anAct->SetVisibility( false );
347               // erase dependent actors
348               vtkActorCollection* aCollection = vtkActorCollection::New();
349               anAct->GetChildActors( aCollection );
350               aCollection->InitTraversal();
351               while(vtkActor* aSubAct = aCollection->GetNextActor())
352                 aSubAct->SetVisibility( false );
353               aCollection->Delete();
354             }
355           }
356         }
357       }
358     }
359   }
360   Repaint();
361 }
362
363 //==========================================================
364 SALOME_Prs* 
365 SVTK_Viewer
366 ::CreatePrs( const char* entry )
367 {
368   SVTK_Prs* prs = new SVTK_Prs();
369   if ( entry ) {
370     vtkRenderer* rnr =  ( (SVTK_ViewWindow*) getViewManager()->getActiveView() )->getRenderer();
371     vtkActorCollection* theActors = rnr->GetActors();
372     theActors->InitTraversal();
373     vtkActor* ac;
374     while( ( ac = theActors->GetNextActor() ) ) {
375       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
376       if ( anActor && anActor->hasIO() && !strcmp( anActor->getIO()->getEntry(), entry ) ) {
377         prs->AddObject( ac );
378       }
379     }
380   }
381   return prs;
382 }
383
384 //==========================================================
385 void
386 SVTK_Viewer
387 ::BeforeDisplay( SALOME_Displayer* d )
388 {
389   d->BeforeDisplay( this, SALOME_VTKViewType() );
390 }
391
392 //==========================================================
393 void
394 SVTK_Viewer::AfterDisplay( SALOME_Displayer* d )
395 {
396   d->AfterDisplay( this, SALOME_VTKViewType() );
397 }
398
399 //==========================================================
400 bool
401 SVTK_Viewer
402 ::isVisible( const Handle(SALOME_InteractiveObject)& io )
403 {
404   QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
405   for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
406     if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
407       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
408         if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
409           if(!aRWI->isVisible( io ))
410             return false;
411   return true;
412 }
413
414 //==========================================================
415 void 
416 SVTK_Viewer
417 ::Repaint()
418 {
419 //  if (theUpdateTrihedron) onAdjustTrihedron();
420   QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
421   for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
422     if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
423       if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
424         if(SVTK_RenderWindow* aRW = aView->getRenderWindow())
425         {
426           aView->getRenderer()->Render();
427           aView->getRWInteractor()->unHighlightAll();
428           aRW->update();
429         }
430 }
431
432 void 
433 SVTK_Viewer
434 ::onSelectionChanged()
435 {
436   emit selectionChanged();
437 }
438