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)
27 typename TImage2::Pointer image;
29 typedef itk::ImageFileReader<TImage2> ReaderType;
30 typename ReaderType::Pointer reader = ReaderType::New();
31 reader->SetFileName( fileName.c_str() );
36 catch( itk::ExceptionObject & err )
38 std::cout << "Caught an exception reading" << fileName << ": " << std::endl;
39 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
44 std::cout << "Error while reading image " << fileName << std::endl;
47 image = reader->GetOutput();
54 template <typename TImage>
55 WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent,
57 const std::string i_namedescp ,
58 const std::string i_namedb)
59 : wxDialog(parent, -1,_T("SELECT IMAGE(S)"), wxDefaultPosition, wxSize(230,150))
61 namedescp = i_namedescp;
66 this->SetTitle(i_title);
68 // Button to select file(s)
69 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
70 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadFile );
72 // Button to select directory
73 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
74 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadDirectory );
76 // button to select creaImageIO
77 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
78 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadGimmick );
80 /// \TODO Button to select Bruker directory
85 //////////////////////////////////////////////////////////////////////
87 //////////////////////////////////////////////////////////////////////
88 template <typename TImage>
89 void WxISimpleDlg<TImage>::OnReadFile(wxCommandEvent& event)
92 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
94 resultShowModal = fileDlg->ShowModal();
95 if ( resultShowModal==wxID_OK )
97 wxArrayString wxArray;
98 fileDlg->GetPaths(wxArray);
101 for( int i = 0; i < wxArray.GetCount(); i++)
103 readImg( crea::wx2std(wxArray[i]));
107 /// \TODO WARNING MESSAGES
110 SetReturnCode( resultShowModal );
112 EndModal( resultShowModal );
116 template <typename TImage>
117 void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
121 //////////////////////////////////////////////////////////////////////
123 //////////////////////////////////////////////////////////////////////
124 template <typename TImage>
125 void WxISimpleDlg<TImage>::OnReadDirectory(wxCommandEvent &event)
129 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
130 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
132 resultShowModal = dirDlg->ShowModal();
133 if ( resultShowModal==wxID_OK )
135 std::string path = crea::wx2std(dirDlg->GetPath());
136 typedef boost::filesystem::directory_iterator dir_it;
139 /*if (boost::filesystem::exists(path))
141 for(;itr != end_itr; ++itr)
143 bvalid = m_exts.size() == 0? true : false;
144 std::vector<std::string>::iterator it = m_exts.begin();
145 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
146 for(; it != m_exts.end(); it++)
154 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
156 readImg(itr->string().c_str());
160 SetReturnCode( resultShowModal );
162 EndModal( resultShowModal );
165 //////////////////////////////////////////////////////////////////////
167 //////////////////////////////////////////////////////////////////////
168 template <typename TImage>
169 void WxISimpleDlg<TImage>::OnReadGimmick(wxCommandEvent &event)
172 WxGimmickReaderDialog dlg(0,-1,
175 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
178 GIMMICK_2D_IMAGE_SELECTION,
179 GIMMICK_3D_IMAGE_SELECTION,
183 if (dlg.GetReturnCode() == wxID_OK)
185 std::vector<std::string> out;
187 dlg.GetSelectedFiles(out);
194 std::vector<std::string>::iterator ii = out.begin();
195 for (;ii != out.end();ii++)
197 readImg( (*ii).c_str() );
202 SetReturnCode( dlg.GetReturnCode() );
204 EndModal( dlg.GetReturnCode() );
208 template <typename TImage>
209 wxString WxISimpleDlg<TImage>::getInfoImage()
215 //////////////////////////////////////////////////////////////////////
216 // Return the results vector //
217 //////////////////////////////////////////////////////////////////////
218 template <typename TImage>
219 std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
224 template <typename TImage>
225 void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
227 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
229 /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
230 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
231 imageIO->SetFileName(i_name.c_str());
232 imageIO->ReadImageInformation();
233 ScalarPixelType pixelType = imageIO->GetComponentType();
234 const size_t dims = imageIO->GetNumberOfDimensions();*/
236 typedef itk::ImageFileReader<TImage> ReaderType;
237 typename ReaderType::Pointer reader = ReaderType::New();
238 reader->SetFileName( i_name );
243 catch( itk::ExceptionObject & err )
245 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
246 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
251 std::cout << "Error while reading image " << i_name << std::endl;
254 m_Iresults.push_back(reader->GetOutput());
259 template <typename TImage>
260 void WxISimpleDlg<TImage>::readDicomImg(const std::vector<std::string> &i_names)
262 typedef itk::GDCMImageIO GDCMType;
263 typedef itk::DICOMSeriesFileNames dicnames;
264 GDCMType::Pointer gdcmIO = GDCMType::New();
265 dicnames::Pointer generator = dicnames::New();
266 // generator->SetInput(i_names);
267 typedef itk::ImageSeriesReader<TImage> ReaderType;
268 typename ReaderType::Pointer reader = ReaderType::New();
269 reader->SetImageIO(gdcmIO);
270 reader->SetFileNames(i_names);
271 // reader->SetFileName( i_name );
276 catch( itk::ExceptionObject & err )
278 // std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
279 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
284 //std::cout << "Error while reading image " << i_name << std::endl;
287 m_Iresults.push_back(reader->GetOutput());
293 template <typename TImage>
294 void WxISimpleDlg<TImage>::split3Din3Dvtk()
296 if ((m_Iresults).size() != 0)
298 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
299 ConnectorType::Pointer connector = ConnectorType::New();
300 for(unsigned int i = 0 ;i < m_Iresults.size(); i++)
302 connector->SetInput(m_Iresults[i]);
303 connector->GetImporter()->SetDataScalarTypeToUnsignedChar();
305 vtkImageData *im = vtkImageData::New();
306 im->ShallowCopy(connector->GetOutput());
308 m_Vresults.push_back(im);
315 template <typename TImage>
316 void WxISimpleDlg<TImage>::split4Din3Dvtk(const std::string &i_dir)
318 if ((m_Iresults).size() != 0)
320 typename TImage::Pointer image = m_Iresults[0];
322 if(image->GetImageDimension() == 4)
324 // size of fourth dimension
325 int dsize = image->GetLargestPossibleRegion().GetSize(3);
327 typedef itk::Image<unsigned char,3> ImageOutputType;
328 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
329 typedef itk::MetaImageIO MetaImageType;
330 MetaImageType::Pointer metaIO;
331 SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
333 // from JPR file to generate output files
334 typedef itk::NumericSeriesFileNames NamesGeneratorType;
335 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
336 namesGenerator->SetStartIndex(0);
337 namesGenerator->SetEndIndex(dsize-1);
338 namesGenerator->SetIncrementIndex(1);
339 std::string format = i_dir;
340 format += "/image%03d.mhd";
341 namesGenerator->SetSeriesFormat( format.c_str() );
343 const std::vector<std::string> names = namesGenerator->GetFileNames();
344 seriesWriter->SetFileNames( names );
345 seriesWriter->SetInput(image);
346 seriesWriter->SetImageIO(metaIO);
349 seriesWriter->Update();
350 vtkMetaImageReader *vReader = vtkMetaImageReader::New();
351 std::vector<std::string>::const_iterator it = names.begin();
352 for( ;it != names.end(); ++it)
354 vReader->SetFileName((*it).c_str());
356 m_Vresults.push_back(vReader->GetOutput());
359 catch( itk::ExceptionObject & excp )
361 std::cerr << "Exception thrown while writing the series " << std::endl;
362 std::cerr << excp << std::endl;
363 //return EXIT_FAILURE;