X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmSerieHeader.cxx;h=3349af5882b6840d76ee2e4bdea726267a56dfda;hb=4210e3a97df19bf964da287698f8c7997755015a;hp=d4f65013b564f8307ea698cf12ae3d403268cd6d;hpb=3869544e5153cebbd44ad8778cbaf35883bfb993;p=gdcm.git diff --git a/src/gdcmSerieHeader.cxx b/src/gdcmSerieHeader.cxx index d4f65013..3349af58 100644 --- a/src/gdcmSerieHeader.cxx +++ b/src/gdcmSerieHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSerieHeader.cxx,v $ Language: C++ - Date: $Date: 2005/01/07 22:19:48 $ - Version: $Revision: 1.4 $ + Date: $Date: 2005/01/18 11:56:52 $ + Version: $Revision: 1.11 $ 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 "gdcmSerieHeader.h" #include "gdcmDirList.h" #include "gdcmHeader.h" +#include "gdcmDebug.h" #include #include @@ -33,6 +34,8 @@ typedef std::vector GdcmHeaderVector; SerieHeader::SerieHeader() { CoherentGdcmFileList.clear(); + // Later will contain: 0020 000e UI REL Series Instance UID + CurrentSerieUID = ""; } SerieHeader::~SerieHeader() @@ -57,17 +60,34 @@ SerieHeader::~SerieHeader() */ void SerieHeader::AddFileName(std::string const &filename) { - Header *header = new Header( filename ); - CoherentGdcmFileList.push_back( header ); -} - -/** - * \brief add a File to the list - * @param file Header to add - */ -void SerieHeader::AddGdcmFile(Header *file) -{ - CoherentGdcmFileList.push_back( file ); + //directly use string and not const char*: + Header *header = new Header( filename ); + if( header->IsReadable() ) + { + // 0020 000e UI REL Series Instance UID + std::string uid = header->GetEntry (0x0020, 0x000e); + // if uid == GDCM_UNFOUND then consistenly we should find GDCM_UNFOUND + // no need here to do anything special + if( CurrentSerieUID == "" ) + { + // Set the current one + CurrentSerieUID = uid; + } + if( CurrentSerieUID == uid ) + { + // Current Serie UID and DICOM header seems to match add the file: + CoherentGdcmFileList.push_back( header ); + } + else + { + gdcmVerboseMacro("Wrong Serie Instance UID should be:" << CurrentSerieUID ); + } + } + else + { + gdcmVerboseMacro("Could not read file: " << filename ); + delete header; + } } /** @@ -76,21 +96,14 @@ void SerieHeader::AddGdcmFile(Header *file) */ void SerieHeader::SetDirectory(std::string const &dir) { - DirList filenames_list(dir); //OS specific + CurrentSerieUID = ""; //Reset previous Serie Instance UID + DirList dirList(dir); //OS specific - for( DirList::const_iterator it = filenames_list.begin(); + DirListType filenames_list = dirList.GetFilenames(); + for( DirListType::const_iterator it = filenames_list.begin(); it != filenames_list.end(); ++it) { - //directly use string and not const char*: - Header *header = new Header( *it ); - if( header->IsReadable() ) - { - CoherentGdcmFileList.push_back( header ); - } - else - { - delete header; - } + AddFileName( *it ); } } @@ -122,7 +135,6 @@ void SerieHeader::OrderGdcmFileList() //----------------------------------------------------------------------------- // Private /** - * \ingroup Header * \brief sorts the images, according to their Patient Position * We may order, considering : * -# Image Number @@ -134,7 +146,7 @@ bool SerieHeader::ImagePositionPatientOrdering() //based on Jolinda's algorithm { //iop is calculated based on the file file - float *cosines = new float[6]; + float cosines[6]; float normal[3]; float ipp[3]; float dist; @@ -172,7 +184,6 @@ bool SerieHeader::ImagePositionPatientOrdering() if( dist == 0 ) { - delete[] cosines; return false; } @@ -195,7 +206,6 @@ bool SerieHeader::ImagePositionPatientOrdering() if( dist == 0 ) { - delete[] cosines; return false; } @@ -226,8 +236,15 @@ bool SerieHeader::ImagePositionPatientOrdering() //2*n sort algo !! //Assumption: all files are present (no one missing) pos = (int)( fabs( (distlist[n]-min)/step) + .5 ); - - CoherentGdcmFileVector[pos] = *it2; + + // a Dicom 'Serie' may contain scout views + // and images may have differents directions + // -> More than one may have the same 'pos' + // Sorting has then NO meaning ! + if (CoherentGdcmFileVector[pos]==NULL) + CoherentGdcmFileVector[pos] = *it2; + else + return false; } CoherentGdcmFileList.clear(); //this doesn't delete list's element, node only @@ -241,13 +258,11 @@ bool SerieHeader::ImagePositionPatientOrdering() distlist.clear(); CoherentGdcmFileVector.clear(); - delete[] cosines; return true; } /** - * \ingroup Header * \brief sorts the images, according to their Image Number * @return false only if the header is bugged ! */ @@ -305,12 +320,11 @@ bool SerieHeader::ImageNumberOrdering() delete[] partition; - return (mult != 0); + return mult != 0; } /** - * \ingroup Header * \brief sorts the images, according to their File Name * @return false only if the header is bugged ! */