X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDicomDir.cxx;h=197942142120ba5c50f81cfb16856959f90895bf;hb=2742ff3e5f5e78f9d3c56194a0380e9bb03ca1c9;hp=96e35066c6c25ff24d43fae0d6adb2ecb3696d42;hpb=2410af81c71712957890eb38d9ecacc77adcd72e;p=gdcm.git diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index 96e35066..19794214 100644 --- a/src/gdcmDicomDir.cxx +++ b/src/gdcmDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDicomDir.cxx,v $ Language: C++ - Date: $Date: 2007/03/23 15:30:15 $ - Version: $Revision: 1.190 $ + Date: $Date: 2007/08/29 15:30:48 $ + Version: $Revision: 1.195 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -102,6 +102,64 @@ // PRIVATE // ENCAP DOC // + +/* + +// see also : ftp://medical.nema.org/medical/dicom/final/cp343_ft.doc + +RELATIONSHIP BETWEEN DIRECTORY RECORDS + +Directory Record Type Directory Record Types which may be included + in the next lower-level directory Entity + +(Root Directory Entity) PATIENT, TOPIC, PRIVATE + +PATIENT STUDY, PRIVATE + +STUDY SERIES, VISIT, RESULTS, STUDY COMPONENT, PRIVATE + +SERIES IMAGE, OVERLAY, MODALITY LUT, VOI LUT, CURVE, + STORED PRINT, RT DOSE, RT STRUCTURE SET, RT PLAN, + RT TREAT RECORD, PRESENTATION, WAVEFORM, SR DOCUMENT, + KEY OBJECT DOC, SPECTROSCOPY, RAW DATA, PRIVATE + +IMAGE PRIVATE +OVERLAY PRIVATE +MODALITY LUT PRIVATE +VOI LUT PRIVATE +CURVE PRIVATE +STORED PRINT PRIVATE +RT DOSE PRIVATE +RT STRUCTURE SET PRIVATE +RT PLAN PRIVATE +RT TREAT RECORD PRIVATE +PRESENTATION PRIVATE +WAVEFORM PRIVATE +SR DOCUMENT PRIVATE +KEY OBJECT DOC PRIVATE +SPECTROSCOPY PRIVATE +RAW DATA PRIVATE + +TOPIC STUDY, SERIES, IMAGE, OVERLAY, MODALITY LUT, VOI LUT, + CURVE, STORED PRINT, RT DOSE, RT STRUCTURE SET, + RT PLAN, RT TREAT RECORD, PRESENTATION, WAVEFORM, + SR DOCUMENT, KEY OBJECT DOC, SPECTROSCOPY, RAW DATA, + PRIVATE + +VISIT PRIVATE + +RESULTS INTERPRETATION, PRIVATE + +INTERPRETATION PRIVATE +STUDY COMPONENT PRIVATE +PRIVATE PRIVATE, (any of the above as privately defined) +MRDR (Not applicable) + +Note : Directory Record Types PRINT QUEUE, FILM SESSION, FILM BOX, and + IMAGE BOX were previously defined in DICOM. They have been retired. + See PS 3.3-1998. +*/ + // ---------------------- // The current gdcm version only deals with : // @@ -116,7 +174,7 @@ // Treelike structure management will have to be upgraded // ---------------------------------------------------------------------------- -namespace gdcm +namespace GDCM_NAME_SPACE { //----------------------------------------------------------------------------- // Constructor / Destructor @@ -152,7 +210,7 @@ DicomDir::DicomDir(std::string const &fileName, bool parseDir ): // 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 @@ -251,7 +309,9 @@ bool DicomDir::DoTheLoadingJob( ) return false; } else + { CreateDicomDir(); + } } else { @@ -315,8 +375,9 @@ bool DicomDir::IsReadable() DicomDirMeta *DicomDir::NewMeta() { if ( MetaElems ) + { MetaElems->Delete(); - + } DocEntry *entry = GetFirstEntry(); if ( entry ) { @@ -431,7 +492,7 @@ bool DicomDir::Write(std::string const &fileName) binary_write( *fp, "DICM"); DicomDirMeta *ptrMeta = GetMeta(); - ptrMeta->WriteContent(fp, ExplicitVR); + ptrMeta->WriteContent(fp, ExplicitVR, true, false); // force writing 0004|1220 [SQ ], that CANNOT exist within DicomDirMeta for(i=0;i<6;++i) @@ -443,7 +504,7 @@ bool DicomDir::Write(std::string const &fileName) cc != Patients.end(); ++cc ) { - (*cc)->WriteContent( fp, ExplicitVR ); + (*cc)->WriteContent( fp, ExplicitVR, false, true ); } // force writing Sequence Delimitation Item @@ -606,6 +667,7 @@ void DicomDir::CreateDicomDir() { // The SeqEntries of "Directory Record Sequence" are parsed. // When a DicomDir tag ("PATIENT", "STUDY", "SERIE", "IMAGE") is found : + // N.B. : VISIT, PRIVATE not fully dealt with // 1 - we save the beginning iterator // 2 - we continue to parse // 3 - we find an other tag @@ -654,7 +716,7 @@ void DicomDir::CreateDicomDir() if ( v == "IMAGE " ) { - si = DicomDirImage::New(true); + si = DicomDirImage::New(true); // true = empty if ( !AddImageToEnd( static_cast(si)) ) { si->Delete(); @@ -664,7 +726,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(); @@ -674,7 +736,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(); @@ -684,7 +746,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(); @@ -694,7 +756,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(); @@ -703,14 +765,14 @@ void DicomDir::CreateDicomDir() } } /// \to do : deal with PRIVATE (not so easy, since PRIVATE appears - /// at defferent levels ?!? ) + /// at different levels ?!? ) else if ( v == "PRIVATE " ) // for SIEMENS 'CSA Non Image' { gdcmWarningMacro( " -------------------------------------------" << "a PRIVATE SQItem was found : " << v); - si = DicomDirPrivate::New(true); + si = DicomDirPrivate::New(true); // true = empty if ( !AddPrivateToEnd( static_cast(si)) ) { si->Delete(); @@ -723,7 +785,7 @@ void DicomDir::CreateDicomDir() // It was neither a 'PATIENT', nor a 'STUDY', nor a 'SERIE', // nor an 'IMAGE' SQItem. Skip to next item. gdcmWarningMacro( " -------------------------------------------" - << "a non PATIENT/STUDY/SERIE/IMAGE SQItem was found : " + << "a non PATIENT/STUDY/SERIE/IMAGE /VISIT/PRIVATE SQItem was found : " << v); // FIXME : deal with other item types ! @@ -940,7 +1002,6 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, DataEntry *entry; std::string val; SQItem *si; - switch( type ) { case GDCM_DICOMDIR_IMAGE: @@ -979,7 +1040,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(); @@ -1009,10 +1070,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, GDCM_VRUNKNOWN); /// \todo : modify dicomelements file, to store VR + entry = DataEntry::New(tmpGr, tmpEl, it->VR); // dicomelements file was modified, to store VR entry->SetOffset(0); // just to avoid further missprinting if ( header )