00001 #include "creaImageIOWxAnySimpleDlg.h"
00002
00003 #include "creaImageIOWxGimmickReaderDialog.h"
00004 #include <itkAnalyzeImageIO.h>
00005 #include <itkImageFileReader.h>
00006 #include <itkImageSeriesReader.h>
00007 #include <itkImage.h>
00008 #include <itkImageSeriesWriter.h>
00009 #include <itkGDCMImageIO.h>
00010 #include <itkDICOMSeriesFileNames.h>
00011 #include <itkNumericSeriesFileNames.h>
00012 #include <itkVectorImage.h>
00013 #include <itkMetaImageIO.h>
00014 #include <itkOrientedImage.h>
00015 #include <vtkImageReader2.h>
00016 #include <vtkMetaImageReader.h>
00017 #include <boost/filesystem/path.hpp>
00018 #include <boost/filesystem.hpp>
00019 #include <boost/utility.hpp>
00020 #include <creaVtkBasicSlicer.h>
00021 #include "itkImageToVTKImageFilter.h"
00022
00023 namespace creaImageIO
00024 {
00025
00027 WxAnySimpleDlg::WxAnySimpleDlg(wxWindow *parent,
00028 wxString i_title,
00029 const std::string i_namedescp ,
00030 const std::string i_namedb)
00031 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
00032 {
00033 namedescp = i_namedescp;
00034 namedb = i_namedb;
00035
00036 if(!i_title.empty())
00037 {
00038 this->SetTitle(i_title);
00039 }
00040
00041 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
00042 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadFile );
00043
00044
00045 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
00046 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadDirectory );
00047
00048
00049 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
00050 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxAnySimpleDlg::OnReadGimmick );
00051
00053 m_dicom = true;
00054 Layout();
00055 }
00056
00058
00060
00061 void WxAnySimpleDlg::OnReadFile(wxCommandEvent& event)
00062 {
00063 int resultShowModal;
00064 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
00065
00066 resultShowModal = fileDlg->ShowModal();
00067 if ( resultShowModal==wxID_OK )
00068 {
00069 wxArrayString wxArray;
00070 fileDlg->GetPaths(wxArray);
00071 if(wxArray.size() >0)
00072 {
00073 for( int i = 0; i < wxArray.GetCount(); i++)
00074 {
00075 std::string name = crea::wx2std(wxArray[i]);
00076
00077 readImg(name);
00078 }
00079 }
00080 else {
00081
00082 }
00083 }
00084 SetReturnCode( resultShowModal );
00085
00086 EndModal( resultShowModal );
00087 }
00088
00089 void WxAnySimpleDlg::setExts(std::vector<std::string> i_exts)
00090 {
00091 m_exts = i_exts;
00092 }
00094
00096
00097 void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event)
00098 {
00099 int resultShowModal;
00100 bool bvalid = false;
00101 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
00102 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
00103
00104 resultShowModal = dirDlg->ShowModal();
00105 if ( resultShowModal==wxID_OK )
00106 {
00107 std::string path = crea::wx2std(dirDlg->GetPath());
00108 typedef boost::filesystem::directory_iterator dir_it;
00109 dir_it itr(path);
00110 dir_it end_itr;
00111
00112
00113 for(;itr != end_itr; ++itr)
00114 {
00115 bvalid = m_exts.size() == 0? true : false;
00116 std::vector<std::string>::iterator it = m_exts.begin();
00117 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
00118 for(; it != m_exts.end(); it++)
00119 {
00120 if(ext == (*it) )
00121 {
00122 bvalid = true;
00123 break;
00124 }
00125 }
00126 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
00127 {
00128 readImg(itr->string().c_str());
00129 }
00130 }
00131 }
00132 SetReturnCode( resultShowModal );
00133
00134 EndModal( resultShowModal );
00135 }
00136
00138
00140
00141 void WxAnySimpleDlg::OnReadGimmick(wxCommandEvent &event)
00142 {
00143
00144 WxGimmickReaderDialog dlg(0,-1,
00145 namedescp,
00146 namedb,
00147 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
00148 wxDefaultPosition,
00149 wxSize(810,750),
00150 GIMMICK_2D_IMAGE_SELECTION,
00151 GIMMICK_3D_IMAGE_SELECTION,
00152 _3D,
00153 1);
00154 dlg.ShowModal();
00155 if (dlg.GetReturnCode() == wxID_OK)
00156 {
00157 std::vector<std::string> out;
00158 dlg.stopReading();
00159 dlg.GetSelectedFiles(out);
00160 if(m_dicom)
00161 {
00162 readDicomImg( out);
00163 }
00164 else
00165 {
00166 std::vector<std::string>::iterator ii = out.begin();
00167 for (;ii != out.end();ii++)
00168 {
00169 readImg( (*ii).c_str() );
00170 }
00171 }
00172 dlg.OnExit();
00173 }
00174 SetReturnCode( dlg.GetReturnCode() );
00175
00176 EndModal( dlg.GetReturnCode() );
00177 }
00178
00179
00180
00181 wxString WxAnySimpleDlg::getInfoImage()
00182 {
00183 return infoimage;
00184 }
00185
00186
00187
00188 const std::type_info & WxAnySimpleDlg::getType(const std::string &i_name)
00189 {
00190 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
00191 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
00192 imageIO->SetFileName(i_name.c_str());
00193 imageIO->ReadImageInformation();
00194 return imageIO->GetComponentTypeInfo();
00195 }
00196
00197 const size_t WxAnySimpleDlg::getNumberOfDimensions(const std::string &i_name)
00198 {
00199 typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
00200 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
00201 imageIO->SetFileName(i_name.c_str());
00202 imageIO->ReadImageInformation();
00203 return imageIO->GetNumberOfDimensions();
00204 }
00205
00206 void WxAnySimpleDlg::readImg(const std::string &i_name)
00207 {
00208 size_t dims = getNumberOfDimensions(i_name);
00209 const std::type_info *type= &getType(i_name);
00210 switch(dims)
00211 {
00212 case 3:
00213 if (getType(i_name) == typeid(unsigned char))
00214 {
00215 typedef itk::Image<unsigned char, 3> TImage;
00216 typedef itk::ImageFileReader<TImage> ReaderType;
00217 ReaderType::Pointer reader = ReaderType::New();
00218 reader->SetFileName( i_name );
00219 reader->Update();
00220 reader->GetOutput()->Register();
00221 m_AnyImages.push_back(reader->GetOutput());
00222 }
00223 else if (getType(i_name) == typeid(signed char))
00224 {
00225 typedef itk::Image<signed char, 3> TImage;
00226 typedef itk::ImageFileReader<TImage> ReaderType;
00227 ReaderType::Pointer reader = ReaderType::New();
00228 reader->SetFileName( i_name );
00229 reader->Update();
00230 reader->GetOutput()->Register();
00231 m_AnyImages.push_back(reader->GetOutput());
00232 }
00233 else if (getType(i_name) == typeid(short))
00234 {
00235 typedef itk::Image<short, 3> TImage;
00236 typedef itk::ImageFileReader<TImage> ReaderType;
00237 ReaderType::Pointer reader = ReaderType::New();
00238 reader->SetFileName( i_name );
00239 reader->Update();
00240 reader->GetOutput()->Register();
00241 m_AnyImages.push_back(reader->GetOutput());
00242 }
00243 else if (getType(i_name) == typeid(unsigned short))
00244 {
00245 typedef itk::Image<unsigned short, 3> TImage;
00246 typedef itk::ImageFileReader<TImage> ReaderType;
00247 ReaderType::Pointer reader = ReaderType::New();
00248 reader->SetFileName( i_name );
00249 reader->Update();
00250 reader->GetOutput()->Register();
00251 m_AnyImages.push_back(reader->GetOutput());
00252 }
00253 else if (getType(i_name) == typeid(unsigned int))
00254 {
00255 typedef itk::Image<unsigned int, 3> TImage;
00256 typedef itk::ImageFileReader<TImage> ReaderType;
00257 ReaderType::Pointer reader = ReaderType::New();
00258 reader->SetFileName( i_name );
00259 reader->Update();
00260 reader->GetOutput()->Register();
00261 m_AnyImages.push_back(reader->GetOutput());
00262 }
00263 else if (getType(i_name) == typeid(signed int))
00264 {
00265 typedef itk::Image<signed int, 3> TImage;
00266 typedef itk::ImageFileReader<TImage> ReaderType;
00267 ReaderType::Pointer reader = ReaderType::New();
00268 reader->SetFileName( i_name );
00269 reader->Update();
00270 reader->GetOutput()->Register();
00271 m_AnyImages.push_back(reader->GetOutput());
00272 }
00273 else if (getType(i_name) == typeid(unsigned long))
00274 {
00275 typedef itk::Image<unsigned long, 3> TImage;
00276 typedef itk::ImageFileReader<TImage> ReaderType;
00277 ReaderType::Pointer reader = ReaderType::New();
00278 reader->SetFileName( i_name );
00279 reader->Update();
00280 reader->GetOutput()->Register();
00281 m_AnyImages.push_back(reader->GetOutput());
00282 }
00283 else if (getType(i_name) == typeid(signed long))
00284 {
00285 typedef itk::Image<signed long, 3> TImage;
00286 typedef itk::ImageFileReader<TImage> ReaderType;
00287 ReaderType::Pointer reader = ReaderType::New();
00288 reader->SetFileName( i_name );
00289 reader->Update();
00290 reader->GetOutput()->Register();
00291 m_AnyImages.push_back(reader->GetOutput());
00292 }
00293 else if (getType(i_name) == typeid(float))
00294 {
00295 typedef itk::Image<float, 3> TImage;
00296 typedef itk::ImageFileReader<TImage> ReaderType;
00297 ReaderType::Pointer reader = ReaderType::New();
00298 reader->SetFileName( i_name );
00299 reader->Update();
00300 reader->GetOutput()->Register();
00301 m_AnyImages.push_back(reader->GetOutput());
00302 }
00303 else if (getType(i_name) == typeid(double))
00304 {
00305 typedef itk::Image<double, 3> TImage;
00306 typedef itk::ImageFileReader<TImage> ReaderType;
00307 ReaderType::Pointer reader = ReaderType::New();
00308 reader->SetFileName( i_name );
00309 reader->Update();
00310 reader->GetOutput()->Register();
00311 m_AnyImages.push_back(reader->GetOutput());
00312 }
00313 else
00314 {
00315
00316 }
00317 break;
00318
00319 case 4:
00320 if (getType(i_name) == typeid(unsigned char))
00321 {
00322 typedef itk::Image<unsigned char, 4> TImage;
00323 typedef itk::ImageFileReader<TImage> ReaderType;
00324 ReaderType::Pointer reader = ReaderType::New();
00325 reader->SetFileName( i_name );
00326 reader->Update();
00327 reader->GetOutput()->Register();
00328 m_AnyImages.push_back(reader->GetOutput());
00329 split4Din3Dvtk<TImage>(reader->GetOutput());
00330 }
00331 else if (getType(i_name) == typeid(signed char))
00332 {
00333 typedef itk::Image<signed char, 4> TImage;
00334 typedef itk::ImageFileReader<TImage> ReaderType;
00335 ReaderType::Pointer reader = ReaderType::New();
00336 reader->SetFileName( i_name );
00337 reader->Update();
00338 reader->GetOutput()->Register();
00339 m_AnyImages.push_back(reader->GetOutput());
00340 split4Din3Dvtk<TImage>(reader->GetOutput());
00341 }
00342 else if (getType(i_name) == typeid(unsigned short))
00343 {
00344 typedef itk::Image<unsigned short, 4> TImage;
00345 typedef itk::ImageFileReader<TImage> ReaderType;
00346 ReaderType::Pointer reader = ReaderType::New();
00347 reader->SetFileName( i_name );
00348 reader->Update();
00349 reader->GetOutput()->Register();
00350 m_AnyImages.push_back(reader->GetOutput());
00351 split4Din3Dvtk<TImage>(reader->GetOutput());
00352 }
00353 else if(getType(i_name) == typeid(short))
00354 {
00355 typedef itk::Image<short, 4> TImage;
00356 typedef itk::ImageFileReader<TImage> ReaderType;
00357 ReaderType::Pointer reader = ReaderType::New();
00358 reader->SetFileName( i_name );
00359 try
00360 {
00361 reader->Update();
00362 }
00363 catch( itk::ExceptionObject & err )
00364 {
00365 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
00366 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
00367 throw err;
00368 }
00369 catch(...)
00370 {
00371 std::cout << "Error while reading image " << i_name << std::endl;
00372 throw;
00373 }
00374 reader->GetOutput()->Register();
00375 m_AnyImages.push_back(reader->GetOutput());
00376 split4Din3Dvtk<TImage>(reader->GetOutput());
00377 }
00378 else if (getType(i_name) == typeid(unsigned short))
00379 {
00380 typedef itk::Image<unsigned short, 4> TImage;
00381 typedef itk::ImageFileReader<TImage> ReaderType;
00382 ReaderType::Pointer reader = ReaderType::New();
00383 reader->SetFileName( i_name );
00384 reader->Update();
00385 reader->GetOutput()->Register();
00386 m_AnyImages.push_back(reader->GetOutput());
00387 split4Din3Dvtk<TImage>(reader->GetOutput());
00388 }
00389 else if (getType(i_name) == typeid(unsigned int))
00390 {
00391 typedef itk::Image<unsigned int, 4> TImage;
00392 typedef itk::ImageFileReader<TImage> ReaderType;
00393 ReaderType::Pointer reader = ReaderType::New();
00394 reader->SetFileName( i_name );
00395 reader->Update();
00396 reader->GetOutput()->Register();
00397 m_AnyImages.push_back(reader->GetOutput());
00398 split4Din3Dvtk<TImage>(reader->GetOutput());
00399 }
00400 else if (getType(i_name) == typeid(signed int))
00401 {
00402 typedef itk::Image<signed int, 4> TImage;
00403 typedef itk::ImageFileReader<TImage> ReaderType;
00404 ReaderType::Pointer reader = ReaderType::New();
00405 reader->SetFileName( i_name );
00406 reader->Update();
00407 reader->GetOutput()->Register();
00408 m_AnyImages.push_back(reader->GetOutput());
00409 split4Din3Dvtk<TImage>(reader->GetOutput());
00410 }
00411 else if (getType(i_name) == typeid(unsigned long))
00412 {
00413 typedef itk::Image<unsigned long, 4> TImage;
00414 typedef itk::ImageFileReader<TImage> ReaderType;
00415 ReaderType::Pointer reader = ReaderType::New();
00416 reader->SetFileName( i_name );
00417 reader->Update();
00418 reader->GetOutput()->Register();
00419 m_AnyImages.push_back(reader->GetOutput());
00420 split4Din3Dvtk<TImage>(reader->GetOutput());
00421 }
00422 else if (getType(i_name) == typeid(signed long))
00423 {
00424 typedef itk::Image<signed long, 4> TImage;
00425 typedef itk::ImageFileReader<TImage> ReaderType;
00426 ReaderType::Pointer reader = ReaderType::New();
00427 reader->SetFileName( i_name );
00428 reader->Update();
00429 reader->GetOutput()->Register();
00430 m_AnyImages.push_back(reader->GetOutput());
00431 split4Din3Dvtk<TImage>(reader->GetOutput());
00432 }
00433 else if (getType(i_name) == typeid(float))
00434 {
00435 typedef itk::Image<float, 4> TImage;
00436 typedef itk::ImageFileReader<TImage> ReaderType;
00437 ReaderType::Pointer reader = ReaderType::New();
00438 reader->SetFileName( i_name );
00439 reader->Update();
00440 reader->GetOutput()->Register();
00441 m_AnyImages.push_back(reader->GetOutput());
00442 split4Din3Dvtk<TImage>(reader->GetOutput());
00443 }
00444 else if (getType(i_name) == typeid(double))
00445 {
00446 typedef itk::Image<double, 4> TImage;
00447 typedef itk::ImageFileReader<TImage> ReaderType;
00448 ReaderType::Pointer reader = ReaderType::New();
00449 reader->SetFileName( i_name );
00450 reader->Update();
00451 reader->GetOutput()->Register();
00452 m_AnyImages.push_back(reader->GetOutput());
00453 split4Din3Dvtk<TImage>(reader->GetOutput());
00454 }
00455 else
00456 {
00457
00458 }
00459 break;
00460 }
00461
00462
00463 bool btest = false;
00464 if( m_AnyDims.size() != 0)
00465 {
00466 btest = true;
00467 }
00468 else
00469 {
00470 m_AnyDims.push_back(dims);
00471 m_AnyType.push_back((std::type_info*)&getType(i_name));
00472 }
00473 if (btest)
00474 {
00475 if(m_AnyDims.front() != dims || m_AnyType.front()->before(getType(i_name)))
00476 {
00477 m_AnyDims.push_back(dims);
00478 m_AnyType.push_back((std::type_info*)&getType(i_name));
00479 }
00480 else{}
00481 }
00482 else {}
00483 }
00484
00485 void WxAnySimpleDlg::readDicomImg(const std::vector<std::string> &i_names)
00486 {
00487 typedef itk::Image<short,3> TImage;
00488 typedef itk::GDCMImageIO GDCMType;
00489 typedef itk::DICOMSeriesFileNames dicnames;
00490 GDCMType::Pointer gdcmIO = GDCMType::New();
00491 dicnames::Pointer generator = dicnames::New();
00492
00493
00494 typedef itk::ImageSeriesReader<TImage> ReaderType;
00495 ReaderType::Pointer reader = ReaderType::New();
00496 reader->SetImageIO(gdcmIO);
00497 reader->SetFileNames(i_names);
00498
00499 try
00500 {
00501 reader->Update();
00502 }
00503 catch( itk::ExceptionObject & err )
00504 {
00505
00506 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
00507 throw err;
00508 }
00509 catch(...)
00510 {
00511
00512 throw;
00513 }
00514
00515
00516 }
00517
00518 template <typename TImage>
00519 void WxAnySimpleDlg::split3Din3Dvtk(TImage* i_Img)
00520 {
00521 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
00522 typename ConnectorType::Pointer connector = ConnectorType::New();
00523 connector->SetInput(i_Img);
00524 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
00525 connector->Update();
00526 vtkImageData *im = vtkImageData::New();
00527 im->ShallowCopy(connector->GetOutput());
00528 im->Update();
00529 m_Vresults.push_back(im);
00530 }
00531
00532
00533 template <typename TImage>
00534 void WxAnySimpleDlg::split4Din3Dvtk(TImage* i_Img)
00535 {
00536 if(i_Img->GetImageDimension() == 4)
00537 {
00538
00539 int dsize = i_Img->GetLargestPossibleRegion().GetSize(3);
00540
00541 typedef itk::Image<unsigned char,3> ImageOutputType;
00542 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
00543 typedef itk::MetaImageIO MetaImageType;
00544 MetaImageType::Pointer metaIO;
00545 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
00546
00547
00548 typedef itk::NumericSeriesFileNames NamesGeneratorType;
00549 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
00550 namesGenerator->SetStartIndex(0);
00551 namesGenerator->SetEndIndex(dsize-1);
00552 namesGenerator->SetIncrementIndex(1);
00553 std::string format = m_dir;
00554 format += "/image%03d.mhd";
00555 namesGenerator->SetSeriesFormat( format.c_str() );
00556
00557 const std::vector<std::string> names = namesGenerator->GetFileNames();
00558 seriesWriter->SetFileNames( names );
00559 seriesWriter->SetInput(i_Img);
00560 seriesWriter->SetImageIO(metaIO);
00561 try
00562 {
00563 seriesWriter->Update();
00564 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
00565 std::vector<std::string>::const_iterator it = names.begin();
00566 for( ;it != names.end(); ++it)
00567 {
00568 vReader->SetFileName((*it).c_str());
00569 vReader->Update();
00570 m_Vresults.push_back(vReader->GetOutput());
00571
00572 }
00573 }
00574 catch( itk::ExceptionObject & excp )
00575 {
00576 std::cerr << "Exception thrown while writing the series " << std::endl;
00577 std::cerr << excp << std::endl;
00578
00579 }
00580 }
00581 }
00582
00583 bool WxAnySimpleDlg::AllSameType()
00584 {
00585 if(m_AnyType.size() == 1)
00586 {
00587 return true;
00588 }
00589 else
00590 {
00591 return false;
00592 }
00593
00594 }
00595
00596 }
00597