]> Creatis software - gdcm.git/blobdiff - Example/SplitIntoXCoherentDirectories.cxx
re indent
[gdcm.git] / Example / SplitIntoXCoherentDirectories.cxx
index 876c77ab221e0990558be4d9883babbf7507c2cf..17c4c8d50cfa693fb246419cfc0cc1c1bdbbf976 100755 (executable)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: SplitIntoXCoherentDirectories.cxx,v $
   Language:  C++
-  Date:      $Date: 2007/10/01 09:40:32 $
-  Version:   $Revision: 1.1 $
+  Date:      $Date: 2011/08/25 14:37:05 $
+  Version:   $Revision: 1.8 $
  
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -28,20 +28,20 @@ int main(int argc, char *argv[])
 {
 
    START_USAGE(usage)
-   "\n exXCoherentFileSet :\n                                                 ",
+   "\n SplitIntoXCoherentDirectories :\n                                      ",
    "Shows the various 'XCoherent' Filesets within a directory                 ",
-   "Optionaly copis the images in a Directories tree                          ",
+   "Optionaly copies the images in a Directories tree                         ",
    "usage: exXCoherentFileSet {dirin=inputDirectoryName}                      ",
    "                           dirout=outputDirectoryName                     ",
    "                       { tag=group-elem | pos | ori } [sort]              ",
-   "                       [{ write | copy }] [studyUID = ]                   ", 
+   "                       [{ write | copy }] [studyUID = ]                   ",
    "                       [ { [noshadowseq] | [noshadow][noseq] } ] [debug]  ",
    "                                                                          ",
    "       dirin : user wants to analyze *all* the files                      ",
    "                            within the directory                          ",
    "       copy  : user wants to copy the files into a directories tree       ",
    "       write : user wants to rewrite the files into a directories tree    ",
-   "               each directory with the same 'Series Instance UID'         ", 
+   "               each directory with the same 'Series Instance UID'         ",
    "       dirout : will be created if doesn't exist                          ",
    "       pos  : user wants to split each Single SerieUID Fileset on the     ",
    "                         'Image Position '                                ",
@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
    "       tag : group-elem    (in hexa, no space)                            ",
    "                       the user wants to split on                         ",
    "       sort :  user wants FileHelper to sort the images                   ",
-   "               Warning : will probabely crah if sort has no meaning       ",
+   "               Warning : will probabely crash if sort has no meaning      ",
    "                (not only look at image names)                            ",
    "       studyUID   : *aware* user wants to add the serie                   ",
    "                                             to an already existing study ",
@@ -74,7 +74,7 @@ int main(int argc, char *argv[])
  
    int loadMode;
    int maxSize;
-   
+
    const char *dirName  = am->ArgMgrGetString("dirin");
    if (dirName == 0)
    {
@@ -93,16 +93,16 @@ int main(int argc, char *argv[])
    bool ori  =    ( 0 != am->ArgMgrDefined("ori") );   
    bool sort =    ( 0 != am->ArgMgrDefined("sort") );
    bool copy =    ( 0 != am->ArgMgrDefined("copy") );
-   bool write =   ( 0 != am->ArgMgrDefined("write") );   
+   bool write =   ( 0 != am->ArgMgrDefined("write") );
    bool verbose = ( 0 != am->ArgMgrDefined("verbose") );
    bool tag     = ( 0 != am->ArgMgrDefined("tag") );
-   
+
    if( copy && write )
    {
       std::cout << "COPY and WRITE are mutually exclusive" << std::endl;
       delete am;
-      return 0;      
-   }   
+      return 0;
+   }
 
    if( (tag && (pos || ori)) || (pos && (tag || ori)) || (ori && (tag || pos)) )
    {
@@ -144,16 +144,18 @@ int main(int argc, char *argv[])
    delete am;  // ------ we don't need Arguments Manager any longer ------
 
 
-      
    GDCM_NAME_SPACE::SerieHelper *s;  
    s = GDCM_NAME_SPACE::SerieHelper::New();
-   
+
    GDCM_NAME_SPACE::File *f;
+   s->SetLoadMode(GDCM_NAME_SPACE::LD_ALL); // Load everything for each File
+   s->SetDirectory(dirName, true);          // true : recursive exploration
    
    GDCM_NAME_SPACE::DirList dirlist(dirName, true); // recursive exploration
    GDCM_NAME_SPACE::DirListType fileNames = dirlist.GetFilenames();
-
    GDCM_NAME_SPACE::FileList *l = new GDCM_NAME_SPACE::FileList;
+
+   std::string replaceChar("_");
 // Loop on all the gdcm-readable files
    for (GDCM_NAME_SPACE::DirListType::iterator it = fileNames.begin();
                                     it != fileNames.end();
@@ -161,33 +163,33 @@ int main(int argc, char *argv[])
    {
       if (verbose)
          std::cout << *it << std::endl;
+
       if (write) {
          loadMode = GDCM_NAME_SPACE::LD_ALL; // load any DataElement
-          maxSize  = 0x7fff;                  // load any length
+         maxSize  = 0x7fff;                  // load any length
       } else {
          loadMode = GDCM_NAME_SPACE::LD_NOSEQ | GDCM_NAME_SPACE::LD_NOSHADOW ; 
-         maxSize  = 0x0100;      
+         maxSize  = 0x0100;
       }
 
       f = GDCM_NAME_SPACE::File::New();
-      f->SetLoadMode(loadMode);   
-      f->SetMaxSizeLoadEntry(maxSize); 
+      f->SetLoadMode(loadMode);
+      f->SetMaxSizeLoadEntry(maxSize);
       f->SetFileName( *it );
       f->Load();
-      l->push_back(f);     
+      l->push_back(f);
    }
 
    std::string systemCommand;
-   std::string filenameout;   
-   if (write || copy) { 
+   std::string filenameout;
+   if (write || copy) {
       if (verbose)
          std::cout << "Check for output directory :[" << dirNameout << "]."
                    <<std::endl;
       if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirNameout) )    // dirout not found
       {
          std::string strDirNameout(dirNameout);          // to please gcc 4
-         systemCommand = "mkdir " +strDirNameout;        // create it!
+         systemCommand = "mkdir \"" +strDirNameout + "\"";        // create it!
          if (verbose)
             std::cout << systemCommand << std::endl;
          system (systemCommand.c_str());
@@ -206,12 +208,11 @@ int main(int argc, char *argv[])
       else
       {
          if (verbose)
-            std::cout << "Output Directory [" << dirNameout 
+            std::cout << "Output Directory [" << dirNameout
                       << "] already exists; Used as is."
                       << std::endl;
-      }      
+      }
    }
-   
       // --> End of checking supposed-to-be-directory names
 
    int nbFiles;
@@ -219,19 +220,25 @@ int main(int argc, char *argv[])
 
    // For all the Single SerieUID Files Sets of the GDCM_NAME_SPACE::Serie
 
-   //GDCM_NAME_SPACE::FileList *l = s->GetFirstSingleSerieUIDFileSet();//===> Ignore 'Serie UID"
+  // GDCM_NAME_SPACE::FileList *l = s->GetFirstSingleSerieUIDFileSet();
+
+   l = s->GetFirstSingleSerieUIDFileSet();
+   if (l == NULL) {
+      std::cout << "No Serie found ?!?" << std::endl;
+      exit (0);
+   }
 
    GDCM_NAME_SPACE::XCoherentFileSetmap xcm;
 
    std::string serieUID;
    std::string currentSerieWriteDir = "";
    std::string xCoherentWriteDir = "";
-   std::string xCoherentName = ""; 
+   std::string xCoherentName = "";
    std::string serieDirectory;
    std::string lastFilename;
    std::string rep("_");
    int controlCount = 0;
-   
+
    // 'Study Instance UID'
    // The user is allowed to create his own Study, 
    //          keeping the same 'Study Instance UID' for various images
@@ -245,16 +252,18 @@ int main(int argc, char *argv[])
          strStudyUID = studyUID;
    }
 
-//   while (l) // for each 'Single SerieUID FileSet' //===> Ignore 'Serie UID"
-//   { 
+   while (l) // for each 'Single SerieUID FileSet' //===> Ignore 'Serie UID"
+   { 
+ currentSerieWriteDir = "";
       nbFiles = l->size() ;
       if ( l->size() > 2 ) // ignore a Directory with less than 2 images.
                            // Why not ? Just an example, for testing!
       {
           // Just not to make too many modif in the code
-          serieUID = "aaaa"; //s->GetCurrentSerieUIDFileSetUID();
+          //serieUID = "SingleSerie"; // s->GetCurrentSerieUIDFileSetUID();
+          serieUID = s->GetCurrentSerieUIDFileSetUID();
           GDCM_NAME_SPACE::Util::ReplaceSpecChar(serieUID, rep);
+
           // --- for write
           if (write || copy)
           {
@@ -268,7 +277,7 @@ int main(int argc, char *argv[])
                 std::cout << "[" << currentSerieWriteDir<< "]" << std::endl;
             // if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(currentSerieWriteDir) )
              {     
-                systemCommand   = "mkdir " + currentSerieWriteDir;
+                systemCommand   = "mkdir \"" + currentSerieWriteDir + "\"";
                 system( systemCommand.c_str());
                 if (verbose)
                    std::cout <<  "1 " <<systemCommand << std::endl;
@@ -286,41 +295,41 @@ int main(int argc, char *argv[])
          else if (pos)
             xcm = s->SplitOnPosition(l);
          else if (groupelem != 0) {
-            std:: cout << GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(groupelem[0],groupelem[1])->GetName() << std::endl;
+         // Crashes if DataElement not found
+         //std:: cout << GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(groupelem[0],groupelem[1])->GetName() << std::endl;
  
             xcm = s->SplitOnTagValue(l, groupelem[0],groupelem[1] );
          }
+
          GDCM_NAME_SPACE::FileHelper *fh;
+
          for (GDCM_NAME_SPACE::XCoherentFileSetmap::iterator i = xcm.begin(); 
                                                   i != xcm.end();
                                                 ++i)
          {
             xCoherentName = (*i).first;
             if (verbose)
-               std::cout << "xCoherentName = " << xCoherentName << std::endl;
+               std::cout << "==========================================xCoherentName = " << xCoherentName << std::endl;
              GDCM_NAME_SPACE::Util::ReplaceSpecChar(xCoherentName, rep);
              // --- for write
              if (write || copy)
-             { 
+             {
                 xCoherentWriteDir = currentSerieWriteDir + GDCM_NAME_SPACE::GDCM_FILESEPARATOR+ xCoherentName;
                // if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(xCoherentWriteDir) )
                 {      
-                   systemCommand   = "mkdir " + xCoherentWriteDir;
+                   systemCommand   = "mkdir \"" + xCoherentWriteDir + "\"";
                    system( systemCommand.c_str());
                    if (verbose)
                       std::cout << "2 " << systemCommand << std::endl;       
                 }
             } 
             // --- end for write
-    
-            if (ori) 
+
+            if (ori)
                std::cout << "Orientation : ";
-            else if (pos) 
+            else if (pos)
                std::cout << "Position : ";
-            else if (groupelem != 0)    
+            else if (groupelem != 0)
                std::cout << "Tag (" << std::hex << groupelem[0]
                          << "|" << groupelem[1] << ") value : ";
             std::cout << "[" << (*i).first << "]" << std::endl;
@@ -332,12 +341,12 @@ int main(int argc, char *argv[])
            // OrderFileList() causes trouble, since some files
            // (eg:MIP views) don't have 'Position', now considered as mandatory
            // --> Activated on user demand.
-           
-            if (sort) {
+
+           if (sort) {
               s->OrderFileList((*i).second);  // sort the XCoherent Fileset
               std::cout << "ZSpacing for the file set " << s->GetZSpacing()
                         << std::endl;
-            
+           } 
 
             std::string strSerieUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();
 
@@ -347,20 +356,23 @@ int main(int argc, char *argv[])
             {
                controlCount ++;
                fileName = (*it2)->GetFileName();
-               std::cout << "    " << fileName << std::endl;
-    
                // --- for write
                lastFilename =  GDCM_NAME_SPACE::Util::GetName( fileName );
-               filenameout = xCoherentWriteDir  + GDCM_NAME_SPACE::GDCM_FILESEPARATOR+ lastFilename;   
+
+               // If you want to create file names of your own, here is the place!
+               // Just replace 'lastFilename' by anything that's better for you.
+               GDCM_NAME_SPACE:: Util::ReplaceSpecChar(lastFilename, replaceChar);
+
+               filenameout = xCoherentWriteDir  + GDCM_NAME_SPACE::GDCM_FILESEPARATOR+ lastFilename; 
                if (write)
                {  
-                  fh = GDCM_NAME_SPACE::FileHelper::New( (*it2) );  
+                  fh = GDCM_NAME_SPACE::FileHelper::New( (*it2) );
                   fh->SetKeepOverlays( true );       
                   fh->InsertEntryString(strSerieUID,0x0020,0x000e,"UI");
                   unsigned int dataSize  = fh->GetImageDataRawSize();
                   uint8_t *imageData = fh->GetImageDataRaw();// somewhat important : Loads the Pixels in memory !
                   if (!imageData)
-                     std::cout << "fail to read [" << (*it2)->GetFileName() << std::endl; 
+                     std::cout << "fail to read [" << (*it2)->GetFileName() << std::endl;
                   fh->SetWriteTypeToDcmExplVR();
                   fh->SetContentType(GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE);
                   if (!fh->Write(filenameout))
@@ -368,25 +380,25 @@ int main(int argc, char *argv[])
                      std::cout << "Fail to write :[" << filenameout << "]"
                                << std::endl;
                   }
-               } 
+                  fh->Delete();
+               }
                else if (copy)
                {
-                   systemCommand   = "cp " + fileName + " " + filenameout;
+                   systemCommand   = "cp \"" + fileName + "\" \"" + filenameout + "\"";
                    system( systemCommand.c_str());
-               } 
+               }
                if (verbose)
                      std::cout << "3 " << systemCommand << std::endl;
-               fh->Delete();
-            } 
-
-            std::cout << std::endl;   
+            }
          }
+         std::cout << std::endl;
       }
-     // l = s->GetNextSingleSerieUIDFileSet(); //===> Ignore 'Serie UID"
+      l = s->GetNextSingleSerieUIDFileSet();
+   }
     
    if ( controlCount == 0 )
       std::cout << "No suitable file was found!" << std::endl;
+
    s->Delete();
    return 0;
 }