]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx
Some bugs
[cpPlugins.git] / lib / cpPlugins / Extensions / Visualization / ImageInteractorStyle.cxx
index 0c44df1743c95c1ddd3d1d92a9768976fb72ef56..a72f68bc95ff9ea8815c52b1326191aa7ccbef6a 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,161 +114,347 @@ SetInteractor( vtkRenderWindowInteractor* interactor, const int& axis )
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMouseMove( )
 {
-  std::cout << "moumov" << std::endl;
+  if( this->m_MPRActors == NULL )
+    return;
+  
+  double pos[ 3 ];
+  if( this->CursorMoving )
+  {
+    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
+  }
+  else
+  {
+    switch( this->State )
+    {
+    case VTKIS_WINDOW_LEVEL:
+      this->WindowLevel( );
+      break;
+    case VTKIS_DOLLY:
+      this->Dolly( );
+      break;
+    case VTKIS_PAN:
+      this->Pan( );
+      break;
+    } // hctiws
+
+  } // 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;
+  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( );
+    if( this->Interactor )
+      this->ReleaseFocus( );
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMiddleButtonDown( )
 {
-  std::cout << "middown" << std::endl;
+  int x = this->Interactor->GetEventPosition( )[ 0 ];
+  int y = this->Interactor->GetEventPosition( )[ 1 ];
+
+  this->FindPokedRenderer( x, y );
+  if( this->CurrentRenderer == NULL )
+    return;
+  this->GrabFocus( this->EventCallbackCommand );
+
+  if( this->Interactor->GetAltKey( ) )
+  {
+  }
+  else if( this->Interactor->GetControlKey( ) )
+  {
+  }
+  else if( this->Interactor->GetShiftKey( ) )
+  {
+  }
+  else
+    this->StartPan( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnMiddleButtonUp( )
 {
-  std::cout << "midup" << std::endl;
+  switch( this->State )
+  {
+  case VTKIS_PAN:
+    this->EndPan( );
+    break;
+  } // hctiws
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnRightButtonDown( )
 {
-  std::cout << "ridown" << std::endl;
+  int x = this->Interactor->GetEventPosition( )[ 0 ];
+  int y = this->Interactor->GetEventPosition( )[ 1 ];
+
+  this->FindPokedRenderer( x, y );
+  if( this->CurrentRenderer == NULL )
+    return;
+  this->GrabFocus( this->EventCallbackCommand );
+
+  if( this->Interactor->GetControlKey( ) )
+  {
+    this->WindowLevelStartPosition[ 0 ] = x;
+    this->WindowLevelStartPosition[ 1 ] = y;
+    this->StartWindowLevel( );
+  }
+  else
+  {
+    this->StartDolly( );
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnRightButtonUp( )
 {
-  std::cout << "riup" << std::endl;
+  switch( this->State )
+  {
+  case VTKIS_WINDOW_LEVEL:
+  {
+    this->EndWindowLevel( );
+    if( this->Interactor )
+      this->ReleaseFocus( );
+  }
+  break;
+  case VTKIS_DOLLY:
+    this->EndDolly( );
+    break;
+  } // hctiws
 }
 
 // -------------------------------------------------------------------------
 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( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 OnChar( )
 {
-  std::cout << "char" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Rotate( )
-{
-  std::cout << "Rotate" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Pan( )
-{
-  std::cout << "pan" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Spin( )
-{
-  std::cout << "spin" << std::endl;
-}
+  switch( this->Interactor->GetKeyCode( ) )
+  {
+  case 'r': case 'R':
+  {
+    vtkRenderer* ren =
+      this->Interactor->GetRenderWindow( )->
+      GetRenderers( )->GetFirstRenderer( );
+    if( ren != NULL )
+      ren->ResetCamera( );
+    this->Interactor->Render( );
+  }
+  break;
+  case 'w': case 'W': case 'l': case 'L':
+  {
+    if( this->m_MPRActors != NULL )
+    {
+      this->m_MPRActors->ResetWindowLevel( );
+      this->Interactor->Render( );
+      this->_RenderAssociateInteractors( );
 
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Zoom( )
-{
-  std::cout << "Zoom" << std::endl;
+    } // fi
+  }
+  break;
+  } // hctiws
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 WindowLevel( )
 {
-  std::cout << "wl" << std::endl;
-}
-
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Pick( )
-{
-  std::cout << "Pick" << std::endl;
-}
+  if( this->Mode == Self::NavigationMode )
+  {
+    if( this->Interactor == NULL )
+      return;
+    vtkRenderer* ren =
+      this->Interactor->GetRenderWindow( )->
+      GetRenderers( )->GetFirstRenderer( );
+    if( ren == NULL )
+      return;
+
+    // Compute scales
+    this->WindowLevelCurrentPosition[ 0 ] =
+      this->Interactor->GetEventPosition( )[ 0 ];
+    this->WindowLevelCurrentPosition[ 1 ] =
+      this->Interactor->GetEventPosition( )[ 1 ];
+    int* size = ren->GetSize( );
+    double sw = double(
+      this->WindowLevelCurrentPosition[ 0 ] -
+      this->WindowLevelStartPosition[ 0 ]
+      ) / double( size[ 0 ] );
+    double sl = (
+      this->WindowLevelStartPosition[ 1 ] -
+      this->WindowLevelCurrentPosition[ 1 ]
+      ) / double( size[ 1 ] );
+
+    double w = this->WindowLevelInitial[ 0 ] * ( double( 1 ) + sw );
+    double l = this->WindowLevelInitial[ 1 ] * ( double( 1 ) + sl );
+    double minw = this->m_MPRActors->GetMinWindow( );
+    double maxw = this->m_MPRActors->GetMaxWindow( );
+    double minl = this->m_MPRActors->GetMinLevel( );
+    double maxl = this->m_MPRActors->GetMaxLevel( );
+
+    if( w < minw ) w = minw;
+    if( maxw < w ) w = maxw;
+    if( l < minl ) l = minl;
+    if( maxl < l ) l = maxl;
+
+    this->m_MPRActors->SetWindowLevel( w, l );
+    this->Interactor->Render( );
+    this->_RenderAssociateInteractors( );
+  }
+  else if( this->Mode == Self::DeformationMode )
+  {
+    // TODO
 
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-Slice( )
-{
-  std::cout << "Slice" << std::endl;
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
 StartWindowLevel( )
 {
-  std::cout << "swl" << std::endl;
-}
+  if( this->State != VTKIS_NONE )
+    return;
+  if( this->Mode == Self::NavigationMode )
+  {
+    this->StartState( VTKIS_WINDOW_LEVEL );
 
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-EndWindowLevel( )
-{
-  std::cout << "ewl" << std::endl;
-}
+    this->WindowLevelInitial[ 0 ] = this->m_MPRActors->GetWindow( );
+    this->WindowLevelInitial[ 1 ] = this->m_MPRActors->GetLevel( );
+  }
+  else if( this->Mode == Self::DeformationMode )
+  {
+    // TODO
 
-// -------------------------------------------------------------------------
-void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-StartPick( )
-{
-  std::cout << "sp" << std::endl;
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-EndPick( )
+EndWindowLevel( )
 {
-  std::cout << "ep" << std::endl;
+  if( this->Mode == Self::NavigationMode )
+  {
+    if( this->State != VTKIS_WINDOW_LEVEL )
+      return;
+    this->StopState( );
+  }
+  else
+  {
+    // TODO
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-StartSlice( )
+StartCursorMoving( )
 {
-  std::cout << "ss" << std::endl;
+  if( this->CursorMoving )
+    return;
+  this->CursorMoving = true;
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Extensions::Visualization::ImageInteractorStyle::
-EndSlice( )
+EndCursorMoving( )
 {
-  std::cout << "es" << std::endl;
+  if( !( this->CursorMoving ) )
+    return;
+  this->CursorMoving = false;
 }
 
 // -------------------------------------------------------------------------
@@ -264,7 +463,8 @@ ImageInteractorStyle( )
   : Superclass( ),
     Mode( Self::NavigationMode ),
     m_SliceActors( NULL ),
-    m_MPRActors( NULL )
+    m_MPRActors( NULL ),
+    CursorMoving( false )
 {
   // Orientation marks
   vtkSmartPointer< vtkAnnotatedCubeActor > cube =
@@ -312,14 +512,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 );
 }
 
 // -------------------------------------------------------------------------