#include #include #include #include #include #include #include #include #include #include #include #include #include // ------------------------------------------------------------------------- const int cpPlugins::Extensions::Visualization:: ImageInteractorStyle::SliceEvent = vtkCommand::UserEvent + 1; // ------------------------------------------------------------------------- cpPlugins::Extensions::Visualization::ImageInteractorStyle:: Self* cpPlugins::Extensions::Visualization::ImageInteractorStyle:: New( ) { return( new Self( ) ); } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: Configure( ImageSliceActors* slice_actors, MPRActors* mpr_actors ) { this->m_SliceActors = slice_actors; this->m_MPRActors = mpr_actors; this->SetModeToNavigation( ); this->PropPicker->AddPickList( slice_actors->GetImageActor( ) ); 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( ) { this->Mode = Self::NavigationMode; } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: SetModeToDeformation( ) { this->Mode = Self::DeformationMode; } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: SetInteractor( vtkRenderWindowInteractor* interactor, const int& axis ) { this->Superclass::SetInteractor( interactor ); this->OrientationWidget->SetInteractor( interactor ); interactor->SetInteractorStyle( this ); if( interactor == NULL ) return; // TODO: interactor->SetPicker( this->PropPicker ); // Get camera, avoiding segfaults vtkRenderer* ren = interactor->GetRenderWindow( )->GetRenderers( )->GetFirstRenderer( ); if( ren == NULL ) return; vtkCamera* cam = ren->GetActiveCamera( ); if( cam == NULL ) return; // Parallel projections are better when displaying 2D images cam->ParallelProjectionOn( ); cam->SetFocalPoint( double( 0 ), double( 0 ), double( 0 ) ); if( axis == 0 ) { cam->SetPosition( double( 1 ), double( 0 ), double( 0 ) ); cam->SetViewUp ( double( 0 ), double( 1 ), double( 0 ) ); } else if( axis == 1 ) { cam->SetPosition( double( 0 ), double( 1 ), double( 0 ) ); cam->SetViewUp ( double( 0 ), double( 0 ), double( -1 ) ); } else // if( axis == 2 ) { cam->SetPosition( double( 0 ), double( 0 ), double( 1 ) ); cam->SetViewUp ( double( 0 ), double( 1 ), double( 0 ) ); } // fi ren->ResetCamera( ); // Enable 2D orientation widget this->OrientationWidget->SetEnabled( 1 ); this->OrientationWidget->InteractiveOff( ); } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: OnMouseMove( ) { 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( ) { 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( ) { if( this->CursorMoving ) { this->EndCursorMoving( ); if( this->Interactor ) this->ReleaseFocus( ); } // fi } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: OnMiddleButtonDown( ) { 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( ) { switch( this->State ) { case VTKIS_PAN: this->EndPan( ); break; } // hctiws } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: OnRightButtonDown( ) { 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( ) { 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( ) { 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( ) { 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( ) { 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( ); } // fi } break; } // hctiws } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: WindowLevel( ) { 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 } // fi } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: StartWindowLevel( ) { if( this->State != VTKIS_NONE ) return; if( this->Mode == Self::NavigationMode ) { this->StartState( VTKIS_WINDOW_LEVEL ); this->WindowLevelInitial[ 0 ] = this->m_MPRActors->GetWindow( ); this->WindowLevelInitial[ 1 ] = this->m_MPRActors->GetLevel( ); } else if( this->Mode == Self::DeformationMode ) { // TODO } // fi } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: EndWindowLevel( ) { if( this->Mode == Self::NavigationMode ) { if( this->State != VTKIS_WINDOW_LEVEL ) return; this->StopState( ); } else { // TODO } // fi } // ------------------------------------------------------------------------- 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 ), CursorMoving( false ) { // Orientation marks vtkSmartPointer< vtkAnnotatedCubeActor > cube = vtkSmartPointer< vtkAnnotatedCubeActor >::New( ); cube->GetCubeProperty( )->SetColor( 0.9, 0.7, 0.2 ); cube->GetTextEdgesProperty( )->SetLineWidth( 1 ); cube->GetTextEdgesProperty( )->SetDiffuse( 0 ); cube->GetTextEdgesProperty( )->SetAmbient( 1 ); cube->GetTextEdgesProperty( )->SetColor( 0.18, 0.28, 0.23 ); cube->GetXPlusFaceProperty( )->SetColor( 1, 0, 0 ); cube->GetXPlusFaceProperty( )->SetInterpolationToFlat( ); cube->GetXMinusFaceProperty( )->SetColor( 1, 0, 0 ); cube->GetXMinusFaceProperty( )->SetInterpolationToFlat( ); cube->GetYPlusFaceProperty( )->SetColor( 0, 1, 0 ); cube->GetYPlusFaceProperty( )->SetInterpolationToFlat( ); cube->GetYMinusFaceProperty( )->SetColor( 0, 1, 0 ); cube->GetYMinusFaceProperty( )->SetInterpolationToFlat( ); cube->GetZPlusFaceProperty( )->SetColor( 0, 0, 1 ); cube->GetZPlusFaceProperty( )->SetInterpolationToFlat( ); cube->GetZMinusFaceProperty( )->SetColor( 0, 0, 1 ); cube->GetZMinusFaceProperty( )->SetInterpolationToFlat( ); vtkSmartPointer< vtkAxesActor > axes = vtkSmartPointer< vtkAxesActor >::New( ); axes->AxisLabelsOff( ); axes->SetShaftTypeToCylinder( ); axes->SetTotalLength( 2, 2, 2 ); vtkSmartPointer< vtkPropAssembly > actors = vtkSmartPointer< vtkPropAssembly >::New( ); actors->AddPart( cube ); actors->AddPart( axes ); this->OrientationWidget = vtkSmartPointer< vtkOrientationMarkerWidget >::New( ); this->OrientationWidget->SetOutlineColor( 0.93, 0.57, 0.13 ); this->OrientationWidget->SetOrientationMarker( actors ); this->OrientationWidget->SetViewport( 0.0, 0.0, 0.2, 0.2 ); this->PropPicker = vtkSmartPointer< vtkPropPicker >::New( ); this->PropPicker->PickFromListOn( ); } // ------------------------------------------------------------------------- cpPlugins::Extensions::Visualization::ImageInteractorStyle:: ~ImageInteractorStyle( ) { } // ------------------------------------------------------------------------- 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 ] ) { 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 ); } // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: _UpdateCursor( ) { std::cout << "upcur" << std::endl; } // eof - $RCSfile$