Program: gdcm
Module: $RCSfile: MakeDicomDir.cxx,v $
Language: C++
- Date: $Date: 2005/02/02 14:26:30 $
- Version: $Revision: 1.1 $
+ Date: $Date: 2007/09/28 14:09:20 $
+ Version: $Revision: 1.25 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmDicomDir.h"
#include "gdcmDicomDirPatient.h"
#include "gdcmDirList.h"
+#include "gdcmDebug.h"
+#include "gdcmArgMgr.h"
-#include <iostream>
-
-// ---
-void StartMethod(void *toto) {
- (void)toto;
- std::cout<<"Start parsing"<<std::endl;
-}
+//#include <sys/times.h> // Linux Only
-void EndMethod(void *toto) {
- (void)toto;
- std::cout<<"End parsing"<<std::endl;
-}
-// ---
+#include <iostream>
/**
- * \ingroup Test
- * \brief Explores recursively the given directory (or GDCM_DATA_ROOT by default)
+ * \brief Explores recursively the given directory
* orders the gdcm-readable found Files
* according their Patient/Study/Serie/Image characteristics
* makes the gdcmDicomDir
- * and writes a file named NewDICOMDIR..
+ * and writes a file named DICOMDIR. (user may choose an other name)
*/
int main(int argc, char *argv[])
{
- gdcm::DicomDir *dcmdir;
- std::string dirName;
+ START_USAGE(usage)
+ " \n MakeDicomDir :\n ",
+ " Explores recursively the given directory, makes the relevant DICOMDIR ",
+ " and writes it as 'DICOMDIR' ",
+ " ",
+ " usage: MakeDicomDir dirname=rootDirectoryName ",
+ " name=DICOMDIR file name ",
+ " [noshadowseq][noshadow][noseq] [debug] [check] ",
+ " ",
+ " name : the default name for the generated dicomdir is 'DICOMDIR' ",
+ " noshadowseq: user doesn't want to load Private Sequences ",
+ " noshadow : user doesn't want to load Private groups (odd number) ",
+ " noseq : user doesn't want to load Sequences ",
+ " debug : developper wants to run the program in 'debug mode' ",
+ " check : the dicomdir is checked as 'gdcm readable' ",
+ FINISH_USAGE
+
+ // ----- Initialize Arguments Manager ------
+ GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
+
+ if (argc == 1 || am->ArgMgrDefined("usage"))
+ {
+ am->ArgMgrUsage(usage); // Display 'usage'
+ delete am;
+ return 0;
+ }
+
+ const char *dirName;
+ dirName = am->ArgMgrGetString("dirName",".");
+
+ const char *name;
+ name = am->ArgMgrGetString("name","DICOMDIR");
+
+ int loadMode = GDCM_NAME_SPACE::LD_ALL;
+ if ( am->ArgMgrDefined("noshadowseq") )
+ loadMode |= GDCM_NAME_SPACE::LD_NOSHADOWSEQ;
+ else
+ {
+ if ( am->ArgMgrDefined("noshadow") )
+ loadMode |= GDCM_NAME_SPACE::LD_NOSHADOW;
+ if ( am->ArgMgrDefined("noseq") )
+ loadMode |= GDCM_NAME_SPACE::LD_NOSEQ;
+ }
+
+ if (am->ArgMgrDefined("debug"))
+ GDCM_NAME_SPACE::Debug::DebugOn();
+
+ int check = am->ArgMgrDefined("check");
+
+ // if unused Param we give up
+ if ( am->ArgMgrPrintUnusedLabels() )
+ {
+ am->ArgMgrUsage(usage);
+ delete am;
+ return 0;
+ }
+
+ delete am; // we don't need Argument Manager any longer
- if (argc > 1)
- dirName = argv[1];
- else
- dirName = GDCM_DATA_ROOT;
+ // ----- Begin Processing -----
+
+ GDCM_NAME_SPACE::DicomDir *dcmdir;
+
+ // we ask for Directory parsing
- dcmdir = new gdcm::DicomDir(dirName, true); // we ask for Directory parsing
+ dcmdir = GDCM_NAME_SPACE::DicomDir::New( );
- dcmdir->SetStartMethod(StartMethod, (void *) NULL);
- dcmdir->SetEndMethod(EndMethod);
+ dcmdir->SetLoadMode(loadMode);
+ dcmdir->SetDirectoryName(dirName);
+ //dcmdir->SetParseDir(true);
- if ( !dcmdir->GetFirstEntry() )
+ // struct tms tms1, tms2; // Time measurements
+ // times(&tms1);
+
+ dcmdir->Load(); // Reads all the files and creates the GDCM_NAME_SPACE::DicomDir
+
+ //times(&tms2);
+ //std::cout
+ // << (long) ((tms2.tms_utime) - (tms1.tms_utime))
+ // << std::endl;
+
+ if ( GDCM_NAME_SPACE::Debug::GetDebugFlag() )
+ std::cout << "======================= End Parsing Directory" << std::endl;
+
+ // ----- Check the result
+
+ if ( !dcmdir->GetFirstPatient() )
{
- std::cout << "makeDicomDir: no patient list present. Exiting."
+ std::cout << "makeDicomDir: no patient found. Exiting."
<< std::endl;
+ dcmdir->Delete();
return 1;
}
- dcmdir->WriteDicomDir("NewDICOMDIR");
- std::cout<<std::flush;
+ // ----- Writes the corresponding DICOMDIR file (from the GDCM_NAME_SPACE::DicomDir)
- delete dcmdir;
+ dcmdir->Write(name);
+ dcmdir->Delete();
+
+ if (check)
+ {
+ if ( GDCM_NAME_SPACE::Debug::GetDebugFlag() )
+ std::cout << "======================= End Writting DICOMDIR"
+ << std::endl;
+
+ // Read from disc the just written DicomDir
+
+ GDCM_NAME_SPACE::DicomDir *newDicomDir = GDCM_NAME_SPACE::DicomDir::New();
+ newDicomDir->SetFileName( name );
+ newDicomDir->Load();
+ if ( GDCM_NAME_SPACE::Debug::GetDebugFlag() )
+ std::cout << "======================= End Parsing DICOMDIR"
+ << std::endl;
+ if( !newDicomDir->IsReadable() )
+ {
+ std::cout<<" Written DicomDir [" << name << "] "
+ <<" is not readable"<<std::endl
+ <<" ...Failed"<<std::endl;
+
+ newDicomDir->Delete();
+ return 1;
+ }
+
+ if( !newDicomDir->GetFirstPatient() )
+ {
+ std::cout <<" Written DicomDir [" << name << "] "
+ <<" has no patient"<<std::endl
+ <<" ...Failed"<<std::endl;
+
+ newDicomDir->Delete();
+ return(1);
+ }
+ std::cout<<std::flush;
+ newDicomDir->Delete();
+ }
return 0;
}