]> Creatis software - bbtk.git/blob - packages/itkvtk/src/bbitkvtkvtkImageData2itkImage.cxx
New widget pipeline : progressing ...
[bbtk.git] / packages / itkvtk / src / bbitkvtkvtkImageData2itkImage.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbitkvtkvtkImageData2itkImage.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/11/25 11:17:18 $
7   Version:   $Revision: 1.4 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 /**
19  *  \file 
20  *  \brief 
21  */
22 #ifdef _USE_ITK_
23 #ifdef _USE_VTK_
24
25 #include "bbitkvtkvtkImageData2itkImage.h"
26 #include "bbitkvtkPackage.h"
27 // VtkToItkConnection 
28 #include "itkVTKImageToImageFilter.h"
29 // ItkToVtkConnection
30 //#include "itkImageToVTKImageFilter.h"
31
32
33 namespace bbitkvtk 
34 {
35   
36   BBTK_BLACK_BOX_IMPLEMENTATION(vtkImageData2itkImage,bbtk::AtomicBlackBox);
37
38   BBTK_ADD_BLACK_BOX_TO_PACKAGE(itkvtk,vtkImageData2itkImage);
39   
40 #define BBTK_TEMPLATE_VTK_IMAGE_DATA_SWITCH_DIM(I,DIM,M)                \
41   if (I->GetDataDimension()==DIM)                                       \
42     {                                                                   \
43       if (I->GetScalarType()==VTK_CHAR) M<char,DIM>();                  \
44       else if (I->GetScalarType()==VTK_SIGNED_CHAR) M<signed char,DIM>(); \
45       else if (I->GetScalarType()==VTK_UNSIGNED_CHAR) M<unsigned char,DIM>(); \
46       else if (I->GetScalarType()==VTK_SHORT) M<short,DIM>();           \
47       else if (I->GetScalarType()==VTK_UNSIGNED_SHORT) M<unsigned short,DIM>(); \
48       else if (I->GetScalarType()==VTK_INT) M<int,DIM>();               \
49       else if (I->GetScalarType()==VTK_UNSIGNED_INT) M<unsigned int,DIM>(); \
50       else if (I->GetScalarType()==VTK_LONG) M<long,DIM>();             \
51       else if (I->GetScalarType()==VTK_UNSIGNED_LONG) M<unsigned long,DIM>(); \
52       else if (I->GetScalarType()==VTK_FLOAT) M<float,DIM>();           \
53       else if (I->GetScalarType()==VTK_DOUBLE) M<double,DIM>();         \
54     }
55   
56 #define BBTK_TEMPLATE_VTK_IMAGE_DATA_SWITCH(I,M) \
57   BBTK_TEMPLATE_VTK_IMAGE_DATA_SWITCH_DIM(I,2,M) \
58   BBTK_TEMPLATE_VTK_IMAGE_DATA_SWITCH_DIM(I,3,M) 
59
60   void vtkImageData2itkImage::Convert()
61   {   
62     BBTK_TEMPLATE_VTK_IMAGE_DATA_SWITCH(bbGetInputIn(),Convert)
63   }
64   
65
66
67    template<class T, unsigned int D>
68    void vtkImageData2itkImage::Convert()
69   {
70     bbtkDebugMessage("process",5,"==> ["<<bbGetFullName()<<"] : Convert<"
71                         <<bbtk::TypeName<T>()<<","<<D
72                         <<">()"<<std::endl);
73     
74
75     typedef itk::Image<T,D> itkImageType;
76     typedef itk::VTKImageToImageFilter< itkImageType > VtkToItkConnection;
77     typename VtkToItkConnection::Pointer conv;
78
79     // No converter yet : create it and set its input
80     if (!mConverter) 
81       {
82         bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : No converter yet : creating it"<<std::endl);
83         conv = VtkToItkConnection::New();
84         mConverter = conv;
85         conv->SetInput( this->bbGetInputIn() );
86       }
87     else 
88       {
89         bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : Converter ok "<<std::endl);
90         // Input vtkImage type changed ? 
91         // Have to change the converter and set its input
92         conv = dynamic_cast<VtkToItkConnection*>
93           ((itk::ProcessObject*)mConverter);
94         if (!conv) 
95           {
96             bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : Converter of wrong input type : reacreating it "<<std::endl);
97             mConverter->UnRegister();
98             conv = VtkToItkConnection::New();
99             mConverter = conv;
100             conv->SetInput( this->bbGetInputIn() );
101           }
102         // Input image type did not change but input image pointer did:
103         // set new input
104         else if ( this->bbGetInputIn() != conv->GetExporter()->GetInput())
105           {
106             bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : Converter input changed : resetting it"<<std::endl);
107             conv->SetInput( this->bbGetInputIn() );
108           }
109         else 
110           {
111             bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : Nothing changed"<<std::endl);     
112           }
113       }
114     try
115       {
116         
117         bbtkDebugMessage("process",5,"    ["<<bbGetFullName()<<"] : Trying update"<<std::endl);  
118         conv->Update();
119         itkImageType* out = const_cast<itkImageType*>(conv->GetOutput());
120         bbSetOutputOut(out);    
121       }
122     catch( itk::ExceptionObject & e) 
123       {
124         bbtkError("vtkImageData2itkImage<"
125                   <<bbtk::TypeName<T>()<<","<<D
126                   <<">::Convert() : "<<e);
127       } 
128     bbtkDebugMessage("process",5,"<== ["<<bbGetFullName()<<"] : Convert<"
129                      <<bbtk::TypeName<T>()<<","<<D
130                      <<">() *DONE*"<<std::endl);         
131   }
132
133   
134   void vtkImageData2itkImage::bbUserConstructor()
135   {
136     //    bbSetOutputOut(NULL);
137     mConverter = 0;
138   }
139   
140   void vtkImageData2itkImage::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
141   {
142     //    bbSetOutputOut(NULL);
143     mConverter = 0;
144   }
145   
146   void vtkImageData2itkImage::bbUserDestructor()
147   {
148     //    if (mConverter) mConverter->UnRegister();
149   }
150   
151
152
153
154 }
155 // eo namespace bbtk
156
157 #endif
158 // _USE_VTK_
159 #endif
160 // _USE_ITK_