1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #ifndef SVTK_VIEWWINDOW_H
24 #define SVTK_VIEWWINDOW_H
27 #pragma warning( disable:4251 )
31 #include "SVTK_Selection.h"
33 #include "SUIT_ViewWindow.h"
35 #include "SALOME_InteractiveObject.hxx"
38 #include <vtkSmartPointer.h>
41 class SUIT_ResourceMgr;
43 class VTKViewer_Actor;
44 class VTKViewer_Trihedron;
46 class SVTK_ViewModelBase;
50 class SVTK_CubeAxesActor2D;
53 class vtkRenderWindow;
54 class vtkRenderWindowInteractor;
55 class vtkInteractorStyle;
56 class vtkCallbackCommand;
58 class SVTK_RenderWindowInteractor;
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;
71 class vtkPVAxesWidget;
80 int convertAction( const int );
83 //! Define a container for SALOME VTK view window
84 class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
89 //! To construct #SVTK_ViewWindow instance
90 SVTK_ViewWindow(SUIT_Desktop* theDesktop);
92 virtual ~SVTK_ViewWindow();
94 virtual QImage dumpView();
96 //! To initialize #SVTK_ViewWindow instance
97 virtual void Initialize(SVTK_ViewModelBase* theModel);
100 SVTK_View* getView();
102 //! Get render window
103 vtkRenderWindow* getRenderWindow();
106 vtkRenderWindowInteractor* getInteractor() const;
108 //! Get SVTK interactor
109 SVTK_RenderWindowInteractor* GetInteractor() const;
111 //! Get current interactor style
112 vtkInteractorStyle* GetInteractorStyle() const;
114 //! Add interactor style to the stack of styles
115 void PushInteractorStyle(vtkInteractorStyle* theStyle);
117 //! Remove last interactor style from the stack of styles
118 void PopInteractorStyle();
121 vtkRenderer* getRenderer() const;
123 //! Get SVTK renderer
124 SVTK_Renderer* GetRenderer() const;
127 SVTK_Selector* GetSelector() const;
129 //! Set selection mode
130 Selection_Mode SelectionMode() const;
132 //! Change selection mode
133 virtual void SetSelectionMode(Selection_Mode theMode);
135 //! Set background color [obsolete]
136 virtual void setBackgroundColor( const QColor& );
138 //! Get background color [obsolete]
139 QColor backgroundColor() const;
142 virtual void setBackground( const Qtx::BackgroundData& );
145 Qtx::BackgroundData background() const;
147 //! Return \c true if "display trihedron" flag is set
148 bool isTrihedronDisplayed();
150 //! Return \c true if "show graduated axes" flag is set
151 bool isCubeAxesDisplayed();
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);
159 //! Redirect the request to #SVTK_View::unHighlightAll (to support old code)
160 virtual void unHighlightAll();
162 //! Redirect the request to #SVTK_View::isInViewer (to support old code)
163 bool isInViewer(const Handle(SALOME_InteractiveObject)& theIObject);
165 //! Redirect the request to #SVTK_View::isVisible (to support old code)
166 bool isVisible(const Handle(SALOME_InteractiveObject)& theIObject);
168 //! Redirect the request to #SVTK_View::FindIObject (to support old code)
169 //----------------------------------------------------------------------------
170 Handle(SALOME_InteractiveObject) FindIObject(const char* theEntry);
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);
178 //! Redirect the request to #SVTK_View::DisplayOnly (to support old code)
179 virtual void DisplayOnly(const Handle(SALOME_InteractiveObject)& theIObject);
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);
185 //! Redirect the request to #SVTK_View::DisplayAll (to support old code)
186 virtual void DisplayAll();
188 //! Redirect the request to #SVTK_View::EraseAll (to support old code)
189 virtual void EraseAll();
191 //! To repaint the viewer
192 virtual void Repaint(bool theUpdateTrihedron = true);
194 //----------------------------------------------------------------------------
195 //! Redirect the request to #SVTK_Renderer::SetScale
196 virtual void SetScale( double theScale[3] );
198 //! Redirect the request to #SVTK_Renderer::GetScale
199 virtual void GetScale( double theScale[3] );
201 //! Redirect the request to #SVTK_Renderer::AddActor
202 virtual void AddActor(VTKViewer_Actor* theActor,
203 bool theIsUpdate = false,
204 bool theIsAdjustActors = true);
206 //! Redirect the request to #SVTK_Renderer::RemoveActor
207 virtual void RemoveActor(VTKViewer_Actor* theActor,
208 bool theIsUpdate = false,
209 bool theIsAdjustActors = true);
211 //----------------------------------------------------------------------------
212 //! Redirect the request to #SVTK_Renderer::AdjustActors
213 virtual void AdjustTrihedrons(const bool theIsForced);
215 //! Redirect the request to #SVTK_Renderer::GetTrihedron
216 VTKViewer_Trihedron* GetTrihedron();
218 //! Redirect the request to #SVTK_Renderer::GetCubeAxes
219 SVTK_CubeAxesActor2D* GetCubeAxes();
221 //! Redirect the request to #SVTK_Renderer::GetTrihedronSize
222 double GetTrihedronSize() const;
224 //! Redirect the request to #SVTK_Renderer::SetTrihedronSize
225 virtual void SetTrihedronSize( const double, const bool = true );
227 //! Set incremental speed
228 virtual void SetIncrementalSpeed( const int, const int = 0 );
230 //! Set current projection mode
231 virtual void SetProjectionMode( const int );
233 //! Set interactive style
234 virtual void SetInteractionStyle( const int );
236 //! Set zooming style
237 virtual void SetZoomingStyle( const int );
239 //! Set preselection mode
240 virtual void SetPreSelectionMode( Preselection_Mode );
242 //! Enable/disable selection
243 virtual void SetSelectionEnabled( bool );
245 //! Customize space mouse buttons
246 virtual void SetSpacemouseButtons( const int, const int, const int );
248 //! Set selection properties
249 virtual void SetSelectionProp(const double& theRed = 1,
250 const double& theGreen = 1,
251 const double& theBlue = 0,
252 const int& theWidth = 5);
254 //! Redirect the request to #SVTK_Renderer::SetPreselectionProp
255 virtual void SetPreselectionProp(const double& theRed = 0,
256 const double& theGreen = 1,
257 const double& theBlue = 1,
258 const int& theWidth = 5);
260 //! Redirect the request to #SVTK_Renderer::SetSelectionTolerance
261 virtual void SetSelectionTolerance(const double& theTolNodes = 0.025,
262 const double& theTolCell = 0.001,
263 const double& theTolObjects = 0.025);
265 //! Get visibility status of the static trihedron
266 bool IsStaticTrihedronVisible() const;
268 //! Set visibility status of the static trihedron
269 virtual void SetStaticTrihedronVisible( const bool );
271 //! Methods to save/restore visual parameters of a view (pan, zoom, etc.)
272 virtual QString getVisualParameters();
274 virtual void setVisualParameters( const QString& parameters );
276 virtual bool eventFilter( QObject*, QEvent* );
278 virtual void RefreshDumpImage();
280 void emitTransformed();
282 //! To invoke a VTK event on #SVTK_RenderWindowInteractor instance
283 void InvokeEvent(unsigned long theEvent, void* theCallData);
285 virtual SUIT_CameraProperties cameraProperties();
288 void Show( QShowEvent * );
289 void Hide( QHideEvent * );
292 virtual void showEvent( QShowEvent * );
293 virtual void hideEvent( QHideEvent * );
294 virtual void onSelectionChanged();
296 void onChangeRotationPoint(bool theIsActivate);
298 void activateSetRotationGravity();
299 void activateSetRotationSelected(void* theData);
300 void activateStartPointSelection( Selection_Mode );
302 void onUpdateRate(bool theIsActivate);
303 void onNonIsometric(bool theIsActivate);
304 void onGraduatedAxes(bool theIsActivate);
307 void activateWindowFit();
308 void activateRotation();
309 void activatePanning();
310 void activateGlobalPanning();
312 void onPerspectiveMode();
314 void activateProjectionMode(int);
316 void activateSetFocalPointGravity();
317 void activateSetFocalPointSelected();
318 void activateStartFocalPointSelection();
320 void onViewParameters(bool theIsActivate);
322 void onSwitchInteractionStyle(bool theOn);
323 void onSwitchZoomingStyle(bool theOn);
325 void onSwitchPreSelectionMode(int theMode);
326 void onEnableSelection(bool theOn);
328 void onStartRecording();
329 void onPlayRecording();
330 void onPauseRecording();
331 void onStopRecording();
334 void selectionChanged();
335 void actorAdded(VTKViewer_Actor*);
336 void actorRemoved(VTKViewer_Actor*);
337 void transformed(SVTK_ViewWindow*);
340 //! Redirect the request to #SVTK_Renderer::OnFrontView
341 virtual void onFrontView();
343 //! Redirect the request to #SVTK_Renderer::OnBackView
344 virtual void onBackView();
346 //! Redirect the request to #SVTK_Renderer::OnTopView
347 virtual void onTopView();
349 //! Redirect the request to #SVTK_Renderer::OnBottomView
350 virtual void onBottomView();
352 //! Redirect the request to #SVTK_Renderer::OnRightView
353 virtual void onRightView();
355 //! Redirect the request to #SVTK_Renderer::OnLeftView
356 virtual void onLeftView();
358 //! Redirect the request to #SVTK_Renderer::onClockWiseView
359 virtual void onClockWiseView();
361 //! Redirect the request to #SVTK_Renderer::onAntiClockWiseView
362 virtual void onAntiClockWiseView();
364 //! Redirect the request to #SVTK_Renderer::OnResetView
365 virtual void onResetView();
367 //! Redirect the request to #SVTK_Renderer::OnFitAll
368 virtual void onFitAll();
370 //! Redirect the request to #SVTK_Renderer::OnFitSelection
371 virtual void onFitSelection();
373 //! Redirect the request to #SVTK_Renderer::OnViewTrihedron
374 virtual void onViewTrihedron(bool);
376 //! Redirect the request to #SVTK_Renderer::OnViewCubeAxes
377 virtual void onViewCubeAxes();
379 //! Redirect the request to #SVTK_Renderer::OnAdjustTrihedron
380 virtual void onAdjustTrihedron();
382 //! Redirect the request to #SVTK_Renderer::OnAdjustCubeAxes
383 virtual void onAdjustCubeAxes();
385 virtual void synchronize(SVTK_ViewWindow*);
388 void synchronize( SUIT_ViewWindow* );
389 void onKeyPressed(QKeyEvent* event);
390 void onKeyReleased(QKeyEvent* event);
391 void onMousePressed(QMouseEvent* event);
392 void onMouseDoubleClicked(QMouseEvent* event);
393 void onMouseReleased(QMouseEvent* event);
394 void onMouseMoving(QMouseEvent* event);
397 virtual void Initialize(SVTK_View* theView,
398 SVTK_ViewModelBase* theModel);
400 // Main process event method
401 static void ProcessEvents(vtkObject* object,
406 void doSetVisualParameters( const QString&, bool = false );
407 void SetEventDispatcher(vtkObject* theDispatcher);
409 QImage dumpViewContent();
411 virtual QString filter() const;
412 virtual bool dumpViewToFormat( const QImage& img, const QString& fileName, const QString& format );
414 virtual bool action( const int );
416 QtxAction* getAction( int ) const;
417 void createToolBar();
418 void createActions(SUIT_ResourceMgr* theResourceMgr);
420 enum { DumpId, FitAllId, FitRectId, FitSelectionId, ZoomId, PanId, GlobalPanId,
421 ChangeRotationPointId, RotationId,
422 FrontId, BackId, TopId, BottomId, LeftId, RightId, ClockWiseId, AntiClockWiseId, ResetId,
423 ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate,
424 ParallelModeId, ProjectionModeId, ViewParametersId, SynchronizeId, SwitchInteractionStyleId,
425 SwitchZoomingStyleId,
426 PreselectionId, StandardPreselectionId, DynamicPreselectionId, DisablePreselectionId,
428 StartRecordingId, PlayRecordingId, PauseRecordingId, StopRecordingId };
431 SVTK_ViewModelBase* myModel;
433 SVTK_RenderWindowInteractor* myInteractor;
434 vtkSmartPointer<SVTK_InteractorStyle> myDefaultInteractorStyle;
435 vtkSmartPointer<SVTK_KeyFreeInteractorStyle> myKeyFreeInteractorStyle;
437 QString myVisualParams; // used for delayed setting of view parameters
439 vtkSmartPointer<vtkObject> myEventDispatcher;
441 // Used to process events
442 vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
444 SVTK_NonIsometricDlg* myNonIsometricDlg;
445 SVTK_UpdateRateDlg* myUpdateRateDlg;
446 SVTK_CubeAxesDlg* myCubeAxesDlg;
447 SVTK_SetRotationPointDlg* mySetRotationPointDlg;
448 SVTK_ViewParameterDlg* myViewParameterDlg;
450 QSize myPreRecordingMinSize;
451 QSize myPreRecordingMaxSize;
453 SVTK_Recorder* myRecorder;
454 QtxAction* myStartAction;
455 QtxAction* myPlayAction;
456 QtxAction* myPauseAction;
457 QtxAction* myStopAction;
460 int myRecordingToolBar;
462 salomevtk::vtkPVAxesWidget* myAxesWidget;
463 Qtx::BackgroundData myBackground;
470 #pragma warning( default:4251 )