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