]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.h
Major refactoring: API-HCI bug corrected.
[cpPlugins.git] / lib / cpPlugins / Extensions / Visualization / ImageInteractorStyle.h
index b618f5e47931056a8da9582e4d106ac5f7a4b04f..7ff6dbd6f5fdc0647cc396738da5ce0f3897c764 100644 (file)
@@ -1,18 +1,25 @@
 #ifndef __CPPLUGINS__EXTENSIONS__VISUALIZATION__IMAGEINTERACTORSTYLE__H__
 #define __CPPLUGINS__EXTENSIONS__VISUALIZATION__IMAGEINTERACTORSTYLE__H__
 
+#include <vector>
+
 #include <vtkInteractorStyleImage.h>
 #include <vtkOrientationMarkerWidget.h>
 #include <vtkPropPicker.h>
 #include <vtkSmartPointer.h>
 
-/* TODO
-   #include <vtkInteractorStyleImage.h>
-   #include <vtkLineWidget2.h>
-   #include <vtkLineRepresentation.h>
-   #include <vtkPlane.h>
-   class vtkImageData;
-*/
+#include <cpPlugins/Extensions/cpPlugins_Extensions_Export.h>
+
+// -------------------------------------------------------------------------
+#define cpPlugins_ImageInteractorStyle_ObserverMacro( e )               \
+  inline unsigned long Add##e##Observer( vtkCommand* observer )         \
+  { return( this->AddObserver( Self::e##Event, observer ) ); }          \
+  inline void Remove##e##Observer( unsigned long tag )                  \
+  { this->RemoveObserver( tag ); }                                      \
+  inline void Remove##e##Observer( vtkCommand* observer )               \
+  { this->RemoveObserver( observer ); }                                 \
+  inline void Remove##e##Observers( )                                   \
+  { this->RemoveObservers( Self::e##Event ); }
 
 namespace cpPlugins
 {
@@ -25,7 +32,7 @@ namespace cpPlugins
 
       /**
        */
-      class ImageInteractorStyle
+      class cpPlugins_Extensions_EXPORT ImageInteractorStyle
         : public vtkInteractorStyleImage
       {
       public:
@@ -40,6 +47,10 @@ namespace cpPlugins
       public:
         vtkTypeMacro( ImageInteractorStyle, vtkInteractorStyleImage );
 
+        cpPlugins_ImageInteractorStyle_ObserverMacro( DoubleClick );
+        cpPlugins_ImageInteractorStyle_ObserverMacro( Cursor );
+        cpPlugins_ImageInteractorStyle_ObserverMacro( Radius );
+
       public:
         static Self* New( );
 
@@ -47,6 +58,7 @@ namespace cpPlugins
           ImageSliceActors* slice_actors,
           MPRActors* mpr_actors = NULL
           );
+        void AssociateInteractor( vtkRenderWindowInteractor* interactor );
 
         void SetModeToNavigation( );
         void SetModeToDeformation( );
@@ -76,28 +88,36 @@ namespace cpPlugins
         // they might be called from OnTimer, they do not have mouse coord
         // parameters (use interactor's GetEventPosition and
         // GetLastEventPosition)
-        virtual void Rotate( );
-        virtual void Pan( );
-        virtual void Spin( );
-        virtual void Zoom( );
+
+        virtual void Rotate( ) { }
+        virtual void Spin( )   { }
+        virtual void Zoom( )   { }
+        virtual void Pick( )   { }
+        virtual void Slice( )  { }
         virtual void WindowLevel( );
-        virtual void Pick( );
-        virtual void Slice( );
 
         // Interaction mode entry points used internally.
+        virtual void StartPick( )  { }
+        virtual void EndPick( )    { }
+        virtual void StartSlice( ) { }
+        virtual void EndSlice( )   { }
         virtual void StartWindowLevel( );
         virtual void EndWindowLevel( );
-        virtual void StartPick( );
-        virtual void EndPick( );
-        virtual void StartSlice( );
-        virtual void EndSlice( );
+
+        // New events
+        virtual void StartCursorMoving( );
+        virtual void EndCursorMoving( );
+        virtual void StartRadiusMoving( );
+        virtual void EndRadiusMoving( );
 
       protected:
         ImageInteractorStyle( );
         virtual ~ImageInteractorStyle( );
 
+        void _RenderAssociateInteractors( );
         bool _PickPosition( double pos[ 3 ] );
         void _UpdateCursor( );
+        void _UpdateRadius( );
 
       private:
         // Purposely not implemented
@@ -113,8 +133,21 @@ namespace cpPlugins
         vtkSmartPointer< vtkOrientationMarkerWidget > OrientationWidget;
         vtkSmartPointer< vtkPropPicker > PropPicker;
 
+        std::vector< vtkRenderWindowInteractor* > AssociatedInteractors;
+
+        bool CursorMoving;
+        double Cursor[ 3 ];
+
+        bool RadiusMoving;
+        double Radius[ 3 ];
+        vtkSmartPointer< vtkPolyData > Circle;
+        vtkSmartPointer< vtkPolyDataMapper > CircleMapper;
+        vtkSmartPointer< vtkActor > CircleActor;
+
       public:
-        static const int SliceEvent;
+        static const int CursorEvent;
+        static const int RadiusEvent;
+        static const int DoubleClickEvent;
       };
 
     } // ecapseman