X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeaderHelper.cxx;h=22ad729e7abc1c3ab9a231ccb00cee4cc30116ec;hb=b26e20f5faabeaebef8992f5a364fa1d5561bd08;hp=0898ed5d945f05a47b33dee7bbc5ad709e57fe92;hpb=8fb1011e6fca9654c69d4921642f18146c66ca7f;p=gdcm.git diff --git a/src/gdcmHeaderHelper.cxx b/src/gdcmHeaderHelper.cxx index 0898ed5d..22ad729e 100644 --- a/src/gdcmHeaderHelper.cxx +++ b/src/gdcmHeaderHelper.cxx @@ -1,60 +1,61 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.cxx,v 1.17 2003/11/12 14:06:35 malaterre Exp $ - +// gdcmHeaderHelper.cxx +//----------------------------------------------------------------------------- #include "gdcmHeaderHelper.h" #include "gdcmUtil.h" //for debug #include #include -//#include //for bzero -//directory manipulation (os indep). -//cygwin ???? -> _WIN32 ?? #ifdef _MSC_VER -#include -int GetDir(std::string dPath, std::list &filenames) -{ - //For now dPath should have an ending "\" - WIN32_FIND_DATA FileData; - HANDLE hFile; - hFile = FindFirstFile((dPath+"*").c_str(), &FileData); - if ( hFile == INVALID_HANDLE_VALUE ) - { - //No files ! - return false; - } + #include + + int GetDir(std::string dPath, std::list &filenames) + { + //For now dPath should have an ending "\" + WIN32_FIND_DATA FileData; + HANDLE hFile; + hFile = FindFirstFile((dPath+"*").c_str(), &FileData); + if ( hFile == INVALID_HANDLE_VALUE ) + { + //No files ! + return false; + } - if( strncmp(FileData.cFileName, ".", 1) != 0 ) - filenames.push_back( dPath+FileData.cFileName ); - while( FindNextFile(hFile, &FileData ) != 0) - { - if( strncmp(FileData.cFileName, ".", 1) != 0 ) - filenames.push_back( dPath+FileData.cFileName ); - } - return true; -} + if( strncmp(FileData.cFileName, ".", 1) != 0 ) + filenames.push_back( dPath+FileData.cFileName ); + while( FindNextFile(hFile, &FileData ) != 0) + { + if( strncmp(FileData.cFileName, ".", 1) != 0 ) + filenames.push_back( dPath+FileData.cFileName ); + } + return true; + } #else -#include + #include -int GetDir(std::string dPath, std::list &filenames) -{ - DIR *dir = opendir( dPath.c_str() ); - struct dirent *entry; - while((entry = readdir(dir)) != NULL) - { -// if( strncmp(entry->d_name, ".", 1) != 0 && strncmp(entry->d_name, "..", 2) != 0) - if( strncmp(entry->d_name, ".", 1) != 0 ) + int GetDir(std::string dPath, std::list &filenames) { - filenames.push_back( dPath + "/" + entry->d_name ); + DIR *dir = opendir( dPath.c_str() ); + struct dirent *entry; + while((entry = readdir(dir)) != NULL) + { + // if( strncmp(entry->d_name, ".", 1) != 0 && strncmp(entry->d_name, "..", 2) != 0) + if( strncmp(entry->d_name, ".", 1) != 0 ) + { + filenames.push_back( dPath + "/" + entry->d_name ); + } + } + closedir(dir); + return true; } - } - closedir(dir); - return true; -} #endif -//---------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// gdcmHeaderHelper +//----------------------------------------------------------------------------- +// Constructor / Destructor /** * \ingroup gdcmHeaderHelper * \brief cstor @@ -62,7 +63,7 @@ int GetDir(std::string dPath, std::list &filenames) gdcmHeaderHelper::gdcmHeaderHelper() : gdcmHeader( ) { } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief cstor @@ -71,7 +72,12 @@ gdcmHeaderHelper::gdcmHeaderHelper(const char *InFilename, bool exception_on_error) : gdcmHeader( InFilename , exception_on_error) { } -//---------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Print + +//----------------------------------------------------------------------------- +// Public /** * \ingroup gdcmHeaderHelper * \brief Return the size (in bytes) of a single pixel of data. @@ -82,7 +88,7 @@ int gdcmHeaderHelper::GetPixelSize() { // 0028 0100 US IMG Bits Allocated // (in order no to be messed up by old RGB images) - if (gdcmHeader::GetPubElValByNumber(0x0028,0x0100) == "24") + if (gdcmHeader::GetEntryByNumber(0x0028,0x0100) == "24") return 3; std::string PixelType = GetPixelType(); @@ -96,69 +102,6 @@ int gdcmHeaderHelper::GetPixelSize() { return 0; } -//---------------------------------------------------------------------------- -/** - * \ingroup gdcmHeaderHelper - * \brief This function is intended to user who doesn't whan - * \ to have to manage a LUT and expects to get an RBG Pixel image - * \ (or a monochrome one ...) - * \warning to be used with GetImagePixels() - * @return 1 if Gray level, 3 if Color (RGB, YBR or PALETTE COLOR) - */ -int gdcmHeaderHelper::GetNumberOfScalarComponents() { - - if (GetSamplesPerPixel() ==3) - return 3; - - // 0028 0100 US IMG Bits Allocated - // (in order no to be messed up by old RGB images) - if (gdcmHeader::GetPubElValByNumber(0x0028,0x0100) == "24") - return 3; - - std::string PhotometricInterpretation = - gdcmHeader::GetPubElValByNumber(0x0028,0x0004); - - if ( ( PhotometricInterpretation == "PALETTE COLOR ") ) { - if (HasLUT()) // PALETTE COLOR is NOT enough - return 3; - else - return 1; - } - - //beware of trailing space at end of string - if (PhotometricInterpretation.find(GDCM_UNFOUND) < - PhotometricInterpretation.length() || - PhotometricInterpretation.find("MONOCHROME1") < - PhotometricInterpretation.length() || - PhotometricInterpretation.find("MONOCHROME2") < - PhotometricInterpretation.length() ) - return 1; - else - // we assume that *all* kinds of YBR are dealt with - return 3; -} - -//---------------------------------------------------------------------------- -/** - * \ingroup gdcmHeaderHelper - * \brief This function is intended to user that DOESN'T want - * \to get RGB pixels image when it's stored as a PALETTE COLOR image - * \ - the (vtk) user is supposed to know how deal with LUTs - - * \warning to be used with GetImagePixelsRaw() - * @return 1 if Gray level, 3 if Color (RGB or YBR - NOT 'PALETTE COLOR' -) - */ -int gdcmHeaderHelper::GetNumberOfScalarComponentsRaw() { - - // 0028 0100 US IMG Bits Allocated - // (in order no to be messed up by old RGB images) - if (gdcmHeader::GetPubElValByNumber(0x0028,0x0100) == "24") - return 3; - - // we assume that *all* kinds of YBR are dealt with - return GetSamplesPerPixel(); -} - -//---------------------------------------------------------------------------- /** * \ingroup gdcmHeaderHelper * \brief Build the Pixel Type of the image. @@ -175,8 +118,8 @@ int gdcmHeaderHelper::GetNumberOfScalarComponentsRaw() { */ std::string gdcmHeaderHelper::GetPixelType() { std::string BitsAlloc; - BitsAlloc = GetElValByName("Bits Allocated"); - if (BitsAlloc == GDCM_UNFOUND) { + BitsAlloc = GetEntryByNumber(0x0028, 0x0100); + if (BitsAlloc == GDCM_UNFOUND) { // Bits Allocated dbg.Verbose(0, "gdcmHeader::GetPixelType: unfound Bits Allocated"); BitsAlloc = std::string("16"); } @@ -186,8 +129,8 @@ std::string gdcmHeaderHelper::GetPixelType() { BitsAlloc = std::string("8"); // by old RGB images) std::string Signed; - Signed = GetElValByName("Pixel Representation"); - if (Signed == GDCM_UNFOUND) { + Signed = GetEntryByNumber(0x0028, 0x0103); + if (Signed == GDCM_UNFOUND) { // "Pixel Representation" dbg.Verbose(0, "gdcmHeader::GetPixelType: unfound Pixel Representation"); BitsAlloc = std::string("0"); } @@ -198,7 +141,7 @@ std::string gdcmHeaderHelper::GetPixelType() { return( BitsAlloc + Signed); } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0028,0030 : Pixel Spacing @@ -207,7 +150,7 @@ std::string gdcmHeaderHelper::GetPixelType() { */ float gdcmHeaderHelper::GetXSpacing() { float xspacing, yspacing; - std::string StrSpacing = GetPubElValByNumber(0x0028,0x0030); + std::string StrSpacing = GetEntryByNumber(0x0028,0x0030); if (StrSpacing == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXSpacing: unfound Pixel Spacing (0028,0030)"); @@ -222,7 +165,7 @@ float gdcmHeaderHelper::GetXSpacing() { } return xspacing; } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0028,0030 : Pixel Spacing @@ -231,7 +174,7 @@ float gdcmHeaderHelper::GetXSpacing() { */ float gdcmHeaderHelper::GetYSpacing() { float xspacing, yspacing; - std::string StrSpacing = GetPubElValByNumber(0x0028,0x0030); + std::string StrSpacing = GetEntryByNumber(0x0028,0x0030); if (StrSpacing == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYSpacing: unfound Pixel Spacing (0028,0030)"); @@ -247,7 +190,6 @@ float gdcmHeaderHelper::GetYSpacing() { return yspacing; } -//---------------------------------------------------------------------------- /** *\ingroup gdcmHeaderHelper *\brief gets the info from 0018,0088 : Space Between Slices @@ -256,7 +198,6 @@ float gdcmHeaderHelper::GetYSpacing() { * @return Z dimension of a voxel-to be */ float gdcmHeaderHelper::GetZSpacing() { - // TODO : translate into English // Spacing Between Slices : distance entre le milieu de chaque coupe // Les coupes peuvent etre : // jointives (Spacing between Slices = Slice Thickness) @@ -267,11 +208,11 @@ float gdcmHeaderHelper::GetZSpacing() { // Si le Spacing Between Slices est absent, // on suppose que les coupes sont jointives - std::string StrSpacingBSlices = GetPubElValByNumber(0x0018,0x0088); + std::string StrSpacingBSlices = GetEntryByNumber(0x0018,0x0088); if (StrSpacingBSlices == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetZSpacing: unfound StrSpacingBSlices"); - std::string StrSliceThickness = GetPubElValByNumber(0x0018,0x0050); + std::string StrSliceThickness = GetEntryByNumber(0x0018,0x0050); if (StrSliceThickness == GDCM_UNFOUND) return 1.; else @@ -285,8 +226,112 @@ float gdcmHeaderHelper::GetZSpacing() { } } -//---------------------------------------------------------------------------- -// +float gdcmHeaderHelper::GetRescaleIntercept() +{ + float resInter = 0.; + std::string StrRescInter = GetEntryByNumber(0x0028,0x1052); //0028 1052 DS IMG Rescale Intercept + if (StrRescInter != GDCM_UNFOUND) { + if( sscanf( StrRescInter.c_str(), "%f", &resInter) != 1) { + dbg.Verbose(0, "gdcmHeader::GetRescaleIntercept: Rescale Slope is empty"); + // bug in the element 0x0028,0x1052 + } + } + return resInter; +} + +float gdcmHeaderHelper::GetRescaleSlope() +{ + float resSlope = 1.; + std::string StrRescSlope = GetEntryByNumber(0x0028,0x1053); //0028 1053 DS IMG Rescale Slope + if (StrRescSlope != GDCM_UNFOUND) { + if( sscanf( StrRescSlope.c_str(), "%f", &resSlope) != 1) { + dbg.Verbose(0, "gdcmHeader::GetRescaleSlope: Rescale Slope is empty"); + // bug in the element 0x0028,0x1053 + } + } + return resSlope; +} + +/** + * \ingroup gdcmHeaderHelper + * \brief This function is intended to user who doesn't whan + * \ to have to manage a LUT and expects to get an RBG Pixel image + * \ (or a monochrome one ...) + * \warning to be used with GetImagePixels() + * @return 1 if Gray level, 3 if Color (RGB, YBR or PALETTE COLOR) + */ +int gdcmHeaderHelper::GetNumberOfScalarComponents() { + + if (GetSamplesPerPixel() ==3) + return 3; + + // 0028 0100 US IMG Bits Allocated + // (in order no to be messed up by old RGB images) + if (gdcmHeader::GetEntryByNumber(0x0028,0x0100) == "24") + return 3; + + std::string PhotometricInterpretation = + gdcmHeader::GetEntryByNumber(0x0028,0x0004); + + if ( ( PhotometricInterpretation == "PALETTE COLOR ") ) { + if (HasLUT()) // PALETTE COLOR is NOT enough + return 3; + else + return 1; + } + + //beware of trailing space at end of string + if (PhotometricInterpretation.find(GDCM_UNFOUND) < + PhotometricInterpretation.length() || + PhotometricInterpretation.find("MONOCHROME1") < + PhotometricInterpretation.length() || + PhotometricInterpretation.find("MONOCHROME2") < + PhotometricInterpretation.length() ) + return 1; + else + // we assume that *all* kinds of YBR are dealt with + return 3; +} + +/** + * \ingroup gdcmHeaderHelper + * \brief This function is intended to user that DOESN'T want + * \to get RGB pixels image when it's stored as a PALETTE COLOR image + * \ - the (vtk) user is supposed to know how deal with LUTs - + * \warning to be used with GetImagePixelsRaw() + * @return 1 if Gray level, 3 if Color (RGB or YBR - NOT 'PALETTE COLOR' -) + */ +int gdcmHeaderHelper::GetNumberOfScalarComponentsRaw() { + + // 0028 0100 US IMG Bits Allocated + // (in order no to be messed up by old RGB images) + if (gdcmHeader::GetEntryByNumber(0x0028,0x0100) == "24") + return 3; + + // we assume that *all* kinds of YBR are dealt with + return GetSamplesPerPixel(); +} + +std::string gdcmHeaderHelper::GetStudyUID() +{ + return GetEntryByNumber(0x0020,0x000d); //0020 000d UI REL Study Instance UID +} + +std::string gdcmHeaderHelper::GetSeriesUID() +{ + return GetEntryByNumber(0x0020,0x000e); //0020 000e UI REL Series Instance UID +} + +std::string gdcmHeaderHelper::GetClassUID() +{ + return GetEntryByNumber(0x0008,0x0016); //0008 0016 UI ID SOP Class UID +} + +std::string gdcmHeaderHelper::GetInstanceUID() +{ + return GetEntryByNumber(0x0008,0x0018); //0008 0018 UI ID SOP Instance UID +} + // Image Position Patient (0020,0032): // If not found (ACR_NEMA) we try Image Position (0020,0030) // If not found (ACR-NEMA), we consider Slice Location (0020,1041) @@ -296,7 +341,6 @@ float gdcmHeaderHelper::GetZSpacing() { // TODO : find a way to inform the caller nothing was found // TODO : How to tell the caller a wrong number of values was found? - /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0020,0032 : Image Position Patient @@ -306,11 +350,11 @@ float gdcmHeaderHelper::GetZSpacing() { */ float gdcmHeaderHelper::GetXOrigin() { float xImPos, yImPos, zImPos; - std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); + std::string StrImPos = GetEntryByNumber(0x0020,0x0032); if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position Patient (0020,0032)"); - StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images + StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position (RET) (0020,0030)"); // How to tell the caller nothing was found ? @@ -321,7 +365,7 @@ float gdcmHeaderHelper::GetXOrigin() { return 0.; return xImPos; } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0020,0032 : Image Position Patient @@ -331,11 +375,11 @@ float gdcmHeaderHelper::GetXOrigin() { */ float gdcmHeaderHelper::GetYOrigin() { float xImPos, yImPos, zImPos; - std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); + std::string StrImPos = GetEntryByNumber(0x0020,0x0032); if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position Patient (0020,0032)"); - StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images + StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position (RET) (0020,0030)"); // How to tell the caller nothing was found ? @@ -346,7 +390,7 @@ float gdcmHeaderHelper::GetYOrigin() { return 0.; return yImPos; } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0020,0032 : Image Position Patient @@ -358,7 +402,7 @@ float gdcmHeaderHelper::GetYOrigin() { */ float gdcmHeaderHelper::GetZOrigin() { float xImPos, yImPos, zImPos; - std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); + std::string StrImPos = GetEntryByNumber(0x0020,0x0032); if (StrImPos != GDCM_UNFOUND) { if( sscanf( StrImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Image Position Patient (0020,0032)"); @@ -367,7 +411,7 @@ float gdcmHeaderHelper::GetZOrigin() { return zImPos; } } - StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images + StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images if (StrImPos != GDCM_UNFOUND) { if( sscanf( StrImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Image Position (RET) (0020,0030)"); @@ -376,7 +420,7 @@ float gdcmHeaderHelper::GetZOrigin() { return zImPos; } } - std::string StrSliceLocation = GetPubElValByNumber(0x0020,0x1041);// for *very* old ACR-NEMA images + std::string StrSliceLocation = GetEntryByNumber(0x0020,0x1041);// for *very* old ACR-NEMA images if (StrSliceLocation != GDCM_UNFOUND) { if( sscanf( StrSliceLocation.c_str(), "%f", &zImPos) !=1) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Slice Location (0020,1041)"); @@ -386,7 +430,7 @@ float gdcmHeaderHelper::GetZOrigin() { } } dbg.Verbose(0, "gdcmHeader::GetZImagePosition: unfound Slice Location (0020,1041)"); - std::string StrLocation = GetPubElValByNumber(0x0020,0x0050); + std::string StrLocation = GetEntryByNumber(0x0020,0x0050); if (StrLocation != GDCM_UNFOUND) { if( sscanf( StrLocation.c_str(), "%f", &zImPos) !=1) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Location (0020,0050)"); @@ -398,7 +442,7 @@ float gdcmHeaderHelper::GetZOrigin() { dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Location (0020,0050)"); return 0.; // Hopeless } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0020,0013 : Image Number @@ -411,20 +455,20 @@ int gdcmHeaderHelper::GetImageNumber() { //binary conversion rules. This may be preferable to sscanf() since atoi() is a much smaller, // simpler and faster function. sscanf() can do all possible conversions whereas atoi() can //only do single decimal integer conversions. - std::string StrImNumber = GetPubElValByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number + std::string StrImNumber = GetEntryByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number if (StrImNumber != GDCM_UNFOUND) { return atoi( StrImNumber.c_str() ); } return 0; //Hopeless } -//---------------------------------------------------------------------------- + /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0008,0060 : Modality * @return ModalityType */ ModalityType gdcmHeaderHelper::GetModality(void) { - std::string StrModality = GetPubElValByNumber(0x0008,0x0060); //0008 0060 CS ID Modality + std::string StrModality = GetEntryByNumber(0x0008,0x0060); //0008 0060 CS ID Modality if (StrModality != GDCM_UNFOUND) { if ( StrModality.find("AU") < StrModality.length()) return AU; else if ( StrModality.find("AS") < StrModality.length()) return AS; @@ -477,72 +521,6 @@ ModalityType gdcmHeaderHelper::GetModality(void) { return Unknow; } -//---------------------------------------------------------------------------- -std::string gdcmHeaderHelper::GetStudyUID() -{ - return GetPubElValByNumber(0x0020,0x000d); //0020 000d UI REL Study Instance UID -} -//---------------------------------------------------------------------------- -std::string gdcmHeaderHelper::GetSeriesUID() -{ - return GetPubElValByNumber(0x0020,0x000e); //0020 000e UI REL Series Instance UID -} -//---------------------------------------------------------------------------- -std::string gdcmHeaderHelper::GetClassUID() -{ - return GetPubElValByNumber(0x0008,0x0016); //0008 0016 UI ID SOP Class UID -} -//---------------------------------------------------------------------------- -std::string gdcmHeaderHelper::GetInstanceUID() -{ - return GetPubElValByNumber(0x0008,0x0018); //0008 0018 UI ID SOP Instance UID -} -//---------------------------------------------------------------------------- -float gdcmHeaderHelper::GetRescaleIntercept() -{ - float resInter = 0.; - std::string StrRescInter = GetPubElValByNumber(0x0028,0x1052); //0028 1052 DS IMG Rescale Intercept - if (StrRescInter != GDCM_UNFOUND) { - if( sscanf( StrRescInter.c_str(), "%f", &resInter) != 1) { - dbg.Verbose(0, "gdcmHeader::GetRescaleIntercept: Rescale Slope is empty"); - // bug in the element 0x0028,0x1052 - } - } - return resInter; -} -//---------------------------------------------------------------------------- -float gdcmHeaderHelper::GetRescaleSlope() -{ - float resSlope = 1.; - std::string StrRescSlope = GetPubElValByNumber(0x0028,0x1053); //0028 1053 DS IMG Rescale Slope - if (StrRescSlope != GDCM_UNFOUND) { - if( sscanf( StrRescSlope.c_str(), "%f", &resSlope) != 1) { - dbg.Verbose(0, "gdcmHeader::GetRescaleSlope: Rescale Slope is empty"); - // bug in the element 0x0028,0x1053 - } - } - return resSlope; -} - - - - - - - - - -gdcmSerieHeaderHelper::~gdcmSerieHeaderHelper() -{ - //! \todo - for (std::list::iterator it = CoherentGdcmFileList.begin(); - it != CoherentGdcmFileList.end(); it++) - { - delete *it; - } - CoherentGdcmFileList.clear(); -} -//---------------------------------------------------------------------------- /** * \ingroup gdcmHeaderHelper * \brief gets the info from 0020,0037 : Image Orientation Patient @@ -553,7 +531,7 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { //iop is supposed to be float[6] iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0; - std::string StrImOriPat = GetPubElValByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient) + std::string StrImOriPat = GetEntryByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient) if (StrImOriPat != GDCM_UNFOUND) { if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) { @@ -565,7 +543,7 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { } //For ACR-NEMA - StrImOriPat = GetPubElValByNumber(0x0020,0x0035); //0020 0035 DS REL Image Orientation (RET) + StrImOriPat = GetEntryByNumber(0x0020,0x0035); //0020 0035 DS REL Image Orientation (RET) if (StrImOriPat != GDCM_UNFOUND) { if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) { @@ -577,30 +555,59 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { } } -//---------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Protected + +//----------------------------------------------------------------------------- +// Private + +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +// gdcmSerieHeaderHelper +//----------------------------------------------------------------------------- +// Constructor / Destructor +gdcmSerieHeaderHelper::~gdcmSerieHeaderHelper() +{ + //! \todo + for (std::list::iterator it = CoherentGdcmFileList.begin(); + it != CoherentGdcmFileList.end(); it++) + { + delete *it; + } + CoherentGdcmFileList.clear(); +} + +//----------------------------------------------------------------------------- +// Print + +//----------------------------------------------------------------------------- +// Public /** - * \ingroup gdcmHeaderHelper - * \brief add a gdcmFile to the list based on file name - */ + * \ingroup gdcmHeaderHelper + * \brief add a gdcmFile to the list based on file name + */ void gdcmSerieHeaderHelper::AddFileName(std::string filename) { gdcmHeaderHelper *GdcmFile = new gdcmHeaderHelper( filename.c_str() ); this->CoherentGdcmFileList.push_back( GdcmFile ); } -//---------------------------------------------------------------------------- + /** - * \ingroup gdcmHeaderHelper - * \brief add a gdcmFile to the list - */ + * \ingroup gdcmHeaderHelper + * \brief add a gdcmFile to the list + */ void gdcmSerieHeaderHelper::AddGdcmFile(gdcmHeaderHelper *file) { this->CoherentGdcmFileList.push_back( file ); } -//---------------------------------------------------------------------------- + /** - * \ingroup gdcmHeaderHelper - * \brief \todo - */ + * \ingroup gdcmHeaderHelper + * \brief \todo + */ void gdcmSerieHeaderHelper::SetDirectory(std::string dir) { std::list filenames_list; @@ -613,7 +620,7 @@ void gdcmSerieHeaderHelper::SetDirectory(std::string dir) this->CoherentGdcmFileList.push_back( file ); } } -//---------------------------------------------------------------------------- + //This could be implemented in a 'Strategy Pattern' approach //But as I don't know how to do it, I leave it this way //BTW, this is also a Strategy, I don't know this is the best approach :) @@ -632,17 +639,27 @@ void gdcmSerieHeaderHelper::OrderGdcmFileList() FileNameOrdering(); } } -//---------------------------------------------------------------------------- + +std::list &gdcmSerieHeaderHelper::GetGdcmFileList() +{ + return CoherentGdcmFileList; +} + +//----------------------------------------------------------------------------- +// Protected + +//----------------------------------------------------------------------------- +// Private /** - * \ingroup gdcmHeaderHelper - * \brief - We may order, considering : - -# Image Number - -# Image Position Patient - -# More to come :) -*/ -//based on Jolinda's algorithm + * \ingroup gdcmHeaderHelper + * \brief + * We may order, considering : + * -# Image Number + * -# Image Position Patient + * -# More to come :) + */ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() +//based on Jolinda's algorithm { //iop is calculated based on the file file float *cosines = new float[6]; @@ -749,8 +766,9 @@ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() return true; } -//---------------------------------------------------------------------------- + //Based on Image Number + bool gdcmSerieHeaderHelper::ImageNumberOrdering() { int min, max, pos; @@ -783,7 +801,7 @@ bool gdcmSerieHeaderHelper::ImageNumberOrdering() partition[pos - min]++; } - unsigned char mult; + unsigned char mult = 1; for(int i=0; i &gdcmSerieHeaderHelper::GetGdcmFileList() -{ - return CoherentGdcmFileList; -} -//---------------------------------------------------------------------------- + +//-----------------------------------------------------------------------------