]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Interface/Image.hxx
5b675b2bcada1e7a2a436d6c50594f30efd9cb30
[cpPlugins.git] / lib / cpPlugins / Interface / Image.hxx
1 #ifndef __CPPLUGINS__INTERFACE__IMAGE__HXX__
2 #define __CPPLUGINS__INTERFACE__IMAGE__HXX__
3
4 #include <complex>
5
6 #include <itkImage.h>
7 #include <itkVectorImage.h>
8 #include <itkImageToVTKImageFilter.h>
9
10 #include <itkCovariantVector.h>
11 #include <itkDiffusionTensor3D.h>
12 #include <itkPoint.h>
13 #include <itkRGBPixel.h>
14 #include <itkRGBAPixel.h>
15 #include <itkSymmetricSecondRankTensor.h>
16 #include <itkVector.h>
17
18 // -------------------------------------------------------------------------
19 #define cpPlugins_VTKImage_Demangle( TI, T, D, o )              \
20   if( typeid( TI ) == typeid( itk::Image< T, D > ) )            \
21     this->_ITK_2_VTK< T, D >( o )
22
23 // -------------------------------------------------------------------------
24 #define cpPlugins_VTKImageArray_Demangle( TI, T, P, DP, DI, o )      \
25   if( typeid( TI ) == typeid( itk::Image< T< P, DP >, DI > ) )       \
26     this->_ITK_2_VTK< T< P, DP >, DI >( o )
27
28 // -------------------------------------------------------------------------
29 #define cpPlugins_VTKImage_Demangle_AllDims( TI, T, o )         \
30   cpPlugins_VTKImage_Demangle( TI, T, 2, o );                   \
31   else cpPlugins_VTKImage_Demangle( TI, T, 3, o )
32
33 // -------------------------------------------------------------------------
34 #define cpPlugins_VTKImageArray_Demangle_AllDims( TI, T, P, o )      \
35   cpPlugins_VTKImageArray_Demangle( TI, T, P, 2, 2, o );             \
36   else cpPlugins_VTKImageArray_Demangle( TI, T, P, 3, 3, o )
37
38 // -------------------------------------------------------------------------
39 template< class I >
40 void cpPlugins::Interface::Image::
41 SetITK( itk::Object* object )
42 {
43   // Check if input object has the desired type
44   I* image = dynamic_cast< I* >( object );
45   if( image == NULL )
46   {
47     this->m_ITKObject = NULL;
48     this->m_VTKObject = NULL;
49     this->m_ITKvVTKConnection = NULL;
50     this->Modified( );
51
52   } // fi
53
54   // --------- TODO ---------------
55   typename I::DirectionType norm_dir;
56   norm_dir.SetIdentity( );
57   image->SetDirection( norm_dir );
58   // --------- TODO ---------------
59
60   // Connect it to VTK
61   cpPlugins_VTKImage_Demangle_AllDims( I, char, image );
62   else cpPlugins_VTKImage_Demangle_AllDims( I, short, image );
63   else cpPlugins_VTKImage_Demangle_AllDims( I, int, image );
64   else cpPlugins_VTKImage_Demangle_AllDims( I, long, image );
65   else cpPlugins_VTKImage_Demangle_AllDims( I, unsigned char, image );
66   else cpPlugins_VTKImage_Demangle_AllDims( I, unsigned short, image );
67   else cpPlugins_VTKImage_Demangle_AllDims( I, unsigned int, image );
68   else cpPlugins_VTKImage_Demangle_AllDims( I, unsigned long, image );
69   else cpPlugins_VTKImage_Demangle_AllDims( I, float, image );
70   else cpPlugins_VTKImage_Demangle_AllDims( I, double, image );
71   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< char >, image );
72   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< short >, image );
73   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< int >, image );
74   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< long >, image );
75   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< unsigned char >, image );
76   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< unsigned short >, image );
77   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< unsigned int >, image );
78   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< unsigned long >, image );
79   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< float >, image );
80   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBPixel< double >, image );
81   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< char >, image );
82   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< short >, image );
83   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< int >, image );
84   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< long >, image );
85   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< unsigned char >, image );
86   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< unsigned short >, image );
87   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< unsigned int >, image );
88   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< unsigned long >, image );
89   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< float >, image );
90   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::RGBAPixel< double >, image );
91   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::DiffusionTensor3D< float >, image );
92   else cpPlugins_VTKImage_Demangle_AllDims( I, itk::DiffusionTensor3D< double >, image );
93   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::Vector, float, image );
94   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::Vector, double, image );
95   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::CovariantVector, float, image );
96   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::CovariantVector, double, image );
97   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::Point, float, image );
98   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::Point, double, image );
99   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::SymmetricSecondRankTensor, float, image );
100   else cpPlugins_VTKImageArray_Demangle_AllDims( I, itk::SymmetricSecondRankTensor, double, image );
101   else
102   {
103     this->m_VTKObject = NULL;
104     this->m_ITKvVTKConnection = NULL;
105
106   } // fi
107
108   // Keep objects
109   this->m_ITKObject = object;
110   this->Modified( );
111 }
112
113 // -------------------------------------------------------------------------
114 template< class P, unsigned int D >
115 void cpPlugins::Interface::Image::
116 _ITK_2_VTK( itk::Object* object )
117 {
118   typedef itk::Image< P, D > _I;
119   typedef itk::ImageToVTKImageFilter< _I > _I2Vtk;
120
121   // Check if input object has the desired type
122   _I* image = dynamic_cast< _I* >( object );
123   if( image == NULL )
124     return;
125
126   // Connect it to VTK
127   _I2Vtk* f =
128     dynamic_cast< _I2Vtk* >( this->m_ITKvVTKConnection.GetPointer( ) );
129   if( f == NULL )
130   {
131     typename _I2Vtk::Pointer nf = _I2Vtk::New( );
132     this->m_ITKvVTKConnection = nf;
133     f = nf.GetPointer( );
134
135   } // fi
136   f->SetInput( image );
137   f->Update( );
138
139   // Keep object track
140   this->m_VTKObject = f->GetOutput( );
141 }
142
143 #ifndef cpPlugins_Interface_EXPORTS
144
145 // =========================================================================
146 // ==========           Declare import itk::Image types           ==========
147 // =========================================================================
148
149 // -------------------------------------------------------------------------
150 #define cpPlugins_ITKImage_Import( T, D )                       \
151   cpPlugins_TEMPLATE_IMPORT(                                    \
152     2(class cpPlugins_Interface_EXPORT itk::Image< T, D >)      \
153     )
154
155 // -------------------------------------------------------------------------
156 #define cpPlugins_ITKArrayImage_Import( A, T, DA, DI )                  \
157   cpPlugins_TEMPLATE_IMPORT(                                            \
158     3(class cpPlugins_Interface_EXPORT itk::Image< A< T, DA >, DI >)    \
159     )
160
161 // -------------------------------------------------------------------------
162 #define cpPlugins_ITKImage_AllDims_Import( T )  \
163   cpPlugins_ITKImage_Import( T, 2 );            \
164   cpPlugins_ITKImage_Import( T, 3 );            \
165   cpPlugins_ITKImage_Import( T, 4 )
166
167 // -------------------------------------------------------------------------
168 #define cpPlugins_ITKArrayImage_AllDims_Import( A, T )  \
169   cpPlugins_ITKArrayImage_Import( A, T, 2, 2 );         \
170   cpPlugins_ITKArrayImage_Import( A, T, 3, 3 );         \
171   cpPlugins_ITKArrayImage_Import( A, T, 4, 4 )
172
173 // -------------------------------------------------------------------------
174 #define cpPlugins_VTKImage_Import( T, D )               \
175   cpPlugins_TEMPLATE_IMPORT(                            \
176     2(                                                  \
177       class cpPlugins_Interface_EXPORT                  \
178       itk::ImageToVTKImageFilter< itk::Image< T, D > >  \
179       )                                                 \
180     )
181
182 // -------------------------------------------------------------------------
183 #define cpPlugins_VTKArrayImage_Import( A, T, DA, DI )                  \
184   cpPlugins_TEMPLATE_IMPORT(                                            \
185     3(class                                                             \
186       cpPlugins_Interface_EXPORT                                        \
187       itk::ImageToVTKImageFilter< itk::Image< A< T, DA >, DI > >)       \
188     )
189
190 // -------------------------------------------------------------------------
191 #define cpPlugins_VTKImage_AllDims_Import( T )  \
192   cpPlugins_VTKImage_Import( T, 2 );            \
193   cpPlugins_VTKImage_Import( T, 3 )
194
195 // -------------------------------------------------------------------------
196 #define cpPlugins_VTKArrayImage_AllDims_Import( A, T )  \
197   cpPlugins_VTKArrayImage_Import( A, T, 2, 2 );         \
198   cpPlugins_VTKArrayImage_Import( A, T, 3, 3 )
199
200 // -------------------------------------------------------------------------
201 #define cpPlugins_Image_Import( T, D )          \
202   cpPlugins_ITKImage_Import( T, D );            \
203   cpPlugins_VTKImage_Import( T, D )             \
204   
205 // -------------------------------------------------------------------------
206 #define cpPlugins_Image_AllDims_Import( T )     \
207   cpPlugins_ITKImage_AllDims_Import( T );       \
208   cpPlugins_VTKImage_AllDims_Import( T )        \
209   
210 // -------------------------------------------------------------------------
211 #define cpPlugins_ArrayImage_AllDims_Import( A, T )     \
212   cpPlugins_ITKArrayImage_AllDims_Import( A, T );       \
213   cpPlugins_VTKArrayImage_AllDims_Import( A, T )        \
214   
215 // -------------------------------------------------------------------------
216 // ITK-VTK base clases
217 // -------------------------------------------------------------------------
218
219 cpPlugins_Image_AllDims_Import( char );
220 cpPlugins_Image_AllDims_Import( short );
221 cpPlugins_Image_AllDims_Import( int );
222 cpPlugins_Image_AllDims_Import( long );
223 cpPlugins_Image_AllDims_Import( unsigned char );
224 cpPlugins_Image_AllDims_Import( unsigned short );
225 cpPlugins_Image_AllDims_Import( unsigned int );
226 cpPlugins_Image_AllDims_Import( unsigned long );
227 cpPlugins_Image_AllDims_Import( float );
228 cpPlugins_Image_AllDims_Import( double );
229
230 cpPlugins_Image_AllDims_Import( itk::RGBPixel< char > );
231 cpPlugins_Image_AllDims_Import( itk::RGBPixel< short > );
232 cpPlugins_Image_AllDims_Import( itk::RGBPixel< int > );
233 cpPlugins_Image_AllDims_Import( itk::RGBPixel< long > );
234 cpPlugins_Image_AllDims_Import( itk::RGBPixel< unsigned char > );
235 cpPlugins_Image_AllDims_Import( itk::RGBPixel< unsigned short > );
236 cpPlugins_Image_AllDims_Import( itk::RGBPixel< unsigned int > );
237 cpPlugins_Image_AllDims_Import( itk::RGBPixel< unsigned long > );
238 cpPlugins_Image_AllDims_Import( itk::RGBPixel< float > );
239 cpPlugins_Image_AllDims_Import( itk::RGBPixel< double > );
240
241 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< char > );
242 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< short > );
243 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< int > );
244 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< long > );
245 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< unsigned char > );
246 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< unsigned short > );
247 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< unsigned int > );
248 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< unsigned long > );
249 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< float > );
250 cpPlugins_Image_AllDims_Import( itk::RGBAPixel< double > );
251
252 cpPlugins_Image_AllDims_Import( itk::DiffusionTensor3D< float > );
253 cpPlugins_Image_AllDims_Import( itk::DiffusionTensor3D< double > );
254
255 cpPlugins_ArrayImage_AllDims_Import( itk::Vector, float );
256 cpPlugins_ArrayImage_AllDims_Import( itk::Vector, double );
257
258 cpPlugins_ArrayImage_AllDims_Import( itk::CovariantVector, float );
259 cpPlugins_ArrayImage_AllDims_Import( itk::CovariantVector, double );
260
261 cpPlugins_ArrayImage_AllDims_Import( itk::Point, float );
262 cpPlugins_ArrayImage_AllDims_Import( itk::Point, double );
263
264 cpPlugins_ArrayImage_AllDims_Import( itk::SymmetricSecondRankTensor, float );
265 cpPlugins_ArrayImage_AllDims_Import( itk::SymmetricSecondRankTensor, double );
266
267 // -------------------------------------------------------------------------
268 // ITK-only base clases
269 // -------------------------------------------------------------------------
270
271 cpPlugins_ITKImage_AllDims_Import( std::complex< float > );
272 cpPlugins_ITKImage_AllDims_Import( std::complex< double > );
273
274 cpPlugins_ITKImage_Import( itk::Offset< 2 >, 2 );
275 cpPlugins_ITKImage_Import( itk::Offset< 3 >, 3 );
276 cpPlugins_ITKImage_Import( itk::Offset< 4 >, 4 );
277
278 // =========================================================================
279 // ==========        Declare import itk::VectorImage types        ==========
280 // =========================================================================
281
282 // -------------------------------------------------------------------------
283 #define cpPlugins_VectorImage_Import( T, D )                            \
284   cpPlugins_TEMPLATE_IMPORT(                                            \
285     2(class cpPlugins_Interface_EXPORT itk::VectorImage< T, D >)        \
286     )
287
288 // -------------------------------------------------------------------------
289 #define cpPlugins_ArrayVectorImage_Import( A, T, DA, DI )               \
290   cpPlugins_TEMPLATE_IMPORT(                                            \
291     3(class                                                             \
292       cpPlugins_Interface_EXPORT                                        \
293       itk::VectorImage< A< T, DA >, DI >)                               \
294     )
295
296 // -------------------------------------------------------------------------
297 #define cpPlugins_VectorImage_AllDims_Import( T )  \
298   cpPlugins_VectorImage_Import( T, 2 );            \
299   cpPlugins_VectorImage_Import( T, 3 );            \
300   cpPlugins_VectorImage_Import( T, 4 )
301
302 // -------------------------------------------------------------------------
303 #define cpPlugins_ArrayVectorImage_AllDims_Import( A, T )     \
304   cpPlugins_ArrayVectorImage_Import( A, T, 2, 2 );            \
305   cpPlugins_ArrayVectorImage_Import( A, T, 3, 3 );            \
306   cpPlugins_ArrayVectorImage_Import( A, T, 4, 4 )
307
308 // -------------------------------------------------------------------------
309 // ITK-VTK base clases
310 // -------------------------------------------------------------------------
311
312 cpPlugins_VectorImage_AllDims_Import( char );
313 cpPlugins_VectorImage_AllDims_Import( short );
314 cpPlugins_VectorImage_AllDims_Import( int );
315 cpPlugins_VectorImage_AllDims_Import( long );
316 cpPlugins_VectorImage_AllDims_Import( unsigned char );
317 cpPlugins_VectorImage_AllDims_Import( unsigned short );
318 cpPlugins_VectorImage_AllDims_Import( unsigned int );
319 cpPlugins_VectorImage_AllDims_Import( unsigned long );
320 cpPlugins_VectorImage_AllDims_Import( float );
321 cpPlugins_VectorImage_AllDims_Import( double );
322
323 cpPlugins_VectorImage_AllDims_Import( std::complex< float > );
324 cpPlugins_VectorImage_AllDims_Import( std::complex< double > );
325
326 cpPlugins_VectorImage_Import( itk::Offset< 2 >, 2 );
327 cpPlugins_VectorImage_Import( itk::Offset< 3 >, 3 );
328 cpPlugins_VectorImage_Import( itk::Offset< 4 >, 4 );
329
330 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< char > );
331 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< short > );
332 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< int > );
333 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< long > );
334 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< unsigned char > );
335 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< unsigned short > );
336 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< unsigned int > );
337 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< unsigned long > );
338 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< float > );
339 cpPlugins_VectorImage_AllDims_Import( itk::RGBPixel< double > );
340
341 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< char > );
342 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< short > );
343 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< int > );
344 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< long > );
345 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< unsigned char > );
346 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< unsigned short > );
347 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< unsigned int > );
348 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< unsigned long > );
349 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< float > );
350 cpPlugins_VectorImage_AllDims_Import( itk::RGBAPixel< double > );
351
352 cpPlugins_VectorImage_AllDims_Import( itk::DiffusionTensor3D< float > );
353 cpPlugins_VectorImage_AllDims_Import( itk::DiffusionTensor3D< double > );
354
355 cpPlugins_ArrayVectorImage_AllDims_Import( itk::Vector, float );
356 cpPlugins_ArrayVectorImage_AllDims_Import( itk::Vector, double );
357
358 cpPlugins_ArrayVectorImage_AllDims_Import( itk::CovariantVector, float );
359 cpPlugins_ArrayVectorImage_AllDims_Import( itk::CovariantVector, double );
360
361 cpPlugins_ArrayVectorImage_AllDims_Import( itk::Point, float );
362 cpPlugins_ArrayVectorImage_AllDims_Import( itk::Point, double );
363
364 cpPlugins_ArrayVectorImage_AllDims_Import(
365   itk::SymmetricSecondRankTensor, float
366   );
367 cpPlugins_ArrayVectorImage_AllDims_Import(
368   itk::SymmetricSecondRankTensor, double
369   );
370
371 #endif // cpPlugins_Interface_EXPORTS
372
373 #endif // __CPPLUGINS__INTERFACE__IMAGE__HXX__
374
375 // eof - $RCSfile$