X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmSerieHelper.cxx;h=19f82fe3e6588ab1784657cad76111030b296bd8;hb=af52d821b66539803b39c1ca733ae8a09aa85379;hp=bed98f31e83b515739624ca66ed67fb0da06f779;hpb=eeb624df6a1661e969566c200505f3dac84f4cd6;p=gdcm.git diff --git a/src/gdcmSerieHelper.cxx b/src/gdcmSerieHelper.cxx index bed98f31..19f82fe3 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 05:00:15 $ - Version: $Revision: 1.14 $ + Date: $Date: 2005/07/30 18:13:24 $ + Version: $Revision: 1.17 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -37,7 +37,7 @@ namespace gdcm */ SerieHelper::SerieHelper() { - // For all the File lists of the gdcm::Serie + // For all the File lists that may already exist within the gdcm::Serie FileList *l = GetFirstCoherentFileList(); while (l) { @@ -46,12 +46,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 +69,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,7 +220,6 @@ 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 @@ -245,7 +245,8 @@ 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 - * @deprecated use : + * @deprecated use : AddRestriction(uint16_t group, uint16_t elem, + * std::string const &value, int op); */ void SerieHelper::AddRestriction(TagKey const &key, std::string const &value) { @@ -295,6 +296,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 @@ -456,13 +487,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(); @@ -475,6 +519,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 @@ -504,7 +552,10 @@ 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; } @@ -514,6 +565,10 @@ bool SerieHelper::FileNameLessThan(File *file1, File *file2) 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 @@ -521,7 +576,11 @@ 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; }