]> Creatis software - cpPlugins.git/blobdiff - lib/cpInstances/DataObjects/Image.cxx
yet another refactoring
[cpPlugins.git] / lib / cpInstances / DataObjects / Image.cxx
diff --git a/lib/cpInstances/DataObjects/Image.cxx b/lib/cpInstances/DataObjects/Image.cxx
new file mode 100644 (file)
index 0000000..09cf834
--- /dev/null
@@ -0,0 +1,196 @@
+#include <cpInstances/DataObjects/Image.h>
+
+#include <itkImageToVTKImageFilter.h>
+#include <itkVTKImageToImageFilter.h>
+#include <vtkImageData.h>
+#include <itkDiffusionTensor3D.h>
+#include <itkRGBPixel.h>
+#include <itkRGBAPixel.h>
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::Image::
+SetITK( itk::LightObject* o )
+{
+  this->Superclass::SetITK( o );
+  this->m_VTK = NULL;
+  this->m_ITKvVTK = NULL;
+  this->Modified( );
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::Image::
+SetVTK( vtkObjectBase* o )
+{
+  this->Superclass::SetVTK( o );
+  this->m_ITK = NULL;
+  this->m_ITKvVTK = NULL;
+  this->Modified( );
+
+  /* TODO
+     vtkImageData* img = dynamic_cast< vtkImageData* >( o );
+     this->Superclass::SetVTK( img );
+     if( img == NULL )
+     {
+     this->m_ITK = NULL;
+     this->m_ITKvVTK = NULL;
+     this->Modified( );
+     return;
+
+     } // fi
+
+     bool success = false;
+     auto stype = img->GetScalarType( );
+     #ifdef cpPlugins_CONFIG_INTEGER_TYPES_char
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< char >( img );
+     if( stype == VTK_UNSIGNED_CHAR ) success = this->_VTK_2_ITK_0< unsigned char >( img );
+     #endif // cpPlugins_CONFIG_INTEGER_TYPES_char
+     #ifdef cpPlugins_CONFIG_INTEGER_TYPES_short
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< short >( img );
+     if( stype == VTK_UNSIGNED_CHAR ) success = this->_VTK_2_ITK_0< unsigned short >( img );
+     #endif // cpPlugins_CONFIG_INTEGER_TYPES_short
+     #ifdef cpPlugins_CONFIG_INTEGER_TYPES_int
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< int >( img );
+     if( stype == VTK_UNSIGNED_CHAR ) success = this->_VTK_2_ITK_0< unsigned int >( img );
+     #endif // cpPlugins_CONFIG_INTEGER_TYPES_int
+     #ifdef cpPlugins_CONFIG_INTEGER_TYPES_long
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< long >( img );
+     if( stype == VTK_UNSIGNED_CHAR ) success = this->_VTK_2_ITK_0< unsigned long >( img );
+     #endif // cpPlugins_CONFIG_INTEGER_TYPES_long
+     #ifdef cpPlugins_CONFIG_REAL_TYPES_float
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< float >( img );
+     #endif // cpPlugins_CONFIG_REAL_TYPES_float
+     #ifdef cpPlugins_CONFIG_REAL_TYPES_double
+     if( stype == VTK_CHAR ) success = this->_VTK_2_ITK_0< double >( img );
+     #endif // cpPlugins_CONFIG_REAL_TYPES_double
+  */
+  /* TODO
+     #define cpPlugins_CONFIG_COLOR_PIXELS_RGBPixel
+     #define cpPlugins_CONFIG_COLOR_PIXELS_RGBAPixel
+     #define cpPlugins_CONFIG_VECTORS_CovariantVector
+     #define cpPlugins_CONFIG_VECTORS_Point
+     #define cpPlugins_CONFIG_VECTORS_SymmetricSecondRankTensor
+     #define cpPlugins_CONFIG_VECTORS_Vector
+     #define cpPlugins_CONFIG_DIFFUSIONTENSORS_DiffusionTensor3D
+     #define cpPlugins_CONFIG_MATRICES_Matrix
+  */
+  /* TODO
+     if( !success )
+     {
+     this->m_ITK = NULL;
+     this->m_ITKvVTK = NULL;
+
+     } // fi
+     this->Modified( );
+  */
+}
+
+// -------------------------------------------------------------------------
+cpInstances::DataObjects::Image::
+Image( )
+  : Superclass( )
+{
+}
+
+// -------------------------------------------------------------------------
+cpInstances::DataObjects::Image::
+~Image( )
+{
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::Image::
+_UpdateITK( ) const
+{
+  // TODO: std::cout << "Create ITK representation." << std::endl;
+}
+
+// -------------------------------------------------------------------------
+void cpInstances::DataObjects::Image::
+_UpdateVTK( ) const
+{
+  auto i = const_cast< itk::LightObject* >( this->m_ITK.GetPointer( ) );
+  auto v = const_cast< vtkObjectBase* >( this->m_VTK.GetPointer( ) );
+  if( i != NULL && v == NULL )
+  {
+    cpPlugins_Demangle_Image_VisualDims_1( i, _ITK_2_VTK_0 )
+      cpPlugins_Demangle_Image_DiffTensors3D_1( i, _ITK_2_VTK_1 );
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+template< class _TImage >
+void cpInstances::DataObjects::Image::
+_ITK_2_VTK_0( _TImage* image ) const
+{
+  static const unsigned int d = _TImage::ImageDimension;
+  cpPlugins_Demangle_Image_ScalarPixels_1( image, _ITK_2_VTK_1, d )
+    cpPlugins_Demangle_Image_ColorPixels_1( image, _ITK_2_VTK_1, d )
+    cpPlugins_Demangle_Image_VectorPixels_1( image, _ITK_2_VTK_1, d );
+}
+
+// -------------------------------------------------------------------------
+template< class _TImage >
+void cpInstances::DataObjects::Image::
+_ITK_2_VTK_1( _TImage* image ) const
+{
+  typedef itk::ImageToVTKImageFilter< _TImage > _TFilter;
+
+  Self* self = const_cast< Self* >( this );
+  _TFilter* f = dynamic_cast< _TFilter* >( self->m_ITKvVTK.GetPointer( ) );
+  if( f == NULL )
+  {
+    typename _TFilter::Pointer nf = _TFilter::New( );
+    self->m_ITKvVTK = nf;
+    f = nf.GetPointer( );
+
+  } // fi
+  f->SetInput( image );
+  f->Update( );
+
+  // Keep object track
+  self->m_ITK = image;
+  self->m_VTK = f->GetOutput( );
+}
+
+// -------------------------------------------------------------------------
+template< class _TPixel >
+bool cpInstances::DataObjects::Image::
+_VTK_2_ITK_0( vtkImageData* image )
+{
+  bool success = false;
+  unsigned int dim = image->GetDataDimension( );
+#ifdef cpPlugins_CONFIG_VISUAL_DIMENSIONS_2
+  if( dim == 2 ) success = this->_VTK_2_ITK_1< _TPixel, 2 >( image );
+#endif // cpPlugins_CONFIG_VISUAL_DIMENSIONS_2
+#ifdef cpPlugins_CONFIG_VISUAL_DIMENSIONS_3
+  if( dim == 3 ) success = this->_VTK_2_ITK_1< _TPixel, 3 >( image );
+#endif // cpPlugins_CONFIG_VISUAL_DIMENSIONS_2
+  return( success );
+}
+
+// -------------------------------------------------------------------------
+template< class _TPixel, unsigned int _VDim >
+bool cpInstances::DataObjects::Image::
+_VTK_2_ITK_1( vtkImageData* image )
+{
+  typedef itk::Image< _TPixel, _VDim > _TImage;
+  typedef itk::VTKImageToImageFilter< _TImage > _TFilter;
+  _TFilter* f = dynamic_cast< _TFilter* >( this->m_ITKvVTK.GetPointer( ) );
+  if( f == NULL )
+  {
+    typename _TFilter::Pointer nf = _TFilter::New( );
+    this->m_ITKvVTK = nf;
+    f = nf.GetPointer( );
+
+  } // fi
+  f->SetInput( image );
+  f->Update( );
+
+  // Keep object track
+  this->m_VTK = image;
+  this->m_ITK = f->GetOutput( );
+  return( true );
+}
+
+// eof - $RCSfile$