From: Frederic Cervenansky Date: Fri, 12 Mar 2010 11:52:19 +0000 (+0000) Subject: Set GDCM2 library as available DICOM Reader X-Git-Tag: CREATOOLS.2-0-3~51 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=creaImageIO.git;a=commitdiff_plain;h=c15dd7f9013f1c5bb6b4f5cac3cd1c92f57333f1 Set GDCM2 library as available DICOM Reader --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d592ba..32fc752 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,9 @@ IF (crea_FOUND) INCLUDE(${crea_USE_FILE}) ENDIF(crea_FOUND) -SET(USE_GDCM ON) -#SET(USE_GDCM2 ON) + + + SET(USE_GDCM_VTK ON) SET(USE_VTK ON) @@ -34,6 +35,9 @@ SET(USE_ITK OFF) SET(USE_BOOST ON) SET(USE_WXWIDGETS ON) +OPTION(USE_GDCM ON) +OPTION(USE_GDCM2 OFF) + CREA_FIND_AND_USE_LIBRARIES() SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) @@ -50,6 +54,7 @@ LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/win32) ENDIF(WIN32) + OPTION(BUILD_V2 "Build Version 2 ?" ON) IF (BUILD_V2) @@ -68,7 +73,6 @@ ELSE (BUILD_V2) SUBDIRS(src) ENDIF (BUILD_V2) - OPTION(BUILD_CREA_BRUKER "Build creaIRM with creaBruker?" ON) IF (BUILD_CREA_BRUKER) @@ -91,3 +95,4 @@ SUBDIRS(appli) SUBDIRS(bbtk) SUBDIRS(win32) SUBDIRS(install) + diff --git a/src2/CMakeLists.txt b/src2/CMakeLists.txt index 8908fc5..33cbbe1 100644 --- a/src2/CMakeLists.txt +++ b/src2/CMakeLists.txt @@ -24,6 +24,8 @@ FILE(GLOB SOURCES_CREAIMAGEIO creaImageIOListener.cpp ) + + # Attributed tree data structure FILE(GLOB SOURCES_CREAIMAGEIO_TREE creaImageIOTree.cpp @@ -36,15 +38,25 @@ FILE(GLOB SOURCES_CREAIMAGEIO_TREE creaImageIOTreeHandlerImageAdder.cpp creaImageIOSQLiteTreeHandler.cpp ) - +IF(USE_GDCM) + FILE(GLOB SOURCES_CREAIMAGEIO_IMG_DICOM_READER + creaImageIODicomImageReader.cpp) +ENDIF(USE_GDCM) + + +IF(USE_GDCM2) + FILE(GLOB SOURCES_CREAIMAGEIO_IMG_DICOM_READER + creaImageIODicomImageReader2.cpp) +ENDIF(USE_GDCM2) + # Image Readers FILE(GLOB SOURCES_CREAIMAGEIO_IMG_READER creaImageIOAbstractImageReader.cpp - creaImageIODicomImageReader.cpp creaImageIOImageReader.cpp creaImageIOUltrasonixImageReader.cpp creaImageIOVtkImageReader.cpp creaImageIOMultiThreadImageReader.cpp + ${SOURCES_CREAIMAGEIO_IMG_DICOM_READER} ) @@ -81,7 +93,8 @@ if(BUILD_CREA_PACS) SOURCE_GROUP("Source Files\\PACS" FILES ${SOURCES_CREAIMAGEIO_PACS}) SOURCE_GROUP("Header Files\\PACS" FILES ${HEADER_CREAIMAGEIO_PACS}) endif(BUILD_CREA_PACS) -SOURCE_GROUP("Source Files\\Readers" FILES ${SOURCES_CREAIMAGEIO_IMG_READER}) +SOURCE_GROUP("Source Files\\Readers" FILES ${SOURCES_CREAIMAGEIO_IMG_READER} + ${SOURCES_CREAIMAGEIO_IMG_DICOM_READER}) SOURCE_GROUP("Source Files\\Tree" FILES ${SOURCES_CREAIMAGEIO_TREE}) @@ -89,6 +102,7 @@ SET( PRIMITIVE_SRCS ${SOURCES_CREAIMAGEIO} ${HEADER_CREAIMAGEIO} ${SOURCES_CREAIMAGEIO_IMG_READER} + ${SOURCES_CREAIMAGEIO_IMG_DICOM_READER} ${SOURCES_CREAIMAGEIO_WX} ${SOURCES_CREAIMAGEIO_TREE} ) diff --git a/src2/creaImageIODicomImageReader.cpp b/src2/creaImageIODicomImageReader.cpp index e12fd0a..8ff8b5b 100644 --- a/src2/creaImageIODicomImageReader.cpp +++ b/src2/creaImageIODicomImageReader.cpp @@ -1,6 +1,9 @@ #include #include + + + #include #include "boost/filesystem/path.hpp" @@ -19,6 +22,7 @@ namespace creaImageIO mReader = vtkGdcmReader::New(); //EED mReader->SetFlipY(false); SetName ( "Dicom" ); + }; //===================================================================== diff --git a/src2/creaImageIODicomImageReader2.cpp b/src2/creaImageIODicomImageReader2.cpp new file mode 100644 index 0000000..75f5f40 --- /dev/null +++ b/src2/creaImageIODicomImageReader2.cpp @@ -0,0 +1,161 @@ +#include + + + +#include +#include "boost/filesystem/path.hpp" + +#include +#include +#include +#ifdef _DEBUG +#define new DEBUG_NEW +#endif +namespace creaImageIO +{ + + //===================================================================== + DicomImageReader::DicomImageReader() + { + mReader = vtkGDCMImageReader::New(); + SetName ( "Dicom" ); + + }; + //===================================================================== + + //===================================================================== + DicomImageReader::~DicomImageReader() + { + mReader->Delete(); + } + //===================================================================== + + //===================================================================== + bool DicomImageReader::CanRead(const std::string& filename) + { + gdcm::Reader reader; + reader.SetFileName( filename.c_str() ); + return reader.Read(); + + } + //===================================================================== + + //===================================================================== + vtkImageData* DicomImageReader::ReadImage(const std::string& filename) + { + vtkImageData* im = 0; + try + { + mReader->SetFileName(filename.c_str()); + mReader->Update(); + im = vtkImageData::New(); + im->ShallowCopy(mReader->GetOutput()); + } + catch (...) + { + if (im!=0) im->Delete(); + im = 0; + } + return im; + } + + //===================================================================== + void DicomImageReader::PushBackExtensions(std::vector& v) + { + v.push_back("dcm"); + v.push_back(""); + } + //===================================================================== + + //======================================================================== + std::string irclean(const std::string& str) + { + if(str.size() > 0) + { + if (str == "GDCM::Unfound") + { + return ""; + } + if (str[str.size()-1]==' ') + { + return irclean(str.substr(0,str.size()-1)); + } + if (str[str.size()-1]==0) + { + return irclean(str.substr(0,str.size()-1)); + } + } + + return str; + } + //======================================================================== + + //===================================================================== + void DicomImageReader::ReadAttributes(const std::string& filename, + std::map& attr) + { + GimmickMessage(2,"Reading attributes from DICOM file '" + <::iterator i; + for (i=attr.begin();i!=attr.end();++i) + { + if ( i->first == "D0004_1500" ) + { + boost::filesystem::path full_path(filename); + std::string f = full_path.leaf(); + i->second = f; + } + else if ( i->first == "FullFileName" ) + { + i->second = filename; + } + else if ( i->first == "FullFileDirectory" ) + { + std::string::size_type last_pos = filename.find_last_of("//"); + //find first separator + i->second = filename.substr(0, last_pos); + } + else + { + uint16_t el; + uint16_t gr; + + tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el); + if ( ( gr!=0 ) && ( el!=0 ) ) + { + gdcm::DataElement de( gdcm::Tag(gr,el) ); + std::string val = GetStringValueFromTag(reader.GetFile().GetHeader().GetDataElement(gdcm::Tag(gr,el))); + i->second = irclean(val); + } + } + } + } + } + + const std::string DicomImageReader::GetStringValueFromTag(const gdcm::DataElement& de) +{ + static std::string buffer; + buffer = ""; // cleanup previous call + + + const gdcm::ByteValue *bv = de.GetByteValue(); + if( bv ) // Can be Type 2 + { + buffer = std::string( bv->GetPointer(), bv->GetLength() ); + // Will be padded with at least one \0 + } + + + // Since return is a const char* the very first \0 will be considered + return buffer.c_str(); +} + //===================================================================== + +} // namespace creaImageIO + diff --git a/src2/creaImageIODicomImageReader2.h b/src2/creaImageIODicomImageReader2.h new file mode 100644 index 0000000..ffcaae5 --- /dev/null +++ b/src2/creaImageIODicomImageReader2.h @@ -0,0 +1,59 @@ +#ifndef __creaImageIODicomImageReader_h_INCLUDED__ +#define __creaImageIODicomImageReader_h_INCLUDED__ + + +#include +#if defined(USE_GDCM2) +#include +#include +#endif + +class vtkGDCMImageReader; + +namespace creaImageIO +{ + + + /** + * \ingroup IO + */ + + //===================================================================== + /// Concrete image reader for DICOM images + class DicomImageReader : virtual public AbstractImageReader + { + public: + DicomImageReader(); + virtual ~DicomImageReader(); + + /// Add file extensions read by the reader + virtual void PushBackExtensions(std::vector&); + /// Test if file is read by this reader + virtual bool CanRead(const std::string& filename); + /// return for a file a 2D VTkImage + virtual vtkImageData* ReadImage(const std::string& filename); + /// Read the attributes for a file + virtual void ReadAttributes(const std::string& filename, + tree::AttributeMapType& attr); + + private: + const std::string GetStringValueFromTag( const gdcm::DataElement& ds); + vtkGDCMImageReader *mReader; + struct deleter + { + void operator()(gdcm::File* p) + { + delete p; + } + }; + friend struct deleter; + }; + //===================================================================== + + + +} // namespace creaImageIO + + + +#endif // #ifndef __creaImageIODicomImageReader_h_INCLUDED__ diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index 6df7fc0..29d22e3 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -1,9 +1,18 @@ #include #include #include "boost/filesystem.hpp" + +#if defined(USE_GDCM) #include #include #include +#endif + +#if defined(USE_GDCM2) +#include +#endif + + namespace fs = boost::filesystem; namespace creaImageIO { @@ -363,7 +372,9 @@ void GimmickView::ReadImagesNotThreaded(std::vector& s, std::vect double spc[3]; first->GetSpacing(spc); spc[2]=OrderTheFileNameVector(im); + out->SetSpacing(spc); + int slice = 0; std::vector::iterator it; @@ -382,8 +393,8 @@ void GimmickView::ReadImagesNotThreaded(std::vector& s, std::vect } //====================================================================== - -double GimmickView::OrderTheFileNameVector(std::vector &im) +#if defined(USE_GDCM) + double GimmickView::OrderTheFileNameVector(std::vector &im) { double spacing=1; typedef std::vector FileList; @@ -429,6 +440,15 @@ double GimmickView::OrderTheFileNameVector(std::vector &im) } +#endif + +#if defined(USE_GDCM2) + // TO DO + double GimmickView::OrderTheFileNameVector(std::vector &im) + { + return 1; + } +#endif //====================================================================== diff --git a/src2/creaImageIOImageReader.cpp b/src2/creaImageIOImageReader.cpp index 9fda226..4b67e04 100644 --- a/src2/creaImageIOImageReader.cpp +++ b/src2/creaImageIOImageReader.cpp @@ -3,9 +3,13 @@ #include #include -#include +#if defined (USE_GDCM) + #include +#endif +#if defined(USE_GDCM2) + #include +#endif #include - #include #include #include @@ -43,6 +47,7 @@ namespace creaImageIO Register(boost::shared_ptr(new DicomImageReader)); Register(boost::shared_ptr(new UltrasonixImageReader)); + UnRegister(".txt"); mUnreadableImage = vtkImageData::New(); int dim[3]; @@ -87,14 +92,48 @@ namespace creaImageIO { mReader.push_back(r); + } + + void ImageReader::UnRegister(const std::string i_val) + { + mUnReader.push_back(i_val); + } //===================================================================== + //===================================================================== + // Returns true iff the file is readable + bool ImageReader::ShallNotRead( const std::string& filename ) + { + bool ok = true; + if(filename != "") + { + std::vector::iterator i ; + for (i=mUnReader.begin(); i!=mUnReader.end(); i++) + { + + if ( (*i).c_str() == filename) + { + ok = false; + break; + } + } + } + return ok; + + } + + //===================================================================== // Returns true iff the file is readable bool ImageReader::CanRead( const std::string& filename ) { bool ok = false; + + if( !ShallNotRead(filename)) + { + return ok; + } if(filename != "") { std::vector >::iterator i; diff --git a/src2/creaImageIOImageReader.h b/src2/creaImageIOImageReader.h index f736642..ab9fbe7 100644 --- a/src2/creaImageIOImageReader.h +++ b/src2/creaImageIOImageReader.h @@ -49,6 +49,12 @@ namespace creaImageIO std::string mLastFilename; boost::shared_ptr mLastReader; + + bool ShallNotRead( const std::string& filename ); + + void UnRegister(const std::string i_val); + + std::vector mUnReader; private: diff --git a/src2/creaImageIOTreeAttributeDescriptor.cpp b/src2/creaImageIOTreeAttributeDescriptor.cpp index 3d6a0e3..3d3ffb1 100644 --- a/src2/creaImageIOTreeAttributeDescriptor.cpp +++ b/src2/creaImageIOTreeAttributeDescriptor.cpp @@ -1,8 +1,17 @@ #include #include + +#if defined(USE_GDCM) #include #include +#endif + +#if defined(USE_GDCM2) +#include +#include +#include +#endif #include @@ -65,6 +74,7 @@ namespace creaImageIO GimmickDebugMessage(3,"AttributeDescriptor : '"<GetDefaultPubDict()->GetEntry(GetGroup(),GetElement()); if( entry != 0) { @@ -127,6 +164,21 @@ namespace creaImageIO btest = true; } } +#endif +#if defined(USE_GDCM2) + const gdcm::Global& g = gdcm::Global::GetInstance(); // sum of all knowledge ! + const gdcm::Dicts &dicts = g.GetDicts(); + const gdcm::Dict &dict = dicts.GetPublicDict(); // Part 6 + + if(mGroup != 0 && mElement != 0) + { + gdcm::DictEntry dictentry = dict.GetDictEntry(gdcm::Tag(GetGroup(), GetElement())); + if( gdcm::VR::GetVRString(dictentry.GetVR()) == "DA") + { + btest = true; + } + } +#endif return btest; } @@ -136,6 +188,7 @@ namespace creaImageIO { bool btest = false; +#if defined(USE_GDCM) // Retrieve the name from gdcm dict GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement()); if( entry != 0) @@ -145,6 +198,22 @@ namespace creaImageIO btest = true; } } +#endif + +#if defined(USE_GDCM2) + const gdcm::Global& g = gdcm::Global::GetInstance(); // sum of all knowledge ! + const gdcm::Dicts &dicts = g.GetDicts(); + const gdcm::Dict &dict = dicts.GetPublicDict(); // Part 6 + if(mGroup != 0 && mElement != 0) + { + gdcm::DictEntry dictentry = dict.GetDictEntry(gdcm::Tag(mGroup, mElement)); + if(gdcm::VR::GetVRString(dictentry.GetVR()) == "TM") + { + btest = true; + } + } +#endif + return btest; } @@ -153,8 +222,8 @@ namespace creaImageIO /// Decodes the type of the attribute void AttributeDescriptor::DecodeType(unsigned int& typ) const { - - + std::string type=""; +#if defined(USE_GDCM) // Retrieve the name from gdcm dict GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts() @@ -165,7 +234,16 @@ namespace creaImageIO typ = 2; return; } - std::string type = entry->GetVR().str(); + type = entry->GetVR().str(); +#endif +#if defined(USE_GDCM2) + const gdcm::Global& g = gdcm::Global::GetInstance(); // sum of all knowledge ! + const gdcm::Dicts &dicts = g.GetDicts(); + const gdcm::Dict &dict = dicts.GetPublicDict(); // Part 6 + gdcm::DictEntry dictentry = dict.GetDictEntry(gdcm::Tag(mGroup, mElement)); + type = gdcm::VR::GetVRString(dictentry.GetVR()); +#endif + GimmickDebugMessage(3,"VR Value is "< #include - namespace creaImageIO { #define HEADER_SIZE 19 @@ -146,7 +145,7 @@ namespace creaImageIO fclose(Ultrasonix_file); - im = crea::NewVtkImageDataFromRaw( dataB8, h.width, h.height, h.frame); + im = crea::NewVtkImageDataFromRaw( dataB8, h.width, h.height, h.frame); break; case TYPE_B32: @@ -164,7 +163,7 @@ namespace creaImageIO fclose(Ultrasonix_file); - im = crea::NewVtkImageDataFromRaw( dataB32, h.width, h.height, h.frame); + im = crea::NewVtkImageDataFromRaw( dataB32, h.width, h.height, h.frame); break; } diff --git a/src2/creaImageIOWxCustomizeConfigPanel.cpp b/src2/creaImageIOWxCustomizeConfigPanel.cpp index f237eaf..c28a37d 100644 --- a/src2/creaImageIOWxCustomizeConfigPanel.cpp +++ b/src2/creaImageIOWxCustomizeConfigPanel.cpp @@ -1,6 +1,5 @@ #include #include - namespace creaImageIO { // CTor diff --git a/src2/creaImageIOWxDescriptorPanel.cpp b/src2/creaImageIOWxDescriptorPanel.cpp index d192534..3b0f78e 100644 --- a/src2/creaImageIOWxDescriptorPanel.cpp +++ b/src2/creaImageIOWxDescriptorPanel.cpp @@ -1,7 +1,9 @@ #include "creaImageIOWxDescriptorPanel.h" #include +#if defined(USE_GDCM) #include #include +#endif #include #include @@ -243,7 +245,7 @@ namespace creaImageIO val.clear(); val << std::dec << el ; val >> std::hex >> element; - +#if defined(USE_GDCM) // Retrieve the name from gdcm dict GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(group, element); // AttributeCombo->Clear(); @@ -257,6 +259,7 @@ namespace creaImageIO AttributeCombo->Delete(0); AttributeCombo->Insert(_T("Unknown Attribute"),0); } +#endif AttributeCombo->SetSelection(0); } @@ -759,11 +762,13 @@ namespace creaImageIO compose += descriptors[1]; compose += "_"; compose += descriptors[2]; +#if defined(USE_GDCM) GDCM_NAME_SPACE::DictEntry* entry = GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(group, element); if(ilevel>0) { onAddAttribute( entry->GetName(),compose, level); } +#endif } else if(descriptors[0].find("#") != -1) { diff --git a/src2/creaImageIOWxDumpPanel.cpp b/src2/creaImageIOWxDumpPanel.cpp index 1d1a376..843db48 100644 --- a/src2/creaImageIOWxDumpPanel.cpp +++ b/src2/creaImageIOWxDumpPanel.cpp @@ -1,11 +1,13 @@ #include #include #include +#if defined(USE_GDCM) #include #include #include "gdcmFile.h" #include "gdcmDocument.h" #include "gdcmFileHelper.h" +#endif #include "icons/save.xpm" namespace creaImageIO @@ -36,25 +38,64 @@ namespace creaImageIO std::stringstream os; if ( !filename.empty()) // ====== Deal with a single file ====== { - GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New(); + /* GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New(); f->SetLoadMode(GDCM_NAME_SPACE::LD_ALL); f->SetFileName( filename ); f->SetMaxSizeLoadEntry(0xffff); f->Load(); GDCM_NAME_SPACE::FileHelper *fh = GDCM_NAME_SPACE::FileHelper::New(f); + f->SetLoadMode(GDCM_NAME_SPACE::LD_NOSEQ |GDCM_NAME_SPACE::LD_NOSHADOW); fh->SetPrintLevel( 0 ); fh->Print(os); std::string result; std::string line; while(std::getline(os, line)) { - result +=line; + result +=clean(line.c_str()); result += "\n"; } DumpText->SetValue(crea::std2wx(result)); + + std::string pixelType =f->GetPixelType(); + int nX,nY,nZ,nT,sPP,planarConfig; + + nX=f->GetXSize(); + nY=f->GetYSize(); + nZ=f->GetZSize(); + nT=f->GetTSize();*/ } } + + const std::string WxDumpPanel::clean(const std::string &i_line) + { + + if (i_line.substr(4,1) == "|") + { + std::string tag; + std::string line; + std:string signification; + std::string value; + std::string resultat; + + tag = "(" + i_line.substr(0,9) + ")"; + line = i_line.substr(14,i_line.size()-10); + int pos1 = line.find_first_of("["); + int pos2 = line.find_first_of("]"); + signification = line.substr(pos1+1, pos2-pos1-1); + line = line.substr(pos2+1); + pos1 = line.find_first_of("["); + pos2 = line.find_first_of("]"); + value = line.substr(pos1+1, pos2-pos1-1); + resultat = tag + " " + signification + ": " +value; + return resultat; + } + else + { + return i_line; + } + } + /////////////////////////////////////////////////// /// wxEvent to save Dicom Tags in a text file // /////////////////////////////////////////////////// diff --git a/src2/creaImageIOWxDumpPanel.h b/src2/creaImageIOWxDumpPanel.h index 891a4d3..474892c 100644 --- a/src2/creaImageIOWxDumpPanel.h +++ b/src2/creaImageIOWxDumpPanel.h @@ -29,6 +29,7 @@ namespace creaImageIO private : + const std::string clean(const std::string &i_line); /// Display in a control Text all dicom tags void Print(); diff --git a/src2/creaImageIOWxGimmickPanel.h b/src2/creaImageIOWxGimmickPanel.h index 040a859..ad776dd 100644 --- a/src2/creaImageIOWxGimmickPanel.h +++ b/src2/creaImageIOWxGimmickPanel.h @@ -17,7 +17,7 @@ namespace creaImageIO */ //===================================================================== //===================================================================== - class CREAIMAGEIO_EXPORT WxGimmickPanel : public wxPanel + class CREAIMAGEIO_EXPORT WxGimmickPanel : public wxPanel { public: WxGimmickPanel(); diff --git a/src2/creaImageIOWxViewer.h b/src2/creaImageIOWxViewer.h index b807f7c..1e4e2f2 100644 --- a/src2/creaImageIOWxViewer.h +++ b/src2/creaImageIOWxViewer.h @@ -70,7 +70,7 @@ namespace creaImageIO wxCheckBox *mcheck; /// Associated wxvtk interactor - crea::creawxVTKRenderWindowInteractor *mInteractor; + crea::creawxVTKRenderWindowInteractor *mInteractor; /// Current extent int mx1,mx2,my1,my2,mz1,mz2;