X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDicomDir.cxx;h=fb566c629744cdda1fbc37418442a2c1e35e7c18;hb=e25987c451d6f797a5e5288ac1a926cfd767fe57;hp=b74bad25d923d464d552847d8b916b2980120e68;hpb=72911a1e847536580a21f85f211c0a14cdcf944c;p=gdcm.git diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index b74bad25..fb566c62 100644 --- a/src/gdcmDicomDir.cxx +++ b/src/gdcmDicomDir.cxx @@ -1,15 +1,7 @@ // gdcmDicomDir.cxx //----------------------------------------------------------------------------- -#include "gdcmDicomDir.h" -#include "gdcmDicomDirStudy.h" -#include "gdcmDicomDirSerie.h" -#include "gdcmDicomDirImage.h" -#include "gdcmDirList.h" -#include "gdcmUtil.h" - #include #include - #include #include @@ -19,28 +11,39 @@ #include #endif +#include "gdcmDicomDir.h" +#include "gdcmDicomDirStudy.h" +#include "gdcmDicomDirSerie.h" +#include "gdcmDicomDirImage.h" +#include "gdcmDirList.h" +#include "gdcmUtil.h" +#include "gdcmDebug.h" +#include "gdcmGlobal.h" + //----------------------------------------------------------------------------- // For full DICOMDIR description, see: // PS 3.3-2003, pages 731-750 //----------------------------------------------------------------------------- + // Constructor / Destructor -/* - * \ingroup gdcmDicomDir - * \brief Constructor : Parses recursively the directory and creates the DicomDir - * \ or uses an already built DICOMDIR, depending on 'parseDir' value - * @param Name name of the root directory (parseDir = true) - * name of the DICOMDIR (parseDir = false) - * @param parseDir - true if user passed an entry point +/** + * \brief Constructor Parses recursively the directory and creates the DicomDir + * or uses an already built DICOMDIR, depending on 'parseDir' value. + * @param FileName name + * - of the root directory (parseDir = true) + * - of the DICOMDIR (parseDir = false) + * @param parseDir boolean + * - true if user passed an entry point * and wants to explore recursively the directories - * - false if user passed an already built DICOMDIR file + * - false if user passed an already built DICOMDIR file * and wants to use it - * @param exception_on_error whether we want to throw an exception or not + * @param exception_on_error whether we want to throw an exception or not */ -gdcmDicomDir::gdcmDicomDir(const char *Name, bool parseDir, +gdcmDicomDir::gdcmDicomDir(const char *FileName, bool parseDir, bool exception_on_error): - gdcmParser(Name,exception_on_error,true) // true : enable SeQuences + gdcmParser(FileName,exception_on_error,true) // true : enable SeQuences { // que l'on ai passe un root directory ou un DICOMDIR // et quelle que soit la valeur de parseDir, @@ -69,33 +72,30 @@ gdcmDicomDir::gdcmDicomDir(const char *Name, bool parseDir, // if parseDir == false, it should be tagged as an error dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : entry list empty"); - if(strlen(Name)==1 && Name[0]=='.') { // user passed '.' as Name + if(strlen(FileName)==1 && FileName[0]=='.') { // user passed '.' as Name // we get current directory name char*dummy=(char*) malloc(1000); -#ifdef _MSC_VER - _getcwd(dummy,(size_t)1000); -#else getcwd(dummy,(size_t)1000); -#endif SetFileName(dummy); // will be converted into a string free(dummy); // no longer needed } if(parseDir) { - dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : Parse directory and create the DicomDir"); - ParseDirectory(); + dbg.Verbose(0, "gdcmDicomDir::gdcmDicomDir : Parse directory" + " and create the DicomDir"); + ParseDirectory(); } } else { CreateDicomDir(); CheckBoundaries(); // to maintain consistency between // home-made gdcmDicomDir - // and the ones comming from a DICOMDIR file + // and the ones comming from a DICOMDIR file } } -/* +/** * \ingroup gdcmDicomDir * \brief Constructor : creates an empty gdcmDicomDir * @param exception_on_error whether we want to throw an exception or not @@ -122,7 +122,7 @@ gdcmDicomDir::gdcmDicomDir(bool exception_on_error): } -/* +/** * \ingroup gdcmDicomDir * \brief Canonical destructor */ @@ -143,7 +143,7 @@ gdcmDicomDir::~gdcmDicomDir() //----------------------------------------------------------------------------- // Print -/* +/** * \ingroup gdcmDicomDir * \brief Canonical Printer */ @@ -163,7 +163,7 @@ void gdcmDicomDir::Print(std::ostream &os) //----------------------------------------------------------------------------- // Public -/* +/** * \ingroup gdcmDicomDir * \brief This predicate, based on hopefully reasonable heuristics, * decides whether or not the current header was properly parsed @@ -184,7 +184,7 @@ bool gdcmDicomDir::IsReadable(void) return(true); } -/* +/** * \ingroup gdcmDicomDir * \brief fills the whole structure, starting from a root Directory */ @@ -194,11 +194,12 @@ void gdcmDicomDir::ParseDirectory(void) CreateDicomDir(); } -/* +/** * \ingroup gdcmDicomDir * \brief Set the start method to call when the parsing of the directory starts * @param method Method to call * @param arg Argument to pass to the method + * @param argDelete Argument * \warning In python : the arg parameter isn't considered */ void gdcmDicomDir::SetStartMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete) @@ -211,7 +212,7 @@ void gdcmDicomDir::SetStartMethod(gdcmMethod *method,void *arg,gdcmMethod *argDe startMethodArgDelete=argDelete; } -/* +/** * \ingroup gdcmDicomDir * \brief Set the method to delete the argument * The argument is destroyed when the method is changed or when the @@ -223,11 +224,12 @@ void gdcmDicomDir::SetStartMethodArgDelete(gdcmMethod *method) startMethodArgDelete=method; } -/* +/** * \ingroup gdcmDicomDir * \brief Set the progress method to call when the parsing of the directory progress * @param method Method to call * @param arg Argument to pass to the method + * @param argDelete Argument * \warning In python : the arg parameter isn't considered */ void gdcmDicomDir::SetProgressMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete) @@ -240,7 +242,7 @@ void gdcmDicomDir::SetProgressMethod(gdcmMethod *method,void *arg,gdcmMethod *ar progressMethodArgDelete=argDelete; } -/* +/** * \ingroup gdcmDicomDir * \brief Set the method to delete the argument * The argument is destroyed when the method is changed or when the @@ -252,14 +254,15 @@ void gdcmDicomDir::SetProgressMethodArgDelete(gdcmMethod *method) progressMethodArgDelete=method; } -/* +/** * \ingroup gdcmDicomDir * \brief Set the end method to call when the parsing of the directory ends * @param method Method to call * @param arg Argument to pass to the method + * @param argDelete Argument * \warning In python : the arg parameter isn't considered */ -void gdcmDicomDir::SetEndMethod(gdcmMethod *method,void *arg,gdcmMethod *argDelete) +void gdcmDicomDir::SetEndMethod(gdcmMethod *method, void *arg, gdcmMethod *argDelete) { if((endArg)&&(endMethodArgDelete)) endMethodArgDelete(endArg); @@ -269,7 +272,7 @@ void gdcmDicomDir::SetEndMethod(gdcmMethod *method,void *arg,gdcmMethod *argDele endMethodArgDelete=argDelete; } -/* +/** * \ingroup gdcmDicomDir * \brief Set the method to delete the argument * The argument is destroyed when the method is changed or when the class @@ -310,20 +313,18 @@ bool gdcmDicomDir::Write(std::string fileName) fwrite("DICM",4,1,fp1); free(filePreamble); UpdateDirectoryRecordSequenceLength(); - WriteDicomDirEntries(fp1); + WriteEntries(fp1); fclose(fp1); return true; } /** - * \ingroup gdcmParser - * \brief writes on disc according to the DICOMDIR format - * using the tree-like structure + * \brief Writes in a file using the tree-like structure. * @param _fp already open file pointer */ -void gdcmDicomDir::WriteDicomDirEntries(FILE *_fp) +void gdcmDicomDir::WriteEntries(FILE *_fp) { // TODO (?) tester les echecs en ecriture // (apres chaque fwrite, dans le WriteEntry) @@ -337,28 +338,28 @@ void gdcmDicomDir::WriteDicomDirEntries(FILE *_fp) ptrMeta= GetDicomDirMeta(); for(i=ptrMeta->debut();i!=ptrMeta->fin();++i) { - WriteEntry(*i,_fp,DICOMDIR); + WriteEntry(*i,_fp, ExplicitVR); } itPatient = GetDicomDirPatients().begin(); while ( itPatient != GetDicomDirPatients().end() ) { for(i=(*itPatient)->debut();i!=(*itPatient)->fin();++i) { - WriteEntry(*i,_fp,DICOMDIR); + WriteEntry(*i,_fp, ExplicitVR); } itStudy = ((*itPatient)->GetDicomDirStudies()).begin(); while (itStudy != (*itPatient)->GetDicomDirStudies().end() ) { for(i=(*itStudy)->debut();i!=(*itStudy)->fin();++i) { - WriteEntry(*i,_fp,DICOMDIR); + WriteEntry(*i,_fp, ExplicitVR); } itSerie = ((*itStudy)->GetDicomDirSeries()).begin(); while (itSerie != (*itStudy)->GetDicomDirSeries().end() ) { for(i=(*itSerie)->debut();i!=(*itSerie)->fin();++i) { - WriteEntry(*i,_fp,DICOMDIR); + WriteEntry(*i,_fp, ExplicitVR); } itImage = ((*itSerie)->GetDicomDirImages()).begin(); while (itImage != (*itSerie)->GetDicomDirImages().end() ) { for(i=(*itImage)->debut();i!=(*itImage)->fin();++i) { - WriteEntry(*i,_fp,DICOMDIR); + WriteEntry(*i,_fp, ExplicitVR); } ++itImage; } @@ -373,7 +374,7 @@ void gdcmDicomDir::WriteDicomDirEntries(FILE *_fp) //----------------------------------------------------------------------------- // Protected -/* +/** * \ingroup gdcmDicomDir * \brief create a gdcmHeader-like chained list from a root Directory * @param path entry point of the tree-like structure @@ -418,7 +419,10 @@ void gdcmDicomDir::CreateDicomDirChainedList(std::string path) CallEndMethod(); } - +/** + * \ingroup gdcmDicomDir + * \brief modifies the limits of a gdcmObject, created from a DICOMDIR file + */ void gdcmDicomDir::CheckBoundaries() { @@ -442,18 +446,18 @@ void gdcmDicomDir::CheckBoundaries() itImage = ((*itSerie)->GetDicomDirImages()).begin(); while (itImage != (*itSerie)->GetDicomDirImages().end() ) { (*itImage)->ResetBoundaries(1); - ++itImage; - } - ++itSerie; + ++itImage; + } + ++itSerie; } - ++itStudy; + ++itStudy; } ++itPatient; } } -/* +/** * \ingroup gdcmDicomDir * \brief adds a new Patient to a partially created DICOMDIR */ @@ -482,9 +486,9 @@ gdcmDicomDirPatient * gdcmDicomDir::NewPatient(void) { entry->SetValue(it->value); if(dictEntry->GetGroup()==0xfffe) - { - entry->SetLength(entry->GetValue().length()); - } + { + entry->SetLength(entry->GetValue().length()); + } else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") ) { entry->SetLength(4); @@ -516,7 +520,7 @@ gdcmDicomDirPatient * gdcmDicomDir::NewPatient(void) { return p; } -/* +/** * \ingroup gdcmDicomDir * \brief CallStartMethod */ @@ -527,7 +531,7 @@ void gdcmDicomDir::CallStartMethod(void) if(startMethod) startMethod(startArg); } -/* +/** * \ingroup gdcmDicomDir * \brief CallProgressMethod */ @@ -536,7 +540,7 @@ void gdcmDicomDir::CallProgressMethod(void) if(progressMethod) progressMethod(progressArg); } -/* +/** * \ingroup gdcmDicomDir * \brief CallEndMethod */ @@ -549,7 +553,7 @@ void gdcmDicomDir::CallEndMethod(void) //----------------------------------------------------------------------------- // Private -/* +/** * \ingroup gdcmDicomDir * \brief create a 'gdcmDicomDir' from a DICOMDIR gdcmHeader */ @@ -609,12 +613,12 @@ void gdcmDicomDir::CreateDicomDir() if(begin!=end) AddObjectToEnd(type,begin,--end2); } -/* +/** * \ingroup gdcmDicomDir * \brief AddObjectToEnd * @param type - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddObjectToEnd(gdcmDicomDirType type,ListTag::iterator begin,ListTag::iterator end) { @@ -641,11 +645,11 @@ void gdcmDicomDir::AddObjectToEnd(gdcmDicomDirType type,ListTag::iterator begin, } } -/* +/** * \ingroup gdcmDicomDir * \brief Well ... Not realy to end, there is only one occurence - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddDicomDirMetaToEnd(ListTag::iterator begin,ListTag::iterator end) { @@ -654,22 +658,22 @@ void gdcmDicomDir::AddDicomDirMetaToEnd(ListTag::iterator begin,ListTag::iterato metaElems = new gdcmDicomDirMeta(begin,end,&tagHT,&listEntries); } -/* +/** * \ingroup gdcmDicomDir * \brief AddDicomDirPatientToEnd - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddDicomDirPatientToEnd(ListTag::iterator begin,ListTag::iterator end) { patients.push_back(new gdcmDicomDirPatient(begin,end,&tagHT, &listEntries)); } -/* +/** * \ingroup gdcmDicomDir * \brief AddDicomDirStudyToEnd - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddDicomDirStudyToEnd(ListTag::iterator begin,ListTag::iterator end) { @@ -680,11 +684,11 @@ void gdcmDicomDir::AddDicomDirPatientToEnd(ListTag::iterator begin,ListTag::iter (*itp)->AddDicomDirStudy(new gdcmDicomDirStudy(begin,end,&tagHT, &listEntries)); } } -/* +/** * \ingroup gdcmDicomDir * \brief AddDicomDirSerieToEnd - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddDicomDirSerieToEnd(ListTag::iterator begin,ListTag::iterator end) { @@ -702,11 +706,11 @@ void gdcmDicomDir::AddDicomDirSerieToEnd(ListTag::iterator begin,ListTag::iterat } } -/* +/** * \ingroup gdcmDicomDir * \brief AddDicomDirImageToEnd - * @param begin - * @param end + * @param begin iterator on the first HeaderEntry within the chained List + * @param end iterator on the last HeaderEntry within the chained List */ void gdcmDicomDir::AddDicomDirImageToEnd(ListTag::iterator begin,ListTag::iterator end) { @@ -730,7 +734,7 @@ void gdcmDicomDir::AddDicomDirSerieToEnd(ListTag::iterator begin,ListTag::iterat } } -/* +/** * \ingroup gdcmDicomDir * \brief for each Header of the chained list, add/update the Patient/Study/Serie/Image info * @param path path of the root directory @@ -782,7 +786,7 @@ void gdcmDicomDir::SetElements(std::string &path, ListHeader &list) } } -/* +/** * \ingroup gdcmDicomDir * \brief adds to the HTable and at the end of the Chained List * the gdcmEntries (Dicom Elements) corresponding to the given type @@ -893,13 +897,19 @@ void gdcmDicomDir::SetElement(std::string &path,gdcmDicomDirType type,gdcmHeader //wasUpdated = 1; // is private } } - +/** + * \ingroup gdcmDicomDir + * \brief compares two dgcmHeaders + */ bool gdcmDicomDir::HeaderLessThan(gdcmHeader *header1,gdcmHeader *header2) { return(*header1<*header2); } - +/** + * \ingroup gdcmDicomDir + * \brief Sets the accurate value for the (0x0004,0x1220) element of a DICOMDIR + */ void gdcmDicomDir::UpdateDirectoryRecordSequenceLength() { int offset = 0;