X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmSerieHelper.cxx;h=c049e8b45c4807550742db86d83746835c17330b;hb=b823b9aedd899f5bd07315943ea3cedc4637ee8a;hp=aad62e48f965f5f25f1324e3a9ca1d5babe26300;hpb=43d3220922f848b2c9b21e2a9c71b3063bff9048;p=gdcm.git diff --git a/src/gdcmSerieHelper.cxx b/src/gdcmSerieHelper.cxx index aad62e48..c049e8b4 100644 --- a/src/gdcmSerieHelper.cxx +++ b/src/gdcmSerieHelper.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSerieHelper.cxx,v $ Language: C++ - Date: $Date: 2005/07/21 06:39:24 $ - Version: $Revision: 1.15 $ + Date: $Date: 2005/08/31 16:24:19 $ + Version: $Revision: 1.20 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -29,6 +29,7 @@ namespace gdcm { +//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Constructor / Destructor @@ -37,7 +38,9 @@ namespace gdcm */ SerieHelper::SerieHelper() { - // For all the File lists of the gdcm::Serie + UserLessThanFunction = 0; + + // For all the File lists that may already exist within the gdcm::Serie FileList *l = GetFirstCoherentFileList(); while (l) { @@ -46,12 +49,13 @@ SerieHelper::SerieHelper() it != l->end(); ++it) { - delete *it; + delete *it; // remove entry } l->clear(); - delete l;; + delete l; // remove the list l = GetNextCoherentFileList(); } + DirectOrder = true; } /** @@ -68,10 +72,10 @@ SerieHelper::~SerieHelper() it != l->end(); ++it) { - delete *it; + delete *it; // remove entry } l->clear(); - delete l; + delete l; // remove the list l = GetNextCoherentFileList(); } } @@ -219,13 +223,16 @@ void SerieHelper::AddGdcmFile(File *header) // Even if a rule was unmatch we don't deallocate the gdcm::File: } - /** * \brief add a rules for restricting a DICOM file to be in the serie we are * trying to find. For example you can select only the DICOM file from a * directory which would have a particular EchoTime==4.0. * This method is a user level, value is not required to be formatted as a DICOM * string + * @param group Group number of the target tag. + * @param elem Element number of the target tag. + * @param value value to be checked to exclude File + * @param op operator we want to use to check */ void SerieHelper::AddRestriction(uint16_t group, uint16_t elem, std::string const &value, int op) @@ -245,6 +252,9 @@ void SerieHelper::AddRestriction(uint16_t group, uint16_t elem, * directory which would have a particular EchoTime==4.0. * This method is a user level, value is not required to be formatted as a DICOM * string + * @param group Group number of the target tag. + * @param elem Element number of the target tag. + * @param value value to be checked to exclude File * @deprecated use : AddRestriction(uint16_t group, uint16_t elem, * std::string const &value, int op); */ @@ -282,7 +292,13 @@ void SerieHelper::SetDirectory(std::string const &dir, bool recursive) */ void SerieHelper::OrderFileList(FileList *coherentFileList) { - if ( ImagePositionPatientOrdering( coherentFileList ) ) + + if ( SerieHelper::UserLessThanFunction ) + { + UserOrdering( coherentFileList ); + return; + } + else if ( ImagePositionPatientOrdering( coherentFileList ) ) { return ; } @@ -296,6 +312,36 @@ void SerieHelper::OrderFileList(FileList *coherentFileList) } } +/** + * \brief Elementary coherence checking of the files with the same Serie UID + * Only sizes and pixel type are checked right now ... + */ +bool SerieHelper::IsCoherent(FileList *coherentFileList) +{ + if(coherentFileList->size() == 1) + return true; + + FileList::const_iterator it = coherentFileList->begin(); + + int nX = (*it)->GetXSize(); + int nY = (*it)->GetYSize(); + int pixelSize = (*it)->GetPixelSize(); + + it ++; + for ( ; + it != coherentFileList->end(); + ++it) + { + if ( (*it)->GetXSize() != nX ) + return false; + if ( (*it)->GetYSize() != nY ) + return false; + if ( (*it)->GetPixelSize() != pixelSize ) + return false; + // probabely more is to be checked (?) + } + return true; +} /** * \brief Get the first List while visiting the CoherentFileListHT * @return The first FileList if found, otherwhise NULL @@ -457,13 +503,26 @@ bool SerieHelper::ImagePositionPatientOrdering( FileList *fileList ) } fileList->clear(); // doesn't delete list elements, only nodes - - //VC++ don't understand what scope is !! it -> it3 - for (FileVector::const_iterator it3 = CoherentFileVector.begin(); - it3 != CoherentFileVector.end(); ++it3) - { - fileList->push_back( *it3 ); + + if (DirectOrder) + { + //VC++ don't understand what scope is !! it -> it3 + for (FileVector::const_iterator it3 = CoherentFileVector.begin(); + it3 != CoherentFileVector.end(); ++it3) + { + fileList->push_back( *it3 ); + } } + else // user asked for reverse order + { + FileVector::const_iterator it4; + it4 = CoherentFileVector.end(); + do + { + it4--; + fileList->push_back( *it4 ); + } while (it4 != CoherentFileVector.begin() ); + } distlist.clear(); CoherentFileVector.clear(); @@ -476,6 +535,10 @@ bool SerieHelper::ImageNumberLessThan(File *file1, File *file2) return file1->GetImageNumber() < file2->GetImageNumber(); } +bool SerieHelper::ImageNumberGreaterThan(File *file1, File *file2) +{ + return file1->GetImageNumber() > file2->GetImageNumber(); +} /** * \brief sorts the images, according to their Image Number * \note Works only on bona fide files (i.e image number is a character string @@ -505,16 +568,23 @@ bool SerieHelper::ImageNumberOrdering(FileList *fileList) gdcmWarningMacro( " 'Image numbers' not coherent. No ImageNumberOrdering sort performed."); return false; } - std::sort(fileList->begin(), fileList->end(), SerieHelper::ImageNumberLessThan ); + if (DirectOrder) + std::sort(fileList->begin(), fileList->end(), SerieHelper::ImageNumberLessThan ); + else + std::sort(fileList->begin(), fileList->end(), SerieHelper::ImageNumberGreaterThan ); return true; } bool SerieHelper::FileNameLessThan(File *file1, File *file2) { - return file1->GetFileName() < file2->GetFileName(); + return file1->GetFileName() < file2->GetFileName(); } +bool SerieHelper::FileNameGreaterThan(File *file1, File *file2) +{ + return file1->GetFileName() > file2->GetFileName(); +} /** * \brief sorts the images, according to their File Name * @param fileList Coherent File list (same Serie UID) to sort @@ -522,7 +592,26 @@ bool SerieHelper::FileNameLessThan(File *file1, File *file2) */ bool SerieHelper::FileNameOrdering(FileList *fileList) { - std::sort(fileList->begin(), fileList->end(), SerieHelper::FileNameLessThan); + if (DirectOrder) + std::sort(fileList->begin(), fileList->end(), SerieHelper::FileNameLessThan); + else + std::sort(fileList->begin(), fileList->end(), SerieHelper::FileNameGreaterThan); + + return true; +} + +/** + * \brief sorts the images, according to user supplied function + * @param fileList Coherent File list (same Serie UID) to sort + * @return false only if the header is bugged ! + */ +bool SerieHelper::UserOrdering(FileList *fileList) +{ + std::sort(fileList->begin(), fileList->end(), SerieHelper::UserLessThanFunction); + if (!DirectOrder) + { + std::reverse(fileList->begin(), fileList->end()); + } return true; }