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 //EED 2017-09-16 Migration wxWidgets 2.8 to 3.0
98 #if wxMAJOR_VERSION <= 2
99 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
101 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxFD_OPEN |wxFD_MULTIPLE, wxDefaultPosition);
104 resultShowModal = fileDlg->ShowModal();
105 if ( resultShowModal==wxID_OK )
107 wxArrayString wxArray;
108 fileDlg->GetPaths(wxArray);
109 if(wxArray.size() >0)
111 for( int i = 0; i < wxArray.GetCount(); i++)
113 std::string name = crea::wx2std(wxArray[i]);
114 // FOR THE MOMENT ONLY short 3D et short 4D
118 // TO DO WARNING MESSAGES
121 SetReturnCode( resultShowModal );
123 EndModal( resultShowModal );
127 /////////////////////////////////////////////////////////////////////
129 //////////////////////////////////////////////////////////////////////
130 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
135 /////////////////////////////////////////////////////////////////////
137 //////////////////////////////////////////////////////////////////////
138 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
142 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
143 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
145 resultShowModal = dirDlg->ShowModal();
146 if ( resultShowModal==wxID_OK )
148 std::string path = crea::wx2std(dirDlg->GetPath());
151 typedef boost::filesystem::directory_iterator dir_it;
154 // if (boost::filesystem::exists(path))
156 for(;itr != end_itr; ++itr)
159 // All files have the same extention
160 // bvalid = m_exts.size() == 0? true : false;
161 // std::vector<std::string>::iterator it = m_exts.begin();
162 // std::string ext = itr->path().filename().string().substr(itr->path().filename().string().find_last_of("."));
163 // for(; it != m_exts.end(); it++)
172 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
174 printf("EED WxAnySimpleDlg::OnReadDirectory Each file %s \n", itr->path().string().c_str() );
175 readImg( itr->path().string().c_str() );
180 typedef vector<boost::filesystem::path> vec; // store paths
181 vec v; // so we can sort them later
182 copy(boost::filesystem::directory_iterator(path), boost::filesystem::directory_iterator(), back_inserter(v));
183 sort(v.begin(), v.end()); // sort, since directory iteration
184 // is not ordered on some file systems
185 for (vec::const_iterator it (v.begin()); it != v.end(); ++it)
187 readImg( it->string().c_str() );
194 SetReturnCode( resultShowModal );
196 EndModal( resultShowModal );
200 //////////////////////////////////////////////////////////////////////
202 //////////////////////////////////////////////////////////////////////
204 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
207 WxGimmickReaderDialog dlg(0,-1,
210 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
213 GIMMICK_2D_IMAGE_SELECTION,
214 GIMMICK_3D_IMAGE_SELECTION,
218 if (dlg.GetReturnCode() == wxID_OK)
220 std::vector<std::string> out;
222 dlg.GetSelectedFiles(out);
229 std::vector<std::string>::iterator ii = out.begin();
230 for (;ii != out.end();ii++)
232 readImg( (*ii).c_str() );
237 SetReturnCode( dlg.GetReturnCode() );
239 EndModal( dlg.GetReturnCode() );
244 wxString WxAnySimpleDlg::getInfoImage()
250 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
251 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
253 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
254 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
255 imageIO->SetFileName(i_name.c_str());
256 imageIO->ReadImageInformation();
257 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
260 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
262 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
263 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
264 imageIO->SetFileName(i_name.c_str());
265 imageIO->ReadImageInformation();
266 return imageIO->GetNumberOfDimensions();
270 void WxAnySimpleDlg::readImg(const std::string &i_name)
272 size_t dims = getNumberOfDimensions(i_name);
274 //const std::type_info *type= &getType(i_name);
278 if (getType(i_name) == typeid(unsigned char))
280 typedef itk::Image<unsigned char, 3> TImage;
281 typedef itk::ImageFileReader<TImage> ReaderType;
282 ReaderType::Pointer reader = ReaderType::New();
283 reader->SetFileName( i_name );
285 reader->GetOutput()->Register();
286 m_AnyImages.push_back(reader->GetOutput());
288 else if (getType(i_name) == typeid(signed char))
290 typedef itk::Image<signed char, 3> TImage;
291 typedef itk::ImageFileReader<TImage> ReaderType;
292 ReaderType::Pointer reader = ReaderType::New();
293 reader->SetFileName( i_name );
295 reader->GetOutput()->Register();
296 m_AnyImages.push_back(reader->GetOutput());
298 else if (getType(i_name) == typeid(short))
300 typedef itk::Image<short, 3> TImage;
301 typedef itk::ImageFileReader<TImage> ReaderType;
302 ReaderType::Pointer reader = ReaderType::New();
303 reader->SetFileName( i_name );
305 reader->GetOutput()->Register();
306 m_AnyImages.push_back(reader->GetOutput());
308 else if (getType(i_name) == typeid(unsigned short))
310 typedef itk::Image<unsigned short, 3> TImage;
311 typedef itk::ImageFileReader<TImage> ReaderType;
312 ReaderType::Pointer reader = ReaderType::New();
313 reader->SetFileName( i_name );
315 reader->GetOutput()->Register();
316 m_AnyImages.push_back(reader->GetOutput());
318 else if (getType(i_name) == typeid(unsigned int))
320 typedef itk::Image<unsigned int, 3> TImage;
321 typedef itk::ImageFileReader<TImage> ReaderType;
322 ReaderType::Pointer reader = ReaderType::New();
323 reader->SetFileName( i_name );
325 reader->GetOutput()->Register();
326 m_AnyImages.push_back(reader->GetOutput());
328 else if (getType(i_name) == typeid(signed int))
330 typedef itk::Image<signed int, 3> TImage;
331 typedef itk::ImageFileReader<TImage> ReaderType;
332 ReaderType::Pointer reader = ReaderType::New();
333 reader->SetFileName( i_name );
335 reader->GetOutput()->Register();
336 m_AnyImages.push_back(reader->GetOutput());
338 else if (getType(i_name) == typeid(unsigned long))
340 typedef itk::Image<unsigned long, 3> TImage;
341 typedef itk::ImageFileReader<TImage> ReaderType;
342 ReaderType::Pointer reader = ReaderType::New();
343 reader->SetFileName( i_name );
345 reader->GetOutput()->Register();
346 m_AnyImages.push_back(reader->GetOutput());
348 else if (getType(i_name) == typeid(signed long))
350 typedef itk::Image<signed long, 3> TImage;
351 typedef itk::ImageFileReader<TImage> ReaderType;
352 ReaderType::Pointer reader = ReaderType::New();
353 reader->SetFileName( i_name );
355 reader->GetOutput()->Register();
356 m_AnyImages.push_back(reader->GetOutput());
358 else if (getType(i_name) == typeid(float))
360 typedef itk::Image<float, 3> TImage;
361 typedef itk::ImageFileReader<TImage> ReaderType;
362 ReaderType::Pointer reader = ReaderType::New();
363 reader->SetFileName( i_name );
365 reader->GetOutput()->Register();
366 m_AnyImages.push_back(reader->GetOutput());
368 else if (getType(i_name) == typeid(double))
370 typedef itk::Image<double, 3> TImage;
371 typedef itk::ImageFileReader<TImage> ReaderType;
372 ReaderType::Pointer reader = ReaderType::New();
373 reader->SetFileName( i_name );
375 reader->GetOutput()->Register();
376 m_AnyImages.push_back(reader->GetOutput());
380 printf("EED WxAnySimpleDlg::readImg Not type found for DIM 3 \n");
381 //????FCY, so what the type????
384 //assume that we have only one 4D file
386 if (getType(i_name) == typeid(unsigned char))
388 typedef itk::Image<unsigned char, 4> TImage;
389 typedef itk::ImageFileReader<TImage> ReaderType;
390 ReaderType::Pointer reader = ReaderType::New();
391 reader->SetFileName( i_name );
393 reader->GetOutput()->Register();
394 m_AnyImages.push_back(reader->GetOutput());
395 split4Din3Dvtk<TImage>(reader->GetOutput());
397 else if (getType(i_name) == typeid(signed char))
399 typedef itk::Image<signed char, 4> TImage;
400 typedef itk::ImageFileReader<TImage> ReaderType;
401 ReaderType::Pointer reader = ReaderType::New();
402 reader->SetFileName( i_name );
404 reader->GetOutput()->Register();
405 m_AnyImages.push_back(reader->GetOutput());
406 split4Din3Dvtk<TImage>(reader->GetOutput());
408 else if (getType(i_name) == typeid(unsigned short))
410 typedef itk::Image<unsigned short, 4> TImage;
411 typedef itk::ImageFileReader<TImage> ReaderType;
412 ReaderType::Pointer reader = ReaderType::New();
413 reader->SetFileName( i_name );
415 reader->GetOutput()->Register();
416 m_AnyImages.push_back(reader->GetOutput());
417 split4Din3Dvtk<TImage>(reader->GetOutput());
419 else if(getType(i_name) == typeid(short))
421 typedef itk::Image<short, 4> TImage;
422 typedef itk::ImageFileReader<TImage> ReaderType;
423 ReaderType::Pointer reader = ReaderType::New();
424 reader->SetFileName( i_name );
429 catch( itk::ExceptionObject & err )
431 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
432 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
437 std::cout << "Error while reading image " << i_name << std::endl;
440 reader->GetOutput()->Register();
441 m_AnyImages.push_back(reader->GetOutput());
442 split4Din3Dvtk<TImage>(reader->GetOutput());
444 else if (getType(i_name) == typeid(unsigned short))
446 typedef itk::Image<unsigned short, 4> TImage;
447 typedef itk::ImageFileReader<TImage> ReaderType;
448 ReaderType::Pointer reader = ReaderType::New();
449 reader->SetFileName( i_name );
451 reader->GetOutput()->Register();
452 m_AnyImages.push_back(reader->GetOutput());
453 split4Din3Dvtk<TImage>(reader->GetOutput());
455 else if (getType(i_name) == typeid(unsigned int))
457 typedef itk::Image<unsigned int, 4> TImage;
458 typedef itk::ImageFileReader<TImage> ReaderType;
459 ReaderType::Pointer reader = ReaderType::New();
460 reader->SetFileName( i_name );
462 reader->GetOutput()->Register();
463 m_AnyImages.push_back(reader->GetOutput());
464 split4Din3Dvtk<TImage>(reader->GetOutput());
466 else if (getType(i_name) == typeid(signed int))
468 typedef itk::Image<signed int, 4> TImage;
469 typedef itk::ImageFileReader<TImage> ReaderType;
470 ReaderType::Pointer reader = ReaderType::New();
471 reader->SetFileName( i_name );
473 reader->GetOutput()->Register();
474 m_AnyImages.push_back(reader->GetOutput());
475 split4Din3Dvtk<TImage>(reader->GetOutput());
477 else if (getType(i_name) == typeid(unsigned long))
479 typedef itk::Image<unsigned long, 4> TImage;
480 typedef itk::ImageFileReader<TImage> ReaderType;
481 ReaderType::Pointer reader = ReaderType::New();
482 reader->SetFileName( i_name );
484 reader->GetOutput()->Register();
485 m_AnyImages.push_back(reader->GetOutput());
486 split4Din3Dvtk<TImage>(reader->GetOutput());
488 else if (getType(i_name) == typeid(signed long))
490 typedef itk::Image<signed long, 4> TImage;
491 typedef itk::ImageFileReader<TImage> ReaderType;
492 ReaderType::Pointer reader = ReaderType::New();
493 reader->SetFileName( i_name );
495 reader->GetOutput()->Register();
496 m_AnyImages.push_back(reader->GetOutput());
497 split4Din3Dvtk<TImage>(reader->GetOutput());
499 else if (getType(i_name) == typeid(float))
501 typedef itk::Image<float, 4> TImage;
502 typedef itk::ImageFileReader<TImage> ReaderType;
503 ReaderType::Pointer reader = ReaderType::New();
504 reader->SetFileName( i_name );
506 reader->GetOutput()->Register();
507 m_AnyImages.push_back(reader->GetOutput());
508 split4Din3Dvtk<TImage>(reader->GetOutput());
510 else if (getType(i_name) == typeid(double))
512 typedef itk::Image<double, 4> TImage;
513 typedef itk::ImageFileReader<TImage> ReaderType;
514 ReaderType::Pointer reader = ReaderType::New();
515 reader->SetFileName( i_name );
517 reader->GetOutput()->Register();
518 m_AnyImages.push_back(reader->GetOutput());
519 split4Din3Dvtk<TImage>(reader->GetOutput());
523 printf("EED WxAnySimpleDlg::readImg Not type found for DIM 4 \n");
524 //????FCY, so what the type????
529 // Test to know if we have to add new type
531 if( m_AnyDims.size() != 0)
537 m_AnyDims.push_back(dims);
538 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
542 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
544 m_AnyDims.push_back(dims);
545 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
552 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
554 typedef itk::Image<short,3> TImage;
555 typedef itk::GDCMImageIO GDCMType;
556 #if ITK_VERSION_MAJOR < 4
557 typedef itk::DICOMSeriesFileNames dicnames;
558 #else // ITK_VERSION_MAJOR < 4
559 typedef itk::GDCMSeriesFileNames dicnames;
560 #endif // ITK_VERSION_MAJOR < 4
561 GDCMType::Pointer gdcmIO = GDCMType::New();
562 dicnames::Pointer generator = dicnames::New();
565 typedef itk::ImageSeriesReader<TImage> ReaderType;
566 ReaderType::Pointer reader = ReaderType::New();
567 reader->SetImageIO(gdcmIO);
568 reader->SetFileNames(i_names);
569 // reader->SetFileName( i_name );
574 catch( itk::ExceptionObject & err )
576 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
577 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
582 //std::cout << "Error while reading image " << i_name << std::endl;
585 //m_Iresults.push_back(reader->GetOutput());
589 /* template <typename TImage>
590 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
592 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
593 typename ConnectorType::Pointer connector = ConnectorType::New();
594 connector->SetInput(i_Img);
595 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
597 vtkImageData *im = vtkImageData::New();
598 im->ShallowCopy(connector->GetOutput());
600 m_Vresults.push_back(im);
604 template <typename TImage>
605 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
607 if(i_Img->GetImageDimension() == 4)
609 // size of fourth dimension
610 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
612 typedef itk::Image<unsigned char,3> ImageOutputType;
613 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
614 typedef itk::MetaImageIO MetaImageType;
615 MetaImageType::Pointer metaIO;
616 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
618 // from JPR file to generate output files
619 typedef itk::NumericSeriesFileNames NamesGeneratorType;
620 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
621 namesGenerator->SetStartIndex(0);
622 namesGenerator->SetEndIndex(dsize-1);
623 namesGenerator->SetIncrementIndex(1);
624 std::string format = m_dir;
625 format += "/image%03d.mhd";
626 namesGenerator->SetSeriesFormat( format.c_str() );
628 const std::vector<std::string> names = namesGenerator->GetFileNames();
629 seriesWriter->SetFileNames( names );
630 seriesWriter->SetInput(i_Img);
631 seriesWriter->SetImageIO(metaIO);
634 seriesWriter->Update();
635 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
636 std::vector<std::string>::const_iterator it = names.begin();
637 for( ;it != names.end(); ++it)
639 vReader->SetFileName((*it).c_str());
641 m_Vresults.push_back(vReader->GetOutput());
645 catch( itk::ExceptionObject & excp )
647 std::cerr << "Exception thrown while writing the series " << std::endl;
648 std::cerr << excp << std::endl;
649 //return EXIT_FAILURE;
654 bool WxAnySimpleDlg::AllSameType()
656 if(m_AnyType.size() == 1)