1 //#include "creaImageIOWxISimpleDlg.h"
3 #include "creaImageIOWxGimmickReaderDialog.h"
4 #include <itkAnalyzeImageIO.h>
5 #include <itkImageFileReader.h>
7 #include <itkImageSeriesWriter.h>
8 #include <itkNumericSeriesFileNames.h>
9 #include "itkImageToVTKImageFilter.h"
10 #include <vtkImageReader2.h>
11 #include <boost/filesystem/path.hpp>
12 #include <boost/filesystem.hpp>
13 #include <boost/utility.hpp>
17 template <typename TImage2>
18 typename TImage2::Pointer ReadImage( const std::string &fileName)
23 typename TImage2::Pointer image;
25 typedef itk::ImageFileReader<TImage2> ReaderType;
26 typename ReaderType::Pointer reader = ReaderType::New();
27 reader->SetFileName( fileName.c_str() );
32 catch( itk::ExceptionObject & err )
34 std::cout << "Caught an exception reading" << fileName << ": " << std::endl;
35 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
40 std::cout << "Error while reading image " << fileName << std::endl;
43 image = reader->GetOutput();
50 template <typename TImage>
51 WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent,
53 const std::string i_namedescp ,
54 const std::string i_namedb)
55 : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
57 namedescp = i_namedescp;
62 this->SetTitle(i_title);
64 // Button to select file(s)
65 wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
66 Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadFile );
68 // Button to select directory
69 wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
70 Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadDirectory );
72 // button to select creaImageIO
73 wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
74 Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadGimmick );
76 /// \TODO Button to select Bruker directory
81 //////////////////////////////////////////////////////////////////////
83 //////////////////////////////////////////////////////////////////////
84 template <typename TImage>
85 void WxISimpleDlg<TImage>::OnReadFile(wxCommandEvent& event)
88 wxFileDialog* fileDlg = new wxFileDialog( 0, _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
90 resultShowModal = fileDlg->ShowModal();
91 if ( resultShowModal==wxID_OK )
93 wxArrayString wxArray;
94 fileDlg->GetPaths(wxArray);
97 for( int i = 0; i < wxArray.GetCount(); i++)
99 readImg( crea::wx2std(wxArray[i]));
103 // TO DO WARNING MESSAGES
106 SetReturnCode( resultShowModal );
108 EndModal( resultShowModal );
112 template <typename TImage>
113 void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
117 //////////////////////////////////////////////////////////////////////
119 //////////////////////////////////////////////////////////////////////
120 template <typename TImage>
121 void WxISimpleDlg<TImage>::OnReadDirectory(wxCommandEvent &event)
125 long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
126 wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
128 resultShowModal = dirDlg->ShowModal();
129 if ( resultShowModal==wxID_OK )
131 std::string path = crea::wx2std(dirDlg->GetPath());
132 typedef boost::filesystem::directory_iterator dir_it;
135 /*if (boost::filesystem::exists(path))
137 for(;itr != end_itr; ++itr)
139 bvalid = m_exts.size() == 0? true : false;
140 std::vector<std::string>::iterator it = m_exts.begin();
141 std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
142 for(; it != m_exts.end(); it++)
150 if (!boost::filesystem::is_directory(itr->status()) && bvalid)
152 readImg(itr->string().c_str());
156 SetReturnCode( resultShowModal );
158 EndModal( resultShowModal );
161 //////////////////////////////////////////////////////////////////////
163 //////////////////////////////////////////////////////////////////////
164 template <typename TImage>
165 void WxISimpleDlg<TImage>::OnReadGimmick(wxCommandEvent &event)
168 WxGimmickReaderDialog dlg(0,-1,
171 _T("Select image(s) - Gimmick! (c) CREATIS-LRMN 2008"),
174 GIMMICK_2D_IMAGE_SELECTION,
175 GIMMICK_3D_IMAGE_SELECTION,
179 if (dlg.GetReturnCode() == wxID_OK)
181 // infoimage=_T("DICOM: ???_EED_???");
182 //EED 07JUIN2010 dlg.GetSelectedImages(m_results,3);
183 std::vector<creaImageIO::OutStrGimmick> out;
184 std::vector<std::string> attr;
185 // attr.push_back("D0028_0010");
186 // attr.push_back("D0008_0023");
187 // attr.push_back("D0008_1070");
189 dlg.getSelected(out, attr,true,"");
190 // crea::VtkBasicSlicer(out.front().img);
194 //for (ii=0;ii<size;ii++)
196 //m_results.push_back(out[ii].img);
201 SetReturnCode( dlg.GetReturnCode() );
203 EndModal( dlg.GetReturnCode() );
207 template <typename TImage>
208 wxString WxISimpleDlg<TImage>::getInfoImage()
214 //////////////////////////////////////////////////////////////////////
215 // Return the results vector //
216 //////////////////////////////////////////////////////////////////////
217 template <typename TImage>
218 std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
223 template <typename TImage>
224 void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
226 // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
228 /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
229 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
230 imageIO->SetFileName(i_name.c_str());
231 imageIO->ReadImageInformation();
232 ScalarPixelType pixelType = imageIO->GetComponentType();
233 const size_t dims = imageIO->GetNumberOfDimensions();*/
235 typedef itk::ImageFileReader<TImage> ReaderType;
236 typename ReaderType::Pointer reader = ReaderType::New();
237 reader->SetFileName( i_name );
242 catch( itk::ExceptionObject & err )
244 std::cout << "Caught an exception reading" << i_name << ": " << std::endl;
245 std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl;
250 std::cout << "Error while reading image " << i_name << std::endl;
253 m_Iresults.push_back(reader->GetOutput());
259 template <typename TImage>
260 void WxISimpleDlg<TImage>::split3Din3Dvtk()
264 if ((m_Iresults).size() != 0)
267 typename TImage::Pointer image = m_Iresults[0];
268 image->GetImageDimension();
269 typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
270 ConnectorType::Pointer connector = ConnectorType::New();
271 for(unsigned int i = 0 ;i < m_Iresults.size(); i++)
273 connector->SetInput(m_Iresults[i]);
275 vtkImageData *im = vtkImageData::New();
276 im->ShallowCopy(connector->GetOutput());
277 m_Vresults.push_back(im);
284 template <typename TImage>
285 void WxISimpleDlg<TImage>::split4Din3Dvtk(const std::string &i_dir)
287 if ((m_Iresults).size() != 0)
289 typename TImage::Pointer image = m_Iresults[0];
291 // Size and dims for Input Image
292 typedef itk::Size<4> iSize;
293 typedef const itk::Size<4>::SizeValueType iSizeVal;
294 iSize size = image->GetLargestPossibleRegion().GetSize();
295 iSizeVal *dims_size = size.GetSize();
298 typedef itk::Image<short,3> ImageOutputType;
299 typedef itk::ImageSeriesWriter<TImage, ImageOutputType > SeriesWriterType;
301 SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
302 seriesWriter->SetInput( image);
304 // from JPR file to generate output files
305 typedef itk::NumericSeriesFileNames NamesGeneratorType;
306 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
307 namesGenerator->SetStartIndex(0);
308 namesGenerator->SetEndIndex(dims_size[3]-1);
309 namesGenerator->SetIncrementIndex(1);
310 std::string format = i_dir;
311 format += "/image%03d.vtk";
312 namesGenerator->SetSeriesFormat( format.c_str() );
314 seriesWriter->SetFileNames( namesGenerator->GetFileNames() );
318 seriesWriter->Update();
319 vtkImageReader2 *vReader =vtkImageReader2::New();
320 for(unsigned int i = 0 ;i < dims_size[3]; i++)
322 vReader->SetFileName(namesGenerator->GetFileNames()[i].c_str());
324 m_Vresults.push_back(vReader->GetOutput());
327 catch( itk::ExceptionObject & excp )
329 std::cerr << "Exception thrown while writing the series " << std::endl;
330 std::cerr << excp << std::endl;
331 //return EXIT_FAILURE;