1 //#include "creaImageIOWxISimpleDlg.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>
24 template <typename TImage2>
25 typename TImage2::Pointer ReadImage( const std::string &fileName)
30 typename TImage2::Pointer image;
32 typedef itk::ImageFileReader<TImage2> ReaderType;
33 typename ReaderType::Pointer reader = ReaderType::New();
34 reader->SetFileName( fileName.c_str() );
39 catch( itk::ExceptionObject & err )
41 std::cout << "Caught an exception reading" << fileName << ": " << std::endl;
42 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
47 std::cout << "Error while reading image " << fileName << std::endl;
50 image = reader->GetOutput();
57 template <typename TImage>
58 WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent,
60 const std::string i_namedescp ,
61 const std::string i_namedb)
62 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
64 namedescp = i_namedescp;
69 this->SetTitle(i_title);
71 // Button to select file(s)
72 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
73 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadFile );
75 // Button to select directory
76 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
77 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadDirectory );
79 // button to select creaImageIO
80 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
81 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadGimmick );
83 /// \TODO Button to select Bruker directory
88 //////////////////////////////////////////////////////////////////////
90 //////////////////////////////////////////////////////////////////////
91 template <typename TImage>
92 void WxISimpleDlg<TImage>::OnReadFile(wxCommandEvent& event)
95 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
97 resultShowModal = fileDlg->ShowModal();
98 if ( resultShowModal==wxID_OK )
100 wxArrayString wxArray;
101 fileDlg->GetPaths(wxArray);
102 if(wxArray.size() >0)
104 for( int i = 0; i < wxArray.GetCount(); i++)
106 readImg( crea::wx2std(wxArray[i]));
110 // TO DO WARNING MESSAGES
113 SetReturnCode( resultShowModal );
115 EndModal( resultShowModal );
119 template <typename TImage>
120 void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
124 //////////////////////////////////////////////////////////////////////
126 //////////////////////////////////////////////////////////////////////
127 template <typename TImage>
128 void WxISimpleDlg<TImage>::OnReadDirectory(wxCommandEvent &event)
132 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
133 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
135 resultShowModal = dirDlg->ShowModal();
136 if ( resultShowModal==wxID_OK )
138 std::string path = crea::wx2std(dirDlg->GetPath());
139 typedef boost::filesystem::directory_iterator dir_it;
142 /*if (boost::filesystem::exists(path))
144 for(;itr != end_itr; ++itr)
146 bvalid = m_exts.size() == 0? true : false;
147 std::vector<std::string>::iterator it = m_exts.begin();
148 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
149 for(; it != m_exts.end(); it++)
157 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
159 readImg(itr->string().c_str());
163 SetReturnCode( resultShowModal );
165 EndModal( resultShowModal );
168 //////////////////////////////////////////////////////////////////////
170 //////////////////////////////////////////////////////////////////////
171 template <typename TImage>
172 void WxISimpleDlg<TImage>::OnReadGimmick(wxCommandEvent &event)
175 WxGimmickReaderDialog dlg(0,-1,
178 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
181 GIMMICK_2D_IMAGE_SELECTION,
182 GIMMICK_3D_IMAGE_SELECTION,
186 if (dlg.GetReturnCode() == wxID_OK)
188 std::vector<std::string> out;
190 dlg.GetSelectedFiles(out);
197 std::vector<std::string>::iterator ii = out.begin();
198 for (;ii != out.end();ii++)
200 readImg( (*ii).c_str() );
205 SetReturnCode( dlg.GetReturnCode() );
207 EndModal( dlg.GetReturnCode() );
211 template <typename TImage>
212 wxString WxISimpleDlg<TImage>::getInfoImage()
218 //////////////////////////////////////////////////////////////////////
219 // Return the results vector //
220 //////////////////////////////////////////////////////////////////////
221 template <typename TImage>
222 std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
227 template <typename TImage>
228 void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
230 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
232 /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
233 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
234 imageIO->SetFileName(i_name.c_str());
235 imageIO->ReadImageInformation();
236 ScalarPixelType pixelType = imageIO->GetComponentType();
237 const size_t dims = imageIO->GetNumberOfDimensions();*/
239 typedef itk::ImageFileReader<TImage> ReaderType;
240 typename ReaderType::Pointer reader = ReaderType::New();
241 reader->SetFileName( i_name );
246 catch( itk::ExceptionObject & err )
248 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
249 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
254 std::cout << "Error while reading image " << i_name << std::endl;
257 m_Iresults.push_back(reader->GetOutput());
263 template <typename TImage>
264 void WxISimpleDlg<TImage>::readDicomImg(const std::vector<std::string> &i_names)
266 typedef itk::GDCMImageIO GDCMType;
267 typedef itk::DICOMSeriesFileNames dicnames;
268 GDCMType::Pointer gdcmIO = GDCMType::New();
269 dicnames::Pointer generator = dicnames::New();
270 // generator->SetInput(i_names);
271 typedef itk::ImageSeriesReader<TImage> ReaderType;
272 typename ReaderType::Pointer reader = ReaderType::New();
273 reader->SetImageIO(gdcmIO);
274 reader->SetFileNames(i_names);
275 // reader->SetFileName( i_name );
280 catch( itk::ExceptionObject & err )
282 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
283 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
288 //std::cout << "Error while reading image " << i_name << std::endl;
291 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;