X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmSerieHelper.cxx;h=19f82fe3e6588ab1784657cad76111030b296bd8;hb=a08cf53dc69fa5e4b9e2dd4fbbfc3d476b963aa0;hp=030e1d8b8af6a93dc69acc562ed4031d5f76285b;hpb=cb3add46b276c8a5c0e9a422b4c23681fb5ab420;p=gdcm.git diff --git a/src/gdcmSerieHelper.cxx b/src/gdcmSerieHelper.cxx index 030e1d8b..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/19 09:04:58 $ - Version: $Revision: 1.13 $ + 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 @@ -19,6 +19,7 @@ #include "gdcmSerieHelper.h" #include "gdcmDirList.h" #include "gdcmFile.h" +#include "gdcmDictEntry.h" // for TranslateToKey #include "gdcmDebug.h" #include "gdcmUtil.h" @@ -36,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) { @@ -45,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; } /** @@ -67,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(); } } @@ -91,18 +93,21 @@ void SerieHelper::AddFileName(std::string const &filename) header->SetLoadMode(LoadMode); header->SetFileName( filename ); header->Load(); - //File *header = new File( filename ); // Deprecated old style + if ( header->IsReadable() ) { int allrules = 1; - // First step the user has defined a set of rules for the DICOM + // First step the user has defined a set of rules for the DICOM file // he is looking for. // make sure the file correspond to his set of rules: + +/* for(SerieRestrictions::iterator it = Restrictions.begin(); it != Restrictions.end(); ++it) { const Rule &r = *it; + // doesn't compile (no matching function...). const std::string s;// = header->GetEntryValue( r.first ); if ( !Util::DicomStringEqual(s, r.second.c_str()) ) { @@ -111,6 +116,23 @@ void SerieHelper::AddFileName(std::string const &filename) break; } } +*/ + // Just keep 'new style' for Rules + std::string s; + for(SerieExRestrictions::iterator it2 = ExRestrictions.begin(); + it2 != ExRestrictions.end(); + ++it2) + { + const ExRule &r = *it2; + s = header->GetEntryValue( r.group, r.elem ); + if ( !Util::CompareDicomString(s, r.value.c_str(), r.op) ) + { + // Argh ! This rule is unmatch let's just quit + allrules = 0; + break; + } + } + if ( allrules ) // all rules are respected: { // Allright ! we have a found a DICOM that match the user expectation. @@ -197,6 +219,7 @@ 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 @@ -204,6 +227,27 @@ void SerieHelper::AddGdcmFile(File *header) * This method is a user level, value is not required to be formatted as a DICOM * string */ +void SerieHelper::AddRestriction(uint16_t group, uint16_t elem, + std::string const &value, int op) +{ + ExRule r; + r.group = group; + r.elem = elem; + r.value = value; + r.op = op; + ExRestrictions.push_back( r ); +} + +#ifndef GDCM_LEGACY_REMOVE +/** + * \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 + * @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) { Rule r; @@ -211,6 +255,7 @@ void SerieHelper::AddRestriction(TagKey const &key, std::string const &value) r.second = value; Restrictions.push_back( r ); } +#endif /** * \brief Sets the root Directory @@ -251,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 @@ -412,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(); @@ -431,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 @@ -460,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; } @@ -470,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 @@ -477,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; }