X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmDicomDir.cxx;h=ef45a81e8388d2f040828f95ee971b67f0c6c5fb;hb=41559a6f2d66bcd4af4db17a0d9668df37d19f3b;hp=f382906c22bd0e36dc7537f04dc84a3c95ffe838;hpb=6c514fed47b5884b2025e43e9a6f6ee413a6fd5e;p=gdcm.git diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index f382906c..ef45a81e 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/11/04 15:46:03 $ - Version: $Revision: 1.169 $ + Date: $Date: 2005/11/28 16:31:23 $ + Version: $Revision: 1.175 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -37,6 +37,7 @@ #include "gdcmSeqEntry.h" #include "gdcmSQItem.h" #include "gdcmDataEntry.h" +#include "gdcmCommandManager.h" #include #include @@ -129,10 +130,6 @@ DicomDir::DicomDir() */ DicomDir::~DicomDir() { - SetStartMethod(NULL,NULL,NULL); - SetProgressMethod(NULL,NULL,NULL); - SetEndMethod(NULL,NULL,NULL); - ClearPatient(); if ( MetaElems ) { @@ -159,32 +156,6 @@ bool DicomDir::Load( ) return DoTheLoadingJob( ); } -#ifndef GDCM_LEGACY_REMOVE -/* * - * \ brief Loader. (DEPRECATED : kept not to break the API) - * @ param fileName file to be open for parsing - * @ return false if file cannot be open or no swap info was found, - * or no tag was found. - * @ deprecated use SetFileName(n) + Load() instead - */ -bool DicomDir::Load(std::string const &fileName ) -{ - SetFileName(fileName); - return Load(); -} - -/// DEPRECATED : use SetDirectoryName(dname) instead -/* * - * \brief Loader. (DEPRECATED : kept not to break the API) - * @param paseDir Parse Dir - * @deprecated use SetDirectoryName(dname) instead - */ -void DicomDir::SetParseDir(bool parseDir) -{ - ParseDir = parseDir; -} -#endif - /** * \brief Does the Loading Job (internal use only) * @return false if file cannot be open or no swap info was found, @@ -233,7 +204,7 @@ bool DicomDir::DoTheLoadingJob( ) const char *cwd = getcwd(buf, 2048); if( cwd ) { - SetFileName( cwd ); // will be converted into a string + SetFileName( buf ); // will be converted into a string } else { @@ -371,117 +342,6 @@ void DicomDir::ParseDirectory() CreateDicomDir(); } -void DicomDir::SetStartMethod( DicomDir::Method *method, void *arg ) -{ - SetStartMethod(method,arg,NULL); -} - -void DicomDir::SetProgressMethod( DicomDir::Method *method, void *arg ) -{ - SetProgressMethod(method,arg,NULL); -} - -void DicomDir::SetEndMethod( DicomDir::Method *method, void *arg ) -{ - SetEndMethod(method,arg,NULL); -} - -/** - * \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 DicomDir::SetStartMethod( DicomDir::Method *method, void *arg, - DicomDir::Method *argDelete ) -{ - if ( StartArg && StartMethodArgDelete ) - { - StartMethodArgDelete( StartArg ); - } - - StartMethod = method; - StartArg = arg; - StartMethodArgDelete = argDelete; -} - - -/** - * \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 DicomDir::SetProgressMethod( DicomDir::Method *method, void *arg, - DicomDir::Method *argDelete ) -{ - if ( ProgressArg && ProgressMethodArgDelete ) - { - ProgressMethodArgDelete( ProgressArg ); - } - - ProgressMethod = method; - ProgressArg = arg; - ProgressMethodArgDelete = argDelete; -} - -/** - * \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 DicomDir::SetEndMethod( DicomDir::Method *method, void *arg, - DicomDir::Method *argDelete ) -{ - if ( EndArg && EndMethodArgDelete ) - { - EndMethodArgDelete( EndArg ); - } - - EndMethod = method; - EndArg = arg; - EndMethodArgDelete = argDelete; -} - -/** - * \brief Set the method to delete the argument - * The argument is destroyed when the method is changed or when the - * class is destroyed - * @param method Method to call to delete the argument - */ -void DicomDir::SetStartMethodArgDelete( DicomDir::Method *method ) -{ - StartMethodArgDelete = method; -} - -/** - * \brief Set the method to delete the argument - * The argument is destroyed when the method is changed or when the - * class is destroyed - * @param method Method to call to delete the argument - */ -void DicomDir::SetProgressMethodArgDelete( DicomDir::Method *method ) -{ - ProgressMethodArgDelete = method; -} - -/** - * \brief Set the method to delete the argument - * The argument is destroyed when the method is changed or when - * the class is destroyed - * @param method Method to call to delete the argument - */ -void DicomDir::SetEndMethodArgDelete( DicomDir::Method *method ) -{ - EndMethodArgDelete = method; -} - /** * \brief writes on disc a DICOMDIR * \ warning does NOT add the missing elements in the header : @@ -493,7 +353,7 @@ void DicomDir::SetEndMethodArgDelete( DicomDir::Method *method ) bool DicomDir::Write(std::string const &fileName) { int i; - uint16_t sq[4] = { 0x0004, 0x1220, 0xffff, 0xffff }; + uint16_t sq[6] = { 0x0004, 0x1220, 0x5153, 0x0000, 0xffff, 0xffff }; uint16_t sqt[4]= { 0xfffe, 0xe0dd, 0xffff, 0xffff }; std::ofstream *fp = new std::ofstream(fileName.c_str(), @@ -513,7 +373,7 @@ bool DicomDir::Write(std::string const &fileName) ptrMeta->WriteContent(fp, ExplicitVR); // force writing 0004|1220 [SQ ], that CANNOT exist within DicomDirMeta - for(i=0;i<4;++i) + for(i=0;i<6;++i) { binary_write(*fp, sq[i]); } @@ -644,10 +504,7 @@ void DicomDir::CallStartMethod() { Progress = 0.0f; Abort = false; - if ( StartMethod ) - { - StartMethod( StartArg ); - } + CommandManager::ExecuteCommand(this,CMD_STARTPROGRESS); } /** @@ -655,10 +512,7 @@ void DicomDir::CallStartMethod() */ void DicomDir::CallProgressMethod() { - if ( ProgressMethod ) - { - ProgressMethod( ProgressArg ); - } + CommandManager::ExecuteCommand(this,CMD_PROGRESS); } /** @@ -667,10 +521,7 @@ void DicomDir::CallProgressMethod() void DicomDir::CallEndMethod() { Progress = 1.0f; - if ( EndMethod ) - { - EndMethod( EndArg ); - } + CommandManager::ExecuteCommand(this,CMD_ENDPROGRESS); } //----------------------------------------------------------------------------- @@ -680,16 +531,6 @@ void DicomDir::CallEndMethod() */ void DicomDir::Initialize() { - StartMethod = NULL; - ProgressMethod = NULL; - EndMethod = NULL; - StartMethodArgDelete = NULL; - ProgressMethodArgDelete = NULL; - EndMethodArgDelete = NULL; - StartArg = NULL; - ProgressArg = NULL; - EndArg = NULL; - Progress = 0.0; Abort = false; @@ -1047,6 +888,9 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, default: return; } + + // FIXME : troubles found when it's a SeqEntry + // removed all the seems-to-be-useless stuff about Referenced Image Sequence // to avoid further troubles // imageElem 0008 1140 "" // Referenced Image Sequence @@ -1055,8 +899,7 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, // imageElem 0008 1155 "" // Referenced SOP Instance UID : to be set/forged later // imageElem fffe e00d "" // Item delimitation : length to be set to ZERO later - // FIXME : troubles found when it's a SeqEntry - + std::string referencedVal; // for all the relevant elements found in their own spot of the DicomDir.dic for( it = elemList.begin(); it != elemList.end(); ++it) { @@ -1071,7 +914,8 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, { // NULL when we Build Up (ex nihilo) a DICOMDIR // or when we add the META elems - val = header->GetEntryString(tmpGr, tmpEl); + + val = header->GetEntryString(tmpGr, tmpEl); } else { @@ -1079,27 +923,49 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, } if ( val == GDCM_UNFOUND) - { - if ( tmpGr == 0x0004 && tmpEl == 0x1130 ) // File-set ID - { - // force to the *end* File Name - val = Util::GetName( path ); - } - else if ( tmpGr == 0x0004 && tmpEl == 0x1500 ) // Only used for image - { - if ( header->GetFileName().substr(0, path.length()) != path ) - { - gdcmWarningMacro( "The base path of file name is incorrect"); - val = header->GetFileName(); - } - else - { - val = &(header->GetFileName().c_str()[path.length()+1]); - } - } - else + { + if ( tmpGr == 0x0004 ) // never present in File ! { - val = it->Value; + switch (tmpEl) + { + case 0x1130: // File-set ID + // force to the *end* File Name + val = Util::GetName( path ); + break; + + case 0x1500: // Only used for image + if ( header->GetFileName().substr(0, path.length()) != path ) + { + gdcmWarningMacro( "The base path of file name is incorrect"); + val = header->GetFileName(); + } + else + { + val = &(header->GetFileName().c_str()[path.length()+1]); + } + break; + + case 0x1510: // Referenced SOP Class UID in File + referencedVal = header->GetEntryString(0x0008, 0x0016); + // FIXME : probabely something to check + val = referencedVal; + break; + + case 0x1511: // Referenced SOP Instance UID in File + referencedVal = header->GetEntryString(0x0008, 0x0018); + // FIXME : probabely something to check + val = referencedVal; + break; + + case 0x1512: // Referenced Transfer Syntax UID in File + referencedVal = header->GetEntryString(0x0002, 0x0010); + // FIXME : probabely something to check + val = referencedVal; + break; + + default : + val = it->Value; + } } } else @@ -1108,6 +974,18 @@ void DicomDir::SetElement(std::string const &path, DicomDirType type, val = it->Value; } +/* FIX later the pb of creating the 'Implementation Version Name'! + + if (val == GDCM_UNFOUND) + val = ""; + + if ( tmpGr == 0x0002 && tmpEl == 0x0013) + { + // 'Implementation Version Name' + std::string val = "GDCM "; + val += Util::GetVersion(); + } +*/ entry->SetString( val ); // troubles expected when vr=SQ ... if ( type == GDCM_DICOMDIR_META ) // fusible : should never print !