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 "itkImageToVTKImageFilter.h"
14 #include <itkOrientedImage.h>
15 #include <vtkImageReader2.h>
16 #include <boost/filesystem/path.hpp>
17 #include <boost/filesystem.hpp>
18 #include <boost/utility.hpp>
19 #include <creaVtkBasicSlicer.h>
23 template <typename TImage2>
24 typename TImage2::Pointer ReadImage( const std::string &fileName)
29 typename TImage2::Pointer image;
31 typedef itk::ImageFileReader<TImage2> ReaderType;
32 typename ReaderType::Pointer reader = ReaderType::New();
33 reader->SetFileName( fileName.c_str() );
38 catch( itk::ExceptionObject & err )
40 std::cout << "Caught an exception reading" << fileName << ": " << std::endl;
41 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
46 std::cout << "Error while reading image " << fileName << std::endl;
49 image = reader->GetOutput();
56 template <typename TImage>
57 WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent,
59 const std::string i_namedescp ,
60 const std::string i_namedb)
61 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
63 namedescp = i_namedescp;
68 this->SetTitle(i_title);
70 // Button to select file(s)
71 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
72 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadFile );
74 // Button to select directory
75 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
76 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadDirectory );
78 // button to select creaImageIO
79 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
80 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadGimmick );
82 /// \TODO Button to select Bruker directory
87 //////////////////////////////////////////////////////////////////////
89 //////////////////////////////////////////////////////////////////////
90 template <typename TImage>
91 void WxISimpleDlg<TImage>::OnReadFile(wxCommandEvent& event)
94 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
96 resultShowModal = fileDlg->ShowModal();
97 if ( resultShowModal==wxID_OK )
99 wxArrayString wxArray;
100 fileDlg->GetPaths(wxArray);
101 if(wxArray.size() >0)
103 for( int i = 0; i < wxArray.GetCount(); i++)
105 readImg( crea::wx2std(wxArray[i]));
109 // TO DO WARNING MESSAGES
112 SetReturnCode( resultShowModal );
114 EndModal( resultShowModal );
118 template <typename TImage>
119 void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
123 //////////////////////////////////////////////////////////////////////
125 //////////////////////////////////////////////////////////////////////
126 template <typename TImage>
127 void WxISimpleDlg<TImage>::OnReadDirectory(wxCommandEvent &event)
131 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
132 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
134 resultShowModal = dirDlg->ShowModal();
135 if ( resultShowModal==wxID_OK )
137 std::string path = crea::wx2std(dirDlg->GetPath());
138 typedef boost::filesystem::directory_iterator dir_it;
141 /*if (boost::filesystem::exists(path))
143 for(;itr != end_itr; ++itr)
145 bvalid = m_exts.size() == 0? true : false;
146 std::vector<std::string>::iterator it = m_exts.begin();
147 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
148 for(; it != m_exts.end(); it++)
156 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
158 readImg(itr->string().c_str());
162 SetReturnCode( resultShowModal );
164 EndModal( resultShowModal );
167 //////////////////////////////////////////////////////////////////////
169 //////////////////////////////////////////////////////////////////////
170 template <typename TImage>
171 void WxISimpleDlg<TImage>::OnReadGimmick(wxCommandEvent &event)
174 WxGimmickReaderDialog dlg(0,-1,
177 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
180 GIMMICK_2D_IMAGE_SELECTION,
181 GIMMICK_3D_IMAGE_SELECTION,
185 if (dlg.GetReturnCode() == wxID_OK)
187 std::vector<std::string> out;
189 dlg.GetSelectedFiles(out);
196 std::vector<std::string>::iterator ii = out.begin();
197 for (;ii != out.end();ii++)
199 readImg( (*ii).c_str() );
204 SetReturnCode( dlg.GetReturnCode() );
206 EndModal( dlg.GetReturnCode() );
210 template <typename TImage>
211 wxString WxISimpleDlg<TImage>::getInfoImage()
217 //////////////////////////////////////////////////////////////////////
218 // Return the results vector //
219 //////////////////////////////////////////////////////////////////////
220 template <typename TImage>
221 std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
226 template <typename TImage>
227 void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
229 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
231 /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
232 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
233 imageIO->SetFileName(i_name.c_str());
234 imageIO->ReadImageInformation();
235 ScalarPixelType pixelType = imageIO->GetComponentType();
236 const size_t dims = imageIO->GetNumberOfDimensions();*/
238 typedef itk::ImageFileReader<TImage> ReaderType;
239 typename ReaderType::Pointer reader = ReaderType::New();
240 reader->SetFileName( i_name );
245 catch( itk::ExceptionObject & err )
247 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
248 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
253 std::cout << "Error while reading image " << i_name << std::endl;
256 m_Iresults.push_back(reader->GetOutput());
262 template <typename TImage>
263 void WxISimpleDlg<TImage>::readDicomImg(const std::vector<std::string> &i_names)
265 typedef itk::GDCMImageIO GDCMType;
266 typedef itk::DICOMSeriesFileNames dicnames;
267 GDCMType::Pointer gdcmIO = GDCMType::New();
268 dicnames::Pointer generator = dicnames::New();
269 // generator->SetInput(i_names);
270 typedef itk::ImageSeriesReader<TImage> ReaderType;
271 typename ReaderType::Pointer reader = ReaderType::New();
272 reader->SetImageIO(gdcmIO);
273 reader->SetFileNames(i_names);
274 // reader->SetFileName( i_name );
279 catch( itk::ExceptionObject & err )
281 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
282 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
287 //std::cout << "Error while reading image " << i_name << std::endl;
290 m_Iresults.push_back(reader->GetOutput());
297 template <typename TImage>
298 void WxISimpleDlg<TImage>::split3Din3Dvtk()
300 if ((m_Iresults).size() != 0)
302 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
303 ConnectorType::Pointer connector = ConnectorType::New();
304 for(unsigned int i = 0 ;i < m_Iresults.size(); i++)
306 connector->SetInput(m_Iresults[i]);
307 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
309 vtkImageData *im = vtkImageData::New();
310 im->ShallowCopy(connector->GetOutput());
312 m_Vresults.push_back(im);
319 template <typename TImage>
320 void WxISimpleDlg<TImage>::split4Din3Dvtk(const std::string &i_dir)
322 if ((m_Iresults).size() != 0)
324 typename TImage::Pointer image = m_Iresults[0];
326 // Size and dims for Input Image
327 typedef itk::Size<4> iSize; // TO REMOVE
328 typedef const itk::Size<4>::SizeValueType iSizeVal; // TO REMOVE
329 iSize size = image->GetLargestPossibleRegion().GetSize();
330 iSizeVal *dims_size = size.GetSize();
333 typedef itk::Image<unsigned char,3> ImageOutputType;
334 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
336 /* typedef itk::VectorImage<short, 3> VectorImageType;
337 VectorImageType::Pointer vect = VectorImageType::New();
341 SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
342 seriesWriter->SetInput( image);
344 // from JPR file to generate output files
345 typedef itk::NumericSeriesFileNames NamesGeneratorType;
346 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
347 namesGenerator->SetStartIndex(0);
348 namesGenerator->SetEndIndex(dims_size[3]-1); // TO CHANGE
349 namesGenerator->SetIncrementIndex(1);
350 std::string format = i_dir;
351 format += "/image%03d.vtk";
352 namesGenerator->SetSeriesFormat( format.c_str() );
353 const std::vector<std::string> names = namesGenerator->GetFileNames();
354 seriesWriter->SetFileNames( names );
358 seriesWriter->Update();
359 vtkImageReader2 *vReader = vtkImageReader2::New();
360 vReader->SetFilePrefix(".vtk");
361 std::vector<std::string>::const_iterator it = names.begin();
362 for( ;it != names.end(); ++it)
364 vReader->SetFileName((*it).c_str());
366 crea::VtkBasicSlicer(vReader->GetOutput());
367 m_Vresults.push_back(vReader->GetOutput());
370 catch( itk::ExceptionObject & excp )
372 std::cerr << "Exception thrown while writing the series " << std::endl;
373 std::cerr << excp << std::endl;
374 //return EXIT_FAILURE;