]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx
Interaction improved: cursor
[cpPlugins.git] / lib / cpPlugins / Extensions / Visualization / ImageInteractorStyle.cxx
index 0c44df1743c95c1ddd3d1d92a9768976fb72ef56..d017cb2c3a8148f1aac4b43eed5def93db266643 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <vtkAnnotatedCubeActor.h>
 #include <vtkAxesActor.h>
+#include <vtkCallbackCommand.h>
 #include <vtkCamera.h>
 #include <vtkCommand.h>
 #include <vtkPropAssembly.h>
@@ -36,6 +37,18 @@ Configure( ImageSliceActors* slice_actors, MPRActors* mpr_actors )
   this->Modified( );
 }
 
+// -------------------------------------------------------------------------
+void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
+AssociateInteractor( vtkRenderWindowInteractor* interactor )
+{
+  if( interactor != NULL )
+  {
+    this->AssociatedInteractors.push_back( interactor );
+    this->Modified( );
+
+  } // fi
+}
+
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 SetModeToNavigation( )
@@ -101,21 +114,77 @@ SetInteractor( vtkRenderWindowInteractor* interactor, const int& axis )
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMouseMove( )
 {
-  std::cout << "moumov" << std::endl;
+  double pos[ 3 ];
+  if( this->CursorMoving && this->m_MPRActors != NULL )
+  {
+    bool picked = this->_PickPosition( pos );
+    if( picked )
+    {
+      for( int i = 0; i < 3; ++i )
+        if( this->m_SliceActors->GetAxis( ) != i )
+          this->m_MPRActors->SetSlice( i, pos[ i ] );
+      this->Interactor->Render( );
+      this->_RenderAssociateInteractors( );
+
+    } // fi
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnLeftButtonDown( )
 {
-  std::cout << "leftdown" << std::endl;
+  int x = this->Interactor->GetEventPosition( )[ 0 ];
+  int y = this->Interactor->GetEventPosition( )[ 1 ];
+
+  this->FindPokedRenderer( x, y );
+  if( this->CurrentRenderer == NULL )
+    return;
+
+  // Redefine this button to handle window/level
+  this->GrabFocus( this->EventCallbackCommand );
+
+  if( this->Interactor->GetControlKey( ) )
+    this->StartCursorMoving( );
+
+  /* TODO
+     if (!this->Interactor->GetShiftKey() && !this->Interactor->GetControlKey())
+     {
+     this->WindowLevelStartPosition[0] = x;
+     this->WindowLevelStartPosition[1] = y;
+     this->StartWindowLevel();
+     }
+
+     // If shift is held down, do a rotation
+     else if (this->InteractionMode == VTKIS_IMAGE3D &&
+     this->Interactor->GetShiftKey())
+     {
+     this->StartRotate();
+     }
+
+     // If ctrl is held down in slicing mode, slice the image
+     else if (this->InteractionMode == VTKIS_IMAGE_SLICING &&
+     this->Interactor->GetControlKey())
+     {
+     this->StartSlice();
+     }
+
+     // The rest of the button + key combinations remain the same
+
+     else
+     {
+     this->Superclass::OnLeftButtonDown();
+     }
+  */
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnLeftButtonUp( )
 {
-  std::cout << "leftup" << std::endl;
+  if( this->CursorMoving )
+    this->EndCursorMoving( );
 }
 
 // -------------------------------------------------------------------------
@@ -150,14 +219,32 @@ OnRightButtonUp( )
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMouseWheelForward( )
 {
-  std::cout << "whfwd" << std::endl;
+  if( this->m_SliceActors == NULL || this->Interactor == NULL )
+    return;
+  int off = 1;
+  if( this->Interactor->GetShiftKey( ) == 1 )
+    off *= 10;
+  int s = this->m_SliceActors->GetSliceNumber( ) + off;
+  int maxs = this->m_SliceActors->GetSliceNumberMaxValue( );
+  this->m_SliceActors->SetSliceNumber( ( s < maxs )? s: maxs );
+  this->Interactor->Render( );
+  this->_RenderAssociateInteractors( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMouseWheelBackward( )
 {
-  std::cout << "whbwd" << std::endl;
+  if( this->m_SliceActors == NULL || this->Interactor == NULL )
+    return;
+  int off = 1;
+  if( this->Interactor->GetShiftKey( ) == 1 )
+    off *= 10;
+  int s = this->m_SliceActors->GetSliceNumber( ) - off;
+  int mins = this->m_SliceActors->GetSliceNumberMinValue( );
+  this->m_SliceActors->SetSliceNumber( ( mins < s )? s: mins );
+  this->Interactor->Render( );
+  this->_RenderAssociateInteractors( );
 }
 
 // -------------------------------------------------------------------------
@@ -258,13 +345,32 @@ EndSlice( )
   std::cout << "es" << std::endl;
 }
 
+// -------------------------------------------------------------------------
+void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
+StartCursorMoving( )
+{
+  if( this->CursorMoving )
+    return;
+  this->CursorMoving = true;
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
+EndCursorMoving( )
+{
+  if( !( this->CursorMoving ) )
+    return;
+  this->CursorMoving = false;
+}
+
 // -------------------------------------------------------------------------
 cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 ImageInteractorStyle( )
   : Superclass( ),
     Mode( Self::NavigationMode ),
     m_SliceActors( NULL ),
-    m_MPRActors( NULL )
+    m_MPRActors( NULL ),
+    CursorMoving( false )
 {
   // Orientation marks
   vtkSmartPointer< vtkAnnotatedCubeActor > cube =
@@ -312,14 +418,34 @@ ImageInteractorStyle( )
 cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 ~ImageInteractorStyle( )
 {
-  std::cout << "destructor" << std::endl;
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
+_RenderAssociateInteractors( )
+{
+  std::vector< vtkRenderWindowInteractor* >::iterator rIt =
+    this->AssociatedInteractors.begin( );
+  for( ; rIt != this->AssociatedInteractors.end( ); ++rIt )
+    ( *rIt )->Render( );
 }
 
 // -------------------------------------------------------------------------
 bool cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 _PickPosition( double pos[ 3 ] )
 {
-  std::cout << "pickpos" << std::endl;
+  if( this->m_SliceActors == NULL )
+    return( false );
+
+  double x = double( this->Interactor->GetEventPosition( )[ 0 ] );
+  double y = double( this->Interactor->GetEventPosition( )[ 1 ] );
+  this->FindPokedRenderer( x, y );
+  int success =
+    this->PropPicker->Pick( x, y, double( 0 ), this->CurrentRenderer );
+  if( success == 0 )
+    return( false );
+  this->PropPicker->GetPickPosition( pos );
+  return( true );
 }
 
 // -------------------------------------------------------------------------