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"
32 #include <itkAnalyzeImageIO.h>
33 #include <itkImageFileReader.h>
34 #include <itkImageSeriesReader.h>
36 #include <itkImageSeriesWriter.h>
37 #include <itkGDCMImageIO.h>
38 #include <itkDICOMSeriesFileNames.h>
39 #include <itkNumericSeriesFileNames.h>
40 #include <itkVectorImage.h>
41 #include <itkMetaImageIO.h>
42 #include <vtkImageReader2.h>
43 #include <vtkMetaImageReader.h>
44 #include <boost/filesystem/path.hpp>
45 #include <boost/filesystem.hpp>
46 #include <boost/utility.hpp>
47 #include <creaVtkBasicSlicer.h>
54 WxAnySimpleDlg::WxAnySimpleDlg(wxWindow *parent,
56 const std::string i_namedescp ,
57 const std::string i_namedb)
58 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
60 namedescp = i_namedescp;
65 this->SetTitle(i_title);
67 // Button to select file(s)
68 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
69 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadFile );
71 // Button to select directory
72 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
73 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadDirectory );
75 // button to select creaImageIO
76 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
77 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadGimmick );
79 /// \TODO Button to select Bruker directory
84 //////////////////////////////////////////////////////////////////////
86 //////////////////////////////////////////////////////////////////////
88 void WxAnySimpleDlg::OnReadFile(wxCommandEvent& event)
91 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
93 resultShowModal = fileDlg->ShowModal();
94 if ( resultShowModal==wxID_OK )
96 wxArrayString wxArray;
97 fileDlg->GetPaths(wxArray);
100 for( int i = 0; i < wxArray.GetCount(); i++)
102 std::string name = crea::wx2std(wxArray[i]);
103 // FOR THE MOMENT ONLY short 3D et short 4D
108 // TO DO WARNING MESSAGES
111 SetReturnCode( resultShowModal );
113 EndModal( resultShowModal );
116 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
120 /////////////////////////////////////////////////////////////////////
122 //////////////////////////////////////////////////////////////////////
124 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
128 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
129 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
131 resultShowModal = dirDlg->ShowModal();
132 if ( resultShowModal==wxID_OK )
134 std::string path = crea::wx2std(dirDlg->GetPath());
135 typedef boost::filesystem::directory_iterator dir_it;
138 /*if (boost::filesystem::exists(path))
140 for(;itr != end_itr; ++itr)
142 bvalid = m_exts.size() == 0? true : false;
143 std::vector<std::string>::iterator it = m_exts.begin();
144 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
145 for(; it != m_exts.end(); it++)
153 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
155 readImg(itr->string().c_str());
159 SetReturnCode( resultShowModal );
161 EndModal( resultShowModal );
164 //////////////////////////////////////////////////////////////////////
166 //////////////////////////////////////////////////////////////////////
168 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
171 WxGimmickReaderDialog dlg(0,-1,
174 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
177 GIMMICK_2D_IMAGE_SELECTION,
178 GIMMICK_3D_IMAGE_SELECTION,
182 if (dlg.GetReturnCode() == wxID_OK)
184 std::vector<std::string> out;
186 dlg.GetSelectedFiles(out);
193 std::vector<std::string>::iterator ii = out.begin();
194 for (;ii != out.end();ii++)
196 readImg( (*ii).c_str() );
201 SetReturnCode( dlg.GetReturnCode() );
203 EndModal( dlg.GetReturnCode() );
208 wxString WxAnySimpleDlg::getInfoImage()
214 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
215 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
217 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
218 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
219 imageIO->SetFileName(i_name.c_str());
220 imageIO->ReadImageInformation();
221 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
224 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
226 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
227 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
228 imageIO->SetFileName(i_name.c_str());
229 imageIO->ReadImageInformation();
230 return imageIO->GetNumberOfDimensions();
233 void WxAnySimpleDlg::readImg(const std::string &i_name)
235 size_t dims = getNumberOfDimensions(i_name);
236 //const std::type_info *type= &getType(i_name);
240 if (getType(i_name) == typeid(unsigned char))
242 typedef itk::Image<unsigned char, 3> TImage;
243 typedef itk::ImageFileReader<TImage> ReaderType;
244 ReaderType::Pointer reader = ReaderType::New();
245 reader->SetFileName( i_name );
247 reader->GetOutput()->Register();
248 m_AnyImages.push_back(reader->GetOutput());
250 else if (getType(i_name) == typeid(signed char))
252 typedef itk::Image<signed char, 3> TImage;
253 typedef itk::ImageFileReader<TImage> ReaderType;
254 ReaderType::Pointer reader = ReaderType::New();
255 reader->SetFileName( i_name );
257 reader->GetOutput()->Register();
258 m_AnyImages.push_back(reader->GetOutput());
260 else if (getType(i_name) == typeid(short))
262 typedef itk::Image<short, 3> TImage;
263 typedef itk::ImageFileReader<TImage> ReaderType;
264 ReaderType::Pointer reader = ReaderType::New();
265 reader->SetFileName( i_name );
267 reader->GetOutput()->Register();
268 m_AnyImages.push_back(reader->GetOutput());
270 else if (getType(i_name) == typeid(unsigned short))
272 typedef itk::Image<unsigned short, 3> TImage;
273 typedef itk::ImageFileReader<TImage> ReaderType;
274 ReaderType::Pointer reader = ReaderType::New();
275 reader->SetFileName( i_name );
277 reader->GetOutput()->Register();
278 m_AnyImages.push_back(reader->GetOutput());
280 else if (getType(i_name) == typeid(unsigned int))
282 typedef itk::Image<unsigned int, 3> TImage;
283 typedef itk::ImageFileReader<TImage> ReaderType;
284 ReaderType::Pointer reader = ReaderType::New();
285 reader->SetFileName( i_name );
287 reader->GetOutput()->Register();
288 m_AnyImages.push_back(reader->GetOutput());
290 else if (getType(i_name) == typeid(signed int))
292 typedef itk::Image<signed int, 3> TImage;
293 typedef itk::ImageFileReader<TImage> ReaderType;
294 ReaderType::Pointer reader = ReaderType::New();
295 reader->SetFileName( i_name );
297 reader->GetOutput()->Register();
298 m_AnyImages.push_back(reader->GetOutput());
300 else if (getType(i_name) == typeid(unsigned long))
302 typedef itk::Image<unsigned long, 3> TImage;
303 typedef itk::ImageFileReader<TImage> ReaderType;
304 ReaderType::Pointer reader = ReaderType::New();
305 reader->SetFileName( i_name );
307 reader->GetOutput()->Register();
308 m_AnyImages.push_back(reader->GetOutput());
310 else if (getType(i_name) == typeid(signed long))
312 typedef itk::Image<signed long, 3> TImage;
313 typedef itk::ImageFileReader<TImage> ReaderType;
314 ReaderType::Pointer reader = ReaderType::New();
315 reader->SetFileName( i_name );
317 reader->GetOutput()->Register();
318 m_AnyImages.push_back(reader->GetOutput());
320 else if (getType(i_name) == typeid(float))
322 typedef itk::Image<float, 3> TImage;
323 typedef itk::ImageFileReader<TImage> ReaderType;
324 ReaderType::Pointer reader = ReaderType::New();
325 reader->SetFileName( i_name );
327 reader->GetOutput()->Register();
328 m_AnyImages.push_back(reader->GetOutput());
330 else if (getType(i_name) == typeid(double))
332 typedef itk::Image<double, 3> TImage;
333 typedef itk::ImageFileReader<TImage> ReaderType;
334 ReaderType::Pointer reader = ReaderType::New();
335 reader->SetFileName( i_name );
337 reader->GetOutput()->Register();
338 m_AnyImages.push_back(reader->GetOutput());
342 //????FCY, so what the type????
345 //assume that we have only one 4D file
347 if (getType(i_name) == typeid(unsigned char))
349 typedef itk::Image<unsigned char, 4> TImage;
350 typedef itk::ImageFileReader<TImage> ReaderType;
351 ReaderType::Pointer reader = ReaderType::New();
352 reader->SetFileName( i_name );
354 reader->GetOutput()->Register();
355 m_AnyImages.push_back(reader->GetOutput());
356 split4Din3Dvtk<TImage>(reader->GetOutput());
358 else if (getType(i_name) == typeid(signed char))
360 typedef itk::Image<signed char, 4> 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());
367 split4Din3Dvtk<TImage>(reader->GetOutput());
369 else if (getType(i_name) == typeid(unsigned short))
371 typedef itk::Image<unsigned short, 4> 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());
378 split4Din3Dvtk<TImage>(reader->GetOutput());
380 else if(getType(i_name) == typeid(short))
382 typedef itk::Image<short, 4> TImage;
383 typedef itk::ImageFileReader<TImage> ReaderType;
384 ReaderType::Pointer reader = ReaderType::New();
385 reader->SetFileName( i_name );
390 catch( itk::ExceptionObject & err )
392 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
393 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
398 std::cout << "Error while reading image " << i_name << std::endl;
401 reader->GetOutput()->Register();
402 m_AnyImages.push_back(reader->GetOutput());
403 split4Din3Dvtk<TImage>(reader->GetOutput());
405 else if (getType(i_name) == typeid(unsigned short))
407 typedef itk::Image<unsigned short, 4> TImage;
408 typedef itk::ImageFileReader<TImage> ReaderType;
409 ReaderType::Pointer reader = ReaderType::New();
410 reader->SetFileName( i_name );
412 reader->GetOutput()->Register();
413 m_AnyImages.push_back(reader->GetOutput());
414 split4Din3Dvtk<TImage>(reader->GetOutput());
416 else if (getType(i_name) == typeid(unsigned int))
418 typedef itk::Image<unsigned int, 4> TImage;
419 typedef itk::ImageFileReader<TImage> ReaderType;
420 ReaderType::Pointer reader = ReaderType::New();
421 reader->SetFileName( i_name );
423 reader->GetOutput()->Register();
424 m_AnyImages.push_back(reader->GetOutput());
425 split4Din3Dvtk<TImage>(reader->GetOutput());
427 else if (getType(i_name) == typeid(signed int))
429 typedef itk::Image<signed int, 4> TImage;
430 typedef itk::ImageFileReader<TImage> ReaderType;
431 ReaderType::Pointer reader = ReaderType::New();
432 reader->SetFileName( i_name );
434 reader->GetOutput()->Register();
435 m_AnyImages.push_back(reader->GetOutput());
436 split4Din3Dvtk<TImage>(reader->GetOutput());
438 else if (getType(i_name) == typeid(unsigned long))
440 typedef itk::Image<unsigned long, 4> TImage;
441 typedef itk::ImageFileReader<TImage> ReaderType;
442 ReaderType::Pointer reader = ReaderType::New();
443 reader->SetFileName( i_name );
445 reader->GetOutput()->Register();
446 m_AnyImages.push_back(reader->GetOutput());
447 split4Din3Dvtk<TImage>(reader->GetOutput());
449 else if (getType(i_name) == typeid(signed long))
451 typedef itk::Image<signed long, 4> TImage;
452 typedef itk::ImageFileReader<TImage> ReaderType;
453 ReaderType::Pointer reader = ReaderType::New();
454 reader->SetFileName( i_name );
456 reader->GetOutput()->Register();
457 m_AnyImages.push_back(reader->GetOutput());
458 split4Din3Dvtk<TImage>(reader->GetOutput());
460 else if (getType(i_name) == typeid(float))
462 typedef itk::Image<float, 4> TImage;
463 typedef itk::ImageFileReader<TImage> ReaderType;
464 ReaderType::Pointer reader = ReaderType::New();
465 reader->SetFileName( i_name );
467 reader->GetOutput()->Register();
468 m_AnyImages.push_back(reader->GetOutput());
469 split4Din3Dvtk<TImage>(reader->GetOutput());
471 else if (getType(i_name) == typeid(double))
473 typedef itk::Image<double, 4> TImage;
474 typedef itk::ImageFileReader<TImage> ReaderType;
475 ReaderType::Pointer reader = ReaderType::New();
476 reader->SetFileName( i_name );
478 reader->GetOutput()->Register();
479 m_AnyImages.push_back(reader->GetOutput());
480 split4Din3Dvtk<TImage>(reader->GetOutput());
484 //????FCY, so what the type????
489 // Test to know if we have to add new type
491 if( m_AnyDims.size() != 0)
497 m_AnyDims.push_back(dims);
498 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
502 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
504 m_AnyDims.push_back(dims);
505 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
512 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
514 typedef itk::Image<short,3> TImage;
515 typedef itk::GDCMImageIO GDCMType;
516 typedef itk::DICOMSeriesFileNames dicnames;
517 GDCMType::Pointer gdcmIO = GDCMType::New();
518 dicnames::Pointer generator = dicnames::New();
521 typedef itk::ImageSeriesReader<TImage> ReaderType;
522 ReaderType::Pointer reader = ReaderType::New();
523 reader->SetImageIO(gdcmIO);
524 reader->SetFileNames(i_names);
525 // reader->SetFileName( i_name );
530 catch( itk::ExceptionObject & err )
532 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
533 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
538 //std::cout << "Error while reading image " << i_name << std::endl;
541 //m_Iresults.push_back(reader->GetOutput());
545 /* template <typename TImage>
546 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
548 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
549 typename ConnectorType::Pointer connector = ConnectorType::New();
550 connector->SetInput(i_Img);
551 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
553 vtkImageData *im = vtkImageData::New();
554 im->ShallowCopy(connector->GetOutput());
556 m_Vresults.push_back(im);
560 template <typename TImage>
561 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
563 if(i_Img->GetImageDimension() == 4)
565 // size of fourth dimension
566 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
568 typedef itk::Image<unsigned char,3> ImageOutputType;
569 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
570 typedef itk::MetaImageIO MetaImageType;
571 MetaImageType::Pointer metaIO;
572 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
574 // from JPR file to generate output files
575 typedef itk::NumericSeriesFileNames NamesGeneratorType;
576 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
577 namesGenerator->SetStartIndex(0);
578 namesGenerator->SetEndIndex(dsize-1);
579 namesGenerator->SetIncrementIndex(1);
580 std::string format = m_dir;
581 format += "/image%03d.mhd";
582 namesGenerator->SetSeriesFormat( format.c_str() );
584 const std::vector<std::string> names = namesGenerator->GetFileNames();
585 seriesWriter->SetFileNames( names );
586 seriesWriter->SetInput(i_Img);
587 seriesWriter->SetImageIO(metaIO);
590 seriesWriter->Update();
591 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
592 std::vector<std::string>::const_iterator it = names.begin();
593 for( ;it != names.end(); ++it)
595 vReader->SetFileName((*it).c_str());
597 m_Vresults.push_back(vReader->GetOutput());
601 catch( itk::ExceptionObject & excp )
603 std::cerr << "Exception thrown while writing the series " << std::endl;
604 std::cerr << excp << std::endl;
605 //return EXIT_FAILURE;
610 bool WxAnySimpleDlg::AllSameType()
612 if(m_AnyType.size() == 1)