Salome HOME
Merge from V6_main 11/02/2013
[modules/gui.git] / src / SVTK / SVTK_ViewWindow.h
1 // Copyright (C) 2007-2012  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.
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 class vtkPVAxesWidget;
70
71 class vtkObject;
72 class QtxAction;
73
74 namespace SVTK
75 {
76   SVTK_EXPORT
77     int convertAction( const int );
78 }
79
80 //! Define a container for SALOME VTK view window
81 class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
82 {
83   Q_OBJECT;
84
85  public:
86   //! To construct #SVTK_ViewWindow instance
87   SVTK_ViewWindow(SUIT_Desktop* theDesktop);
88
89   virtual ~SVTK_ViewWindow();
90   
91   virtual QImage dumpView();
92
93   //! To initialize #SVTK_ViewWindow instance
94   virtual void Initialize(SVTK_ViewModelBase* theModel);
95
96   //! Get #SVTK_View
97   SVTK_View* getView();
98
99   //! Get render window
100   vtkRenderWindow* getRenderWindow();
101
102   //! Get interactor
103   vtkRenderWindowInteractor* getInteractor() const;
104
105   //! Get SVTK interactor
106   SVTK_RenderWindowInteractor*  GetInteractor() const;
107
108   //! Get current interactor style
109   vtkInteractorStyle* GetInteractorStyle() const;
110
111   //! Add interactor style to the stack of styles
112   void PushInteractorStyle(vtkInteractorStyle* theStyle);
113
114   //! Remove last interactor style from the stack of styles
115   void PopInteractorStyle();
116
117   //! Get renderer
118   vtkRenderer* getRenderer() const;
119   
120   //! Get SVTK renderer
121   SVTK_Renderer* GetRenderer() const;
122
123   //! Get selector
124   SVTK_Selector* GetSelector() const;
125   
126   //! Set selection mode
127   Selection_Mode SelectionMode() const;
128   
129   //! Change selection mode
130   virtual void SetSelectionMode(Selection_Mode theMode);
131
132   //! Set background color [obsolete] 
133   virtual void setBackgroundColor( const QColor& );
134
135   //! Get background color [obsolete]
136   QColor backgroundColor() const;
137
138   //! Set background
139   virtual void setBackground( const Qtx::BackgroundData& );
140
141   //! Get background
142   Qtx::BackgroundData background() const;
143
144   //! Return \c true if "display trihedron" flag is set
145   bool isTrihedronDisplayed();
146
147   //! Return \c true if "show graduated axes" flag is set
148   bool isCubeAxesDisplayed();
149  
150   /*  interactive object management */
151   //! Redirect the request to #SVTK_View::highlight (to support old code)
152   virtual void highlight(const Handle(SALOME_InteractiveObject)& theIO, 
153                          bool theIsHighlight = true, 
154                          bool theIsUpdate = true);
155
156   //! Redirect the request to #SVTK_View::unHighlightAll (to support old code)
157   virtual void unHighlightAll();
158
159   //! Redirect the request to #SVTK_View::isInViewer (to support old code)
160   bool isInViewer(const Handle(SALOME_InteractiveObject)& theIObject);
161
162   //! Redirect the request to #SVTK_View::isVisible (to support old code)
163   bool isVisible(const Handle(SALOME_InteractiveObject)& theIObject);
164
165   //! Redirect the request to #SVTK_View::FindIObject (to support old code)
166   //----------------------------------------------------------------------------
167   Handle(SALOME_InteractiveObject) FindIObject(const char* theEntry);
168   
169   /* display */         
170   //----------------------------------------------------------------------------
171   //! Redirect the request to #SVTK_View::Display (to support old code)
172   virtual void Display(const Handle(SALOME_InteractiveObject)& theIObject,
173                        bool theImmediatly = true);
174
175   //! Redirect the request to #SVTK_View::DisplayOnly (to support old code)
176   virtual void DisplayOnly(const Handle(SALOME_InteractiveObject)& theIObject);
177
178   //! Redirect the request to #SVTK_View::Erase (to support old code)
179   virtual void Erase(const Handle(SALOME_InteractiveObject)& theIObject,
180                      bool theImmediatly = true);
181
182   //! Redirect the request to #SVTK_View::DisplayAll (to support old code)
183   virtual void DisplayAll();
184
185   //! Redirect the request to #SVTK_View::EraseAll (to support old code)
186   virtual void EraseAll();
187
188   //! To repaint the viewer
189   virtual void Repaint(bool theUpdateTrihedron = true);
190
191   //----------------------------------------------------------------------------
192   //! Redirect the request to #SVTK_Renderer::SetScale
193   virtual void SetScale( double theScale[3] );
194
195   //! Redirect the request to #SVTK_Renderer::GetScale
196   virtual void GetScale( double theScale[3] );
197
198   //! Redirect the request to #SVTK_Renderer::AddActor
199   virtual void AddActor(VTKViewer_Actor* theActor,
200                         bool theIsUpdate = false,
201                         bool theIsAdjustActors = true);
202
203   //! Redirect the request to #SVTK_Renderer::RemoveActor
204   virtual void RemoveActor(VTKViewer_Actor* theActor,
205                            bool theIsUpdate = false,
206                            bool theIsAdjustActors = true);
207
208   //----------------------------------------------------------------------------
209   //! Redirect the request to #SVTK_Renderer::AdjustActors
210   virtual void AdjustTrihedrons(const bool theIsForced);
211
212   //! Redirect the request to #SVTK_Renderer::GetTrihedron
213   VTKViewer_Trihedron* GetTrihedron();
214
215   //! Redirect the request to #SVTK_Renderer::GetCubeAxes
216   SVTK_CubeAxesActor2D* GetCubeAxes();
217
218   //! Redirect the request to #SVTK_Renderer::GetTrihedronSize
219   vtkFloatingPointType GetTrihedronSize() const;
220
221   //! Redirect the request to #SVTK_Renderer::SetTrihedronSize
222   virtual void SetTrihedronSize( const vtkFloatingPointType, const bool = true );
223
224   //! Set incremental speed
225   virtual void SetIncrementalSpeed( const int, const int = 0 );
226
227   //! Set current projection mode
228   virtual void SetProjectionMode( const int );
229
230   //! Set interactive style
231   virtual void SetInteractionStyle( const int );
232
233   //! Set zooming style
234   virtual void SetZoomingStyle( const int );
235
236   //! Set dynamic preselection on/off
237   virtual void SetDynamicPreSelection( bool );
238
239   //! Customize space mouse buttons
240   virtual void SetSpacemouseButtons( const int, const int, const int );
241
242   //! Set selection properties
243   virtual void SetSelectionProp(const double& theRed = 1, 
244                                 const double& theGreen = 1,
245                                 const double& theBlue = 0, 
246                                 const int& theWidth = 5);
247
248   //! Redirect the request to #SVTK_Renderer::SetPreselectionProp
249   virtual void SetPreselectionProp(const double& theRed = 0, 
250                                    const double& theGreen = 1,
251                                    const double& theBlue = 1, 
252                                    const int& theWidth = 5);
253
254   //! Redirect the request to #SVTK_Renderer::SetSelectionTolerance
255   virtual void SetSelectionTolerance(const double& theTolNodes = 0.025, 
256                                      const double& theTolCell = 0.001,
257                                      const double& theTolObjects = 0.025);
258
259   //! Get visibility status of the static trihedron
260   bool IsStaticTrihedronVisible() const;
261
262   //! Set visibility status of the static trihedron
263   virtual void SetStaticTrihedronVisible( const bool );
264
265   //! Methods to save/restore visual parameters of a view (pan, zoom, etc.)
266   virtual QString getVisualParameters();
267   
268   virtual void setVisualParameters( const QString& parameters );
269
270   virtual bool eventFilter( QObject*, QEvent* );
271
272   virtual void RefreshDumpImage();
273
274   void emitTransformed();
275
276   //! To invoke a VTK event on #SVTK_RenderWindowInteractor instance
277   void InvokeEvent(unsigned long theEvent, void* theCallData);
278   
279   virtual SUIT_CameraProperties cameraProperties();
280   
281  signals:
282   void Show( QShowEvent * );
283   void Hide( QHideEvent * );
284
285 public slots:
286   virtual void showEvent( QShowEvent * );
287   virtual void hideEvent( QHideEvent * );
288   virtual void onSelectionChanged();
289
290   void onChangeRotationPoint(bool theIsActivate);
291
292   void activateSetRotationGravity();
293   void activateSetRotationSelected(void* theData);
294   void activateStartPointSelection();
295
296   void onUpdateRate(bool theIsActivate);
297   void onNonIsometric(bool theIsActivate);
298   void onGraduatedAxes(bool theIsActivate);
299
300   void activateZoom();
301   void activateWindowFit();
302   void activateRotation();
303   void activatePanning(); 
304   void activateGlobalPanning(); 
305
306   void onPerspectiveMode();
307
308   void activateProjectionMode(int);
309
310   void activateSetFocalPointGravity();
311   void activateSetFocalPointSelected();
312   void activateStartFocalPointSelection();
313
314   void onViewParameters(bool theIsActivate);
315
316   void onSwitchInteractionStyle(bool theOn);
317   void onSwitchZoomingStyle(bool theOn);
318   void onSwitchDynamicPreSelection(bool theOn);
319
320   void onStartRecording();
321   void onPlayRecording();
322   void onPauseRecording();
323   void onStopRecording();
324
325 signals:
326  void selectionChanged();
327  void actorAdded(VTKViewer_Actor*);
328  void actorRemoved(VTKViewer_Actor*);
329  void transformed(SVTK_ViewWindow*);
330
331 public slots:
332   //! Redirect the request to #SVTK_Renderer::OnFrontView
333   virtual void onFrontView(); 
334
335   //! Redirect the request to #SVTK_Renderer::OnBackView
336   virtual void onBackView(); 
337
338   //! Redirect the request to #SVTK_Renderer::OnTopView
339   virtual void onTopView();
340
341   //! Redirect the request to #SVTK_Renderer::OnBottomView
342   virtual void onBottomView();
343
344   //! Redirect the request to #SVTK_Renderer::OnRightView
345   virtual void onRightView(); 
346
347   //! Redirect the request to #SVTK_Renderer::OnLeftView
348   virtual void onLeftView();     
349
350   //! Redirect the request to #SVTK_Renderer::onClockWiseView
351   virtual void onClockWiseView();
352
353   //! Redirect the request to #SVTK_Renderer::onAntiClockWiseView
354   virtual void onAntiClockWiseView();
355
356   //! Redirect the request to #SVTK_Renderer::OnResetView
357   virtual void onResetView();     
358
359   //! Redirect the request to #SVTK_Renderer::OnFitAll
360   virtual void onFitAll();
361
362   //! Redirect the request to #SVTK_Renderer::OnViewTrihedron
363   virtual void onViewTrihedron(); 
364
365   //! Redirect the request to #SVTK_Renderer::OnViewCubeAxes
366   virtual void onViewCubeAxes();
367
368   //! Redirect the request to #SVTK_Renderer::OnAdjustTrihedron
369   virtual void onAdjustTrihedron();
370
371   //! Redirect the request to #SVTK_Renderer::OnAdjustCubeAxes
372   virtual void onAdjustCubeAxes();
373   
374   virtual void synchronize(SVTK_ViewWindow*);
375     
376 protected slots:
377   void synchronize( SUIT_ViewWindow* );
378   void onKeyPressed(QKeyEvent* event);
379   void onKeyReleased(QKeyEvent* event);
380   void onMousePressed(QMouseEvent* event);
381   void onMouseDoubleClicked(QMouseEvent* event);
382   void onMouseReleased(QMouseEvent* event);
383   void onMouseMoving(QMouseEvent* event);
384
385 protected:
386   virtual void Initialize(SVTK_View* theView,
387                           SVTK_ViewModelBase* theModel);
388
389   // Main process event method
390   static void ProcessEvents(vtkObject* object,
391                             unsigned long event,
392                             void* clientdata,
393                             void* calldata);
394
395   void doSetVisualParameters( const QString&, bool = false );
396   void SetEventDispatcher(vtkObject* theDispatcher);
397
398   QImage dumpViewContent();
399
400   virtual QString filter() const;
401   virtual bool dumpViewToFormat( const QImage& img, const QString& fileName, const QString& format );
402   
403   virtual bool action( const int );
404   
405   QtxAction* getAction( int ) const;
406   void createToolBar();
407   void createActions(SUIT_ResourceMgr* theResourceMgr);
408
409   enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId, 
410          ChangeRotationPointId, RotationId,
411          FrontId, BackId, TopId, BottomId, LeftId, RightId, ClockWiseId, AntiClockWiseId, ResetId,
412          ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate,
413          ParallelModeId, ProjectionModeId, ViewParametersId, SynchronizeId, SwitchInteractionStyleId,
414          SwitchZoomingStyleId,SwitchDynamicPreselectionId,
415          StartRecordingId, PlayRecordingId, PauseRecordingId, StopRecordingId };
416
417   SVTK_View* myView;
418   SVTK_ViewModelBase* myModel;
419
420   SVTK_RenderWindowInteractor* myInteractor;
421   vtkSmartPointer<SVTK_InteractorStyle> myDefaultInteractorStyle;
422   vtkSmartPointer<SVTK_KeyFreeInteractorStyle> myKeyFreeInteractorStyle;
423
424   QString myVisualParams; // used for delayed setting of view parameters 
425
426   vtkSmartPointer<vtkObject> myEventDispatcher;
427
428   // Used to process events
429   vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
430
431   SVTK_NonIsometricDlg* myNonIsometricDlg;
432   SVTK_UpdateRateDlg* myUpdateRateDlg;
433   SVTK_CubeAxesDlg* myCubeAxesDlg;
434   SVTK_SetRotationPointDlg* mySetRotationPointDlg;
435   SVTK_ViewParameterDlg* myViewParameterDlg;
436
437   QSize myPreRecordingMinSize;
438   QSize myPreRecordingMaxSize;
439
440   SVTK_Recorder* myRecorder;
441   QtxAction* myStartAction;
442   QtxAction* myPlayAction;
443   QtxAction* myPauseAction;
444   QtxAction* myStopAction;
445
446   int myToolBar;
447   int myRecordingToolBar;
448
449   vtkPVAxesWidget* myAxesWidget;
450   Qtx::BackgroundData myBackground;
451
452 private:
453   QImage myDumpImage;
454 };
455
456 #ifdef WIN32
457 #pragma warning( default:4251 )
458 #endif
459
460 #endif