From 2e68bf3e3a3433d77adbc67cebc17fd5cb0111f6 Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Tue, 16 Dec 2014 19:11:06 +0100 Subject: [PATCH] Image interaction updated. --- .../Visualization/ImageInteractorStyle.cxx | 90 +++++++++++-------- .../Visualization/ImageInteractorStyle.h | 7 +- .../Visualization/MPRWithDifferentWindows.cxx | 27 ++++++ .../Visualization/MPRWithDifferentWindows.h | 4 + lib/cpPlugins/Interface/DataObject.cxx | 12 +++ lib/cpPlugins/Interface/DataObject.h | 2 + lib/cpPlugins/Interface/Image.cxx | 73 ++++++++------- lib/cpPlugins/Interface/Image.h | 1 + lib/cpPlugins/Interface/ProcessObject.cxx | 8 +- 9 files changed, 153 insertions(+), 71 deletions(-) diff --git a/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx b/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx index a72f68b..67a271f 100644 --- a/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx +++ b/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.cxx @@ -1,5 +1,7 @@ #include +#include + #include #include #include @@ -16,7 +18,7 @@ // ------------------------------------------------------------------------- const int cpPlugins::Extensions::Visualization:: -ImageInteractorStyle::SliceEvent = vtkCommand::UserEvent + 1; +ImageInteractorStyle::DoubleClickEvent = vtkCommand::UserEvent + 1; // ------------------------------------------------------------------------- cpPlugins::Extensions::Visualization::ImageInteractorStyle:: @@ -110,6 +112,34 @@ SetInteractor( vtkRenderWindowInteractor* interactor, const int& axis ) this->OrientationWidget->InteractiveOff( ); } +// ------------------------------------------------------------------------- +unsigned long cpPlugins::Extensions::Visualization::ImageInteractorStyle:: +AddDoubleClickObserver( vtkCommand* observer ) +{ + return( this->AddObserver( Self::DoubleClickEvent, observer ) ); +} + +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: +RemoveDoubleClickObserver( unsigned long tag ) +{ + this->RemoveObserver( tag ); +} + +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: +RemoveDoubleClickObserver( vtkCommand* observer ) +{ + this->RemoveObserver( observer ); +} + +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: +RemoveDoubleClickObservers( ) +{ + this->RemoveObservers( Self::DoubleClickEvent ); +} + // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: OnMouseMove( ) @@ -153,46 +183,32 @@ OnMouseMove( ) void cpPlugins::Extensions::Visualization::ImageInteractorStyle:: OnLeftButtonDown( ) { - int x = this->Interactor->GetEventPosition( )[ 0 ]; - int y = this->Interactor->GetEventPosition( )[ 1 ]; - - this->FindPokedRenderer( x, y ); + static double pnt[ 3 ]; + static int pos[ 2 ]; + this->Interactor->GetEventPosition( pos ); + this->FindPokedRenderer( pos[ 0 ], pos[ 1 ] ); 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(); - } - */ + // TODO: check this code + // Manage double-click + static const long epsilon_time = 250; + static long last_click_time = -( epsilon_time << 1 ); + long click_time = static_cast< long >( std::clock( ) ); + if( ( click_time - last_click_time ) < epsilon_time ) + { + last_click_time = -( epsilon_time << 1 ); + if( this->_PickPosition( pnt ) ) + this->InvokeEvent( Self::DoubleClickEvent, pnt ); + } + else + { + last_click_time = click_time; + if( this->Interactor->GetControlKey( ) ) + this->StartCursorMoving( ); + + } // fi } // ------------------------------------------------------------------------- diff --git a/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.h b/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.h index 3cac84e..f2909e2 100644 --- a/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.h +++ b/lib/cpPlugins/Extensions/Visualization/ImageInteractorStyle.h @@ -57,6 +57,11 @@ namespace cpPlugins vtkRenderWindowInteractor* interactor, const int& axis ); + unsigned long AddDoubleClickObserver( vtkCommand* observer ); + void RemoveDoubleClickObserver( unsigned long tag ); + void RemoveDoubleClickObserver( vtkCommand* observer ); + void RemoveDoubleClickObservers( ); + // Description: // Event bindings controlling the effects of pressing mouse buttons // or moving the mouse. @@ -126,7 +131,7 @@ namespace cpPlugins bool CursorMoving; public: - static const int SliceEvent; + static const int DoubleClickEvent; }; } // ecapseman diff --git a/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.cxx b/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.cxx index e271631..6a7851a 100644 --- a/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.cxx +++ b/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.cxx @@ -72,6 +72,33 @@ cpPlugins::Extensions::Visualization::MPRWithDifferentWindows:: { } +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::MPRWithDifferentWindows:: +AddDoubleClickObserver( vtkCommand* observer ) +{ + for( int i = 0; i < 3; ++i ) + if( this->m_Styles[ i ].GetPointer( ) != NULL ) + this->m_Styles[ i ]->AddDoubleClickObserver( observer ); +} + +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::MPRWithDifferentWindows:: +RemoveDoubleClickObserver( vtkCommand* observer ) +{ + for( int i = 0; i < 3; ++i ) + if( this->m_Styles[ i ].GetPointer( ) != NULL ) + this->m_Styles[ i ]->RemoveDoubleClickObserver( observer ); +} + +// ------------------------------------------------------------------------- +void cpPlugins::Extensions::Visualization::MPRWithDifferentWindows:: +RemoveDoubleClickObservers( ) +{ + for( int i = 0; i < 3; ++i ) + if( this->m_Styles[ i ].GetPointer( ) != NULL ) + this->m_Styles[ i ]->RemoveDoubleClickObservers( ); +} + // ------------------------------------------------------------------------- void cpPlugins::Extensions::Visualization::MPRWithDifferentWindows:: SetImage( vtkImageData* image ) diff --git a/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.h b/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.h index bf15f04..6ac17e8 100644 --- a/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.h +++ b/lib/cpPlugins/Extensions/Visualization/MPRWithDifferentWindows.h @@ -34,6 +34,10 @@ namespace cpPlugins ); virtual ~MPRWithDifferentWindows( ); + void AddDoubleClickObserver( vtkCommand* observer ); + void RemoveDoubleClickObserver( vtkCommand* observer ); + void RemoveDoubleClickObservers( ); + void SetImage( vtkImageData* image ); void SetSegmentation( vtkImageData* image ); diff --git a/lib/cpPlugins/Interface/DataObject.cxx b/lib/cpPlugins/Interface/DataObject.cxx index 4ec6223..310cbb3 100644 --- a/lib/cpPlugins/Interface/DataObject.cxx +++ b/lib/cpPlugins/Interface/DataObject.cxx @@ -49,4 +49,16 @@ SetSource( cpPlugins::Interface::ProcessObject* src ) this->m_Source = src; } +// ------------------------------------------------------------------------- +void cpPlugins::Interface::DataObject:: +DisconnectPipeline( ) +{ + if( this->m_DataObject.IsNotNull( ) ) + { + this->m_DataObject->DisconnectPipeline( ); + this->m_Source = NULL; + + } // fi +} + // eof - $RCSfile$ diff --git a/lib/cpPlugins/Interface/DataObject.h b/lib/cpPlugins/Interface/DataObject.h index 9edf92b..3f561a2 100644 --- a/lib/cpPlugins/Interface/DataObject.h +++ b/lib/cpPlugins/Interface/DataObject.h @@ -34,6 +34,8 @@ namespace cpPlugins ProcessObject* GetSource( ) const; void SetSource( ProcessObject* src ); + void DisconnectPipeline( ); + protected: itk::DataObject::Pointer m_DataObject; ProcessObject* m_Source; diff --git a/lib/cpPlugins/Interface/Image.cxx b/lib/cpPlugins/Interface/Image.cxx index d309a11..52792d3 100644 --- a/lib/cpPlugins/Interface/Image.cxx +++ b/lib/cpPlugins/Interface/Image.cxx @@ -6,19 +6,21 @@ #include // ------------------------------------------------------------------------- -#define cpPlugins_Interface_Image_Dimension( d, dobj, func ) \ - if( dynamic_cast< itk::ImageBase< d >* >( dobj ) != NULL ) \ - this->func< d >( ) +#define cpPlugins_Image_Dimension( d, o, f ) \ + if( dynamic_cast< itk::ImageBase< d >* >( o ) != NULL ) \ + this->f< d >( ) // ------------------------------------------------------------------------- -#define cpPlugins_Interface_Image_Pixel( p, d, dobj, func ) \ - if( dynamic_cast< itk::Image< p, d >* >( dobj ) != NULL ) \ - this->func< p, d >( ) +#define cpPlugins_Image_Pixel( p, d, o, f ) \ + if( dynamic_cast< itk::Image< p, d >* >( o ) != NULL ) \ + this->f< p, d >( ) // ------------------------------------------------------------------------- -#define cpPlugins_Interface_Image_RGB( p, d, dobj, func ) \ - if( dynamic_cast< itk::Image< itk::RGBPixel< p >, d >* >( dobj ) != NULL ) \ - this->func< itk::RGBPixel< p >, d >( ) +#define cpPlugins_Image_RGB( p, d, o, f ) \ + if( \ + dynamic_cast< itk::Image< itk::RGBPixel< p >, d >* >( o ) != NULL \ + ) \ + this->f< itk::RGBPixel< p >, d >( ) // ------------------------------------------------------------------------- cpPlugins::Interface::Image:: @@ -48,8 +50,8 @@ SetDataObject( itk::DataObject* dobj ) this->Superclass::SetDataObject( dobj ); // WARNING: Only 2 and 3 dimensions at this moment - cpPlugins_Interface_Image_Dimension( 2, dobj, _ConnectToVTK_0 ); - else cpPlugins_Interface_Image_Dimension( 3, dobj, _ConnectToVTK_0 ); + cpPlugins_Image_Dimension( 2, dobj, _ConnectToVTK_0 ); + else cpPlugins_Image_Dimension( 3, dobj, _ConnectToVTK_0 ); } // ------------------------------------------------------------------------- @@ -59,6 +61,15 @@ GetVTKImageData( ) const return( this->m_VTKImageData ); } +// ------------------------------------------------------------------------- +void cpPlugins::Interface::Image:: +UpdateVTKImageData( ) +{ + this->m_Image2VTKImageData->Modified( ); + this->m_Image2VTKImageData->Update( ); + this->m_VTKImageData->Modified( ); +} + // ------------------------------------------------------------------------- template< unsigned int D > void cpPlugins::Interface::Image:: @@ -66,26 +77,26 @@ _ConnectToVTK_0( ) { itk::DataObject* dobj = this->Superclass::GetDataObject( ); - cpPlugins_Interface_Image_Pixel( char, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( short, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( int, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( long, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( unsigned char, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( unsigned short, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( unsigned int, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( unsigned long, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( float, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_Pixel( double, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( char, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( short, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( int, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( long, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( unsigned char, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( unsigned short, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( unsigned int, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( unsigned long, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( float, D, dobj, _ConnectToVTK_1 ); - else cpPlugins_Interface_Image_RGB( double, D, dobj, _ConnectToVTK_1 ); + cpPlugins_Image_Pixel( char, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( short, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( int, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( long, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( unsigned char, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( unsigned short, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( unsigned int, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( unsigned long, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( float, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_Pixel( double, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( char, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( short, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( int, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( long, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( unsigned char, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( unsigned short, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( unsigned int, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( unsigned long, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( float, D, dobj, _ConnectToVTK_1 ); + else cpPlugins_Image_RGB( double, D, dobj, _ConnectToVTK_1 ); } // ------------------------------------------------------------------------- diff --git a/lib/cpPlugins/Interface/Image.h b/lib/cpPlugins/Interface/Image.h index e6b2b77..f5454c4 100644 --- a/lib/cpPlugins/Interface/Image.h +++ b/lib/cpPlugins/Interface/Image.h @@ -30,6 +30,7 @@ namespace cpPlugins virtual void SetDataObject( itk::DataObject* dobj ); vtkImageData* GetVTKImageData( ) const; + void UpdateVTKImageData( ); protected: template< unsigned int D > diff --git a/lib/cpPlugins/Interface/ProcessObject.cxx b/lib/cpPlugins/Interface/ProcessObject.cxx index f2499c2..d1982b0 100644 --- a/lib/cpPlugins/Interface/ProcessObject.cxx +++ b/lib/cpPlugins/Interface/ProcessObject.cxx @@ -96,7 +96,11 @@ Update( ) // Force upstream updates std::string r = ""; for( unsigned int i = 0; i < this->m_Inputs.size( ) && r == ""; ++i ) - r = this->m_Inputs[ i ]->GetSource( )->Update( ); + { + if( this->m_Inputs[ i ]->GetSource( ) != NULL ) + r = this->m_Inputs[ i ]->GetSource( )->Update( ); + + } // rof // Current update if( r == "" ) @@ -117,7 +121,7 @@ DisconnectOutputs( ) this->m_OutputsDisconnected = true; for( unsigned int idx = 0; idx < this->m_Outputs.size( ); ++idx ) if( this->m_Outputs[ idx ] != NULL ) - this->m_Outputs[ idx ]->GetDataObject( )->DisconnectPipeline( ); + this->m_Outputs[ idx ]->DisconnectPipeline( ); } // ------------------------------------------------------------------------- -- 2.45.1