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>
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 );
89 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
93 /////////////////////////////////////////////////////////////////////
95 //////////////////////////////////////////////////////////////////////
97 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
101 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
102 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
104 resultShowModal = dirDlg->ShowModal();
105 if ( resultShowModal==wxID_OK )
107 std::string path = crea::wx2std(dirDlg->GetPath());
108 typedef boost::filesystem::directory_iterator dir_it;
111 /*if (boost::filesystem::exists(path))
113 for(;itr != end_itr; ++itr)
115 bvalid = m_exts.size() == 0? true : false;
116 std::vector<std::string>::iterator it = m_exts.begin();
117 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
118 for(; it != m_exts.end(); it++)
126 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
128 readImg(itr->string().c_str());
132 SetReturnCode( resultShowModal );
134 EndModal( resultShowModal );
137 //////////////////////////////////////////////////////////////////////
139 //////////////////////////////////////////////////////////////////////
141 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
144 WxGimmickReaderDialog dlg(0,-1,
147 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
150 GIMMICK_2D_IMAGE_SELECTION,
151 GIMMICK_3D_IMAGE_SELECTION,
155 if (dlg.GetReturnCode() == wxID_OK)
157 std::vector<std::string> out;
159 dlg.GetSelectedFiles(out);
166 std::vector<std::string>::iterator ii = out.begin();
167 for (;ii != out.end();ii++)
169 readImg( (*ii).c_str() );
174 SetReturnCode( dlg.GetReturnCode() );
176 EndModal( dlg.GetReturnCode() );
181 wxString WxAnySimpleDlg::getInfoImage()
187 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
188 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
190 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
191 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
192 imageIO->SetFileName(i_name.c_str());
193 imageIO->ReadImageInformation();
194 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
197 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
199 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
200 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
201 imageIO->SetFileName(i_name.c_str());
202 imageIO->ReadImageInformation();
203 return imageIO->GetNumberOfDimensions();
206 void WxAnySimpleDlg::readImg(const std::string &i_name)
208 size_t dims = getNumberOfDimensions(i_name);
209 //const std::type_info *type= &getType(i_name);
213 if (getType(i_name) == typeid(unsigned char))
215 typedef itk::Image<unsigned char, 3> TImage;
216 typedef itk::ImageFileReader<TImage> ReaderType;
217 ReaderType::Pointer reader = ReaderType::New();
218 reader->SetFileName( i_name );
220 reader->GetOutput()->Register();
221 m_AnyImages.push_back(reader->GetOutput());
223 else if (getType(i_name) == typeid(signed char))
225 typedef itk::Image<signed char, 3> TImage;
226 typedef itk::ImageFileReader<TImage> ReaderType;
227 ReaderType::Pointer reader = ReaderType::New();
228 reader->SetFileName( i_name );
230 reader->GetOutput()->Register();
231 m_AnyImages.push_back(reader->GetOutput());
233 else if (getType(i_name) == typeid(short))
235 typedef itk::Image<short, 3> TImage;
236 typedef itk::ImageFileReader<TImage> ReaderType;
237 ReaderType::Pointer reader = ReaderType::New();
238 reader->SetFileName( i_name );
240 reader->GetOutput()->Register();
241 m_AnyImages.push_back(reader->GetOutput());
243 else if (getType(i_name) == typeid(unsigned short))
245 typedef itk::Image<unsigned short, 3> TImage;
246 typedef itk::ImageFileReader<TImage> ReaderType;
247 ReaderType::Pointer reader = ReaderType::New();
248 reader->SetFileName( i_name );
250 reader->GetOutput()->Register();
251 m_AnyImages.push_back(reader->GetOutput());
253 else if (getType(i_name) == typeid(unsigned int))
255 typedef itk::Image<unsigned int, 3> TImage;
256 typedef itk::ImageFileReader<TImage> ReaderType;
257 ReaderType::Pointer reader = ReaderType::New();
258 reader->SetFileName( i_name );
260 reader->GetOutput()->Register();
261 m_AnyImages.push_back(reader->GetOutput());
263 else if (getType(i_name) == typeid(signed int))
265 typedef itk::Image<signed int, 3> TImage;
266 typedef itk::ImageFileReader<TImage> ReaderType;
267 ReaderType::Pointer reader = ReaderType::New();
268 reader->SetFileName( i_name );
270 reader->GetOutput()->Register();
271 m_AnyImages.push_back(reader->GetOutput());
273 else if (getType(i_name) == typeid(unsigned long))
275 typedef itk::Image<unsigned long, 3> TImage;
276 typedef itk::ImageFileReader<TImage> ReaderType;
277 ReaderType::Pointer reader = ReaderType::New();
278 reader->SetFileName( i_name );
280 reader->GetOutput()->Register();
281 m_AnyImages.push_back(reader->GetOutput());
283 else if (getType(i_name) == typeid(signed long))
285 typedef itk::Image<signed long, 3> TImage;
286 typedef itk::ImageFileReader<TImage> ReaderType;
287 ReaderType::Pointer reader = ReaderType::New();
288 reader->SetFileName( i_name );
290 reader->GetOutput()->Register();
291 m_AnyImages.push_back(reader->GetOutput());
293 else if (getType(i_name) == typeid(float))
295 typedef itk::Image<float, 3> TImage;
296 typedef itk::ImageFileReader<TImage> ReaderType;
297 ReaderType::Pointer reader = ReaderType::New();
298 reader->SetFileName( i_name );
300 reader->GetOutput()->Register();
301 m_AnyImages.push_back(reader->GetOutput());
303 else if (getType(i_name) == typeid(double))
305 typedef itk::Image<double, 3> TImage;
306 typedef itk::ImageFileReader<TImage> ReaderType;
307 ReaderType::Pointer reader = ReaderType::New();
308 reader->SetFileName( i_name );
310 reader->GetOutput()->Register();
311 m_AnyImages.push_back(reader->GetOutput());
315 //????FCY, so what the type????
318 //assume that we have only one 4D file
320 if (getType(i_name) == typeid(unsigned char))
322 typedef itk::Image<unsigned char, 4> 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());
329 split4Din3Dvtk<TImage>(reader->GetOutput());
331 else if (getType(i_name) == typeid(signed char))
333 typedef itk::Image<signed char, 4> TImage;
334 typedef itk::ImageFileReader<TImage> ReaderType;
335 ReaderType::Pointer reader = ReaderType::New();
336 reader->SetFileName( i_name );
338 reader->GetOutput()->Register();
339 m_AnyImages.push_back(reader->GetOutput());
340 split4Din3Dvtk<TImage>(reader->GetOutput());
342 else if (getType(i_name) == typeid(unsigned short))
344 typedef itk::Image<unsigned short, 4> TImage;
345 typedef itk::ImageFileReader<TImage> ReaderType;
346 ReaderType::Pointer reader = ReaderType::New();
347 reader->SetFileName( i_name );
349 reader->GetOutput()->Register();
350 m_AnyImages.push_back(reader->GetOutput());
351 split4Din3Dvtk<TImage>(reader->GetOutput());
353 else if(getType(i_name) == typeid(short))
355 typedef itk::Image<short, 4> TImage;
356 typedef itk::ImageFileReader<TImage> ReaderType;
357 ReaderType::Pointer reader = ReaderType::New();
358 reader->SetFileName( i_name );
363 catch( itk::ExceptionObject & err )
365 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
366 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
371 std::cout << "Error while reading image " << i_name << std::endl;
374 reader->GetOutput()->Register();
375 m_AnyImages.push_back(reader->GetOutput());
376 split4Din3Dvtk<TImage>(reader->GetOutput());
378 else if (getType(i_name) == typeid(unsigned short))
380 typedef itk::Image<unsigned short, 4> TImage;
381 typedef itk::ImageFileReader<TImage> ReaderType;
382 ReaderType::Pointer reader = ReaderType::New();
383 reader->SetFileName( i_name );
385 reader->GetOutput()->Register();
386 m_AnyImages.push_back(reader->GetOutput());
387 split4Din3Dvtk<TImage>(reader->GetOutput());
389 else if (getType(i_name) == typeid(unsigned int))
391 typedef itk::Image<unsigned int, 4> TImage;
392 typedef itk::ImageFileReader<TImage> ReaderType;
393 ReaderType::Pointer reader = ReaderType::New();
394 reader->SetFileName( i_name );
396 reader->GetOutput()->Register();
397 m_AnyImages.push_back(reader->GetOutput());
398 split4Din3Dvtk<TImage>(reader->GetOutput());
400 else if (getType(i_name) == typeid(signed int))
402 typedef itk::Image<signed int, 4> TImage;
403 typedef itk::ImageFileReader<TImage> ReaderType;
404 ReaderType::Pointer reader = ReaderType::New();
405 reader->SetFileName( i_name );
407 reader->GetOutput()->Register();
408 m_AnyImages.push_back(reader->GetOutput());
409 split4Din3Dvtk<TImage>(reader->GetOutput());
411 else if (getType(i_name) == typeid(unsigned long))
413 typedef itk::Image<unsigned long, 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(signed long))
424 typedef itk::Image<signed long, 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(float))
435 typedef itk::Image<float, 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(double))
446 typedef itk::Image<double, 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());
457 //????FCY, so what the type????
462 // Test to know if we have to add new type
464 if( m_AnyDims.size() != 0)
470 m_AnyDims.push_back(dims);
471 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
475 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
477 m_AnyDims.push_back(dims);
478 m_AnyType.push_back((std::type_info*)&getType(i_name)); //JPR cast
485 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
487 typedef itk::Image<short,3> TImage;
488 typedef itk::GDCMImageIO GDCMType;
489 typedef itk::DICOMSeriesFileNames dicnames;
490 GDCMType::Pointer gdcmIO = GDCMType::New();
491 dicnames::Pointer generator = dicnames::New();
494 typedef itk::ImageSeriesReader<TImage> ReaderType;
495 ReaderType::Pointer reader = ReaderType::New();
496 reader->SetImageIO(gdcmIO);
497 reader->SetFileNames(i_names);
498 // reader->SetFileName( i_name );
503 catch( itk::ExceptionObject & err )
505 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
506 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
511 //std::cout << "Error while reading image " << i_name << std::endl;
514 //m_Iresults.push_back(reader->GetOutput());
518 /* template <typename TImage>
519 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
521 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
522 typename ConnectorType::Pointer connector = ConnectorType::New();
523 connector->SetInput(i_Img);
524 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
526 vtkImageData *im = vtkImageData::New();
527 im->ShallowCopy(connector->GetOutput());
529 m_Vresults.push_back(im);
533 template <typename TImage>
534 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
536 if(i_Img->GetImageDimension() == 4)
538 // size of fourth dimension
539 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
541 typedef itk::Image<unsigned char,3> ImageOutputType;
542 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
543 typedef itk::MetaImageIO MetaImageType;
544 MetaImageType::Pointer metaIO;
545 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
547 // from JPR file to generate output files
548 typedef itk::NumericSeriesFileNames NamesGeneratorType;
549 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
550 namesGenerator->SetStartIndex(0);
551 namesGenerator->SetEndIndex(dsize-1);
552 namesGenerator->SetIncrementIndex(1);
553 std::string format = m_dir;
554 format += "/image%03d.mhd";
555 namesGenerator->SetSeriesFormat( format.c_str() );
557 const std::vector<std::string> names = namesGenerator->GetFileNames();
558 seriesWriter->SetFileNames( names );
559 seriesWriter->SetInput(i_Img);
560 seriesWriter->SetImageIO(metaIO);
563 seriesWriter->Update();
564 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
565 std::vector<std::string>::const_iterator it = names.begin();
566 for( ;it != names.end(); ++it)
568 vReader->SetFileName((*it).c_str());
570 m_Vresults.push_back(vReader->GetOutput());
574 catch( itk::ExceptionObject & excp )
576 std::cerr << "Exception thrown while writing the series " << std::endl;
577 std::cerr << excp << std::endl;
578 //return EXIT_FAILURE;
583 bool WxAnySimpleDlg::AllSameType()
585 if(m_AnyType.size() == 1)