X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDicomDir.cxx;h=2af9aaf2b5825d8b469ea27fb8c5420f4dbef67d;hb=150a817f80ca315498073d4fae9ff0adda3643df;hp=40a41eef7e2db6c113324cdfbff637415a74177b;hpb=f558e91ca92b7b2b5820bebc01e000a926d0828f;p=gdcm.git diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index 40a41eef..2af9aaf2 100644 --- a/src/gdcmDicomDir.cxx +++ b/src/gdcmDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDicomDir.cxx,v $ Language: C++ - Date: $Date: 2005/02/11 16:36:52 $ - Version: $Revision: 1.131 $ + Date: $Date: 2005/06/03 16:08:16 $ + Version: $Revision: 1.140 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -55,21 +55,23 @@ // ---------------------------------------------------------------------------- // // Dicom PS 3.3 describes the relationship between Directory Records, as follow +// (see also PS 4.3, 2004, page 50 for Entity-Relationship model) // // Directory Record Type Directory Record Types which may be included // in the next lower-level directory Entity // -// (Root directory Entity) PATIENT +// (Root directory Entity) PATIENT, TOPIC, PRIVATE // -// PATIENT STUDY +// PATIENT STUDY, PRIVATE // -// STUDY SERIES, VISIT, RESULTS, STUDY COMPONENT +// STUDY SERIES, VISIT, RESULTS, STUDY COMPONENT, PRIVATE // // SERIES IMAGE, OVERLAYS, 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, REGISTRATION, FIDUCIAL +// RAW DATA, REGISTRATION, FIDUCIAL, PRIVATE, +// ENCAP DOC // IMAGE // OVERLAY // MODALITY LUT @@ -88,6 +90,8 @@ // RAW DATA // REGISTRATION // FIDUCIAL +// PRIVATE +// ENCAP DOC // // ---------------------- // The current gdcm version only deals with : @@ -129,79 +133,90 @@ DicomDir::DicomDir() * and wants to use it */ DicomDir::DicomDir(std::string const &fileName, bool parseDir ): - Document( fileName ) + Document( ) { // At this step, Document constructor is already executed, - // whatever user passed (a root directory or a DICOMDIR) + // 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) - Initialize(); // sets all private fields to NULL + ParseDir = parseDir; + SetLoadMode (0x00000000); // concerns only dicom files + Load( fileName ); +} - // if user passed a root directory, sure we didn't get anything +/** + * \brief Canonical destructor + */ +DicomDir::~DicomDir() +{ + SetStartMethod(NULL); + SetProgressMethod(NULL); + SetEndMethod(NULL); - if ( GetFirstEntry() == 0 ) // when user passed a Directory to parse + ClearPatient(); + if ( MetaElems ) { - if (!parseDir) - gdcmWarningMacro( "Entry HT empty for file: "<write(filePreamble, 128); //FIXME + fp->write(filePreamble, 128); binary_write( *fp, "DICM"); DicomDirMeta *ptrMeta = GetMeta(); @@ -478,6 +491,45 @@ bool DicomDir::WriteDicomDir(std::string const &fileName) return true; } +/** + * \brief Anonymize a DICOMDIR + * @return true + */ + +bool DicomDir::AnonymizeDicomDir() +{ + ValEntry *v; + // Something clever to be found to forge the Patient names + std::ostringstream s; + int i = 1; + for(ListDicomDirPatient::iterator cc = Patients.begin(); + cc!= Patients.end(); + ++cc) + { + s << i; + v = (*cc)->GetValEntry(0x0010, 0x0010) ; // Patient's Name + if (v) + { + v->SetValue(s.str()); + } + + v = (*cc)->GetValEntry(0x0010, 0x0020) ; // Patient ID + if (v) + { + v->SetValue(" "); + } + + v = (*cc)->GetValEntry(0x0010, 0x0030) ; // Patient's BirthDate + if (v) + { + v->SetValue(" "); + } + s << ""; + i++; + } + return true; +} + //----------------------------------------------------------------------------- // Protected /** @@ -490,7 +542,7 @@ void DicomDir::CreateDicomDirChainedList(std::string const &path) DirList dirList(path,1); // gets recursively the file list unsigned int count = 0; VectDocument list; - File *header; + File *f; DirListType fileList = dirList.GetFilenames(); @@ -505,22 +557,25 @@ void DicomDir::CreateDicomDirChainedList(std::string const &path) break; } - header = new File( it->c_str() ); - if( !header ) - { - gdcmWarningMacro( "Failure in new gdcm::File " << it->c_str() ); - continue; - } + f = new File( ); + f->SetLoadMode(LoadMode); // we allow user not to load Sequences... + f->Load( it->c_str() ); + +// if( !f ) +// { +// gdcmWarningMacro( "Failure in new gdcm::File " << it->c_str() ); +// continue; +// } - if( header->IsReadable() ) + if( f->IsReadable() ) { // Add the file to the chained list: - list.push_back(header); + list.push_back(f); gdcmWarningMacro( "Readable " << it->c_str() ); } else { - delete header; + delete f; } count++; } @@ -600,7 +655,7 @@ void DicomDir::Initialize() } /** - * \brief create a 'DicomDir' from a DICOMDIR Header + * \brief create a 'gdcm::DicomDir' from a DICOMDIR Header */ void DicomDir::CreateDicomDir() { @@ -643,7 +698,7 @@ void DicomDir::CreateDicomDir() } else { - gdcmWarningMacro( "Not a ValEntry."); + gdcmWarningMacro( "(0004,1430) not a ValEntry ?!?"); continue; } @@ -824,7 +879,6 @@ void DicomDir::SetElements(std::string const &path, VectDocument const &list) || first ) { SetElement(path, GDCM_DICOMDIR_SERIE, *it); - first = true; } // Always Deal with 'IMAGE' Elements @@ -851,7 +905,7 @@ void DicomDir::SetElements(std::string const &path, VectDocument const &list) void DicomDir::SetElement(std::string const &path, DicomDirType type, Document *header) { - ListDicomDirElem elemList; //FIXME this is going to be a by copy operation + ListDicomDirElem elemList; ListDicomDirElem::const_iterator it; uint16_t tmpGr, tmpEl; DictEntry *dictEntry;