]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOWxISimpleDlg.hpp
convert Analyze files to vtkImageData
[creaImageIO.git] / src / creaImageIOWxISimpleDlg.hpp
diff --git a/src/creaImageIOWxISimpleDlg.hpp b/src/creaImageIOWxISimpleDlg.hpp
new file mode 100644 (file)
index 0000000..e310a07
--- /dev/null
@@ -0,0 +1,339 @@
+//#include "creaImageIOWxISimpleDlg.h"
+
+#include "creaImageIOWxGimmickReaderDialog.h"
+#include <itkAnalyzeImageIO.h>
+#include <itkImageFileReader.h>
+#include <itkImage.h>
+#include <itkImageSeriesWriter.h>
+#include <itkNumericSeriesFileNames.h>
+#include "itkImageToVTKImageFilter.h"
+#include <vtkImageReader2.h>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/utility.hpp>
+
+namespace creaImageIO
+{
+               template <typename TImage2> 
+  typename TImage2::Pointer ReadImage( const std::string &fileName) 
+  { 
+
+
+
+    typename TImage2::Pointer image; 
+
+    typedef itk::ImageFileReader<TImage2> ReaderType; 
+    typename ReaderType::Pointer reader = ReaderType::New(); 
+    reader->SetFileName( fileName.c_str() ); 
+    try 
+      { 
+      reader->Update(); 
+      } 
+    catch( itk::ExceptionObject & err ) 
+      { 
+      std::cout << "Caught an exception reading" << fileName << ": " << std::endl; 
+      std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl; 
+      throw err; 
+      } 
+    catch(...) 
+      { 
+      std::cout << "Error while reading image " << fileName << std::endl; 
+      throw; 
+      } 
+     image = reader->GetOutput(); 
+    
+    return image; 
+  } 
+
+
+       ///Ctor
+  template <typename TImage> 
+   WxISimpleDlg<TImage>::WxISimpleDlg(wxWindow *parent, 
+                                                       wxString i_title,  
+                                                       const std::string i_namedescp , 
+                                                       const std::string i_namedb)
+    : wxDialog(parent, -1,_T("DISPLAY IMAGES"), wxDefaultPosition, wxSize(230,150))
+   {
+               namedescp       = i_namedescp; 
+               namedb          = i_namedb;
+
+          if(!i_title.empty())
+          {
+                       this->SetTitle(i_title);  
+          }
+          // Button to select file(s)
+          wxButton *fileBut = new wxButton(this, -1,_T("Select a file to display"), wxPoint(10,7) );
+          Connect( fileBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadFile ); 
+
+          // Button to select directory
+          wxButton *directoryBut = new wxButton(this, -1,_T("Select a directory to display"), wxPoint(10,40) );
+          Connect( directoryBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadDirectory ); 
+
+          // button to select creaImageIO
+          wxButton *gimmickBut = new wxButton(this, -1,_T("Select Gimmick"), wxPoint(10,70) );
+          Connect( gimmickBut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxISimpleDlg::OnReadGimmick ); 
+
+          /// \TODO  Button to select Bruker directory
+       
+       Layout(); 
+       
+       }
+//////////////////////////////////////////////////////////////////////
+//                                                                  //
+//////////////////////////////////////////////////////////////////////
+     template <typename TImage> 
+         void WxISimpleDlg<TImage>::OnReadFile(wxCommandEvent& event)
+         {
+                 int resultShowModal;
+                 wxFileDialog* fileDlg = new wxFileDialog( 0,  _T("Select file"), _T(""), _T(""), crea::std2wx("*"), wxOPEN |wxFD_MULTIPLE, wxDefaultPosition);
+    
+                   resultShowModal = fileDlg->ShowModal();
+                       if ( resultShowModal==wxID_OK )
+                       {
+                               wxArrayString wxArray;
+                               fileDlg->GetPaths(wxArray);
+                               if(wxArray.size() >0)
+                               {
+                                       for( int i = 0; i < wxArray.GetCount(); i++)
+                                       {
+                                               readImg( crea::wx2std(wxArray[i]));
+                                       }
+                               } 
+                               else {
+                                       // TO DO WARNING MESSAGES
+                               }
+                       }
+                 SetReturnCode( resultShowModal );
+//              Close();
+                EndModal( resultShowModal );
+         }
+
+
+           template <typename TImage> 
+               void WxISimpleDlg<TImage>::setExts(std::vector<std::string> i_exts)
+               {
+                       m_exts = i_exts;
+               }
+ //////////////////////////////////////////////////////////////////////
+//                                                                                                                                     //
+//////////////////////////////////////////////////////////////////////
+           template <typename TImage> 
+         void WxISimpleDlg<TImage>::OnReadDirectory(wxCommandEvent &event)
+         {
+                 int resultShowModal;
+                 bool bvalid = false;
+            long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
+                wxDirDialog* dirDlg = new wxDirDialog( 0, _T("Select the directory to display"), _T(""), style);
+                
+                resultShowModal = dirDlg->ShowModal();
+                if ( resultShowModal==wxID_OK )
+                {  
+                       std::string path = crea::wx2std(dirDlg->GetPath());
+                       typedef boost::filesystem::directory_iterator dir_it;
+                       dir_it itr(path);
+                       dir_it end_itr;
+                       /*if (boost::filesystem::exists(path))
+                       {*/
+                               for(;itr != end_itr; ++itr)
+                               {
+                                          bvalid = m_exts.size() == 0? true : false;
+                                          std::vector<std::string>::iterator it = m_exts.begin();
+                                          std::string ext = itr->filename().substr(itr->filename().find_last_of("."));
+                                          for(; it != m_exts.end(); it++)
+                                          {
+                                                  if(ext == (*it) )
+                                                  {
+                                                          bvalid = true;
+                                                          break;
+                                                  }
+                                          }
+                                       if (!boost::filesystem::is_directory(itr->status()) && bvalid)
+                                       {
+                                               readImg(itr->string().c_str());
+                                       }
+                               }
+                }
+                SetReturnCode( resultShowModal );
+//              Close();
+                EndModal( resultShowModal );
+         }
+
+         //////////////////////////////////////////////////////////////////////
+//                                                                                                                                     //
+//////////////////////////////////////////////////////////////////////
+                   template <typename TImage> 
+         void WxISimpleDlg<TImage>::OnReadGimmick(wxCommandEvent &event)
+         {
+                 // Run Gimmick
+                  WxGimmickReaderDialog dlg(0,-1, 
+                                  namedescp,
+                                  namedb, 
+                                  _T("Select image(s)        - Gimmick! (c) CREATIS-LRMN 2008"),
+                   wxDefaultPosition,
+                   wxSize(810,750),
+                   GIMMICK_2D_IMAGE_SELECTION,
+                   GIMMICK_3D_IMAGE_SELECTION,
+                   _3D,
+                                  1);
+                dlg.ShowModal();
+                if (dlg.GetReturnCode() == wxID_OK)
+            {
+       //              infoimage=_T("DICOM: ???_EED_???");
+//EED 07JUIN2010                       dlg.GetSelectedImages(m_results,3);
+                       std::vector<creaImageIO::OutStrGimmick> out;
+                       std::vector<std::string> attr;
+//                             attr.push_back("D0028_0010");
+//                             attr.push_back("D0008_0023");
+//                             attr.push_back("D0008_1070");
+                               dlg.stopReading();
+                               dlg.getSelected(out, attr,true,"");
+//                             crea::VtkBasicSlicer(out.front().img);
+                       //m_results.clear();
+                       int size=out.size();
+                       int ii;
+                       //for (ii=0;ii<size;ii++)
+                       //{
+                               //m_results.push_back(out[ii].img);
+                       //}
+
+                       dlg.OnExit();
+                }
+                SetReturnCode( dlg.GetReturnCode() );
+//              Close();
+                EndModal( dlg.GetReturnCode() );
+          }
+
+
+     template <typename TImage> 
+        wxString WxISimpleDlg<TImage>::getInfoImage()
+       {
+               return infoimage;
+       }
+
+
+    //////////////////////////////////////////////////////////////////////
+    // Return the results vector                                                                               //
+    //////////////////////////////////////////////////////////////////////
+        template <typename TImage>  
+        std::vector<typename TImage::Pointer> WxISimpleDlg<TImage>::getImagesSelected()
+         {
+                 return m_Iresults;
+         }
+
+         template <typename TImage> 
+         void WxISimpleDlg<TImage>::readImg(const std::string &i_name)
+         {
+                   // FCY : just to check but not needed, we hardly suppose that we load only same type and dim of images
+                   // uncomment to test
+                       /*typedef itk::ImageIOBase::IOComponentType ScalarPixelType;
+                       itk::ImageIOBase::Pointer imageIO =  itk::ImageIOFactory::CreateImageIO(i_name.c_str(), itk::ImageIOFactory::ReadMode);
+                   imageIO->SetFileName(i_name.c_str());
+                       imageIO->ReadImageInformation();
+                       ScalarPixelType pixelType = imageIO->GetComponentType();
+                       const size_t dims =  imageIO->GetNumberOfDimensions();*/
+
+                       typedef itk::ImageFileReader<TImage> ReaderType; 
+                   typename ReaderType::Pointer reader = ReaderType::New(); 
+                       reader->SetFileName( i_name ); 
+                       try 
+                       { 
+                               reader->Update(); 
+                       } 
+                       catch( itk::ExceptionObject & err ) 
+                       { 
+                               std::cout << "Caught an exception reading" << i_name << ": " << std::endl; 
+                               std::cout << err << " " << __FILE__ << " " << __LINE__ << std::endl; 
+                               throw err; 
+                       } 
+                       catch(...) 
+                       { 
+                               std::cout << "Error while reading image " << i_name << std::endl; 
+                               throw; 
+                       } 
+                       m_Iresults.push_back(reader->GetOutput()); 
+    
+         }
+
+
+
+         template <typename TImage> 
+         void WxISimpleDlg<TImage>::split3Din3Dvtk()
+         {
+                
+                int ii;
+                 if ((m_Iresults).size() != 0)
+                 {
+
+                         typename TImage::Pointer image = m_Iresults[0];
+                         image->GetImageDimension();
+                         typedef itk::ImageToVTKImageFilter< TImage > ConnectorType;
+                         ConnectorType::Pointer connector = ConnectorType::New();
+                         for(unsigned int i = 0 ;i < m_Iresults.size(); i++)
+                                  {
+                                               connector->SetInput(m_Iresults[i]);
+                                               connector->Update();
+                                               vtkImageData *im = vtkImageData::New();
+                                               im->ShallowCopy(connector->GetOutput());
+                                               m_Vresults.push_back(im);
+                                  }
+                 }
+         }
+
+
+
+         template <typename TImage> 
+         void WxISimpleDlg<TImage>::split4Din3Dvtk(const std::string &i_dir)
+         {
+                       if ((m_Iresults).size() != 0)
+                       {
+                           typename TImage::Pointer image = m_Iresults[0];
+                       
+                                // Size and dims for Input Image
+                               typedef itk::Size<4> iSize;
+                               typedef const itk::Size<4>::SizeValueType iSizeVal;
+                               iSize size = image->GetLargestPossibleRegion().GetSize();
+                               iSizeVal *dims_size  = size.GetSize();
+
+                                // Output Type
+                                typedef itk::Image<short,3> ImageOutputType;  
+                            typedef itk::ImageSeriesWriter<TImage, ImageOutputType >  SeriesWriterType;
+                 
+                                SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
+                                seriesWriter->SetInput( image);
+                       
+                                // from JPR file to generate output files
+                                typedef itk::NumericSeriesFileNames NamesGeneratorType;
+                                NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
+                                namesGenerator->SetStartIndex(0);
+                                namesGenerator->SetEndIndex(dims_size[3]-1);
+                                namesGenerator->SetIncrementIndex(1);
+                                std::string format = i_dir;
+                            format += "/image%03d.vtk";
+                                namesGenerator->SetSeriesFormat( format.c_str() );
+      
+                                seriesWriter->SetFileNames( namesGenerator->GetFileNames() );
+                       
+                                try
+                               {
+                                       seriesWriter->Update();
+                                       vtkImageReader2 *vReader =vtkImageReader2::New();
+                                       for(unsigned int i = 0 ;i < dims_size[3]; i++)
+                                       {
+                                               vReader->SetFileName(namesGenerator->GetFileNames()[i].c_str());
+                                               vReader->Update();
+                                               m_Vresults.push_back(vReader->GetOutput());
+                                       }
+                               }
+                               catch( itk::ExceptionObject & excp )
+                               {
+                                       std::cerr << "Exception thrown while writing the series " << std::endl;
+                                       std::cerr << excp << std::endl;
+                                       //return EXIT_FAILURE;
+                               }
+                               
+                 }
+
+         }
+
+ }// namespace end
+