Salome HOME
Merge remote branch 'origin/master'
[modules/gui.git] / src / OCCViewer / OCCViewer_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 OCCVIEWER_VIEWWINDOW_H
24 #define OCCVIEWER_VIEWWINDOW_H
25
26 #include "OCCViewer.h"
27 #include "Qtx.h"
28 #include "SUIT_ViewWindow.h"
29 #include <gp_Pnt.hxx>
30 #include <V3d_Plane.hxx>
31 #include <TopAbs_ShapeEnum.hxx>
32
33 class QtxRectRubberBand;
34 class SUIT_Desktop;
35 class OCCViewer_ViewPort3d;
36 class OCCViewer_ViewSketcher;
37 class OCCViewer_AxialScaleDlg;
38 class OCCViewer_SetRotationPointDlg;
39 class OCCViewer_Viewer;
40 class OCCViewer_CubeAxesDlg;
41 class QtxAction;
42
43 struct viewAspect
44 {
45 public:
46   double    scale;
47   double  centerX; // deprecated since OCCT 6.7.1
48   double  centerY; // deprecated since OCCT 6.7.1
49   double    projX;
50   double    projY;
51   double    projZ;
52   double    twist;
53   double      atX;
54   double      atY;
55   double      atZ;
56   double     eyeX;
57   double     eyeY;
58   double     eyeZ;
59   double   scaleX;
60   double   scaleY;
61   double   scaleZ;
62   QString    name;
63   bool     isVisible;
64   double   size;
65   // graduated trihedron
66   bool    gtIsVisible;
67   bool    gtDrawNameX;
68   bool    gtDrawNameY;
69   bool    gtDrawNameZ;
70   QString gtNameX;
71   QString gtNameY;
72   QString gtNameZ;
73   int     gtNameColorRX;
74   int     gtNameColorGX;
75   int     gtNameColorBX;
76   int     gtNameColorRY;
77   int     gtNameColorGY;
78   int     gtNameColorBY;
79   int     gtNameColorRZ;
80   int     gtNameColorGZ;
81   int     gtNameColorBZ;
82   bool    gtDrawValuesX;
83   bool    gtDrawValuesY;
84   bool    gtDrawValuesZ;
85   int     gtNbValuesX;
86   int     gtNbValuesY;
87   int     gtNbValuesZ;
88   int     gtOffsetX;
89   int     gtOffsetY;
90   int     gtOffsetZ;
91   int     gtColorRX;
92   int     gtColorGX;
93   int     gtColorBX;
94   int     gtColorRY;
95   int     gtColorGY;
96   int     gtColorBY;
97   int     gtColorRZ;
98   int     gtColorGZ;
99   int     gtColorBZ;
100   bool    gtDrawTickmarksX;
101   bool    gtDrawTickmarksY;
102   bool    gtDrawTickmarksZ;
103   int     gtTickmarkLengthX;
104   int     gtTickmarkLengthY;
105   int     gtTickmarkLengthZ;
106
107 public:
108   viewAspect()
109   : scale( 0.0 ),
110     centerX( 0.0 ), centerY( 0.0 ),
111     projX( 0.0 ), projY( 0.0 ), projZ( 0.0 ),
112     twist( 0.0 ),
113     atX( 0.0 ), atY( 0.0 ), atZ( 0.0 ),
114     eyeX( 0.0 ), eyeY( 0.0 ), eyeZ( 0.0 ),
115     scaleX( 0.0 ), scaleY( 0.0 ), scaleZ( 0.0 ),
116     name(),
117     isVisible( false ),
118     size( 0.0 ),
119     gtIsVisible( false ),
120     gtDrawNameX( false ), gtDrawNameY( false ), gtDrawNameZ( false ),
121     gtNameX(), gtNameY(), gtNameZ(), 
122     gtNameColorRX( 0 ), gtNameColorGX( 0 ), gtNameColorBX( 0 ),
123     gtNameColorRY( 0 ), gtNameColorGY( 0 ), gtNameColorBY( 0 ),
124     gtNameColorRZ( 0 ), gtNameColorGZ( 0 ), gtNameColorBZ( 0 ),
125     gtDrawValuesX( false ), gtDrawValuesY( false ), gtDrawValuesZ( false ),
126     gtNbValuesX( 0 ), gtNbValuesY( 0 ), gtNbValuesZ( 0 ),
127     gtOffsetX( 0 ), gtOffsetY( 0 ), gtOffsetZ( 0 ),
128     gtColorRX( 0 ), gtColorGX( 0 ), gtColorBX( 0 ),
129     gtColorRY( 0 ), gtColorGY( 0 ), gtColorBY( 0 ),
130     gtColorRZ( 0 ), gtColorGZ( 0 ), gtColorBZ( 0 ),
131     gtDrawTickmarksX( false ), gtDrawTickmarksY( false ), gtDrawTickmarksZ( false ),
132     gtTickmarkLengthX( 0 ), gtTickmarkLengthY( 0 ), gtTickmarkLengthZ( 0 ) {}
133 };
134
135 typedef QList<viewAspect> viewAspectList;
136
137 #ifdef WIN32
138 #pragma warning( disable:4251 )
139 #endif
140
141 class OCCVIEWER_EXPORT OCCViewer_ViewWindow : public SUIT_ViewWindow  
142 {
143   Q_OBJECT
144
145 public:
146   enum { DumpId, FitAllId, FitRectId, FitSelectionId, ZoomId, PanId, GlobalPanId,
147          ChangeRotationPointId, RotationId,
148          FrontId, BackId, TopId, BottomId, LeftId, RightId, ClockWiseId, AntiClockWiseId,
149          ResetId, CloneId, ClippingId, MemId, RestoreId,
150          TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId,
151          SwitchInteractionStyleId, SwitchZoomingStyleId, 
152          SwitchPreselectionId, SwitchSelectionId,
153          MaximizedId, SynchronizeId, ReturnTo3dViewId,
154          OrthographicId, PerspectiveId, StereoId,
155          UserId };
156
157   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
158                       PANGLOBAL, WINDOWFIT, FITALLVIEW, FITSELECTION, RESETVIEW,
159                       FRONTVIEW, BACKVIEW, TOPVIEW, BOTTOMVIEW, LEFTVIEW, RIGHTVIEW,
160                       CLOCKWISEVIEW, ANTICLOCKWISEVIEW, PROJECTION };
161
162   enum RotationPointType{ GRAVITY, SELECTED };
163
164   enum SketchingType { NoSketching, Rect, Polygon };
165
166   enum Mode2dType { No2dMode, XYPlane, XZPlane, YZPlane };
167
168   enum ProjectionType { Orthographic, Perspective, Stereo };
169   
170   enum StereoType { QuadBuffer, Anaglyph, RowInterlaced, ColumnInterlaced, ChessBoard, SideBySide, OverUnder, SoftPageFlip, NumberOfModes };
171
172   enum AnaglyphFilter { RedCyan, YellowBlue, GreenMagenta };
173
174   enum FocusIODType { Absolute, Relative };
175
176   OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel);
177   virtual ~OCCViewer_ViewWindow();
178
179   virtual OCCViewer_ViewWindow* getView( const int ) const;
180
181   virtual OCCViewer_ViewPort3d* getViewPort();
182
183   virtual bool eventFilter(QObject* watched, QEvent* e);
184
185   virtual void performRestoring( const viewAspect&, bool = false );
186   
187   virtual void initLayout();
188
189   virtual void updateEnabledDrawMode();
190
191   virtual void setCuttingPlane( bool on, const double x = 0 , const double y = 0 , const double z = 0,
192                                 const double dx = 0, const double dy = 0, const double dz = 1);
193
194   virtual void setCuttingPlane( bool on, const gp_Pln thePln );
195
196   virtual bool isCuttingPlane();
197
198   virtual QString   getVisualParameters();
199   virtual void      setVisualParameters( const QString& parameters );
200
201   virtual void                    initSketchers();
202   virtual OCCViewer_ViewSketcher* getSketcher( const int );
203
204   virtual void                    activateSketching( int );
205
206   virtual int                     interactionStyle() const;
207   virtual void                    setInteractionStyle( const int );
208  
209   virtual int                     zoomingStyle() const;
210   virtual void                    setZoomingStyle( const int );
211
212   virtual bool                    isPreselectionEnabled() const;
213   virtual void                    enablePreselection( bool );   
214   virtual bool                    isSelectionEnabled() const;
215   virtual void                    enableSelection( bool );
216  
217   virtual int                     projectionType() const;
218   virtual void                    setProjectionType( int );
219
220   virtual int                     stereoType() const;
221   virtual void                    setStereoType( const int );
222
223   virtual int                     anaglyphFilter() const;
224   virtual void                    setAnaglyphFilter( const int );
225
226   virtual void                    setStereographicFocus( const int, const double );
227   virtual int                     stereographicFocusType() const;
228   virtual double                  stereographicFocusValue() const;
229
230   virtual void                    setInterocularDistance( const int, const double );
231   virtual int                     interocularDistanceType() const;
232   virtual double                  interocularDistanceValue() const;
233
234   virtual bool                    isReverseStereo() const;
235   virtual void                    setReverseStereo( const bool );
236
237   virtual bool                    isVSync() const;
238   virtual void                    setVSync( const bool );
239
240   virtual bool                    isQuadBufferSupport() const;
241   virtual void                    setQuadBufferSupport( const bool );
242
243   void setTransformEnabled( const OperationType, const bool );
244   bool transformEnabled( const OperationType ) const;
245
246   void            set2dMode( Mode2dType );
247   Mode2dType      get2dMode() const { return my2dMode; }
248
249   void            setMaximized( bool, bool = true );
250   bool            isMaximized() const;
251   void            setReturnedTo3dView( bool = true );
252   
253   void            setSketcherStyle( bool enable );
254   bool            isSketcherStyle() const;
255
256   virtual QColor  backgroundColor() const;                      // obsolete
257   virtual void    setBackgroundColor( const QColor& );          // obsolete
258
259   virtual void    showStaticTrihedron( bool );
260
261   virtual Qtx::BackgroundData  background() const;
262   virtual void                 setBackground( const Qtx::BackgroundData& );
263
264   virtual const   viewAspectList& getViewAspects();
265   virtual void                    appendViewAspect( const viewAspect& );
266   virtual void                    updateViewAspects( const viewAspectList& );
267   virtual void                    clearViewAspects();
268
269   virtual SUIT_CameraProperties   cameraProperties();
270
271 public slots:
272   virtual void onFrontView();
273   virtual void onViewFitAll();
274   virtual void onBackView();
275   virtual void onClipping(bool on);
276   virtual void onTopView();
277   virtual void onBottomView();
278   virtual void onLeftView();
279   virtual void onRightView();
280   virtual void onClockWiseView();
281   virtual void onAntiClockWiseView();
282   virtual void onProjectionType();
283   virtual void onResetView();
284   virtual void onFitAll();
285   virtual void onFitSelection();
286   virtual void activateZoom();
287   virtual void activateWindowFit();
288   virtual void activateRotation();
289   virtual void activatePanning();
290   virtual void activateGlobalPanning();
291   virtual void onSetRotationPoint( bool on );
292   virtual void onCloneView();
293   virtual void onAxialScale();
294   virtual void onGraduatedAxes();
295   virtual void onAmbientToogle();
296   virtual void onMemorizeView();
297   virtual void onRestoreView();
298   virtual void onTrihedronShow(bool);
299   virtual void setRestoreFlag();
300   virtual void onSwitchInteractionStyle( bool on );
301   virtual void onSwitchZoomingStyle( bool on );
302   virtual void onSwitchPreselection( bool on );
303   virtual void onSwitchSelection( bool on );
304
305   virtual void activateSetRotationGravity();
306   virtual void activateSetRotationSelected( double theX, double theY, double theZ );
307   virtual void activateStartPointSelection( TopAbs_ShapeEnum );
308   virtual void updateGravityCoords();
309    
310   virtual void showEvent( QShowEvent * );
311   virtual void hideEvent( QHideEvent * );
312
313   virtual void onMaximizedView();
314   virtual void returnTo3dView();
315
316 signals:
317   void vpTransformationStarted(OCCViewer_ViewWindow::OperationType type);
318   void vpTransformationFinished(OCCViewer_ViewWindow::OperationType type);
319   void viewCloned( SUIT_ViewWindow* );
320
321   void Show( QShowEvent * );
322   void Hide( QHideEvent * );
323   void maximized( OCCViewer_ViewWindow*, bool );
324   void returnedTo3d( );
325
326 protected slots:
327   void synchronize( SUIT_ViewWindow* );
328
329 public:
330   virtual QImage dumpView();
331   virtual bool   dumpViewToFormat( const QImage&, const QString& fileName, const QString& format );
332
333 protected:
334   virtual QString  filter() const;
335
336   bool isOpenGlStereoSupport() const;
337
338   /* Transformation selected but not started yet */
339   bool transformRequested() const;
340   bool setTransformRequested ( OperationType );
341
342   /* Transformation is selected and already started */
343   bool          transformInProcess() const;
344   void          setTransformInProcess( bool );
345
346   void vpMousePressEvent(QMouseEvent* theEvent);
347   void vpMouseReleaseEvent(QMouseEvent* theEvent);
348   void vpMouseMoveEvent(QMouseEvent* theEvent);
349
350   void resetState();
351   void drawRect();
352   void endDrawRect();
353
354   void createActions();
355   void createToolBar();
356
357   virtual OperationType getButtonState(QMouseEvent* theEvent, int theInteractionStyle);
358
359   viewAspect getViewParams() const;
360
361   bool computeGravityCenter( double& theX, double& theY, double& theZ );
362
363   virtual void                          onSketchingStarted();
364   virtual void                          onSketchingFinished();
365
366   virtual OCCViewer_ViewSketcher*       createSketcher( int );
367
368   void                                  saveCursor();
369
370   OCCViewer_ViewSketcher*               mypSketcher;
371   QList<OCCViewer_ViewSketcher*>        mySketchers;
372
373   int                                   myCurSketch;
374
375   OperationType         myOperation;
376   OCCViewer_Viewer*     myModel;
377   OCCViewer_ViewPort3d* myViewPort;
378
379   OCCViewer_CubeAxesDlg* myCubeAxesDlg;
380
381   RotationPointType     myCurrPointType;
382   RotationPointType     myPrevPointType;
383   gp_Pnt                mySelectedPoint;
384   bool                  myRotationPointSelection;
385
386   int                                   myRestoreFlag;
387
388   int                                   myStartX;
389   int                                   myStartY;
390   int                                   myCurrX;
391   int                                   myCurrY;
392
393   bool                  myEventStarted;       // set when transformation is in process 
394   bool                  myCursorIsHand;                 
395   bool                  myDrawRect;           // set when a rect is used for selection or magnify 
396   bool                  myEnableDrawMode;
397   bool                  myPaintersRedrawing;  // set to draw with external painters  
398   bool                  IsSketcherStyle;
399   bool                  myIsKeyFree;
400   
401   QCursor               myCursor;
402
403   double myCurScale;
404
405 private:
406   OCCViewer_AxialScaleDlg* myScalingDlg;
407
408   OCCViewer_SetRotationPointDlg* mySetRotationPointDlg;
409   QtxAction* mySetRotationPointAction;
410
411   QtxRectRubberBand* myRectBand; //!< selection rectangle rubber band
412
413   bool mySelectionEnabled;
414   bool myPreselectionEnabled;
415   int myInteractionStyle;
416
417   typedef QMap<OperationType, bool> MapOfTransformStatus;
418   MapOfTransformStatus myStatus;
419
420   Mode2dType my2dMode;
421
422   Handle(V3d_Plane) myReserveClipPlane;
423
424   viewAspectList myViewAspects;
425 };
426
427 #ifdef WIN32
428 #pragma warning( default:4251 )
429 #endif
430
431 #endif