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
114 // TO DO WARNING MESSAGES
117 SetReturnCode( resultShowModal );
119 EndModal( resultShowModal );
122 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
126 /////////////////////////////////////////////////////////////////////
128 //////////////////////////////////////////////////////////////////////
130 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
134 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
135 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
137 resultShowModal = dirDlg->ShowModal();
138 if ( resultShowModal==wxID_OK )
140 std::string path = crea::wx2std(dirDlg->GetPath());
141 typedef boost::filesystem::directory_iterator dir_it;
144 /*if (boost::filesystem::exists(path))
146 for(;itr != end_itr; ++itr)
148 bvalid = m_exts.size() == 0? true : false;
149 std::vector<std::string>::iterator it = m_exts.begin();
150 std::string ext = itr->path().filename().string().substr(itr->path().filename().string().find_last_of("."));
151 for(; it != m_exts.end(); it++)
159 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
161 readImg(itr->path().string().c_str());
165 SetReturnCode( resultShowModal );
167 EndModal( resultShowModal );
170 //////////////////////////////////////////////////////////////////////
172 //////////////////////////////////////////////////////////////////////
174 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
177 WxGimmickReaderDialog dlg(0,-1,
180 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
183 GIMMICK_2D_IMAGE_SELECTION,
184 GIMMICK_3D_IMAGE_SELECTION,
188 if (dlg.GetReturnCode() == wxID_OK)
190 std::vector<std::string> out;
192 dlg.GetSelectedFiles(out);
199 std::vector<std::string>::iterator ii = out.begin();
200 for (;ii != out.end();ii++)
202 readImg( (*ii).c_str() );
207 SetReturnCode( dlg.GetReturnCode() );
209 EndModal( dlg.GetReturnCode() );
214 wxString WxAnySimpleDlg::getInfoImage()
220 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
221 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
223 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
224 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
225 imageIO->SetFileName(i_name.c_str());
226 imageIO->ReadImageInformation();
227 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
230 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
232 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
233 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
234 imageIO->SetFileName(i_name.c_str());
235 imageIO->ReadImageInformation();
236 return imageIO->GetNumberOfDimensions();
239 void WxAnySimpleDlg::readImg(const std::string &i_name)
241 size_t dims = getNumberOfDimensions(i_name);
242 //const std::type_info *type= &getType(i_name);
246 if (getType(i_name) == typeid(unsigned char))
248 typedef itk::Image<unsigned char, 3> TImage;
249 typedef itk::ImageFileReader<TImage> ReaderType;
250 ReaderType::Pointer reader = ReaderType::New();
251 reader->SetFileName( i_name );
253 reader->GetOutput()->Register();
254 m_AnyImages.push_back(reader->GetOutput());
256 else if (getType(i_name) == typeid(signed char))
258 typedef itk::Image<signed char, 3> TImage;
259 typedef itk::ImageFileReader<TImage> ReaderType;
260 ReaderType::Pointer reader = ReaderType::New();
261 reader->SetFileName( i_name );
263 reader->GetOutput()->Register();
264 m_AnyImages.push_back(reader->GetOutput());
266 else if (getType(i_name) == typeid(short))
268 typedef itk::Image<short, 3> TImage;
269 typedef itk::ImageFileReader<TImage> ReaderType;
270 ReaderType::Pointer reader = ReaderType::New();
271 reader->SetFileName( i_name );
273 reader->GetOutput()->Register();
274 m_AnyImages.push_back(reader->GetOutput());
276 else if (getType(i_name) == typeid(unsigned short))
278 typedef itk::Image<unsigned short, 3> TImage;
279 typedef itk::ImageFileReader<TImage> ReaderType;
280 ReaderType::Pointer reader = ReaderType::New();
281 reader->SetFileName( i_name );
283 reader->GetOutput()->Register();
284 m_AnyImages.push_back(reader->GetOutput());
286 else if (getType(i_name) == typeid(unsigned int))
288 typedef itk::Image<unsigned int, 3> TImage;
289 typedef itk::ImageFileReader<TImage> ReaderType;
290 ReaderType::Pointer reader = ReaderType::New();
291 reader->SetFileName( i_name );
293 reader->GetOutput()->Register();
294 m_AnyImages.push_back(reader->GetOutput());
296 else if (getType(i_name) == typeid(signed int))
298 typedef itk::Image<signed int, 3> TImage;
299 typedef itk::ImageFileReader<TImage> ReaderType;
300 ReaderType::Pointer reader = ReaderType::New();
301 reader->SetFileName( i_name );
303 reader->GetOutput()->Register();
304 m_AnyImages.push_back(reader->GetOutput());
306 else if (getType(i_name) == typeid(unsigned long))
308 typedef itk::Image<unsigned long, 3> TImage;
309 typedef itk::ImageFileReader<TImage> ReaderType;
310 ReaderType::Pointer reader = ReaderType::New();
311 reader->SetFileName( i_name );
313 reader->GetOutput()->Register();
314 m_AnyImages.push_back(reader->GetOutput());
316 else if (getType(i_name) == typeid(signed long))
318 typedef itk::Image<signed long, 3> TImage;
319 typedef itk::ImageFileReader<TImage> ReaderType;
320 ReaderType::Pointer reader = ReaderType::New();
321 reader->SetFileName( i_name );
323 reader->GetOutput()->Register();
324 m_AnyImages.push_back(reader->GetOutput());
326 else if (getType(i_name) == typeid(float))
328 typedef itk::Image<float, 3> TImage;
329 typedef itk::ImageFileReader<TImage> ReaderType;
330 ReaderType::Pointer reader = ReaderType::New();
331 reader->SetFileName( i_name );
333 reader->GetOutput()->Register();
334 m_AnyImages.push_back(reader->GetOutput());
336 else if (getType(i_name) == typeid(double))
338 typedef itk::Image<double, 3> TImage;
339 typedef itk::ImageFileReader<TImage> ReaderType;
340 ReaderType::Pointer reader = ReaderType::New();
341 reader->SetFileName( i_name );
343 reader->GetOutput()->Register();
344 m_AnyImages.push_back(reader->GetOutput());
348 //????FCY, so what the type????
351 //assume that we have only one 4D file
353 if (getType(i_name) == typeid(unsigned char))
355 typedef itk::Image<unsigned char, 4> TImage;
356 typedef itk::ImageFileReader<TImage> ReaderType;
357 ReaderType::Pointer reader = ReaderType::New();
358 reader->SetFileName( i_name );
360 reader->GetOutput()->Register();
361 m_AnyImages.push_back(reader->GetOutput());
362 split4Din3Dvtk<TImage>(reader->GetOutput());
364 else if (getType(i_name) == typeid(signed char))
366 typedef itk::Image<signed char, 4> TImage;
367 typedef itk::ImageFileReader<TImage> ReaderType;
368 ReaderType::Pointer reader = ReaderType::New();
369 reader->SetFileName( i_name );
371 reader->GetOutput()->Register();
372 m_AnyImages.push_back(reader->GetOutput());
373 split4Din3Dvtk<TImage>(reader->GetOutput());
375 else if (getType(i_name) == typeid(unsigned short))
377 typedef itk::Image<unsigned short, 4> TImage;
378 typedef itk::ImageFileReader<TImage> ReaderType;
379 ReaderType::Pointer reader = ReaderType::New();
380 reader->SetFileName( i_name );
382 reader->GetOutput()->Register();
383 m_AnyImages.push_back(reader->GetOutput());
384 split4Din3Dvtk<TImage>(reader->GetOutput());
386 else if(getType(i_name) == typeid(short))
388 typedef itk::Image<short, 4> TImage;
389 typedef itk::ImageFileReader<TImage> ReaderType;
390 ReaderType::Pointer reader = ReaderType::New();
391 reader->SetFileName( i_name );
396 catch( itk::ExceptionObject & err )
398 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
399 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
404 std::cout << "Error while reading image " << i_name << std::endl;
407 reader->GetOutput()->Register();
408 m_AnyImages.push_back(reader->GetOutput());
409 split4Din3Dvtk<TImage>(reader->GetOutput());
411 else if (getType(i_name) == typeid(unsigned short))
413 typedef itk::Image<unsigned short, 4> TImage;
414 typedef itk::ImageFileReader<TImage> ReaderType;
415 ReaderType::Pointer reader = ReaderType::New();
416 reader->SetFileName( i_name );
418 reader->GetOutput()->Register();
419 m_AnyImages.push_back(reader->GetOutput());
420 split4Din3Dvtk<TImage>(reader->GetOutput());
422 else if (getType(i_name) == typeid(unsigned int))
424 typedef itk::Image<unsigned int, 4> TImage;
425 typedef itk::ImageFileReader<TImage> ReaderType;
426 ReaderType::Pointer reader = ReaderType::New();
427 reader->SetFileName( i_name );
429 reader->GetOutput()->Register();
430 m_AnyImages.push_back(reader->GetOutput());
431 split4Din3Dvtk<TImage>(reader->GetOutput());
433 else if (getType(i_name) == typeid(signed int))
435 typedef itk::Image<signed int, 4> TImage;
436 typedef itk::ImageFileReader<TImage> ReaderType;
437 ReaderType::Pointer reader = ReaderType::New();
438 reader->SetFileName( i_name );
440 reader->GetOutput()->Register();
441 m_AnyImages.push_back(reader->GetOutput());
442 split4Din3Dvtk<TImage>(reader->GetOutput());
444 else if (getType(i_name) == typeid(unsigned long))
446 typedef itk::Image<unsigned long, 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(signed long))
457 typedef itk::Image<signed long, 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(float))
468 typedef itk::Image<float, 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(double))
479 typedef itk::Image<double, 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());
490 //????FCY, so what the type????
495 // Test to know if we have to add new type
497 if( m_AnyDims.size() != 0)
503 m_AnyDims.push_back(dims);
504 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
508 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
510 m_AnyDims.push_back(dims);
511 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
518 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
520 typedef itk::Image<short,3> TImage;
521 typedef itk::GDCMImageIO GDCMType;
522 #if ITK_VERSION_MAJOR < 4
523 typedef itk::DICOMSeriesFileNames dicnames;
524 #else // ITK_VERSION_MAJOR < 4
525 typedef itk::GDCMSeriesFileNames dicnames;
526 #endif // ITK_VERSION_MAJOR < 4
527 GDCMType::Pointer gdcmIO = GDCMType::New();
528 dicnames::Pointer generator = dicnames::New();
531 typedef itk::ImageSeriesReader<TImage> ReaderType;
532 ReaderType::Pointer reader = ReaderType::New();
533 reader->SetImageIO(gdcmIO);
534 reader->SetFileNames(i_names);
535 // reader->SetFileName( i_name );
540 catch( itk::ExceptionObject & err )
542 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
543 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
548 //std::cout << "Error while reading image " << i_name << std::endl;
551 //m_Iresults.push_back(reader->GetOutput());
555 /* template <typename TImage>
556 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
558 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
559 typename ConnectorType::Pointer connector = ConnectorType::New();
560 connector->SetInput(i_Img);
561 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
563 vtkImageData *im = vtkImageData::New();
564 im->ShallowCopy(connector->GetOutput());
566 m_Vresults.push_back(im);
570 template <typename TImage>
571 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
573 if(i_Img->GetImageDimension() == 4)
575 // size of fourth dimension
576 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
578 typedef itk::Image<unsigned char,3> ImageOutputType;
579 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
580 typedef itk::MetaImageIO MetaImageType;
581 MetaImageType::Pointer metaIO;
582 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
584 // from JPR file to generate output files
585 typedef itk::NumericSeriesFileNames NamesGeneratorType;
586 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
587 namesGenerator->SetStartIndex(0);
588 namesGenerator->SetEndIndex(dsize-1);
589 namesGenerator->SetIncrementIndex(1);
590 std::string format = m_dir;
591 format += "/image%03d.mhd";
592 namesGenerator->SetSeriesFormat( format.c_str() );
594 const std::vector<std::string> names = namesGenerator->GetFileNames();
595 seriesWriter->SetFileNames( names );
596 seriesWriter->SetInput(i_Img);
597 seriesWriter->SetImageIO(metaIO);
600 seriesWriter->Update();
601 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
602 std::vector<std::string>::const_iterator it = names.begin();
603 for( ;it != names.end(); ++it)
605 vReader->SetFileName((*it).c_str());
607 m_Vresults.push_back(vReader->GetOutput());
611 catch( itk::ExceptionObject & excp )
613 std::cerr << "Exception thrown while writing the series " << std::endl;
614 std::cerr << excp << std::endl;
615 //return EXIT_FAILURE;
620 bool WxAnySimpleDlg::AllSameType()
622 if(m_AnyType.size() == 1)