X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDicomDir.cxx;h=dae78e85c9b8ce7bf142022c085583c518bea0b9;hb=d9ac99c203134d9aa1ced194746748bbb1e005ac;hp=2ca54af0f96aee3e5e6db84d9a11ac7ebf90e6dc;hpb=906464b1c71b1b623f8202a693e75a358a5bd965;p=gdcm.git diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index 2ca54af0..dae78e85 100644 --- a/src/gdcmDicomDir.cxx +++ b/src/gdcmDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDicomDir.cxx,v $ Language: C++ - Date: $Date: 2006/02/16 20:06:13 $ - Version: $Revision: 1.186 $ + Date: $Date: 2007/04/12 13:06:03 $ + Version: $Revision: 1.192 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -26,6 +26,7 @@ #include "gdcmDicomDirSerie.h" #include "gdcmDicomDirVisit.h" #include "gdcmDicomDirImage.h" +#include "gdcmDicomDirPrivate.h" #include "gdcmDicomDirPatient.h" #include "gdcmDicomDirMeta.h" #include "gdcmDicomDirElement.h" @@ -129,7 +130,7 @@ DicomDir::DicomDir() NewMeta(); } -#ifndef GDCM_LEGACY_REMOVE +//#ifndef GDCM_LEGACY_REMOVE /** * \brief Constructor Parses recursively the directory and creates the DicomDir * or uses an already built DICOMDIR, depending on 'parseDir' value. @@ -144,20 +145,22 @@ DicomDir::DicomDir() * @deprecated use : new DicomDir() + [ SetLoadMode(lm) + ] SetDirectoryName(name) * or : new DicomDir() + SetFileName(name) */ + /* DicomDir::DicomDir(std::string const &fileName, bool parseDir ): Document( ) { // At this step, Document constructor is already executed, // whatever user passed (either a root directory or a DICOMDIR) // and whatever the value of parseDir was. - // (nothing is cheked in Document constructor, to avoid overhead) + // (nothing is checked in Document constructor, to avoid overhead) ParseDir = parseDir; SetLoadMode (LD_ALL); // concerns only dicom files SetFileName( fileName ); Load( ); } -#endif +*/ +//#endif /** * \brief Canonical destructor @@ -189,7 +192,7 @@ bool DicomDir::Load( ) } return DoTheLoadingJob( ); } -#ifndef GDCM_LEGACY_REMOVE +//#ifndef GDCM_LEGACY_REMOVE /** * \brief Loader. (DEPRECATED : kept not to break the API) * @param fileName file to be open for parsing @@ -197,6 +200,7 @@ bool DicomDir::Load( ) * or no tag was found. * @deprecated use SetFileName(n) + Load() instead */ + /* bool DicomDir::Load(std::string const &fileName ) { // We should clean out anything that already exists. @@ -210,7 +214,8 @@ bool DicomDir::Load(std::string const &fileName ) } return DoTheLoadingJob( ); } -#endif +*/ +//#endif /** * \brief Does the Loading Job (internal use only) @@ -246,7 +251,9 @@ bool DicomDir::DoTheLoadingJob( ) return false; } else + { CreateDicomDir(); + } } else { @@ -310,8 +317,9 @@ bool DicomDir::IsReadable() DicomDirMeta *DicomDir::NewMeta() { if ( MetaElems ) + { MetaElems->Delete(); - + } DocEntry *entry = GetFirstEntry(); if ( entry ) { @@ -649,7 +657,7 @@ void DicomDir::CreateDicomDir() if ( v == "IMAGE " ) { - si = DicomDirImage::New(true); + si = DicomDirImage::New(true); // true = empty if ( !AddImageToEnd( static_cast(si)) ) { si->Delete(); @@ -659,7 +667,7 @@ void DicomDir::CreateDicomDir() } else if ( v == "SERIES" ) { - si = DicomDirSerie::New(true); + si = DicomDirSerie::New(true); // true = empty if ( !AddSerieToEnd( static_cast(si)) ) { si->Delete(); @@ -669,7 +677,7 @@ void DicomDir::CreateDicomDir() } else if ( v == "VISIT " ) { - si = DicomDirVisit::New(true); + si = DicomDirVisit::New(true); // true = empty if ( !AddVisitToEnd( static_cast(si)) ) { si->Delete(); @@ -679,7 +687,7 @@ void DicomDir::CreateDicomDir() } else if ( v == "STUDY " ) { - si = DicomDirStudy::New(true); + si = DicomDirStudy::New(true); // true = empty if ( !AddStudyToEnd( static_cast(si)) ) { si->Delete(); @@ -689,7 +697,7 @@ void DicomDir::CreateDicomDir() } else if ( v == "PATIENT " ) { - si = DicomDirPatient::New(true); + si = DicomDirPatient::New(true); // true = empty if ( !AddPatientToEnd( static_cast(si)) ) { si->Delete(); @@ -697,11 +705,27 @@ void DicomDir::CreateDicomDir() gdcmErrorMacro( "Add PatientToEnd failed"); } } + /// \to do : deal with PRIVATE (not so easy, since PRIVATE appears + /// at different levels ?!? ) + + else if ( v == "PRIVATE " ) // for SIEMENS 'CSA Non Image' + { + + gdcmWarningMacro( " -------------------------------------------" + << "a PRIVATE SQItem was found : " << v); + si = DicomDirPrivate::New(true); // true = empty + if ( !AddPrivateToEnd( static_cast(si)) ) + { + si->Delete(); + si = NULL; + gdcmErrorMacro( "Add PrivateToEnd failed"); + } + } else { // It was neither a 'PATIENT', nor a 'STUDY', nor a 'SERIE', // nor an 'IMAGE' SQItem. Skip to next item. - gdcmDebugMacro( " -------------------------------------------" + gdcmWarningMacro( " -------------------------------------------" << "a non PATIENT/STUDY/SERIE/IMAGE SQItem was found : " << v); @@ -809,6 +833,32 @@ bool DicomDir::AddImageToEnd(DicomDirImage *dd) return false; } +/** + * \brief AddPrivateToEnd + * @param dd SQ Item to enqueue to the DicomDirPrivate chained List + * (checked for SIEMENS 'CSA non image') + */ +bool DicomDir::AddPrivateToEnd(DicomDirPrivate *dd) +{ + if ( Patients.size() > 0 ) + { + ListDicomDirPatient::iterator itp = Patients.end(); + itp--; + + DicomDirStudy *study = (*itp)->GetLastStudy(); + if ( study ) + { + DicomDirSerie *serie = study->GetLastSerie(); + if ( serie ) + { + serie->AddPrivate(dd); + return true; + } + } + } + return false; +} + /** * \brief for each Header of the chained list, * add/update the Patient/Study/Serie/Image info @@ -889,11 +939,10 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, ListDicomDirElem elemList; ListDicomDirElem::const_iterator it; uint16_t tmpGr, tmpEl; - DictEntry *dictEntry; + //DictEntry *dictEntry; DataEntry *entry; std::string val; SQItem *si; - switch( type ) { case GDCM_DICOMDIR_IMAGE: @@ -932,7 +981,7 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, gdcmErrorMacro( "Add PatientToEnd failed"); } break; - case GDCM_DICOMDIR_META: + case GDCM_DICOMDIR_META: // never used ?!? --> Done within DoTheLoadingJob if ( MetaElems ) { MetaElems->Delete(); @@ -962,9 +1011,8 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, { tmpGr = it->Group; tmpEl = it->Elem; - dictEntry = GetPubDict()->GetEntry(tmpGr, tmpEl); - - entry = DataEntry::New( dictEntry ); + + entry = DataEntry::New(tmpGr, tmpEl, it->VR); // dicomelements file was modified, to store VR entry->SetOffset(0); // just to avoid further missprinting if ( header )