2 #ifndef __creaImageIOWxSimpleDlg_hpp_INCLUDED__
3 #define __creaImageIOWxSimpleDlg_hpp_INCLUDED__
6 //#include "creaImageIOWxISimpleDlg.h"
8 #include "creaImageIOWxGimmickReaderDialog.h"
9 #include <itkAnalyzeImageIO.h>
10 #include <itkImageFileReader.h>
11 #include <itkImageSeriesReader.h>
13 #include <itkImageSeriesWriter.h>
14 #include <itkGDCMImageIO.h>
15 #include <itkDICOMSeriesFileNames.h>
16 #include <itkNumericSeriesFileNames.h>
17 #include <itkVectorImage.h>
18 #include <itkMetaImageIO.h>
19 #include <itkOrientedImage.h>
20 #include <vtkImageReader2.h>
21 #include <vtkMetaImageReader.h>
22 #include <boost/filesystem/path.hpp>
23 #include <boost/filesystem.hpp>
24 #include <boost/utility.hpp>
25 #include <creaVtkBasicSlicer.h>
29 template <typename TImage2>
30 typename TImage2::Pointer ReadImage( const std::string &fileName)
32 typename TImage2::Pointer image;
34 typedef itk::ImageFileReader<TImage2> ReaderType;
35 typename ReaderType::Pointer reader = ReaderType::New();
36 reader->SetFileName( fileName.c_str() );
41 catch( itk::ExceptionObject & err )
43 std::cout << "Caught an exception reading" << fileName << ": " << std::endl;
44 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
49 std::cout << "Error while reading image " << fileName << std::endl;
52 image = reader->GetOutput();
59 template <typename TImage>
60 WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent,
62 const std::string i_namedescp ,
63 const std::string i_namedb)
64 : wxDialog(parent, -1,_T("SELECT IMAGE(S)"), 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) &WxISimpleDlg::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) &WxISimpleDlg::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) &WxISimpleDlg::OnReadGimmick );
85 /// \TODO Button to select Bruker directory
90 //////////////////////////////////////////////////////////////////////
92 //////////////////////////////////////////////////////////////////////
93 template <typename TImage>
94 void WxISimpleDlg<TImage>::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 readImg( crea::wx2std(wxArray[i]));
112 /// \TODO WARNING MESSAGES
115 SetReturnCode( resultShowModal );
117 EndModal( resultShowModal );
121 template <typename TImage>
122 void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
126 //////////////////////////////////////////////////////////////////////
128 //////////////////////////////////////////////////////////////////////
129 template <typename TImage>
130 void WxISimpleDlg<TImage>::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->filename().substr(itr->filename().find_last_of("."));
151 for(; it != m_exts.end(); it++)
159 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
161 readImg(itr->string().c_str());
165 SetReturnCode( resultShowModal );
167 EndModal( resultShowModal );
170 //////////////////////////////////////////////////////////////////////
172 //////////////////////////////////////////////////////////////////////
173 template <typename TImage>
174 void WxISimpleDlg<TImage>::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() );
213 template <typename TImage>
214 wxString WxISimpleDlg<TImage>::getInfoImage()
220 //////////////////////////////////////////////////////////////////////
221 // Return the results vector //
222 //////////////////////////////////////////////////////////////////////
223 template <typename TImage>
224 std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
229 template <typename TImage>
230 void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
232 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
234 /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
235 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
236 imageIO->SetFileName(i_name.c_str());
237 imageIO->ReadImageInformation();
238 ScalarPixelType pixelType = imageIO->GetComponentType();
239 const size_t dims = imageIO->GetNumberOfDimensions();*/
241 typedef itk::ImageFileReader<TImage> ReaderType;
242 typename ReaderType::Pointer reader = ReaderType::New();
243 reader->SetFileName( i_name );
248 catch( itk::ExceptionObject & err )
250 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
251 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
256 std::cout << "Error while reading image " << i_name << std::endl;
259 m_Iresults.push_back(reader->GetOutput());
264 template <typename TImage>
265 void WxISimpleDlg<TImage>::readDicomImg(const std::vector<std::string> &i_names)
267 typedef itk::GDCMImageIO GDCMType;
268 typedef itk::DICOMSeriesFileNames dicnames;
269 GDCMType::Pointer gdcmIO = GDCMType::New();
270 dicnames::Pointer generator = dicnames::New();
271 // generator->SetInput(i_names);
272 typedef itk::ImageSeriesReader<TImage> ReaderType;
273 typename ReaderType::Pointer reader = ReaderType::New();
274 reader->SetImageIO(gdcmIO);
275 reader->SetFileNames(i_names);
276 // reader->SetFileName( i_name );
281 catch( itk::ExceptionObject & err )
283 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
284 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
289 //std::cout << "Error while reading image " << i_name << std::endl;
292 m_Iresults.push_back(reader->GetOutput());
298 template <typename TImage>
299 void WxISimpleDlg<TImage>::split3Din3Dvtk()
301 if ((m_Iresults).size() != 0)
303 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
304 ConnectorType::Pointer connector = ConnectorType::New();
305 for(unsigned int i = 0 ;i < m_Iresults.size(); i++)
307 connector->SetInput(m_Iresults[i]);
308 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
310 vtkImageData *im = vtkImageData::New();
311 im->ShallowCopy(connector->GetOutput());
313 m_Vresults.push_back(im);
320 template <typename TImage>
321 void WxISimpleDlg<TImage>::split4Din3Dvtk(const std::string &i_dir)
323 if ((m_Iresults).size() != 0)
325 typename TImage::Pointer image = m_Iresults[0];
327 if(image->GetImageDimension() == 4)
329 // size of fourth dimension
330 int dsize = image->GetLargestPossibleRegion().GetSize(3);
332 typedef itk::Image<unsigned char,3> ImageOutputType;
333 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
334 typedef itk::MetaImageIO MetaImageType;
335 MetaImageType::Pointer metaIO;
336 SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
338 // from JPR file to generate output files
339 typedef itk::NumericSeriesFileNames NamesGeneratorType;
340 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
341 namesGenerator->SetStartIndex(0);
342 namesGenerator->SetEndIndex(dsize-1);
343 namesGenerator->SetIncrementIndex(1);
344 std::string format = i_dir;
345 format += "/image%03d.mhd";
346 namesGenerator->SetSeriesFormat( format.c_str() );
348 const std::vector<std::string> names = namesGenerator->GetFileNames();
349 seriesWriter->SetFileNames( names );
350 seriesWriter->SetInput(image);
351 seriesWriter->SetImageIO(metaIO);
354 seriesWriter->Update();
355 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
356 std::vector<std::string>::const_iterator it = names.begin();
357 for( ;it != names.end(); ++it)
359 vReader->SetFileName((*it).c_str());
361 m_Vresults.push_back(vReader->GetOutput());
364 catch( itk::ExceptionObject & excp )
366 std::cerr << "Exception thrown while writing the series " << std::endl;
367 std::cerr << excp << std::endl;
368 //return EXIT_FAILURE;
376 #endif //__creaImageIOWxSimpleDlg_hpp_INCLUDED__