1 #include "creaImageIOWxAnySimpleDlg.h"
3 #include "creaImageIOWxGimmickReaderDialog.h"
4 #include <itkAnalyzeImageIO.h>
5 #include <itkImageFileReader.h>
6 #include <itkImageSeriesReader.h>
8 #include <itkImageSeriesWriter.h>
9 #include <itkGDCMImageIO.h>
10 #include <itkDICOMSeriesFileNames.h>
11 #include <itkNumericSeriesFileNames.h>
12 #include <itkVectorImage.h>
13 #include <itkMetaImageIO.h>
14 #include <itkOrientedImage.h>
15 #include <vtkImageReader2.h>
16 #include <vtkMetaImageReader.h>
17 #include <boost/filesystem/path.hpp>
18 #include <boost/filesystem.hpp>
19 #include <boost/utility.hpp>
20 #include <creaVtkBasicSlicer.h>
21 #include "itkImageToVTKImageFilter.h"
27 WxAnySimpleDlg::WxAnySimpleDlg(wxWindow *parent,
29 const std::string i_namedescp ,
30 const std::string i_namedb)
31 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
33 namedescp = i_namedescp;
38 this->SetTitle(i_title);
40 // Button to select file(s)
41 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
42 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadFile );
44 // Button to select directory
45 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
46 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadDirectory );
48 // button to select creaImageIO
49 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
50 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadGimmick );
52 /// \TODO Button to select Bruker directory
57 //////////////////////////////////////////////////////////////////////
59 //////////////////////////////////////////////////////////////////////
61 void WxAnySimpleDlg::OnReadFile(wxCommandEvent& event)
64 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
66 resultShowModal = fileDlg->ShowModal();
67 if ( resultShowModal==wxID_OK )
69 wxArrayString wxArray;
70 fileDlg->GetPaths(wxArray);
73 for( int i = 0; i < wxArray.GetCount(); i++)
75 std::string name = crea::wx2std(wxArray[i]);
76 // FOR THE MOMENT ONLY short 3D et short 4D
81 // TO DO WARNING MESSAGES
84 SetReturnCode( resultShowModal );
86 EndModal( resultShowModal );
91 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
95 //////////////////////////////////////////////////////////////////////
97 //////////////////////////////////////////////////////////////////////
99 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
103 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
104 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
106 resultShowModal = dirDlg->ShowModal();
107 if ( resultShowModal==wxID_OK )
109 std::string path = crea::wx2std(dirDlg->GetPath());
110 typedef boost::filesystem::directory_iterator dir_it;
113 /*if (boost::filesystem::exists(path))
115 for(;itr != end_itr; ++itr)
117 bvalid = m_exts.size() == 0? true : false;
118 std::vector<std::string>::iterator it = m_exts.begin();
119 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
120 for(; it != m_exts.end(); it++)
128 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
130 readImg(itr->string().c_str());
134 SetReturnCode( resultShowModal );
136 EndModal( resultShowModal );
139 //////////////////////////////////////////////////////////////////////
141 //////////////////////////////////////////////////////////////////////
143 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
146 WxGimmickReaderDialog dlg(0,-1,
149 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
152 GIMMICK_2D_IMAGE_SELECTION,
153 GIMMICK_3D_IMAGE_SELECTION,
157 if (dlg.GetReturnCode() == wxID_OK)
159 std::vector<std::string> out;
161 dlg.GetSelectedFiles(out);
168 std::vector<std::string>::iterator ii = out.begin();
169 for (;ii != out.end();ii++)
171 readImg( (*ii).c_str() );
176 SetReturnCode( dlg.GetReturnCode() );
178 EndModal( dlg.GetReturnCode() );
183 wxString WxAnySimpleDlg::getInfoImage()
189 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
190 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
192 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
193 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
194 imageIO->SetFileName(i_name.c_str());
195 imageIO->ReadImageInformation();
196 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
199 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
201 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
202 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
203 imageIO->SetFileName(i_name.c_str());
204 imageIO->ReadImageInformation();
205 return imageIO->GetNumberOfDimensions();
208 void WxAnySimpleDlg::readImg(const std::string &i_name)
210 size_t dims = getNumberOfDimensions(i_name);
211 const std::type_info *type= &getType(i_name);
215 if (getType(i_name) == typeid(unsigned char))
217 typedef itk::Image<unsigned char, 3> TImage;
218 typedef itk::ImageFileReader<TImage> ReaderType;
219 ReaderType::Pointer reader = ReaderType::New();
220 reader->SetFileName( i_name );
222 reader->GetOutput()->Register();
223 m_AnyImages.push_back(reader->GetOutput());
225 else if (getType(i_name) == typeid(signed char))
227 typedef itk::Image<signed char, 3> TImage;
228 typedef itk::ImageFileReader<TImage> ReaderType;
229 ReaderType::Pointer reader = ReaderType::New();
230 reader->SetFileName( i_name );
232 reader->GetOutput()->Register();
233 m_AnyImages.push_back(reader->GetOutput());
235 else if (getType(i_name) == typeid(short))
237 typedef itk::Image<short, 3> TImage;
238 typedef itk::ImageFileReader<TImage> ReaderType;
239 ReaderType::Pointer reader = ReaderType::New();
240 reader->SetFileName( i_name );
242 reader->GetOutput()->Register();
243 m_AnyImages.push_back(reader->GetOutput());
245 else if (getType(i_name) == typeid(unsigned short))
247 typedef itk::Image<unsigned short, 3> TImage;
248 typedef itk::ImageFileReader<TImage> ReaderType;
249 ReaderType::Pointer reader = ReaderType::New();
250 reader->SetFileName( i_name );
252 reader->GetOutput()->Register();
253 m_AnyImages.push_back(reader->GetOutput());
255 else if (getType(i_name) == typeid(unsigned int))
257 typedef itk::Image<unsigned int, 3> TImage;
258 typedef itk::ImageFileReader<TImage> ReaderType;
259 ReaderType::Pointer reader = ReaderType::New();
260 reader->SetFileName( i_name );
262 reader->GetOutput()->Register();
263 m_AnyImages.push_back(reader->GetOutput());
265 else if (getType(i_name) == typeid(signed int))
267 typedef itk::Image<signed int, 3> TImage;
268 typedef itk::ImageFileReader<TImage> ReaderType;
269 ReaderType::Pointer reader = ReaderType::New();
270 reader->SetFileName( i_name );
272 reader->GetOutput()->Register();
273 m_AnyImages.push_back(reader->GetOutput());
275 else if (getType(i_name) == typeid(unsigned long))
277 typedef itk::Image<unsigned long, 3> TImage;
278 typedef itk::ImageFileReader<TImage> ReaderType;
279 ReaderType::Pointer reader = ReaderType::New();
280 reader->SetFileName( i_name );
282 reader->GetOutput()->Register();
283 m_AnyImages.push_back(reader->GetOutput());
285 else if (getType(i_name) == typeid(signed long))
287 typedef itk::Image<signed long, 3> TImage;
288 typedef itk::ImageFileReader<TImage> ReaderType;
289 ReaderType::Pointer reader = ReaderType::New();
290 reader->SetFileName( i_name );
292 reader->GetOutput()->Register();
293 m_AnyImages.push_back(reader->GetOutput());
295 else if (getType(i_name) == typeid(float))
297 typedef itk::Image<float, 3> TImage;
298 typedef itk::ImageFileReader<TImage> ReaderType;
299 ReaderType::Pointer reader = ReaderType::New();
300 reader->SetFileName( i_name );
302 reader->GetOutput()->Register();
303 m_AnyImages.push_back(reader->GetOutput());
305 else if (getType(i_name) == typeid(double))
307 typedef itk::Image<double, 3> TImage;
308 typedef itk::ImageFileReader<TImage> ReaderType;
309 ReaderType::Pointer reader = ReaderType::New();
310 reader->SetFileName( i_name );
312 reader->GetOutput()->Register();
313 m_AnyImages.push_back(reader->GetOutput());
317 //????FCY, so what the type????
320 //assume that we have only one 4D file
322 if (getType(i_name) == typeid(unsigned char))
324 typedef itk::Image<unsigned char, 4> TImage;
325 typedef itk::ImageFileReader<TImage> ReaderType;
326 ReaderType::Pointer reader = ReaderType::New();
327 reader->SetFileName( i_name );
329 reader->GetOutput()->Register();
330 m_AnyImages.push_back(reader->GetOutput());
331 split4Din3Dvtk<TImage>(reader->GetOutput());
333 else if (getType(i_name) == typeid(signed char))
335 typedef itk::Image<signed char, 4> TImage;
336 typedef itk::ImageFileReader<TImage> ReaderType;
337 ReaderType::Pointer reader = ReaderType::New();
338 reader->SetFileName( i_name );
340 reader->GetOutput()->Register();
341 m_AnyImages.push_back(reader->GetOutput());
342 split4Din3Dvtk<TImage>(reader->GetOutput());
344 else if (getType(i_name) == typeid(unsigned short))
346 typedef itk::Image<unsigned short, 4> TImage;
347 typedef itk::ImageFileReader<TImage> ReaderType;
348 ReaderType::Pointer reader = ReaderType::New();
349 reader->SetFileName( i_name );
351 reader->GetOutput()->Register();
352 m_AnyImages.push_back(reader->GetOutput());
353 split4Din3Dvtk<TImage>(reader->GetOutput());
355 else if(getType(i_name) == typeid(short))
357 typedef itk::Image<short, 4> TImage;
358 typedef itk::ImageFileReader<TImage> ReaderType;
359 ReaderType::Pointer reader = ReaderType::New();
360 reader->SetFileName( i_name );
365 catch( itk::ExceptionObject & err )
367 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
368 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
373 std::cout << "Error while reading image " << i_name << std::endl;
376 reader->GetOutput()->Register();
377 m_AnyImages.push_back(reader->GetOutput());
378 split4Din3Dvtk<TImage>(reader->GetOutput());
380 else if (getType(i_name) == typeid(unsigned short))
382 typedef itk::Image<unsigned short, 4> TImage;
383 typedef itk::ImageFileReader<TImage> ReaderType;
384 ReaderType::Pointer reader = ReaderType::New();
385 reader->SetFileName( i_name );
387 reader->GetOutput()->Register();
388 m_AnyImages.push_back(reader->GetOutput());
389 split4Din3Dvtk<TImage>(reader->GetOutput());
391 else if (getType(i_name) == typeid(unsigned int))
393 typedef itk::Image<unsigned int, 4> TImage;
394 typedef itk::ImageFileReader<TImage> ReaderType;
395 ReaderType::Pointer reader = ReaderType::New();
396 reader->SetFileName( i_name );
398 reader->GetOutput()->Register();
399 m_AnyImages.push_back(reader->GetOutput());
400 split4Din3Dvtk<TImage>(reader->GetOutput());
402 else if (getType(i_name) == typeid(signed int))
404 typedef itk::Image<signed int, 4> TImage;
405 typedef itk::ImageFileReader<TImage> ReaderType;
406 ReaderType::Pointer reader = ReaderType::New();
407 reader->SetFileName( i_name );
409 reader->GetOutput()->Register();
410 m_AnyImages.push_back(reader->GetOutput());
411 split4Din3Dvtk<TImage>(reader->GetOutput());
413 else if (getType(i_name) == typeid(unsigned long))
415 typedef itk::Image<unsigned long, 4> TImage;
416 typedef itk::ImageFileReader<TImage> ReaderType;
417 ReaderType::Pointer reader = ReaderType::New();
418 reader->SetFileName( i_name );
420 reader->GetOutput()->Register();
421 m_AnyImages.push_back(reader->GetOutput());
422 split4Din3Dvtk<TImage>(reader->GetOutput());
424 else if (getType(i_name) == typeid(signed long))
426 typedef itk::Image<signed long, 4> TImage;
427 typedef itk::ImageFileReader<TImage> ReaderType;
428 ReaderType::Pointer reader = ReaderType::New();
429 reader->SetFileName( i_name );
431 reader->GetOutput()->Register();
432 m_AnyImages.push_back(reader->GetOutput());
433 split4Din3Dvtk<TImage>(reader->GetOutput());
435 else if (getType(i_name) == typeid(float))
437 typedef itk::Image<float, 4> TImage;
438 typedef itk::ImageFileReader<TImage> ReaderType;
439 ReaderType::Pointer reader = ReaderType::New();
440 reader->SetFileName( i_name );
442 reader->GetOutput()->Register();
443 m_AnyImages.push_back(reader->GetOutput());
444 split4Din3Dvtk<TImage>(reader->GetOutput());
446 else if (getType(i_name) == typeid(double))
448 typedef itk::Image<double, 4> TImage;
449 typedef itk::ImageFileReader<TImage> ReaderType;
450 ReaderType::Pointer reader = ReaderType::New();
451 reader->SetFileName( i_name );
453 reader->GetOutput()->Register();
454 m_AnyImages.push_back(reader->GetOutput());
455 split4Din3Dvtk<TImage>(reader->GetOutput());
459 //????FCY, so what the type????
464 // Test to know if we have to add new type
466 if( m_AnyDims.size() != 0)
472 m_AnyDims.push_back(dims);
473 m_AnyType.push_back(&getType(i_name));
477 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
479 m_AnyDims.push_back(dims);
480 m_AnyType.push_back(&getType(i_name));
490 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
492 typedef itk::Image<short,3> TImage;
493 typedef itk::GDCMImageIO GDCMType;
494 typedef itk::DICOMSeriesFileNames dicnames;
495 GDCMType::Pointer gdcmIO = GDCMType::New();
496 dicnames::Pointer generator = dicnames::New();
499 typedef itk::ImageSeriesReader<TImage> ReaderType;
500 ReaderType::Pointer reader = ReaderType::New();
501 reader->SetImageIO(gdcmIO);
502 reader->SetFileNames(i_names);
503 // reader->SetFileName( i_name );
508 catch( itk::ExceptionObject & err )
510 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
511 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
516 //std::cout << "Error while reading image " << i_name << std::endl;
519 //m_Iresults.push_back(reader->GetOutput());
526 template <typename TImage>
527 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
529 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
530 ConnectorType::Pointer connector = ConnectorType::New();
531 connector->SetInput(i_Img);
532 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
534 vtkImageData *im = vtkImageData::New();
535 im->ShallowCopy(connector->GetOutput());
537 m_Vresults.push_back(im);
541 template <typename TImage>
542 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
544 if(i_Img->GetImageDimension() == 4)
547 // size of fourth dimension
548 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
550 typedef itk::Image<unsigned char,3> ImageOutputType;
551 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
552 typedef itk::MetaImageIO MetaImageType;
553 MetaImageType::Pointer metaIO;
554 SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
556 // from JPR file to generate output files
557 typedef itk::NumericSeriesFileNames NamesGeneratorType;
558 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
559 namesGenerator->SetStartIndex(0);
560 namesGenerator->SetEndIndex(dsize-1);
561 namesGenerator->SetIncrementIndex(1);
562 std::string format = m_dir;
563 format += "/image%03d.mhd";
564 namesGenerator->SetSeriesFormat( format.c_str() );
566 const std::vector<std::string> names = namesGenerator->GetFileNames();
567 seriesWriter->SetFileNames( names );
568 seriesWriter->SetInput(i_Img);
569 seriesWriter->SetImageIO(metaIO);
572 seriesWriter->Update();
573 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
574 std::vector<std::string>::const_iterator it = names.begin();
575 for( ;it != names.end(); ++it)
577 vReader->SetFileName((*it).c_str());
579 m_Vresults.push_back(vReader->GetOutput());
583 catch( itk::ExceptionObject & excp )
585 std::cerr << "Exception thrown while writing the series " << std::endl;
586 std::cerr << excp << std::endl;
587 //return EXIT_FAILURE;
592 bool WxAnySimpleDlg::AllSameType()
594 if(m_AnyType.size() == 1)