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