--- /dev/null
+/*=========================================================================
+
+ Program: gdcm
+ Module: $RCSfile: Rename.cxx,v $
+ Language: C++
+ Date: $Date: 2010/09/01 11:17:32 $
+ Version: $Revision: 1.1 $
+
+ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+ l'Image). All rights reserved. See Doc/License.txt or
+ http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+
+#include "gdcmFile.h"
+#include "gdcmDirList.h"
+#include "gdcmArgMgr.h"
+
+int main(int argc, char *argv[])
+{
+ START_USAGE(usage)
+ " \n copies and renames the files within a directory as ima-SeriesNumber-ImageNumber.dcm (usefull for unaware users!)\n",
+ " usage: Rename dirin=inputDirectoryName ",
+ " dirout=outputDirectoryName",
+ " [rec] [fix] ",
+ " rec : user wants to parse recursively the directory ",
+ " fix : user want fix length (4) for SeriesNumber/ ImageNumber ",
+ " debug : user wants to run the program in 'debug mode' ",
+ " warning : user wants to be warned about any oddity in the File ",
+ " verose : user wants to be warned about the programm processing ",
+
+ 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 1;
+ }
+
+ const char *dirNameIn = am->ArgMgrGetString("dirin");
+ const char *dirNameOut = am->ArgMgrGetString("dirout");
+
+ if (am->ArgMgrDefined("debug"))
+ GDCM_NAME_SPACE::Debug::DebugOn();
+
+ if (am->ArgMgrDefined("warning"))
+ GDCM_NAME_SPACE::Debug::WarningOn();
+
+ bool rec = ( 0 != am->ArgMgrDefined("rec") );
+ bool fix = ( 0 != am->ArgMgrDefined("fix") );
+ bool verbose = ( 0 != am->ArgMgrDefined("verbose") );
+
+ /* if unused Param we give up */
+ if ( am->ArgMgrPrintUnusedLabels() )
+ {
+ am->ArgMgrUsage(usage);
+ delete am;
+ return 1;
+ }
+
+ delete am; // we don't need Argument Manager any longer
+
+ // ----------- End Arguments Manager ---------
+
+ // =============================== Deal with a Directory =====================
+
+#ifdef _MSC_VER
+ std::string copyinstr("copy");
+#else
+ std::string copyinstr("cp");
+#endif
+
+ char copy[4096]; // Hope it's enough!
+
+/*
+ char format[5]; // "%d" or "%04d"
+
+ if (fix)
+ sprintf(format, "%s", "%04d");
+ else
+ sprintf(format, "%s", "%d");
+*/
+
+ std::cout << "dirNameIn [" << dirNameIn << "]" << std::endl;
+
+ GDCM_NAME_SPACE::DirList dirList(dirNameIn, rec); // gets recursively (or not) the file list
+ GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
+ GDCM_NAME_SPACE::File *f;
+ bool res;
+
+ if (fileList.size() == 0)
+ {
+ std::cout << "No file found in : [" << dirNameIn << "]" << std::endl;
+ }
+
+ // Remember :
+ //0020|0011 [IS] [Series Number]
+ //0020|0012 [IS] [Acquisition Number]
+ //0020|0013 [IS] [Instance Number]
+
+ std::string strSeriesNumber;
+ std::string strAcquisitionNumber;
+ std::string strInstanceNumber;
+ int SeriesNumber;
+ int AcquisitionNumber;
+ int InstanceNumber;
+
+ for( GDCM_NAME_SPACE::DirListType::iterator it = fileList.begin();
+ it != fileList.end();
+ ++it )
+ {
+ if (verbose)
+ std::cout << std::endl<<" Start processing :[" << it->c_str() << "]"
+ << std::endl;
+ f = GDCM_NAME_SPACE::File::New();
+ f->SetFileName( it->c_str() );
+ res = f->Load();
+
+ if ( !res )
+ {
+ std::cout << "Cannot process file [" << it->c_str() << "]"
+ << std::endl;
+ std::cout << "Either it doesn't exist, or it's read protected "
+ << std::endl;
+ std::cout << "or it's not a Dicom File, or its 'header' is bugged"
+ << std::endl;
+ std::cout << "use 'PrintFile filein=... debug' "
+ << "to try to guess the pb"
+ << std::endl;
+ f->Delete();
+ continue;
+ }
+
+ int number;
+
+ strSeriesNumber = f->GetEntryString(0x0020,0x0011);
+ if ( strSeriesNumber != GDCM_NAME_SPACE::GDCM_UNFOUND )
+ {
+ if (verbose) std::cout << " SeriesNumber [" << strSeriesNumber << "]" << std::endl;
+ SeriesNumber = atoi(strSeriesNumber.c_str());
+ }
+
+ strAcquisitionNumber = f->GetEntryString(0x0020,0x0012);
+ if ( strAcquisitionNumber != GDCM_NAME_SPACE::GDCM_UNFOUND )
+ {
+ if (verbose) std::cout << " AcquisitionNumber [" << strAcquisitionNumber << "]" << std::endl;
+ AcquisitionNumber = atoi(strAcquisitionNumber.c_str());
+ number = AcquisitionNumber;
+ }
+
+ strInstanceNumber = f->GetEntryString(0x0020,0x0013);
+ if ( strInstanceNumber != GDCM_NAME_SPACE::GDCM_UNFOUND )
+ {
+ if (verbose) std::cout << " InstanceNumber [" << strInstanceNumber << "]" << std::endl;
+ InstanceNumber = atoi(strInstanceNumber.c_str());
+ number = InstanceNumber;
+ }
+
+ if (fix)
+ sprintf (copy, "%s %s %s%cima-%04d-%04d.dcm",
+ copyinstr.c_str(),
+ it->c_str(),
+ dirNameOut, GDCM_NAME_SPACE::GDCM_FILESEPARATOR, SeriesNumber, number);
+ else
+ sprintf (copy, "%s %s %s%cima-%d-%d.dcm",
+ copyinstr.c_str(),
+ it->c_str(),
+ dirNameOut, GDCM_NAME_SPACE::GDCM_FILESEPARATOR, SeriesNumber, number);
+
+
+ if (verbose) std::cout << copy << std::endl;
+ system (copy);
+ }
+}
+
+