From 69b4e990347bac15882c7f45758b69cfebb5e62a Mon Sep 17 00:00:00 2001 From: Eduardo DAVILA Date: Tue, 5 Sep 2017 11:59:32 +0200 Subject: [PATCH] #3123creaImageIO Bug New Normal - branch changestoITK3and4 --- .../bbcreaImageIOGetDicomAttributesFromMaps.h | 4 +- ...bbcreaImageIOItkImagesChooserDialogBox.cxx | 152 ++++++++++++++---- .../bbcreaImageIOItkImagesChooserDialogBox.h | 4 +- src/creaImageIOWxAnySimpleDlg.cpp | 83 +++++++--- src/creaImageIOWxAnySimpleDlg.h | 9 +- src/creaImageIOWxGimmickReaderDialog.cpp | 3 +- 6 files changed, 184 insertions(+), 71 deletions(-) diff --git a/bbtk/src/bbcreaImageIOGetDicomAttributesFromMaps.h b/bbtk/src/bbcreaImageIOGetDicomAttributesFromMaps.h index 3b98bfd..d099ff2 100644 --- a/bbtk/src/bbcreaImageIOGetDicomAttributesFromMaps.h +++ b/bbtk/src/bbcreaImageIOGetDicomAttributesFromMaps.h @@ -32,11 +32,11 @@ class bbcreaImageIO_EXPORT GetDicomAttributesFromMaps BBTK_BEGIN_DESCRIBE_BLACK_BOX(GetDicomAttributesFromMaps,bbtk::AtomicBlackBox); BBTK_NAME("GetDicomAttributesFromMaps"); -BBTK_AUTHOR("Info-Dev, Eduardo DAVIL"); +BBTK_AUTHOR("Info-Dev, Eduardo DAVILA"); BBTK_DESCRIPTION("eduardo.davila[at]creatis.insa-lyon.fr -"); BBTK_CATEGORY("empty"); BBTK_INPUT(GetDicomAttributesFromMaps,In,"Vector of maps with DICOM attributes",std::vector< mapString >,""); - BBTK_INPUT(GetDicomAttributesFromMaps,KeyDicom,"Key DICOM",std::string ,""); + BBTK_INPUT(GetDicomAttributesFromMaps,KeyDicom,"Key DICOM ex: D0028_0030 ",std::string ,""); BBTK_OUTPUT(GetDicomAttributesFromMaps,Out,"Vector of the attribute asked.",std::vector ,""); BBTK_END_DESCRIBE_BLACK_BOX(GetDicomAttributesFromMaps); //===== diff --git a/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.cxx b/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.cxx index 9c77a1d..434b719 100644 --- a/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.cxx +++ b/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.cxx @@ -31,14 +31,30 @@ #include "bbcreaImageIOItkImagesChooserDialogBox.h" #include "bbcreaImageIOPackage.h" +#include "itkImage.h" +#include "itkImportImageFilter.h" + +/* // ------------------------------------------------------------------------- // LFV: avoid itk::Concept check on 4d or superior images #define BBCREAIMAGEIO_ChooserDlg_Template( t, ty, di ) \ - if( t == typeid( itk::Image< ty, di > ) ) \ + if( t == typeid( itk::Image< ty, di >* ) ) \ { \ this->Export< itk::Image< ty, di > >( ); \ this->ExportVTK< itk::Image< ty, di > >( ); \ } +*/ + +// ------------------------------------------------------------------------- +// LFV: avoid itk::Concept check on 4d or superior images +#define BBCREAIMAGEIO_ChooserDlg_Template( t, ty, di ) \ + if( t == typeid( itk::Image< ty, di >* ) ) \ + { \ + this->Export< ty , di >( ); \ + this->ExportVTK< itk::Image< ty, di > >( ); \ + } + + // ------------------------------------------------------------------------- namespace bbcreaImageIO @@ -97,27 +113,91 @@ void ItkImagesChooserDialogBox::Process() delete dlg; } -template + +//template +template void ItkImagesChooserDialogBox::Export() { - if (dlg->getImagesSelected().size() == 1) - { + typedef itk::Image TImage; + +printf("EED ItkImagesChooserDialogBox::Export Start \n"); + if (dlg->getImagesSelected().size() == 1) + { +printf("EED ItkImagesChooserDialogBox::Export 1\n"); bbSetOutputOut( dlg->getTemplatedImagesSelected().front().GetPointer() ); - } - else if (dlg->getImagesSelected().size() > 1) - { - OutputImagesITKType outVect; - - typename std::vector tempImgs= dlg->getTemplatedImagesSelected(); - typename std::vector::iterator it = tempImgs.begin(); - for(;it != tempImgs.end(); ++it) - { - outVect.push_back( (*it).GetPointer() ); - } - bbSetOutputOutIImages( outVect); - } - else - { + } else if (dlg->getImagesSelected().size() > 1){ +printf("EED ItkImagesChooserDialogBox::Export 2\n"); + OutputImagesITKType outVect; + typename std::vector tempImgs= dlg->getTemplatedImagesSelected(); + typename std::vector::iterator it = tempImgs.begin(); + for(;it != tempImgs.end(); ++it) + { + outVect.push_back( (*it).GetPointer() ); + } // for + bbSetOutputOutIImages( outVect); + +//EED creater one 3D image from 2D list +// const unsigned int Dimension = 3; +// typedef itk::RGBPixel< unsigned char > RGBPixelType; +// typedef itk::Image< RGBPixelType, Dimension > RGBImageType; +// typedef itk::ImportImageFilter< RGBPixelType, Dimension > ImportFilterType; + +// typedef itk::RGBPixel< ty > RGBPixelType; + typedef ty RGBPixelType; + typedef itk::ImportImageFilter< ty , di > ImportFilterType; + typename ImportFilterType::Pointer importFilter = ImportFilterType::New(); + + + typename TImage::SizeType imsize; +// imsize[0] = img.width(); +// imsize[1] = img.height(); + imsize[0] = tempImgs[0].GetPointer()->GetLargestPossibleRegion().GetSize()[0]; + imsize[1] = tempImgs[0].GetPointer()->GetLargestPossibleRegion().GetSize()[1]; + imsize[2] = tempImgs.size(); +printf("EED ItkImagesChooserDialogBox::Export 2.10\n"); + + typename ImportFilterType::IndexType start; + start.Fill( 0 ); + typename ImportFilterType::RegionType region; + region.SetIndex( start ); + region.SetSize( imsize ); + importFilter->SetRegion( region ); + +// const itk::SpacePrecisionType origin[ di ] = { 0.0, 0.0, 0.0 }; + const itk::SpacePrecisionType origin[ 3 ] = { 0.0, 0.0, 0.0 }; + importFilter->SetOrigin( origin ); + +// const itk::SpacePrecisionType spacing[ di ] = { 1.0, 1.0, 1.0 }; + const itk::SpacePrecisionType spacing[ 3 ] = { 1.0, 1.0, 1.0 }; + importFilter->SetSpacing( spacing ); + const unsigned long int numberOfPixels2D = imsize[0]*imsize[1]; + const unsigned long int numberOfPixels3D = imsize[0]*imsize[1]*imsize[2]; + + RGBPixelType * localBuffer = new RGBPixelType[ numberOfPixels3D ]; + RGBPixelType * tmpLocalBuffer = localBuffer; +printf("EED ItkImagesChooserDialogBox::Export 2.20\n"); + + it = tempImgs.begin(); + for(;it != tempImgs.end(); ++it) + { +printf("EED ItkImagesChooserDialogBox::Export 2.30\n"); + memcpy(tmpLocalBuffer, (*it).GetPointer()->GetBufferPointer(), numberOfPixels2D); + tmpLocalBuffer = tmpLocalBuffer + numberOfPixels2D; + } // for + + const bool importImageFilterWillOwnTheBuffer = true; + importFilter->SetImportPointer( localBuffer , numberOfPixels3D , importImageFilterWillOwnTheBuffer ); +importFilter->Update(); +importFilter->Register(); +printf("EED ItkImagesChooserDialogBox::Export 2.40\n"); + +// bbSetOutputOut( (*tempImgs.begin()).GetPointer() ); +// bbSetOutputOut( importFilter->GetOutput().unsafe_get() ); + bbSetOutputOut( importFilter->GetOutput() ); +printf("EED ItkImagesChooserDialogBox::Export 2.50\n"); + + } else { +printf("EED ItkImagesChooserDialogBox::Export 3\n"); // warning: passing NULL to non-pointer //bbSetOutputOut( NULL); bbSetOutputOut(0); // JPR @@ -131,10 +211,17 @@ void ItkImagesChooserDialogBox::Export() // reader->Update(); //reader->GetOutput()->Register(); // this->bbSetOutputOut(reader->GetOutput()); + +printf("EED ItkImagesChooserDialogBox::Export End \n"); + } + + template void ItkImagesChooserDialogBox::ExportVTK() { +printf("EED ItkImagesChooserDialogBox::ExportVTK Start \n"); + // BBTK can support only a vector with same dimensions image. if (dlg->getDims().front() < 4) { @@ -145,40 +232,35 @@ void ItkImagesChooserDialogBox::ExportVTK() dlg->split3Din3Dvtk( (*it) ); } bbSetOutputOutVImages( dlg->getVtkImagesSelected() ); - } - else if (dlg->getDims().front() == 4) - { + } else if (dlg->getDims().front() == 4) { // To Test // dlg->split4Din3Dvtk("d:/temp2"); // bbSetOutputOutVImages( dlg->getVtkImagesSelected()); - } - else - { - // NOT IMPLEMENTED YET FOR DIMENSIONS > 4 - - } - + } else { + // NOT IMPLEMENTED YET FOR DIMENSIONS > 4 + } // if dlg +printf("EED ItkImagesChooserDialogBox::ExportVTK End \n"); } + //===== // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) //===== void ItkImagesChooserDialogBox::bbUserSetDefaultValues() -{ - +{ } + //===== // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) //===== void ItkImagesChooserDialogBox::bbUserInitializeProcessing() { - } + //===== // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) //===== void ItkImagesChooserDialogBox::bbUserFinalizeProcessing() { - } -} -// EO namespace bbcreaImageIO + +} // EO namespace bbcreaImageIO diff --git a/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.h b/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.h index fa1d910..b492390 100644 --- a/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.h +++ b/bbtk/src/bbcreaImageIOItkImagesChooserDialogBox.h @@ -75,7 +75,9 @@ class bbcreaImageIO_EXPORT ItkImagesChooserDialogBox private: // Template read method - template void Export(); + +//EED template void Export(); +template void Export(); // Template export vtk Images template void ExportVTK(); diff --git a/src/creaImageIOWxAnySimpleDlg.cpp b/src/creaImageIOWxAnySimpleDlg.cpp index 58b7d95..11d5fa9 100644 --- a/src/creaImageIOWxAnySimpleDlg.cpp +++ b/src/creaImageIOWxAnySimpleDlg.cpp @@ -108,27 +108,31 @@ namespace creaImageIO std::string name = crea::wx2std(wxArray[i]); // FOR THE MOMENT ONLY short 3D et short 4D readImg(name); - } - } - else { + } // for + } else { // TO DO WARNING MESSAGES - } - } + } // if + } // if SetReturnCode( resultShowModal ); // Close(); EndModal( resultShowModal ); } + +///////////////////////////////////////////////////////////////////// +// // +////////////////////////////////////////////////////////////////////// void WxAnySimpleDlg::setExts(std::vector i_exts) { m_exts = i_exts; } - ///////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////// // // ////////////////////////////////////////////////////////////////////// - void WxAnySimpleDlg::OnReadDirectory(wxCommandEvent &event) { +printf("EED WxAnySimpleDlg::OnReadDirectory Start\n"); int resultShowModal; bool bvalid = false; long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST; @@ -138,33 +142,58 @@ namespace creaImageIO if ( resultShowModal==wxID_OK ) { std::string path = crea::wx2std(dirDlg->GetPath()); +printf("EED WxAnySimpleDlg::OnReadDirectory path %s\n", path.c_str() ); + +/* typedef boost::filesystem::directory_iterator dir_it; dir_it itr(path); dir_it end_itr; - /*if (boost::filesystem::exists(path)) - {*/ +// 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->path().filename().string().substr(itr->path().filename().string().find_last_of(".")); - for(; it != m_exts.end(); it++) - { - if(ext == (*it) ) - { - bvalid = true; - break; - } - } +//EED +// All files have the same extention +// bvalid = m_exts.size() == 0? true : false; +// std::vector::iterator it = m_exts.begin(); +// std::string ext = itr->path().filename().string().substr(itr->path().filename().string().find_last_of(".")); +// for(; it != m_exts.end(); it++) +// { +// if(ext == (*it) ) +// { +// bvalid = true; +// break; +// } +// } // for +bvalid=true; if (!boost::filesystem::is_directory(itr->status()) && bvalid) { - readImg(itr->path().string().c_str()); - } - } - } +printf("EED WxAnySimpleDlg::OnReadDirectory Each file %s \n", itr->path().string().c_str() ); + readImg( itr->path().string().c_str() ); + } // if + } // for itr +*/ + + typedef vector vec; // store paths + vec v; // so we can sort them later + copy(boost::filesystem::directory_iterator(path), boost::filesystem::directory_iterator(), back_inserter(v)); + sort(v.begin(), v.end()); // sort, since directory iteration + // is not ordered on some file systems + for (vec::const_iterator it (v.begin()); it != v.end(); ++it) + { + readImg( it->string().c_str() ); + cout << " " << *it << '\n'; + } + + + + + } // if OK SetReturnCode( resultShowModal ); // Close(); EndModal( resultShowModal ); +printf("EED WxAnySimpleDlg::OnReadDirectory End\n"); + } ////////////////////////////////////////////////////////////////////// @@ -236,9 +265,13 @@ namespace creaImageIO return imageIO->GetNumberOfDimensions(); } + void WxAnySimpleDlg::readImg(const std::string &i_name) { size_t dims = getNumberOfDimensions(i_name); + +printf("EED WxAnySimpleDlg::readImg dims=%d \n",dims); + //const std::type_info *type= &getType(i_name); switch(dims) { @@ -345,6 +378,7 @@ namespace creaImageIO } else { + printf("EED WxAnySimpleDlg::readImg Not type found for DIM 3 \n"); //????FCY, so what the type???? } break; @@ -487,6 +521,7 @@ namespace creaImageIO } else { + printf("EED WxAnySimpleDlg::readImg Not type found for DIM 4 \n"); //????FCY, so what the type???? } break; diff --git a/src/creaImageIOWxAnySimpleDlg.h b/src/creaImageIOWxAnySimpleDlg.h index 51674d3..df655a4 100644 --- a/src/creaImageIOWxAnySimpleDlg.h +++ b/src/creaImageIOWxAnySimpleDlg.h @@ -102,13 +102,13 @@ namespace creaImageIO for(; it != m_AnyImages.end(); it++) { imgs.push_back(boost::any_cast (*it)); - } + } // for return imgs; } bool AllSameType(); template void split3Din3Dvtk(TImage* i_Img) - { + { typedef itk::ImageToVTKImageFilter< TImage > ConnectorType; typename ConnectorType::Pointer connector = ConnectorType::New(); connector->SetInput(i_Img); @@ -119,14 +119,11 @@ namespace creaImageIO im->Update(); m_Vresults.push_back(im); } - template void split4Din3Dvtk(TImage* i_Img); - private: - // strange compile error with gcc 4.5.1-4 //JPR std::vector m_AnyDims; //comment out const JPR std::vector m_AnyType; //comment out const JPR @@ -137,7 +134,6 @@ namespace creaImageIO wxString infoimage; std::string m_dir; - bool m_dicom; /// interface to read data SimpleView m_view; @@ -149,6 +145,5 @@ namespace creaImageIO const std::type_info & getType(const std::string &i_name); }; - }// namespace creaImageIO #endif //__creaImageWxAnySimpleDlg_h_INCLUDED__ diff --git a/src/creaImageIOWxGimmickReaderDialog.cpp b/src/creaImageIOWxGimmickReaderDialog.cpp index bce7fc7..1dff6b3 100644 --- a/src/creaImageIOWxGimmickReaderDialog.cpp +++ b/src/creaImageIOWxGimmickReaderDialog.cpp @@ -80,8 +80,7 @@ namespace creaImageIO threads); mView->Initialize(); // Connect the AddProgress callback - mView->ConnectValidationObserver - ( boost::bind( &WxGimmickReaderDialog::OnValid , this, _1 ) ); + mView->ConnectValidationObserver( boost::bind( &WxGimmickReaderDialog::OnValid , this, _1 ) ); } catch (crea::Exception e) { -- 2.47.1