X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSVTK%2FSVTK_InteractorStyle.h;h=dd514356d46d202f22001766710013a3427769b1;hb=e6caa123c65e3c4a3017364ec5bb4225fd898465;hp=c82b592d5a6e87bb45f7ddfae726646df02021b8;hpb=ed7d3bcedc4d353d2167b94252619e11f35bd1f6;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_InteractorStyle.h b/src/SVTK/SVTK_InteractorStyle.h index c82b592d5..dd514356d 100644 --- a/src/SVTK/SVTK_InteractorStyle.h +++ b/src/SVTK/SVTK_InteractorStyle.h @@ -1,56 +1,140 @@ -// SALOME VTKViewer : build VTK viewer into Salome desktop +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SALOME VTKViewer : build VTK viewer into Salome desktop // File : SVTK_InteractorStyle.h // Author : Christophe ATTANASIO -// Module : SALOME -// $Header$ #ifndef __SVTK_InteractorStyle_h #define __SVTK_InteractorStyle_h #include "SVTK.h" -#include +#include "SVTK_SelectionEvent.h" -class vtkCell; -class vtkRenderWindowInteractor; +#include -#include -#include +#include +#include + +#include +#include #include -#include "VTKViewer_Filter.h" +#include + +#ifdef WIN32 +#pragma warning ( disable:4251 ) +#endif + +// +//! Control the value of increment in arithmetic progression mode. +/*! + This class controls of value of increment, + for pan/rotate/zoom operations in arithmetic progression mode +*/ +class SVTK_EXPORT SVTK_ControllerIncrement : public vtkObject{ + public: + vtkTypeMacro(SVTK_ControllerIncrement, vtkObject); + static SVTK_ControllerIncrement* New(); + + //! Set start value of increment + void SetStartValue(const int ); + + //! Get current value of increment + int Current()const; + + //! Increace the increment value by add 1 + virtual int Increase(); + + //! Decreace the increment value by subtract 1 + virtual int Decrease(); + protected: + SVTK_ControllerIncrement(); + virtual ~SVTK_ControllerIncrement(); + protected: + int myIncrement; + private: + SVTK_ControllerIncrement(const SVTK_ControllerIncrement&);//Not implemented + void operator=(const SVTK_ControllerIncrement&); //Not implemented +}; + +// +//! Control the value of increment in geometric progression mode. +/*! + This class controls of value of increment, + for pan/rotate/zoom operations in geometric progression mode. +*/ +class SVTK_EXPORT SVTK_GeomControllerIncrement : public SVTK_ControllerIncrement{ + public: + vtkTypeMacro(SVTK_GeomControllerIncrement, SVTK_ControllerIncrement); + static SVTK_GeomControllerIncrement* New(); -class VTKViewer_Trihedron; + //! Increace the increment value by add 1 + virtual int Increase(); + + //! Decreace the increment value by subtract 1 + virtual int Decrease(); + protected: + SVTK_GeomControllerIncrement(); + virtual ~SVTK_GeomControllerIncrement(); + private: + SVTK_GeomControllerIncrement(const SVTK_GeomControllerIncrement&);//Not implemented + void operator=(const SVTK_GeomControllerIncrement&); //Not implemented +}; +// +//! Control the behaviour of KeyDown event in SALOME way. +/*! + This class controls the behaviour of KeyDown event + in SALOME way +*/ +class SVTK_EXPORT SVTK_ControllerOnKeyDown : public vtkObject{ + public: + vtkTypeMacro(SVTK_ControllerOnKeyDown, vtkObject); + static SVTK_ControllerOnKeyDown* New(); + + //! Provides the action on event + virtual bool OnKeyDown(vtkInteractorStyle* ); + + protected: + SVTK_ControllerOnKeyDown(); + virtual ~SVTK_ControllerOnKeyDown(); + + private: + SVTK_ControllerOnKeyDown(const SVTK_ControllerOnKeyDown&);//Not implemented + void operator=(const SVTK_ControllerOnKeyDown&); //Not implemented +}; + +class vtkPointPicker; +class vtkTDxInteractorStyle; class SALOME_Actor; -class SVTK_Actor; -class SVTK_Viewer; + class SVTK_Selector; -class SVTK_ViewWindow; -class SVTK_RenderWindowInteractor; +class SVTK_GenericRenderWindowInteractor; +class SVTK_Actor; + +class QRubberBand; #define VTK_INTERACTOR_STYLE_CAMERA_NONE 0 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE 1 @@ -60,64 +144,125 @@ class SVTK_RenderWindowInteractor; #define VTK_INTERACTOR_STYLE_CAMERA_FIT 5 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT 6 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7 +#define VTK_INTERACTOR_STYLE_CAMERA_SELECT_ROTATION_POINT 8 -class SVTK_EXPORT SVTK_InteractorStyle : public QObject, - public vtkInteractorStyle -{ - Q_OBJECT; +enum PolygonState { Disable, Start, InProcess, Finished, Closed, NotValid }; +//! Introduce SALOME way of user interaction +/*! + This class defines SALOME way of user interaction for VTK viewer, as well, + as introduce a new selection mechanism +*/ +class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle +{ public: - // Description: - // This class must be supplied with a vtkRenderWindowInteractor wrapper or - // parent. This class should not normally be instantiated by application - // programmers. static SVTK_InteractorStyle *New(); vtkTypeMacro(SVTK_InteractorStyle, vtkInteractorStyle); - virtual void SetInteractor(vtkRenderWindowInteractor *theInteractor); - void setViewWindow(SVTK_ViewWindow* theViewWindow); - void setGUIWindow(QWidget* theWindow); + typedef boost::shared_ptr PSelectionEvent; - virtual int GetState(); + void SetTDxStyle(vtkTDxInteractorStyle*){} - void setTriedron(VTKViewer_Trihedron* theTrihedron); - void setPreselectionProp(const double& theRed = 0, - const double& theGreen = 1, - const double& theBlue = 1, - const int& theWidth = 5); + //! Generate special #SVTK_SelectionEvent + virtual SVTK_SelectionEvent* GetSelectionEvent(); - // Generic event bindings must be overridden in subclasses - void OnMouseMove (int ctrl, int shift, int x, int y); - void OnLeftButtonDown(int ctrl, int shift, int x, int y); - void OnLeftButtonUp (int ctrl, int shift, int x, int y); - void OnMiddleButtonDown(int ctrl, int shift, int x, int y); - void OnMiddleButtonUp (int ctrl, int shift, int x, int y); - void OnRightButtonDown(int ctrl, int shift, int x, int y); - void OnRightButtonUp (int ctrl, int shift, int x, int y); - - void OnSelectionModeChanged(); - - void ViewFitAll(); - - void SetFilter( const Handle(VTKViewer_Filter)& ); - Handle(VTKViewer_Filter) GetFilter( const int ); - bool IsFilterPresent( const int ); - void RemoveFilter( const int ); - bool IsValid( SALOME_Actor* theActor, - const int theId, - const bool theIsNode = false ); + //! Generate special #SVTK_SelectionEvent with flipped Y coordinate + virtual SVTK_SelectionEvent* GetSelectionEventFlipY(); + + //! Redefined in order to add an observer (callback) for custom event (space mouse event) + virtual void SetInteractor( vtkRenderWindowInteractor* ); + + //! To invoke #vtkRenderWindowInteractor::CreateTimer + virtual void Render(); + + //! To implement cached rendering + virtual void OnTimer(); + + //! To reset reset view + virtual void OnConfigure(); + + //! To handle mouse move event + virtual void OnMouseMove(); + + //! To handle left mouse button down event (reimplemented from #vtkInteractorStyle) + virtual void OnLeftButtonDown(); + + //! To handle left mouse button up event (reimplemented from #vtkInteractorStyle) + virtual void OnLeftButtonUp(); + + //! To handle middle mouse button down event (reimplemented from #vtkInteractorStyle) + virtual void OnMiddleButtonDown(); + + //! To handle middle mouse button up event (reimplemented from #vtkInteractorStyle) + virtual void OnMiddleButtonUp(); + + //! To handle right mouse button down event (reimplemented from #vtkInteractorStyle) + virtual void OnRightButtonDown(); + + //! To handle right mouse button up event (reimplemented from #vtkInteractorStyle) + virtual void OnRightButtonUp(); + + //! To handle mouse wheel forward event (reimplemented from #vtkInteractorStyle) + virtual void OnMouseWheelForward(); + + //! To handle mouse wheel backward event (reimplemented from #vtkInteractorStyle) + virtual void OnMouseWheelBackward(); + + //! To handle mouse button double click event + virtual void OnMouseButtonDoubleClick(); + + //! To handle keyboard event (reimplemented from #vtkInteractorStyle) + virtual void OnChar(); + + //! To set current increment controller + void SetControllerIncrement(SVTK_ControllerIncrement*); + + //! To modify current increment controller + void SetIncrementSpeed(const int, const int = 0); + + //! To get current increment controller + SVTK_ControllerIncrement* ControllerIncrement(); + + //! Redefine vtkInteractorStyle::OnKeyDown + virtual void OnKeyDown(); + + //! Provide instructions for Picking + void ActionPicking(); + + //! To set current OnKeyDown controller + void SetControllerOnKeyDown(SVTK_ControllerOnKeyDown*); + + //! To get current OnKeyDown controller + SVTK_ControllerOnKeyDown* ControllerOnKeyDown(); - void IncrementalPan ( const int incrX, const int incrY ); - void IncrementalZoom ( const int incr ); - void IncrementalRotate( const int incrX, const int incrY ); + SVTK_Selector* GetSelector(); - protected: + int CurrentState() const { return State; } + PolygonState GetPolygonState() const { return myPoligonState; } + void SetPolygonState( const PolygonState& thePolygonState ) + { myPoligonState = thePolygonState; } + + void SetAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; } + bool IsAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; } + + //! releaze myLastHighlitedActor and myLastPreHighlitedActor + void FreeActors(); + + protected: SVTK_InteractorStyle(); ~SVTK_InteractorStyle(); - SVTK_InteractorStyle(const SVTK_InteractorStyle&) {}; - void operator=(const SVTK_InteractorStyle&) {}; - SVTK_Selector* GetSelector(); + QWidget* + GetRenderWidget(); + + // Generic event bindings must be overridden in subclasses + virtual void OnMouseMove (int ctrl, int shift, int x, int y); + virtual void OnLeftButtonDown(int ctrl, int shift, int x, int y); + virtual void OnLeftButtonUp (int ctrl, int shift, int x, int y); + virtual void OnMiddleButtonDown(int ctrl, int shift, int x, int y); + virtual void OnMiddleButtonUp (int ctrl, int shift, int x, int y); + virtual void OnRightButtonDown(int ctrl, int shift, int x, int y); + virtual void OnRightButtonUp (int ctrl, int shift, int x, int y); void RotateXY(int dx, int dy); void PanXY(int x, int y, int oldX, int oldY); @@ -126,47 +271,58 @@ class SVTK_EXPORT SVTK_InteractorStyle : public QObject, void fitRect(const int left, const int top, const int right, const int bottom); void Place(const int theX, const int theY); void TranslateView(int toX, int toY, int fromX, int fromY); - bool IsInRect(vtkActor* theActor, - const int left, const int top, - const int right, const int bottom); - bool IsInRect(vtkCell* theCell, - const int left, const int top, - const int right, const int bottom); - bool IsInRect(float* thePoint, - const int left, const int top, - const int right, const int bottom); + + void + IncrementalPan( const int incrX, const int incrY ); + + void + IncrementalZoom( const int incr ); + + void + IncrementalRotate( const int incrX, const int incrY ); + + // Main process event method (reimplemented from #vtkInteractorStyle) + static + void + ProcessEvents(vtkObject* object, + unsigned long event, + void* clientData, + void* callData ); float MotionFactor; float RadianToDegree; // constant: for conv from deg to rad double myScale; - SALOME_Actor* myPreViewActor; - - SVTK_Actor* myPreSelectionActor; - SALOME_Actor* mySelectedActor; - int myElemId; - int myEdgeId; - int myNodeId; - - public: - bool eventFilter(QObject* object, QEvent* event); + protected: void startZoom(); void startPan(); void startGlobalPan(); void startRotate(); void startFitArea(); void startSpin(); - bool needsRedrawing(); + + void startPointSelection(); + void startFocalPointSelection(); protected: void loadCursors(); void startOperation(int operation); void onStartOperation(); - void onFinishOperation(); + virtual void onFinishOperation(); void onOperation(QPoint mousePos); void onCursorMove(QPoint mousePos); void setCursor(const int operation); + void onSpaceMouseMove( double* data ); + virtual void onSpaceMouseButton( int button ); + + void DominantCombinedSwitch(); + + void drawRect(); + void endDrawRect(); + void drawPolygon(); + void endDrawPolygon(); + protected: QCursor myDefCursor; QCursor myPanCursor; @@ -180,18 +336,51 @@ class SVTK_EXPORT SVTK_InteractorStyle : public QObject, bool myCursorState; bool myShiftState; int ForcedState; + + vtkSmartPointer myLastHighlitedActor; + vtkSmartPointer myLastPreHighlitedActor; + + //! "Increment" controller for pan/rotate/zoom operations + vtkSmartPointer myControllerIncrement; + + //!controls the behaviour of KeyDown event in SALOME way + vtkSmartPointer myControllerOnKeyDown; + + // SpaceMouse short cuts + int mySMDecreaseSpeedBtn; + int mySMIncreaseSpeedBtn; + int mySMDominantCombinedSwitchBtn; - SVTK_RenderWindowInteractor* myInteractor; - SVTK_ViewWindow* myViewWindow; - VTKViewer_Trihedron* myTrihedron; - QWidget* myGUIWindow; + vtkSmartPointer myInteractor; + + PSelectionEvent mySelectionEvent; + + unsigned long myCurrRotationPointType; + unsigned long myPrevRotationPointType; + + unsigned long myCurrFocalPointType; + unsigned long myPrevFocalPointType; + + double myRotationPointX; + double myRotationPointY; + double myRotationPointZ; + + vtkSmartPointer myHighlightSelectionPointActor; + vtkSmartPointer myPointPicker; - std::map myFilters; + double myBBCenter[3]; + bool myBBFirstCheck; + + QRubberBand* myRectBand; //!< selection rectangle rubber band + QtxPolyRubberBand* myPolygonBand; //!< polygonal selection + QVector myPolygonPoints; + PolygonState myPoligonState; - // members from old version - double DeltaElevation; - double DeltaAzimuth; - int LastPos[2]; + bool myIsAdvancedZoomingEnabled; }; +#ifdef WIN32 +#pragma warning ( default:4251 ) +#endif + #endif