2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
29 #include "creaImageIOWxAnySimpleDlg.h"
31 #include "creaImageIOWxGimmickReaderDialog.h"
33 #if ITK_VERSION_MAJOR < 4 // : WARNING: deprecated in ITK 4.0
34 # include <itkAnalyzeImageIO.h>
35 # include <itkDICOMSeriesFileNames.h>
36 #else // ITK_VERSION_MAJOR < 4
37 # include <itkGDCMSeriesFileNames.h>
38 #endif // ITK_VERSION_MAJOR < 4
40 #include <itkImageFileReader.h>
41 #include <itkImageSeriesReader.h>
43 #include <itkImageSeriesWriter.h>
44 #include <itkGDCMImageIO.h>
45 #include <itkNumericSeriesFileNames.h>
46 #include <itkVectorImage.h>
47 #include <itkMetaImageIO.h>
48 #include <vtkImageReader2.h>
49 #include <vtkMetaImageReader.h>
50 #include <boost/filesystem/path.hpp>
51 #include <boost/filesystem.hpp>
52 #include <boost/utility.hpp>
53 #include <creaVtkBasicSlicer.h>
60 WxAnySimpleDlg::WxAnySimpleDlg(wxWindow *parent,
62 const std::string i_namedescp ,
63 const std::string i_namedb)
64 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
66 namedescp = i_namedescp;
71 this->SetTitle(i_title);
73 // Button to select file(s)
74 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
75 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadFile );
77 // Button to select directory
78 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
79 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadDirectory );
81 // button to select creaImageIO
82 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
83 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadGimmick );
85 /// \TODO Button to select Bruker directory
90 //////////////////////////////////////////////////////////////////////
92 //////////////////////////////////////////////////////////////////////
94 void WxAnySimpleDlg::OnReadFile(wxCommandEvent& event)
97 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
99 resultShowModal = fileDlg->ShowModal();
100 if ( resultShowModal==wxID_OK )
102 wxArrayString wxArray;
103 fileDlg->GetPaths(wxArray);
104 if(wxArray.size() >0)
106 for( int i = 0; i < wxArray.GetCount(); i++)
108 std::string name = crea::wx2std(wxArray[i]);
109 // FOR THE MOMENT ONLY short 3D et short 4D
113 // TO DO WARNING MESSAGES
116 SetReturnCode( resultShowModal );
118 EndModal( resultShowModal );
122 /////////////////////////////////////////////////////////////////////
124 //////////////////////////////////////////////////////////////////////
125 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
130 /////////////////////////////////////////////////////////////////////
132 //////////////////////////////////////////////////////////////////////
133 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
135 printf("EED WxAnySimpleDlg::OnReadDirectory Start\n");
138 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
139 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
141 resultShowModal = dirDlg->ShowModal();
142 if ( resultShowModal==wxID_OK )
144 std::string path = crea::wx2std(dirDlg->GetPath());
145 printf("EED WxAnySimpleDlg::OnReadDirectory path %s\n", path.c_str() );
148 typedef boost::filesystem::directory_iterator dir_it;
151 // if (boost::filesystem::exists(path))
153 for(;itr != end_itr; ++itr)
156 // All files have the same extention
157 // bvalid = m_exts.size() == 0? true : false;
158 // std::vector<std::string>::iterator it = m_exts.begin();
159 // std::string ext = itr->path().filename().string().substr(itr->path().filename().string().find_last_of("."));
160 // for(; it != m_exts.end(); it++)
169 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
171 printf("EED WxAnySimpleDlg::OnReadDirectory Each file %s \n", itr->path().string().c_str() );
172 readImg( itr->path().string().c_str() );
177 typedef vector<boost::filesystem::path> vec; // store paths
178 vec v; // so we can sort them later
179 copy(boost::filesystem::directory_iterator(path), boost::filesystem::directory_iterator(), back_inserter(v));
180 sort(v.begin(), v.end()); // sort, since directory iteration
181 // is not ordered on some file systems
182 for (vec::const_iterator it (v.begin()); it != v.end(); ++it)
184 readImg( it->string().c_str() );
185 cout << " " << *it << '\n';
192 SetReturnCode( resultShowModal );
194 EndModal( resultShowModal );
195 printf("EED WxAnySimpleDlg::OnReadDirectory End\n");
199 //////////////////////////////////////////////////////////////////////
201 //////////////////////////////////////////////////////////////////////
203 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
206 WxGimmickReaderDialog dlg(0,-1,
209 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
212 GIMMICK_2D_IMAGE_SELECTION,
213 GIMMICK_3D_IMAGE_SELECTION,
217 if (dlg.GetReturnCode() == wxID_OK)
219 std::vector<std::string> out;
221 dlg.GetSelectedFiles(out);
228 std::vector<std::string>::iterator ii = out.begin();
229 for (;ii != out.end();ii++)
231 readImg( (*ii).c_str() );
236 SetReturnCode( dlg.GetReturnCode() );
238 EndModal( dlg.GetReturnCode() );
243 wxString WxAnySimpleDlg::getInfoImage()
249 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
250 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
252 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
253 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
254 imageIO->SetFileName(i_name.c_str());
255 imageIO->ReadImageInformation();
256 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
259 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
261 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
262 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
263 imageIO->SetFileName(i_name.c_str());
264 imageIO->ReadImageInformation();
265 return imageIO->GetNumberOfDimensions();
269 void WxAnySimpleDlg::readImg(const std::string &i_name)
271 size_t dims = getNumberOfDimensions(i_name);
273 printf("EED WxAnySimpleDlg::readImg dims=%d \n",dims);
275 //const std::type_info *type= &getType(i_name);
279 if (getType(i_name) == typeid(unsigned char))
281 typedef itk::Image<unsigned char, 3> TImage;
282 typedef itk::ImageFileReader<TImage> ReaderType;
283 ReaderType::Pointer reader = ReaderType::New();
284 reader->SetFileName( i_name );
286 reader->GetOutput()->Register();
287 m_AnyImages.push_back(reader->GetOutput());
289 else if (getType(i_name) == typeid(signed char))
291 typedef itk::Image<signed char, 3> TImage;
292 typedef itk::ImageFileReader<TImage> ReaderType;
293 ReaderType::Pointer reader = ReaderType::New();
294 reader->SetFileName( i_name );
296 reader->GetOutput()->Register();
297 m_AnyImages.push_back(reader->GetOutput());
299 else if (getType(i_name) == typeid(short))
301 typedef itk::Image<short, 3> TImage;
302 typedef itk::ImageFileReader<TImage> ReaderType;
303 ReaderType::Pointer reader = ReaderType::New();
304 reader->SetFileName( i_name );
306 reader->GetOutput()->Register();
307 m_AnyImages.push_back(reader->GetOutput());
309 else if (getType(i_name) == typeid(unsigned short))
311 typedef itk::Image<unsigned short, 3> TImage;
312 typedef itk::ImageFileReader<TImage> ReaderType;
313 ReaderType::Pointer reader = ReaderType::New();
314 reader->SetFileName( i_name );
316 reader->GetOutput()->Register();
317 m_AnyImages.push_back(reader->GetOutput());
319 else if (getType(i_name) == typeid(unsigned int))
321 typedef itk::Image<unsigned int, 3> TImage;
322 typedef itk::ImageFileReader<TImage> ReaderType;
323 ReaderType::Pointer reader = ReaderType::New();
324 reader->SetFileName( i_name );
326 reader->GetOutput()->Register();
327 m_AnyImages.push_back(reader->GetOutput());
329 else if (getType(i_name) == typeid(signed int))
331 typedef itk::Image<signed int, 3> TImage;
332 typedef itk::ImageFileReader<TImage> ReaderType;
333 ReaderType::Pointer reader = ReaderType::New();
334 reader->SetFileName( i_name );
336 reader->GetOutput()->Register();
337 m_AnyImages.push_back(reader->GetOutput());
339 else if (getType(i_name) == typeid(unsigned long))
341 typedef itk::Image<unsigned long, 3> TImage;
342 typedef itk::ImageFileReader<TImage> ReaderType;
343 ReaderType::Pointer reader = ReaderType::New();
344 reader->SetFileName( i_name );
346 reader->GetOutput()->Register();
347 m_AnyImages.push_back(reader->GetOutput());
349 else if (getType(i_name) == typeid(signed long))
351 typedef itk::Image<signed long, 3> TImage;
352 typedef itk::ImageFileReader<TImage> ReaderType;
353 ReaderType::Pointer reader = ReaderType::New();
354 reader->SetFileName( i_name );
356 reader->GetOutput()->Register();
357 m_AnyImages.push_back(reader->GetOutput());
359 else if (getType(i_name) == typeid(float))
361 typedef itk::Image<float, 3> TImage;
362 typedef itk::ImageFileReader<TImage> ReaderType;
363 ReaderType::Pointer reader = ReaderType::New();
364 reader->SetFileName( i_name );
366 reader->GetOutput()->Register();
367 m_AnyImages.push_back(reader->GetOutput());
369 else if (getType(i_name) == typeid(double))
371 typedef itk::Image<double, 3> TImage;
372 typedef itk::ImageFileReader<TImage> ReaderType;
373 ReaderType::Pointer reader = ReaderType::New();
374 reader->SetFileName( i_name );
376 reader->GetOutput()->Register();
377 m_AnyImages.push_back(reader->GetOutput());
381 printf("EED WxAnySimpleDlg::readImg Not type found for DIM 3 \n");
382 //????FCY, so what the type????
385 //assume that we have only one 4D file
387 if (getType(i_name) == typeid(unsigned char))
389 typedef itk::Image<unsigned char, 4> TImage;
390 typedef itk::ImageFileReader<TImage> ReaderType;
391 ReaderType::Pointer reader = ReaderType::New();
392 reader->SetFileName( i_name );
394 reader->GetOutput()->Register();
395 m_AnyImages.push_back(reader->GetOutput());
396 split4Din3Dvtk<TImage>(reader->GetOutput());
398 else if (getType(i_name) == typeid(signed char))
400 typedef itk::Image<signed char, 4> TImage;
401 typedef itk::ImageFileReader<TImage> ReaderType;
402 ReaderType::Pointer reader = ReaderType::New();
403 reader->SetFileName( i_name );
405 reader->GetOutput()->Register();
406 m_AnyImages.push_back(reader->GetOutput());
407 split4Din3Dvtk<TImage>(reader->GetOutput());
409 else if (getType(i_name) == typeid(unsigned short))
411 typedef itk::Image<unsigned short, 4> TImage;
412 typedef itk::ImageFileReader<TImage> ReaderType;
413 ReaderType::Pointer reader = ReaderType::New();
414 reader->SetFileName( i_name );
416 reader->GetOutput()->Register();
417 m_AnyImages.push_back(reader->GetOutput());
418 split4Din3Dvtk<TImage>(reader->GetOutput());
420 else if(getType(i_name) == typeid(short))
422 typedef itk::Image<short, 4> TImage;
423 typedef itk::ImageFileReader<TImage> ReaderType;
424 ReaderType::Pointer reader = ReaderType::New();
425 reader->SetFileName( i_name );
430 catch( itk::ExceptionObject & err )
432 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
433 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
438 std::cout << "Error while reading image " << i_name << std::endl;
441 reader->GetOutput()->Register();
442 m_AnyImages.push_back(reader->GetOutput());
443 split4Din3Dvtk<TImage>(reader->GetOutput());
445 else if (getType(i_name) == typeid(unsigned short))
447 typedef itk::Image<unsigned short, 4> TImage;
448 typedef itk::ImageFileReader<TImage> ReaderType;
449 ReaderType::Pointer reader = ReaderType::New();
450 reader->SetFileName( i_name );
452 reader->GetOutput()->Register();
453 m_AnyImages.push_back(reader->GetOutput());
454 split4Din3Dvtk<TImage>(reader->GetOutput());
456 else if (getType(i_name) == typeid(unsigned int))
458 typedef itk::Image<unsigned int, 4> TImage;
459 typedef itk::ImageFileReader<TImage> ReaderType;
460 ReaderType::Pointer reader = ReaderType::New();
461 reader->SetFileName( i_name );
463 reader->GetOutput()->Register();
464 m_AnyImages.push_back(reader->GetOutput());
465 split4Din3Dvtk<TImage>(reader->GetOutput());
467 else if (getType(i_name) == typeid(signed int))
469 typedef itk::Image<signed int, 4> TImage;
470 typedef itk::ImageFileReader<TImage> ReaderType;
471 ReaderType::Pointer reader = ReaderType::New();
472 reader->SetFileName( i_name );
474 reader->GetOutput()->Register();
475 m_AnyImages.push_back(reader->GetOutput());
476 split4Din3Dvtk<TImage>(reader->GetOutput());
478 else if (getType(i_name) == typeid(unsigned long))
480 typedef itk::Image<unsigned long, 4> TImage;
481 typedef itk::ImageFileReader<TImage> ReaderType;
482 ReaderType::Pointer reader = ReaderType::New();
483 reader->SetFileName( i_name );
485 reader->GetOutput()->Register();
486 m_AnyImages.push_back(reader->GetOutput());
487 split4Din3Dvtk<TImage>(reader->GetOutput());
489 else if (getType(i_name) == typeid(signed long))
491 typedef itk::Image<signed long, 4> TImage;
492 typedef itk::ImageFileReader<TImage> ReaderType;
493 ReaderType::Pointer reader = ReaderType::New();
494 reader->SetFileName( i_name );
496 reader->GetOutput()->Register();
497 m_AnyImages.push_back(reader->GetOutput());
498 split4Din3Dvtk<TImage>(reader->GetOutput());
500 else if (getType(i_name) == typeid(float))
502 typedef itk::Image<float, 4> TImage;
503 typedef itk::ImageFileReader<TImage> ReaderType;
504 ReaderType::Pointer reader = ReaderType::New();
505 reader->SetFileName( i_name );
507 reader->GetOutput()->Register();
508 m_AnyImages.push_back(reader->GetOutput());
509 split4Din3Dvtk<TImage>(reader->GetOutput());
511 else if (getType(i_name) == typeid(double))
513 typedef itk::Image<double, 4> TImage;
514 typedef itk::ImageFileReader<TImage> ReaderType;
515 ReaderType::Pointer reader = ReaderType::New();
516 reader->SetFileName( i_name );
518 reader->GetOutput()->Register();
519 m_AnyImages.push_back(reader->GetOutput());
520 split4Din3Dvtk<TImage>(reader->GetOutput());
524 printf("EED WxAnySimpleDlg::readImg Not type found for DIM 4 \n");
525 //????FCY, so what the type????
530 // Test to know if we have to add new type
532 if( m_AnyDims.size() != 0)
538 m_AnyDims.push_back(dims);
539 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
543 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
545 m_AnyDims.push_back(dims);
546 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
553 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
555 typedef itk::Image<short,3> TImage;
556 typedef itk::GDCMImageIO GDCMType;
557 #if ITK_VERSION_MAJOR < 4
558 typedef itk::DICOMSeriesFileNames dicnames;
559 #else // ITK_VERSION_MAJOR < 4
560 typedef itk::GDCMSeriesFileNames dicnames;
561 #endif // ITK_VERSION_MAJOR < 4
562 GDCMType::Pointer gdcmIO = GDCMType::New();
563 dicnames::Pointer generator = dicnames::New();
566 typedef itk::ImageSeriesReader<TImage> ReaderType;
567 ReaderType::Pointer reader = ReaderType::New();
568 reader->SetImageIO(gdcmIO);
569 reader->SetFileNames(i_names);
570 // reader->SetFileName( i_name );
575 catch( itk::ExceptionObject & err )
577 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
578 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
583 //std::cout << "Error while reading image " << i_name << std::endl;
586 //m_Iresults.push_back(reader->GetOutput());
590 /* template <typename TImage>
591 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
593 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
594 typename ConnectorType::Pointer connector = ConnectorType::New();
595 connector->SetInput(i_Img);
596 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
598 vtkImageData *im = vtkImageData::New();
599 im->ShallowCopy(connector->GetOutput());
601 m_Vresults.push_back(im);
605 template <typename TImage>
606 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
608 if(i_Img->GetImageDimension() == 4)
610 // size of fourth dimension
611 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
613 typedef itk::Image<unsigned char,3> ImageOutputType;
614 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
615 typedef itk::MetaImageIO MetaImageType;
616 MetaImageType::Pointer metaIO;
617 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
619 // from JPR file to generate output files
620 typedef itk::NumericSeriesFileNames NamesGeneratorType;
621 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
622 namesGenerator->SetStartIndex(0);
623 namesGenerator->SetEndIndex(dsize-1);
624 namesGenerator->SetIncrementIndex(1);
625 std::string format = m_dir;
626 format += "/image%03d.mhd";
627 namesGenerator->SetSeriesFormat( format.c_str() );
629 const std::vector<std::string> names = namesGenerator->GetFileNames();
630 seriesWriter->SetFileNames( names );
631 seriesWriter->SetInput(i_Img);
632 seriesWriter->SetImageIO(metaIO);
635 seriesWriter->Update();
636 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
637 std::vector<std::string>::const_iterator it = names.begin();
638 for( ;it != names.end(); ++it)
640 vReader->SetFileName((*it).c_str());
642 m_Vresults.push_back(vReader->GetOutput());
646 catch( itk::ExceptionObject & excp )
648 std::cerr << "Exception thrown while writing the series " << std::endl;
649 std::cerr << excp << std::endl;
650 //return EXIT_FAILURE;
655 bool WxAnySimpleDlg::AllSameType()
657 if(m_AnyType.size() == 1)