//#include "creaImageIOWxISimpleDlg.h" #include "creaImageIOWxGimmickReaderDialog.h" #include #include #include #include #include #include "itkImageToVTKImageFilter.h" #include #include #include #include namespace creaImageIO { template typename TImage2::Pointer ReadImage( const std::string &fileName) { typename TImage2::Pointer image; typedef itk::ImageFileReader 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 WxISimpleDlg::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 void WxISimpleDlg::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 void WxISimpleDlg::setExts(std::vector i_exts) { m_exts = i_exts; } ////////////////////////////////////////////////////////////////////// // // ////////////////////////////////////////////////////////////////////// template void WxISimpleDlg::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::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 void WxISimpleDlg::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 out; std::vector 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 wxString WxISimpleDlg::getInfoImage() { return infoimage; } ////////////////////////////////////////////////////////////////////// // Return the results vector // ////////////////////////////////////////////////////////////////////// template std::vector WxISimpleDlg::getImagesSelected() { return m_Iresults; } template void WxISimpleDlg::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 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 void WxISimpleDlg::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 void WxISimpleDlg::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 ImageOutputType; typedef itk::ImageSeriesWriter 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