Salome HOME
Implementation of the "22589: EDF 8048 - ergonomics of SMESH" issue.
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewWindow.h
1 // Copyright (C) 2007-2014  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, 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          UserId };
155
156   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
157                       PANGLOBAL, WINDOWFIT, FITALLVIEW, RESETVIEW,
158                       FRONTVIEW, BACKVIEW, TOPVIEW, BOTTOMVIEW, LEFTVIEW, RIGHTVIEW,
159                       CLOCKWISEVIEW, ANTICLOCKWISEVIEW };
160
161   enum RotationPointType{ GRAVITY, SELECTED };
162
163   enum SketchingType { NoSketching, Rect, Polygon };
164
165   enum Mode2dType { No2dMode, XYPlane, XZPlane, YZPlane};
166
167
168   OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel);
169   virtual ~OCCViewer_ViewWindow();
170
171   virtual OCCViewer_ViewWindow* getView( const int ) const;
172
173   virtual OCCViewer_ViewPort3d* getViewPort();
174
175   virtual bool eventFilter(QObject* watched, QEvent* e);
176
177   virtual void performRestoring( const viewAspect&, bool = false );
178   
179   virtual void initLayout();
180
181   virtual void updateEnabledDrawMode();
182
183   virtual void setCuttingPlane( bool on, const double x = 0 , const double y = 0 , const double z = 0,
184                                 const double dx = 0, const double dy = 0, const double dz = 1);
185
186   virtual void setCuttingPlane( bool on, const gp_Pln thePln );
187
188   virtual bool isCuttingPlane();
189
190   virtual QString   getVisualParameters();
191   virtual void      setVisualParameters( const QString& parameters );
192
193   virtual void                    initSketchers();
194   virtual OCCViewer_ViewSketcher* getSketcher( const int );
195
196   virtual void                    activateSketching( int );
197
198   virtual int                     interactionStyle() const;
199   virtual void                    setInteractionStyle( const int );
200  
201   virtual int                     zoomingStyle() const;
202   virtual void                    setZoomingStyle( const int );
203
204   virtual bool                    isPreselectionEnabled() const;
205   virtual void                    enablePreselection( bool );   
206   virtual bool                    isSelectionEnabled() const;
207   virtual void                    enableSelection( bool );
208  
209   void setTransformEnabled( const OperationType, const bool );
210   bool transformEnabled( const OperationType ) const;
211
212
213   void            set2dMode( Mode2dType );
214   Mode2dType      get2dMode() const { return my2dMode; }
215
216   void            setMaximized( bool, bool = true );
217   bool            isMaximized() const;
218   void            setReturnedTo3dView( bool = true );
219   
220   void            setSketcherStyle( bool enable );
221   bool            isSketcherStyle() const;
222
223   virtual QColor  backgroundColor() const;                      // obsolete
224   virtual void    setBackgroundColor( const QColor& );          // obsolete
225
226   virtual void    showStaticTrihedron( bool );
227
228   virtual Qtx::BackgroundData  background() const;
229   virtual void                 setBackground( const Qtx::BackgroundData& );
230
231   virtual const   viewAspectList& getViewAspects();
232   virtual void                    appendViewAspect( const viewAspect& );
233   virtual void                    updateViewAspects( const viewAspectList& );
234   virtual void                    clearViewAspects();
235
236   virtual SUIT_CameraProperties   cameraProperties();
237
238 public slots:
239   virtual void onFrontView();
240   virtual void onViewFitAll();
241   virtual void onBackView();
242   virtual void onClipping(bool on);
243   virtual void onTopView();
244   virtual void onBottomView();
245   virtual void onLeftView();
246   virtual void onRightView();
247   virtual void onClockWiseView();
248   virtual void onAntiClockWiseView();
249   virtual void onResetView();
250   virtual void onFitAll();
251   virtual void activateZoom();
252   virtual void activateWindowFit();
253   virtual void activateRotation();
254   virtual void activatePanning();
255   virtual void activateGlobalPanning();
256   virtual void onSetRotationPoint( bool on );
257   virtual void onCloneView();
258   virtual void onAxialScale();
259   virtual void onGraduatedAxes();
260   virtual void onAmbientToogle();
261   virtual void onMemorizeView();
262   virtual void onRestoreView();
263   virtual void onTrihedronShow(bool);
264   virtual void setRestoreFlag();
265   virtual void onSwitchInteractionStyle( bool on );
266   virtual void onSwitchZoomingStyle( bool on );
267   virtual void onSwitchPreselection( bool on );
268   virtual void onSwitchSelection( bool on );
269
270   virtual void activateSetRotationGravity();
271   virtual void activateSetRotationSelected( double theX, double theY, double theZ );
272   virtual void activateStartPointSelection( TopAbs_ShapeEnum );
273   virtual void updateGravityCoords();
274    
275   virtual void showEvent( QShowEvent * );
276   virtual void hideEvent( QHideEvent * );
277
278   virtual void onMaximizedView();
279   virtual void returnTo3dView();
280
281 signals:
282   void vpTransformationStarted(OCCViewer_ViewWindow::OperationType type);
283   void vpTransformationFinished(OCCViewer_ViewWindow::OperationType type);
284   void viewCloned( SUIT_ViewWindow* );
285
286   void Show( QShowEvent * );
287   void Hide( QHideEvent * );
288   void maximized( OCCViewer_ViewWindow*, bool );
289   void returnedTo3d( );
290
291 protected slots:
292   void synchronize( SUIT_ViewWindow* );
293
294 public:
295   virtual QImage dumpView();
296   virtual bool   dumpViewToFormat( const QImage&, const QString& fileName, const QString& format );
297
298 protected:
299   virtual QString  filter() const;
300
301   /* Transformation selected but not started yet */
302   bool transformRequested() const;
303   bool setTransformRequested ( OperationType );
304
305   /* Transformation is selected and already started */
306   bool          transformInProcess() const;
307   void          setTransformInProcess( bool );
308
309   void vpMousePressEvent(QMouseEvent* theEvent);
310   void vpMouseReleaseEvent(QMouseEvent* theEvent);
311   void vpMouseMoveEvent(QMouseEvent* theEvent);
312
313   void resetState();
314   void drawRect();
315   void endDrawRect();
316
317   void createActions();
318   void createToolBar();
319  
320   virtual OperationType getButtonState(QMouseEvent* theEvent, int theInteractionStyle);
321
322   viewAspect getViewParams() const;
323
324   bool computeGravityCenter( double& theX, double& theY, double& theZ );
325
326   virtual void                          onSketchingStarted();
327   virtual void                          onSketchingFinished();
328
329   virtual OCCViewer_ViewSketcher*       createSketcher( int );
330
331   OCCViewer_ViewSketcher*               mypSketcher;
332   QList<OCCViewer_ViewSketcher*>        mySketchers;
333
334   int                                   myCurSketch;
335
336   OperationType         myOperation;
337   OCCViewer_Viewer*     myModel;
338   OCCViewer_ViewPort3d* myViewPort;
339
340   OCCViewer_CubeAxesDlg* myCubeAxesDlg;
341
342   RotationPointType     myCurrPointType;
343   RotationPointType     myPrevPointType;
344   gp_Pnt                mySelectedPoint;
345   bool                  myRotationPointSelection;
346
347   int                                   myRestoreFlag;
348
349   int                                   myStartX;
350   int                                   myStartY;
351   int                                   myCurrX;
352   int                                   myCurrY;
353
354   bool                  myEventStarted;       // set when transformation is in process 
355   bool                  myCursorIsHand;                 
356   bool                  myDrawRect;           // set when a rect is used for selection or magnify 
357   bool                  myEnableDrawMode;
358   bool                  myPaintersRedrawing;  // set to draw with external painters  
359   bool                  IsSketcherStyle;
360   bool                  myIsKeyFree;
361   
362   QCursor               myCursor;
363
364   double myCurScale;
365
366 private:
367   OCCViewer_AxialScaleDlg* myScalingDlg;
368
369   OCCViewer_SetRotationPointDlg* mySetRotationPointDlg;
370   QtxAction* mySetRotationPointAction;
371
372   QtxRectRubberBand* myRectBand; //!< selection rectangle rubber band
373
374   bool mySelectionEnabled;
375   bool myPreselectionEnabled;
376   int myInteractionStyle;
377
378   typedef QMap<OperationType, bool> MapOfTransformStatus;
379   MapOfTransformStatus myStatus;
380
381   Mode2dType my2dMode;
382
383   Handle(V3d_Plane) myReserveClipPlane;
384
385   viewAspectList myViewAspects;
386 };
387
388 #ifdef WIN32
389 #pragma warning( default:4251 )
390 #endif
391
392 #endif