Salome HOME
b0de0c81bfd2310fd00bbc04fc77433ba1d968ef
[modules/gui.git] / src / SVTK / SVTK_ViewWindow.h
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #ifndef SVTK_VIEWWINDOW_H
24 #define SVTK_VIEWWINDOW_H
25
26 #ifdef WIN32
27 #pragma warning( disable:4251 )
28 #endif
29
30 #include "SVTK.h"
31 #include "SVTK_Selection.h"
32 #include "Qtx.h"
33 #include "SUIT_ViewWindow.h"
34
35 #include "SALOME_InteractiveObject.hxx"
36
37 #include <QImage>
38 #include <vtkSmartPointer.h>
39
40 class SUIT_Desktop;
41 class SUIT_ResourceMgr;
42
43 class VTKViewer_Actor;
44 class VTKViewer_Trihedron;
45
46 class SVTK_ViewModelBase;
47 class SVTK_Selector;
48 class SVTK_View;
49
50 class SVTK_CubeAxesActor2D;
51
52 class vtkRenderer;
53 class vtkRenderWindow;
54 class vtkRenderWindowInteractor;
55 class vtkInteractorStyle;
56 class vtkCallbackCommand;
57
58 class SVTK_RenderWindowInteractor;
59 class SVTK_Renderer;
60 class SVTK_NonIsometricDlg;
61 class SVTK_UpdateRateDlg;
62 class SVTK_CubeAxesDlg;
63 class SVTK_SetRotationPointDlg;
64 class SVTK_InteractorStyle;
65 class SVTK_KeyFreeInteractorStyle;
66 class SVTK_ViewParameterDlg;
67 class SVTK_Recorder;
68
69 namespace salomevtk
70 {
71   class vtkPVAxesWidget;
72 }
73
74 class vtkObject;
75 class QtxAction;
76
77 namespace SVTK
78 {
79   SVTK_EXPORT
80     int convertAction( const int );
81 }
82
83 //! Define a container for SALOME VTK view window
84 class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
85 {
86   Q_OBJECT;
87
88  public:
89   //! To construct #SVTK_ViewWindow instance
90   SVTK_ViewWindow(SUIT_Desktop* theDesktop);
91
92   virtual ~SVTK_ViewWindow();
93   
94   virtual QImage dumpView();
95
96   //! To initialize #SVTK_ViewWindow instance
97   virtual void Initialize(SVTK_ViewModelBase* theModel);
98
99   //! Get #SVTK_View
100   SVTK_View* getView();
101
102   //! Get render window
103   vtkRenderWindow* getRenderWindow();
104
105   //! Get interactor
106   vtkRenderWindowInteractor* getInteractor() const;
107
108   //! Get SVTK interactor
109   SVTK_RenderWindowInteractor*  GetInteractor() const;
110
111   //! Get current interactor style
112   vtkInteractorStyle* GetInteractorStyle() const;
113
114   //! Add interactor style to the stack of styles
115   void PushInteractorStyle(vtkInteractorStyle* theStyle);
116
117   //! Remove last interactor style from the stack of styles
118   void PopInteractorStyle();
119
120   //! Get renderer
121   vtkRenderer* getRenderer() const;
122   
123   //! Get SVTK renderer
124   SVTK_Renderer* GetRenderer() const;
125
126   //! Get selector
127   SVTK_Selector* GetSelector() const;
128   
129   //! Set selection mode
130   Selection_Mode SelectionMode() const;
131   
132   //! Change selection mode
133   virtual void SetSelectionMode(Selection_Mode theMode);
134
135   //! Set background color [obsolete] 
136   virtual void setBackgroundColor( const QColor& );
137
138   //! Get background color [obsolete]
139   QColor backgroundColor() const;
140
141   //! Set background
142   virtual void setBackground( const Qtx::BackgroundData& );
143
144   //! Get background
145   Qtx::BackgroundData background() const;
146
147   //! Return \c true if "display trihedron" flag is set
148   bool isTrihedronDisplayed();
149
150   //! Return \c true if "show graduated axes" flag is set
151   bool isCubeAxesDisplayed();
152  
153   /*  interactive object management */
154   //! Redirect the request to #SVTK_View::highlight (to support old code)
155   virtual void highlight(const Handle(SALOME_InteractiveObject)& theIO, 
156                          bool theIsHighlight = true, 
157                          bool theIsUpdate = true);
158
159   //! Redirect the request to #SVTK_View::unHighlightAll (to support old code)
160   virtual void unHighlightAll();
161
162   //! Redirect the request to #SVTK_View::isInViewer (to support old code)
163   bool isInViewer(const Handle(SALOME_InteractiveObject)& theIObject);
164
165   //! Redirect the request to #SVTK_View::isVisible (to support old code)
166   bool isVisible(const Handle(SALOME_InteractiveObject)& theIObject);
167
168   //! Redirect the request to #SVTK_View::FindIObject (to support old code)
169   //----------------------------------------------------------------------------
170   Handle(SALOME_InteractiveObject) FindIObject(const char* theEntry);
171   
172   /* display */         
173   //----------------------------------------------------------------------------
174   //! Redirect the request to #SVTK_View::Display (to support old code)
175   virtual void Display(const Handle(SALOME_InteractiveObject)& theIObject,
176                        bool theImmediatly = true);
177
178   //! Redirect the request to #SVTK_View::DisplayOnly (to support old code)
179   virtual void DisplayOnly(const Handle(SALOME_InteractiveObject)& theIObject);
180
181   //! Redirect the request to #SVTK_View::Erase (to support old code)
182   virtual void Erase(const Handle(SALOME_InteractiveObject)& theIObject,
183                      bool theImmediatly = true);
184
185   //! Redirect the request to #SVTK_View::DisplayAll (to support old code)
186   virtual void DisplayAll();
187
188   //! Redirect the request to #SVTK_View::EraseAll (to support old code)
189   virtual void EraseAll();
190
191   //! To repaint the viewer
192   virtual void Repaint(bool theUpdateTrihedron = true);
193
194   //----------------------------------------------------------------------------
195   //! Redirect the request to #SVTK_Renderer::SetScale
196   virtual void SetScale( double theScale[3] );
197
198   //! Redirect the request to #SVTK_Renderer::GetScale
199   virtual void GetScale( double theScale[3] );
200
201   //! Redirect the request to #SVTK_Renderer::AddActor
202   virtual void AddActor(VTKViewer_Actor* theActor,
203                         bool theIsUpdate = false,
204                         bool theIsAdjustActors = true);
205
206   //! Redirect the request to #SVTK_Renderer::RemoveActor
207   virtual void RemoveActor(VTKViewer_Actor* theActor,
208                            bool theIsUpdate = false,
209                            bool theIsAdjustActors = true);
210
211   //----------------------------------------------------------------------------
212   //! Redirect the request to #SVTK_Renderer::AdjustActors
213   virtual void AdjustTrihedrons(const bool theIsForced);
214
215   //! Redirect the request to #SVTK_Renderer::GetTrihedron
216   VTKViewer_Trihedron* GetTrihedron();
217
218   //! Redirect the request to #SVTK_Renderer::GetCubeAxes
219   SVTK_CubeAxesActor2D* GetCubeAxes();
220
221   //! Redirect the request to #SVTK_Renderer::GetTrihedronSize
222   double GetTrihedronSize() const;
223
224   //! Redirect the request to #SVTK_Renderer::SetTrihedronSize
225   virtual void SetTrihedronSize( const double, const bool = true );
226
227   //! Set incremental speed
228   virtual void SetIncrementalSpeed( const int, const int = 0 );
229
230   //! Set current projection mode
231   virtual void SetProjectionMode( const int );
232
233   //! Sets stereo type
234   virtual void SetStereoType( const int );
235
236   //! Sets anaglyph filter
237   virtual void SetAnaglyphFilter( const int );
238
239   //! Set interactive style
240   virtual void SetInteractionStyle( const int );
241
242   //! Set zooming style
243   virtual void SetZoomingStyle( const int );
244
245   //! Set preselection mode
246   virtual void SetPreSelectionMode( Preselection_Mode );
247
248   //! Enable/disable selection
249   virtual void SetSelectionEnabled( bool );
250
251   //! Customize space mouse buttons
252   virtual void SetSpacemouseButtons( const int, const int, const int );
253
254   //! Set selection properties
255   virtual void SetSelectionProp(const double& theRed = 1, 
256                                 const double& theGreen = 1,
257                                 const double& theBlue = 0, 
258                                 const int& theWidth = 5);
259
260   //! Redirect the request to #SVTK_Renderer::SetPreselectionProp
261   virtual void SetPreselectionProp(const double& theRed = 0, 
262                                    const double& theGreen = 1,
263                                    const double& theBlue = 1, 
264                                    const int& theWidth = 5);
265
266   //! Redirect the request to #SVTK_Renderer::SetSelectionTolerance
267   virtual void SetSelectionTolerance(const double& theTolNodes = 0.025, 
268                                      const double& theTolCell = 0.001,
269                                      const double& theTolObjects = 0.025);
270
271   //! Get visibility status of the static trihedron
272   bool IsStaticTrihedronVisible() const;
273
274   //! Set visibility status of the static trihedron
275   virtual void SetStaticTrihedronVisible( const bool );
276
277   //! Methods to save/restore visual parameters of a view (pan, zoom, etc.)
278   virtual QString getVisualParameters();
279   
280   virtual void setVisualParameters( const QString& parameters );
281
282   virtual bool eventFilter( QObject*, QEvent* );
283
284   virtual void RefreshDumpImage();
285
286   void emitTransformed();
287
288   //! To invoke a VTK event on #SVTK_RenderWindowInteractor instance
289   void InvokeEvent(unsigned long theEvent, void* theCallData);
290   
291   virtual SUIT_CameraProperties cameraProperties();
292   
293  signals:
294   void Show( QShowEvent * );
295   void Hide( QHideEvent * );
296
297 public slots:
298   virtual void showEvent( QShowEvent * );
299   virtual void hideEvent( QHideEvent * );
300   virtual void onSelectionChanged();
301
302   void onChangeRotationPoint(bool theIsActivate);
303
304   void activateSetRotationGravity();
305   void activateSetRotationSelected(void* theData);
306   void activateStartPointSelection( Selection_Mode );
307
308   void onUpdateRate(bool theIsActivate);
309   void onNonIsometric(bool theIsActivate);
310   void onGraduatedAxes(bool theIsActivate);
311
312   void activateZoom();
313   void activateWindowFit();
314   void activateRotation();
315   void activatePanning(); 
316   void activateGlobalPanning(); 
317
318   void onPerspectiveMode();
319
320   void activateProjectionMode(int);
321
322   void activateSetFocalPointGravity();
323   void activateSetFocalPointSelected();
324   void activateStartFocalPointSelection();
325
326   void onViewParameters(bool theIsActivate);
327
328   void onSwitchInteractionStyle(bool theOn);
329   void onSwitchZoomingStyle(bool theOn);
330
331   void onSwitchPreSelectionMode(int theMode);
332   void onEnableSelection(bool theOn);
333
334   void onStartRecording();
335   void onPlayRecording();
336   void onPauseRecording();
337   void onStopRecording();
338
339 signals:
340  void selectionChanged();
341  void actorAdded(VTKViewer_Actor*);
342  void actorRemoved(VTKViewer_Actor*);
343  void transformed(SVTK_ViewWindow*);
344
345 public slots:
346   //! Redirect the request to #SVTK_Renderer::OnFrontView
347   virtual void onFrontView(); 
348
349   //! Redirect the request to #SVTK_Renderer::OnBackView
350   virtual void onBackView(); 
351
352   //! Redirect the request to #SVTK_Renderer::OnTopView
353   virtual void onTopView();
354
355   //! Redirect the request to #SVTK_Renderer::OnBottomView
356   virtual void onBottomView();
357
358   //! Redirect the request to #SVTK_Renderer::OnRightView
359   virtual void onRightView(); 
360
361   //! Redirect the request to #SVTK_Renderer::OnLeftView
362   virtual void onLeftView();     
363
364   //! Redirect the request to #SVTK_Renderer::onClockWiseView
365   virtual void onClockWiseView();
366
367   //! Redirect the request to #SVTK_Renderer::onAntiClockWiseView
368   virtual void onAntiClockWiseView();
369
370   //! Redirect the request to #SVTK_Renderer::OnResetView
371   virtual void onResetView();     
372
373   //! Redirect the request to #SVTK_Renderer::OnFitAll
374   virtual void onFitAll();
375
376   //! Redirect the request to #SVTK_Renderer::OnFitSelection
377   virtual void onFitSelection();
378
379   //! Redirect the request to #SVTK_Renderer::OnViewTrihedron
380   virtual void onViewTrihedron(bool); 
381
382   //! Redirect the request to #SVTK_Renderer::OnViewCubeAxes
383   virtual void onViewCubeAxes();
384
385   //! Redirect the request to #SVTK_Renderer::OnAdjustTrihedron
386   virtual void onAdjustTrihedron();
387
388   //! Redirect the request to #SVTK_Renderer::OnAdjustCubeAxes
389   virtual void onAdjustCubeAxes();
390   
391   virtual void synchronize(SVTK_ViewWindow*);
392     
393 protected slots:
394   void synchronize( SUIT_ViewWindow* );
395   void onKeyPressed(QKeyEvent* event);
396   void onKeyReleased(QKeyEvent* event);
397   void onMousePressed(QMouseEvent* event);
398   void onMouseDoubleClicked(QMouseEvent* event);
399   void onMouseReleased(QMouseEvent* event);
400   void onMouseMoving(QMouseEvent* event);
401
402 public:
403   enum ProjectionType { Parallel, Projection, Stereo };
404
405   enum StereoType { CrystalEyes, RedBlue, Interlaced, Left, Right, Dresden, Anaglyph, Checkerboard, SplitViewPortHorizontal };
406
407   enum AnaglyphFilter { RedCyan, YellowBlue, GreenMagenta };
408
409 protected:
410   virtual void Initialize(SVTK_View* theView,
411                           SVTK_ViewModelBase* theModel);
412
413   // Main process event method
414   static void ProcessEvents(vtkObject* object,
415                             unsigned long event,
416                             void* clientdata,
417                             void* calldata);
418
419   bool isOpenGlStereoSupport() const;
420
421   void doSetVisualParameters( const QString&, bool = false );
422   void SetEventDispatcher(vtkObject* theDispatcher);
423
424   QImage dumpViewContent();
425
426   virtual QString filter() const;
427   virtual bool dumpViewToFormat( const QImage& img, const QString& fileName, const QString& format );
428   
429   virtual bool action( const int );
430   
431   QtxAction* getAction( int ) const;
432   void createToolBar();
433   void createActions(SUIT_ResourceMgr* theResourceMgr);
434
435   enum { DumpId, FitAllId, FitRectId, FitSelectionId, ZoomId, PanId, GlobalPanId,
436          ChangeRotationPointId, RotationId,
437          FrontId, BackId, TopId, BottomId, LeftId, RightId, ClockWiseId, AntiClockWiseId, ResetId,
438          ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate,
439          ParallelModeId, ProjectionModeId, StereoModeId, ViewParametersId, SynchronizeId, SwitchInteractionStyleId,
440          SwitchZoomingStyleId, 
441          PreselectionId, StandardPreselectionId, DynamicPreselectionId, DisablePreselectionId, 
442          EnableSelectionId,
443          StartRecordingId, PlayRecordingId, PauseRecordingId, StopRecordingId };
444
445   SVTK_View* myView;
446   SVTK_ViewModelBase* myModel;
447
448   SVTK_RenderWindowInteractor* myInteractor;
449   vtkSmartPointer<SVTK_InteractorStyle> myDefaultInteractorStyle;
450   vtkSmartPointer<SVTK_KeyFreeInteractorStyle> myKeyFreeInteractorStyle;
451
452   QString myVisualParams; // used for delayed setting of view parameters 
453
454   vtkSmartPointer<vtkObject> myEventDispatcher;
455
456   // Used to process events
457   vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
458
459   SVTK_NonIsometricDlg* myNonIsometricDlg;
460   SVTK_UpdateRateDlg* myUpdateRateDlg;
461   SVTK_CubeAxesDlg* myCubeAxesDlg;
462   SVTK_SetRotationPointDlg* mySetRotationPointDlg;
463   SVTK_ViewParameterDlg* myViewParameterDlg;
464
465   QSize myPreRecordingMinSize;
466   QSize myPreRecordingMaxSize;
467
468   SVTK_Recorder* myRecorder;
469   QtxAction* myStartAction;
470   QtxAction* myPlayAction;
471   QtxAction* myPauseAction;
472   QtxAction* myStopAction;
473
474   int myToolBar;
475   int myRecordingToolBar;
476
477   salomevtk::vtkPVAxesWidget* myAxesWidget;
478   Qtx::BackgroundData myBackground;
479
480 private:
481   QImage myDumpImage;
482 };
483
484 #ifdef WIN32
485 #pragma warning( default:4251 )
486 #endif
487
488 #endif