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>
21 #include "itkImageToVTKImageFilter.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
56 //////////////////////////////////////////////////////////////////////
58 //////////////////////////////////////////////////////////////////////
60 void WxAnySimpleDlg::OnReadFile(wxCommandEvent& event)
63 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
65 resultShowModal = fileDlg->ShowModal();
66 if ( resultShowModal==wxID_OK )
68 wxArrayString wxArray;
69 fileDlg->GetPaths(wxArray);
72 for( int i = 0; i < wxArray.GetCount(); i++)
74 std::string name = crea::wx2std(wxArray[i]);
75 // FOR THE MOMENT ONLY short 3D et short 4D
80 // TO DO WARNING MESSAGES
83 SetReturnCode( resultShowModal );
85 EndModal( resultShowModal );
90 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
94 /////////////////////////////////////////////////////////////////////
96 //////////////////////////////////////////////////////////////////////
98 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
102 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
103 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
105 resultShowModal = dirDlg->ShowModal();
106 if ( resultShowModal==wxID_OK )
108 std::string path = crea::wx2std(dirDlg->GetPath());
109 typedef boost::filesystem::directory_iterator dir_it;
112 /*if (boost::filesystem::exists(path))
114 for(;itr != end_itr; ++itr)
116 bvalid = m_exts.size() == 0? true : false;
117 std::vector<std::string>::iterator it = m_exts.begin();
118 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
119 for(; it != m_exts.end(); it++)
127 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
129 readImg(itr->string().c_str());
133 SetReturnCode( resultShowModal );
135 EndModal( resultShowModal );
138 //////////////////////////////////////////////////////////////////////
140 //////////////////////////////////////////////////////////////////////
142 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
145 WxGimmickReaderDialog dlg(0,-1,
148 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
151 GIMMICK_2D_IMAGE_SELECTION,
152 GIMMICK_3D_IMAGE_SELECTION,
156 if (dlg.GetReturnCode() == wxID_OK)
158 std::vector<std::string> out;
160 dlg.GetSelectedFiles(out);
167 std::vector<std::string>::iterator ii = out.begin();
168 for (;ii != out.end();ii++)
170 readImg( (*ii).c_str() );
175 SetReturnCode( dlg.GetReturnCode() );
177 EndModal( dlg.GetReturnCode() );
182 wxString WxAnySimpleDlg::getInfoImage()
188 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
189 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
191 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
192 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
193 imageIO->SetFileName(i_name.c_str());
194 imageIO->ReadImageInformation();
195 return imageIO->GetComponentTypeInfo();//AsString( imageIO->GetComponentType());
198 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
200 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
201 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
202 imageIO->SetFileName(i_name.c_str());
203 imageIO->ReadImageInformation();
204 return imageIO->GetNumberOfDimensions();
207 void WxAnySimpleDlg::readImg(const std::string &i_name)
209 size_t dims = getNumberOfDimensions(i_name);
210 const std::type_info *type= &getType(i_name);
214 if (getType(i_name) == typeid(unsigned char))
216 typedef itk::Image<unsigned char, 3> TImage;
217 typedef itk::ImageFileReader<TImage> ReaderType;
218 ReaderType::Pointer reader = ReaderType::New();
219 reader->SetFileName( i_name );
221 reader->GetOutput()->Register();
222 m_AnyImages.push_back(reader->GetOutput());
224 else if (getType(i_name) == typeid(signed char))
226 typedef itk::Image<signed char, 3> TImage;
227 typedef itk::ImageFileReader<TImage> ReaderType;
228 ReaderType::Pointer reader = ReaderType::New();
229 reader->SetFileName( i_name );
231 reader->GetOutput()->Register();
232 m_AnyImages.push_back(reader->GetOutput());
234 else if (getType(i_name) == typeid(short))
236 typedef itk::Image<short, 3> TImage;
237 typedef itk::ImageFileReader<TImage> ReaderType;
238 ReaderType::Pointer reader = ReaderType::New();
239 reader->SetFileName( i_name );
241 reader->GetOutput()->Register();
242 m_AnyImages.push_back(reader->GetOutput());
244 else if (getType(i_name) == typeid(unsigned short))
246 typedef itk::Image<unsigned short, 3> TImage;
247 typedef itk::ImageFileReader<TImage> ReaderType;
248 ReaderType::Pointer reader = ReaderType::New();
249 reader->SetFileName( i_name );
251 reader->GetOutput()->Register();
252 m_AnyImages.push_back(reader->GetOutput());
254 else if (getType(i_name) == typeid(unsigned int))
256 typedef itk::Image<unsigned int, 3> TImage;
257 typedef itk::ImageFileReader<TImage> ReaderType;
258 ReaderType::Pointer reader = ReaderType::New();
259 reader->SetFileName( i_name );
261 reader->GetOutput()->Register();
262 m_AnyImages.push_back(reader->GetOutput());
264 else if (getType(i_name) == typeid(signed int))
266 typedef itk::Image<signed int, 3> TImage;
267 typedef itk::ImageFileReader<TImage> ReaderType;
268 ReaderType::Pointer reader = ReaderType::New();
269 reader->SetFileName( i_name );
271 reader->GetOutput()->Register();
272 m_AnyImages.push_back(reader->GetOutput());
274 else if (getType(i_name) == typeid(unsigned long))
276 typedef itk::Image<unsigned long, 3> TImage;
277 typedef itk::ImageFileReader<TImage> ReaderType;
278 ReaderType::Pointer reader = ReaderType::New();
279 reader->SetFileName( i_name );
281 reader->GetOutput()->Register();
282 m_AnyImages.push_back(reader->GetOutput());
284 else if (getType(i_name) == typeid(signed long))
286 typedef itk::Image<signed long, 3> TImage;
287 typedef itk::ImageFileReader<TImage> ReaderType;
288 ReaderType::Pointer reader = ReaderType::New();
289 reader->SetFileName( i_name );
291 reader->GetOutput()->Register();
292 m_AnyImages.push_back(reader->GetOutput());
294 else if (getType(i_name) == typeid(float))
296 typedef itk::Image<float, 3> TImage;
297 typedef itk::ImageFileReader<TImage> ReaderType;
298 ReaderType::Pointer reader = ReaderType::New();
299 reader->SetFileName( i_name );
301 reader->GetOutput()->Register();
302 m_AnyImages.push_back(reader->GetOutput());
304 else if (getType(i_name) == typeid(double))
306 typedef itk::Image<double, 3> TImage;
307 typedef itk::ImageFileReader<TImage> ReaderType;
308 ReaderType::Pointer reader = ReaderType::New();
309 reader->SetFileName( i_name );
311 reader->GetOutput()->Register();
312 m_AnyImages.push_back(reader->GetOutput());
316 //????FCY, so what the type????
319 //assume that we have only one 4D file
321 if (getType(i_name) == typeid(unsigned char))
323 typedef itk::Image<unsigned char, 4> TImage;
324 typedef itk::ImageFileReader<TImage> ReaderType;
325 ReaderType::Pointer reader = ReaderType::New();
326 reader->SetFileName( i_name );
328 reader->GetOutput()->Register();
329 m_AnyImages.push_back(reader->GetOutput());
330 split4Din3Dvtk<TImage>(reader->GetOutput());
332 else if (getType(i_name) == typeid(signed char))
334 typedef itk::Image<signed char, 4> TImage;
335 typedef itk::ImageFileReader<TImage> ReaderType;
336 ReaderType::Pointer reader = ReaderType::New();
337 reader->SetFileName( i_name );
339 reader->GetOutput()->Register();
340 m_AnyImages.push_back(reader->GetOutput());
341 split4Din3Dvtk<TImage>(reader->GetOutput());
343 else if (getType(i_name) == typeid(unsigned short))
345 typedef itk::Image<unsigned short, 4> TImage;
346 typedef itk::ImageFileReader<TImage> ReaderType;
347 ReaderType::Pointer reader = ReaderType::New();
348 reader->SetFileName( i_name );
350 reader->GetOutput()->Register();
351 m_AnyImages.push_back(reader->GetOutput());
352 split4Din3Dvtk<TImage>(reader->GetOutput());
354 else if(getType(i_name) == typeid(short))
356 typedef itk::Image<short, 4> TImage;
357 typedef itk::ImageFileReader<TImage> ReaderType;
358 ReaderType::Pointer reader = ReaderType::New();
359 reader->SetFileName( i_name );
364 catch( itk::ExceptionObject & err )
366 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
367 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
372 std::cout << "Error while reading image " << i_name << std::endl;
375 reader->GetOutput()->Register();
376 m_AnyImages.push_back(reader->GetOutput());
377 split4Din3Dvtk<TImage>(reader->GetOutput());
379 else if (getType(i_name) == typeid(unsigned short))
381 typedef itk::Image<unsigned short, 4> TImage;
382 typedef itk::ImageFileReader<TImage> ReaderType;
383 ReaderType::Pointer reader = ReaderType::New();
384 reader->SetFileName( i_name );
386 reader->GetOutput()->Register();
387 m_AnyImages.push_back(reader->GetOutput());
388 split4Din3Dvtk<TImage>(reader->GetOutput());
390 else if (getType(i_name) == typeid(unsigned int))
392 typedef itk::Image<unsigned int, 4> TImage;
393 typedef itk::ImageFileReader<TImage> ReaderType;
394 ReaderType::Pointer reader = ReaderType::New();
395 reader->SetFileName( i_name );
397 reader->GetOutput()->Register();
398 m_AnyImages.push_back(reader->GetOutput());
399 split4Din3Dvtk<TImage>(reader->GetOutput());
401 else if (getType(i_name) == typeid(signed int))
403 typedef itk::Image<signed int, 4> TImage;
404 typedef itk::ImageFileReader<TImage> ReaderType;
405 ReaderType::Pointer reader = ReaderType::New();
406 reader->SetFileName( i_name );
408 reader->GetOutput()->Register();
409 m_AnyImages.push_back(reader->GetOutput());
410 split4Din3Dvtk<TImage>(reader->GetOutput());
412 else if (getType(i_name) == typeid(unsigned long))
414 typedef itk::Image<unsigned long, 4> TImage;
415 typedef itk::ImageFileReader<TImage> ReaderType;
416 ReaderType::Pointer reader = ReaderType::New();
417 reader->SetFileName( i_name );
419 reader->GetOutput()->Register();
420 m_AnyImages.push_back(reader->GetOutput());
421 split4Din3Dvtk<TImage>(reader->GetOutput());
423 else if (getType(i_name) == typeid(signed long))
425 typedef itk::Image<signed long, 4> TImage;
426 typedef itk::ImageFileReader<TImage> ReaderType;
427 ReaderType::Pointer reader = ReaderType::New();
428 reader->SetFileName( i_name );
430 reader->GetOutput()->Register();
431 m_AnyImages.push_back(reader->GetOutput());
432 split4Din3Dvtk<TImage>(reader->GetOutput());
434 else if (getType(i_name) == typeid(float))
436 typedef itk::Image<float, 4> TImage;
437 typedef itk::ImageFileReader<TImage> ReaderType;
438 ReaderType::Pointer reader = ReaderType::New();
439 reader->SetFileName( i_name );
441 reader->GetOutput()->Register();
442 m_AnyImages.push_back(reader->GetOutput());
443 split4Din3Dvtk<TImage>(reader->GetOutput());
445 else if (getType(i_name) == typeid(double))
447 typedef itk::Image<double, 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());
458 //????FCY, so what the type????
463 // Test to know if we have to add new type
465 if( m_AnyDims.size() != 0)
471 m_AnyDims.push_back(dims);
472 m_AnyType.push_back(&getType(i_name));
476 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
478 m_AnyDims.push_back(dims);
479 m_AnyType.push_back(&getType(i_name));
489 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
491 typedef itk::Image<short,3> TImage;
492 typedef itk::GDCMImageIO GDCMType;
493 typedef itk::DICOMSeriesFileNames dicnames;
494 GDCMType::Pointer gdcmIO = GDCMType::New();
495 dicnames::Pointer generator = dicnames::New();
498 typedef itk::ImageSeriesReader<TImage> ReaderType;
499 ReaderType::Pointer reader = ReaderType::New();
500 reader->SetImageIO(gdcmIO);
501 reader->SetFileNames(i_names);
502 // reader->SetFileName( i_name );
507 catch( itk::ExceptionObject & err )
509 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
510 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
515 //std::cout << "Error while reading image " << i_name << std::endl;
518 //m_Iresults.push_back(reader->GetOutput());
525 template <typename TImage>
526 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
528 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
529 typename ConnectorType::Pointer connector = ConnectorType::New();
530 connector->SetInput(i_Img);
531 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
533 vtkImageData *im = vtkImageData::New();
534 im->ShallowCopy(connector->GetOutput());
536 m_Vresults.push_back(im);
540 template <typename TImage>
541 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
543 if(i_Img->GetImageDimension() == 4)
545 // size of fourth dimension
546 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
548 typedef itk::Image<unsigned char,3> ImageOutputType;
549 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
550 typedef itk::MetaImageIO MetaImageType;
551 MetaImageType::Pointer metaIO;
552 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
554 // from JPR file to generate output files
555 typedef itk::NumericSeriesFileNames NamesGeneratorType;
556 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
557 namesGenerator->SetStartIndex(0);
558 namesGenerator->SetEndIndex(dsize-1);
559 namesGenerator->SetIncrementIndex(1);
560 std::string format = m_dir;
561 format += "/image%03d.mhd";
562 namesGenerator->SetSeriesFormat( format.c_str() );
564 const std::vector<std::string> names = namesGenerator->GetFileNames();
565 seriesWriter->SetFileNames( names );
566 seriesWriter->SetInput(i_Img);
567 seriesWriter->SetImageIO(metaIO);
570 seriesWriter->Update();
571 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
572 std::vector<std::string>::const_iterator it = names.begin();
573 for( ;it != names.end(); ++it)
575 vReader->SetFileName((*it).c_str());
577 m_Vresults.push_back(vReader->GetOutput());
581 catch( itk::ExceptionObject & excp )
583 std::cerr << "Exception thrown while writing the series " << std::endl;
584 std::cerr << excp << std::endl;
585 //return EXIT_FAILURE;
590 bool WxAnySimpleDlg::AllSameType()
592 if(m_AnyType.size() == 1)