]> Creatis software - clitk.git/blob - common/clitkImageToImageGenericFilterBase.cxx
add MustStop function (for interrupting a filter)
[clitk.git] / common / clitkImageToImageGenericFilterBase.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18
19 // clitk
20 #include "clitkImageToImageGenericFilterBase.h"
21
22 // itk
23 #include <itkImage.h>
24
25 //--------------------------------------------------------------------
26 clitk::ImageToImageGenericFilterBase::~ImageToImageGenericFilterBase() {}
27 //--------------------------------------------------------------------
28
29
30 //--------------------------------------------------------------------
31 clitk::ImageToImageGenericFilterBase::ImageToImageGenericFilterBase(std::string n)
32   :m_IOVerbose(false)
33 {
34   m_FilterName = n;
35   m_FailOnImageTypeError = true;
36   m_ReadOnDisk = true;
37   m_LastError = "";
38   StopOnErrorOn();
39 }
40 //--------------------------------------------------------------------
41
42
43 //--------------------------------------------------------------------
44 void clitk::ImageToImageGenericFilterBase::SetInputFilenames(const std::vector<std::string> & filenames)
45 {
46   m_InputFilenames = filenames;
47 }
48 //--------------------------------------------------------------------
49
50
51 //--------------------------------------------------------------------
52 void clitk::ImageToImageGenericFilterBase::EnableReadOnDisk(bool b)
53 {
54   m_ReadOnDisk = b;
55 }
56 //--------------------------------------------------------------------
57
58
59 //--------------------------------------------------------------------
60 void clitk::ImageToImageGenericFilterBase::SetInputFilename(const std::string & filename)
61 {
62   std::vector<std::string> f;
63   f.push_back(filename);
64   SetInputFilenames(f);
65 }
66 //--------------------------------------------------------------------
67
68
69 //--------------------------------------------------------------------
70 void clitk::ImageToImageGenericFilterBase::AddInputFilename(const std::string & filename)
71 {
72   m_InputFilenames.push_back(filename);
73 }
74 //--------------------------------------------------------------------
75
76
77 //--------------------------------------------------------------------
78 void clitk::ImageToImageGenericFilterBase::SetOutputFilename(const std::string & filename)
79 {
80   m_OutputFilenames.clear();
81   m_OutputFilenames.push_back(filename);
82 }
83 //--------------------------------------------------------------------
84
85
86 //--------------------------------------------------------------------
87 void clitk::ImageToImageGenericFilterBase::AddOutputFilename(const std::string & filename)
88 {
89   m_OutputFilenames.push_back(filename);
90 }
91 //--------------------------------------------------------------------
92
93
94 //--------------------------------------------------------------------
95 void clitk::ImageToImageGenericFilterBase::SetOutputFilenames(const std::vector<std::string> & filenames)
96 {
97   m_OutputFilenames.clear();
98   std::copy(filenames.begin(),filenames.end(),m_OutputFilenames.begin());
99 }
100 //--------------------------------------------------------------------
101
102
103 //--------------------------------------------------------------------
104 std::string clitk::ImageToImageGenericFilterBase::GetOutputFilename()
105 {
106   assert(m_OutputFilenames.size() == 1);
107   return m_OutputFilenames.front();
108 }
109 //--------------------------------------------------------------------
110
111
112 //--------------------------------------------------------------------
113 void clitk::ImageToImageGenericFilterBase::GetInputImageDimensionAndPixelType(unsigned int& dim, \
114     std::string& pixeltype,unsigned int& components)
115 {
116   if (m_ReadOnDisk && m_InputFilenames.size()) {
117     int comp_temp,dim_temp; //clitkCommonImage takes ints
118     ReadImageDimensionAndPixelType(m_InputFilenames[0], dim_temp, pixeltype,comp_temp);
119     components=comp_temp;
120     dim=dim_temp;
121   } else {
122     if (m_InputVVImages.size()) {
123       pixeltype = m_InputVVImages[0]->GetScalarTypeAsITKString();
124       dim = m_InputVVImages[0]->GetNumberOfDimensions();
125       components = m_InputVVImages[0]->GetNumberOfScalarComponents();
126     } else
127       assert(false); //No input image, shouldn't happen
128   }
129   if (m_IOVerbose) {
130     std::cout << "Input is " << m_Dim << "D " << m_PixelTypeName << "." << std::endl;
131   }
132 }
133 //--------------------------------------------------------------------
134
135
136 //--------------------------------------------------------------------
137 vvImage::Pointer clitk::ImageToImageGenericFilterBase::GetOutputVVImage ()
138 {
139   assert(m_OutputVVImages.size());
140   return m_OutputVVImages[0];
141 }
142 //--------------------------------------------------------------------
143
144
145 //--------------------------------------------------------------------
146 std::vector<vvImage::Pointer> clitk::ImageToImageGenericFilterBase::GetOutputVVImages()
147 {
148   return m_OutputVVImages;
149 }
150 //--------------------------------------------------------------------
151
152
153 //--------------------------------------------------------------------
154 void clitk::ImageToImageGenericFilterBase::SetInputVVImage (vvImage::Pointer input)
155 {
156   m_InputVVImages.clear();
157   m_InputVVImages.push_back(input);
158 }
159 //--------------------------------------------------------------------
160
161
162 //--------------------------------------------------------------------
163 void clitk::ImageToImageGenericFilterBase::AddInputVVImage (vvImage::Pointer input)
164 {
165   m_InputVVImages.push_back(input);
166 }
167 //--------------------------------------------------------------------
168
169
170 //--------------------------------------------------------------------
171 void clitk::ImageToImageGenericFilterBase::SetInputVVImages (std::vector<vvImage::Pointer> input)
172 {
173   m_InputVVImages=input;
174 }
175 //--------------------------------------------------------------------
176
177
178 //--------------------------------------------------------------------
179 void clitk::ImageToImageGenericFilterBase::PrintAvailableImageTypes()
180 {
181   std::cout << GetAvailableImageTypes();
182 }
183 //--------------------------------------------------------------------
184
185
186
187 //--------------------------------------------------------------------
188 void clitk::ImageToImageGenericFilterBase::ImageTypeError()
189 {
190   std::cerr << "**Error** The filter <" << m_FilterName << "> is not available for "
191             << m_Dim << "D images with pixel="
192             << m_PixelTypeName << " and "
193             << m_NbOfComponents << " component." << std::endl;
194   std::cerr << GetAvailableImageTypes();
195   exit(0);
196 }
197 //--------------------------------------------------------------------
198
199
200 //--------------------------------------------------------------------
201 void clitk::ImageToImageGenericFilterBase::SetImageTypeError()
202 {
203   std::cerr << "TODO ! " << std::endl;
204   exit(0);
205 }
206 //--------------------------------------------------------------------
207
208
209 //--------------------------------------------------------------------
210 const std::string & clitk::ImageToImageGenericFilterBase::GetFilterName()
211 {
212   return m_FilterName;
213 }
214 //--------------------------------------------------------------------
215
216
217 //--------------------------------------------------------------------
218 void clitk::ImageToImageGenericFilterBase::SetFilterName(std::string & n)
219 {
220   m_FilterName = n;
221 }
222 //--------------------------------------------------------------------
223
224
225 //--------------------------------------------------------------------
226 void clitk::ImageToImageGenericFilterBase::SetIOVerbose(bool b)
227 {
228   m_IOVerbose = b;
229 }
230 //--------------------------------------------------------------------
231
232 #define DEF_SetNextOutput_And_GetInput(PixelType, Dim) \
233   template \
234 void clitk::ImageToImageGenericFilterBase::SetNextOutput<itk::Image<PixelType, Dim> >(itk::Image<PixelType,Dim>::Pointer output); \
235   template \
236    itk::Image<PixelType, Dim>::Pointer clitk::ImageToImageGenericFilterBase::GetInput<itk::Image<PixelType, Dim> >(unsigned int n);
237
238 #define DEF_SetNextOutput_And_GetInput_WithCompo(Compo, Dim)   \
239   template \
240   void clitk::ImageToImageGenericFilterBase::SetNextOutput<itk::Image<itk::Vector<float, Compo>, Dim> >(itk::Image<itk::Vector<float, Compo>,Dim>::Pointer output); \
241   template \
242   itk::Image<itk::Vector<float,Compo>, Dim>::Pointer clitk::ImageToImageGenericFilterBase::GetInput<itk::Image<itk::Vector<float, Compo>, Dim> >(unsigned int n);
243
244 DEF_SetNextOutput_And_GetInput(char, 2);
245 DEF_SetNextOutput_And_GetInput(unsigned char, 2);
246 DEF_SetNextOutput_And_GetInput(short, 2);
247 DEF_SetNextOutput_And_GetInput(unsigned short, 2);
248 DEF_SetNextOutput_And_GetInput(int, 2);
249 DEF_SetNextOutput_And_GetInput(float, 2);
250 DEF_SetNextOutput_And_GetInput(double, 2);
251
252 DEF_SetNextOutput_And_GetInput(char, 3);
253 DEF_SetNextOutput_And_GetInput(unsigned char, 3);
254 DEF_SetNextOutput_And_GetInput(short, 3);
255 DEF_SetNextOutput_And_GetInput(unsigned short, 3);
256 DEF_SetNextOutput_And_GetInput(int, 3);
257 DEF_SetNextOutput_And_GetInput(float, 3);
258 DEF_SetNextOutput_And_GetInput(double, 3);
259
260 DEF_SetNextOutput_And_GetInput_WithCompo(2, 2);
261 DEF_SetNextOutput_And_GetInput_WithCompo(2, 3);
262 DEF_SetNextOutput_And_GetInput_WithCompo(2, 4);
263 DEF_SetNextOutput_And_GetInput_WithCompo(3, 2);
264 DEF_SetNextOutput_And_GetInput_WithCompo(3, 3);
265 DEF_SetNextOutput_And_GetInput_WithCompo(3, 4);
266 DEF_SetNextOutput_And_GetInput_WithCompo(4, 2);
267 DEF_SetNextOutput_And_GetInput_WithCompo(4, 3);
268 DEF_SetNextOutput_And_GetInput_WithCompo(4, 4);
269
270 DEF_SetNextOutput_And_GetInput(char, 4);
271 DEF_SetNextOutput_And_GetInput(unsigned char, 4);
272 DEF_SetNextOutput_And_GetInput(short, 4);
273 DEF_SetNextOutput_And_GetInput(unsigned short, 4);
274 DEF_SetNextOutput_And_GetInput(int, 4);
275 DEF_SetNextOutput_And_GetInput(float, 4);
276 DEF_SetNextOutput_And_GetInput(double, 4);
277
278
279 //--------------------------------------------------------------------
280 template<class ImageType>
281 void clitk::ImageToImageGenericFilterBase::SetNextOutput(typename ImageType::Pointer output)
282 {
283   if (m_OutputFilenames.size()) {
284     clitk::writeImage<ImageType>(output, m_OutputFilenames.front(), m_IOVerbose);
285     m_OutputFilenames.pop_front();
286   }
287   if (m_InputVVImages.size()) //We assume that if a vv image is set as input, we want one as the output
288     m_OutputVVImages.push_back(vvImageFromITK<ImageType::ImageDimension,typename ImageType::PixelType>(output));
289 }
290 //--------------------------------------------------------------------
291
292
293 //--------------------------------------------------------------------
294 template<class ImageType>
295 typename ImageType::Pointer clitk::ImageToImageGenericFilterBase::GetInput(unsigned int n)
296 {
297   if (m_ReadOnDisk && m_InputFilenames.size() > n) {
298     return clitk::readImage<ImageType>(m_InputFilenames[n], m_IOVerbose);
299   } else {
300     if (m_InputVVImages.size() > n)
301       return typename ImageType::Pointer(const_cast<ImageType*>(vvImageToITK<ImageType>(m_InputVVImages[n]).GetPointer()));
302     else {
303       assert(false); //No input, this shouldn't happen
304       return typename ImageType::Pointer(NULL);
305     }
306   }
307 }
308 //--------------------------------------------------------------------
309
310
311 //--------------------------------------------------------------------
312 void clitk::ImageToImageGenericFilterBase::MustStop()
313 {
314   if (m_FilterBase != NULL) {
315     m_FilterBase->SetMustStop(true);
316   }
317 }
318 //--------------------------------------------------------------------
319
320
321