]> Creatis software - gdcm.git/blobdiff - Example/PhilipsToBrucker2.cxx
COMP: Fix compilation against VTK CVS
[gdcm.git] / Example / PhilipsToBrucker2.cxx
index 0b9248150811b5ab367e6bf724ccf897f8afced1..0fded6d025489e81fc5a74f73822d9d516e9bc82 100755 (executable)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: PhilipsToBrucker2.cxx,v $
   Language:  C++
-  Date:      $Date: 2006/01/31 14:09:26 $
-  Version:   $Revision: 1.12 $
+  Date:      $Date: 2006/03/17 14:36:37 $
+  Version:   $Revision: 1.20 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -50,9 +50,9 @@ int main(int argc, char *argv[])
    " - orders the gdcm-readable found Files according to their                ",
    "           (0x0010, 0x0010) Patient's Name                                ",
    "           (0x0020, 0x000e) Series Instance UID                           ",
-   "           (0x0020, 0x0032) Image Position (Patient)                      ",
+   "           (0x0020, 0x0032)PhilipsToBrucker2. Image Position (Patient)    ",
    "           (0x0018, 0x1060) Trigger Time                                  ",
-   "           (0x0018, 0x1312) In-plane Phase Encoding Direction             ",
+   "           (0x0018, 0x1312) In-pl)ane Phase Encoding Direction             ",
    " - fills a single level (*) Directory with *all* the files,               ",
    "           converted into a Brucker-like Dicom, InTags compliant          ",
    "   (*) actually : creates as many directories as Patients                 ",
@@ -73,7 +73,7 @@ int main(int argc, char *argv[])
    "                  dirout=outputDirectoryName                              ",
    "                  {  [keep= list of seriesNumber to process]              ",
    "                   | [drop= list of seriesNumber to ignore] }             ",
-   "                  [taggrid]                                               ",
+   "                  [taggrid] [skel]                                        ",
    "                  [input = {ACR|DCM}]                                     ", 
    "                  [extent=image suffix (.IMA, .NEMA, .DCM, ...)]          ",
    "                  [listonly] [split]                                      ",
@@ -88,6 +88,7 @@ int main(int argc, char *argv[])
    "        e.g : 1030,1035,1043                                              ", 
    " taggrid : user knows all the images are 'grid' -ie : not 'col', not 'raw'",
    " extent : DO NOT forget the leading '.' !                                 ",
+   " skel: name skeleton eg : patName_1.nema -> skel=patName_                 ",
    " split: creates a tree-like structure of directories as :                 ",
    "        - Patient                                                         ",
    "        -- Serie                                                          ",
@@ -149,6 +150,11 @@ int main(int argc, char *argv[])
    }
    
    int taggrid = am->ArgMgrDefined("taggrid");
+   
+   int hasSkel = am->ArgMgrDefined("skel");
+   const char *skel;
+   if (hasSkel)
+      skel = am->ArgMgrGetString("skel");   
       
    const char *extent  = am->ArgMgrGetString("extent",".DCM");
    
@@ -225,12 +231,13 @@ int main(int argc, char *argv[])
    gdcm::File *f;
    gdcm::FileHelper *fh;
    std::vector<std::string> tokens;
+   std::vector<std::string> tokensForFileName;
 /*   
    std::cout << "---------------Print Unique Series identifiers---------"  
              << std::endl;     
    std::string uniqueSeriesIdentifier;
  
-   for (gdcm::DirListType::iterator it = fileNames.begin();  
+   for (gdcm::DirListType::iterator it) = fileNames.begin();  
                                     it != fileNames.end();
                                   ++it)
    {
@@ -314,22 +321,35 @@ int main(int argc, char *argv[])
       }      
 
       userFileIdentifier=s->CreateUserDefinedFileIdentifier(f); 
-     // userFileIdentifier += token;
-      //userFileIdentifier += *it;       
-      std::cout << "userFileIdentifier1: "<< userFileIdentifier << std::endl;
       tokens.clear();
       gdcm::Util::Tokenize (userFileIdentifier, tokens, token); 
    
+      int imageNum; // Within FileName
+      char newName[1024];
+      
       if ( tokens[3] == "gdcmUnfound")  // sometimes Trigger Time is not found. CreateUserDefinedFileIdentifier is not aware of the pb.
       {
-         tokens[3] = gdcm::Util::GetName( *it );
+         ///this is a trick to build up a lexicographical compliant name :
+         ///     eg : fich001.ima vs fich100.ima as opposed to fich1.ima vs fich100.ima
+         std::string name = gdcm::Util::GetName( *it );
+         if (hasSkel)
+         {
+            gdcm::Util::Tokenize (name, tokensForFileName, skel);
+            imageNum = atoi ( tokensForFileName[0].c_str() );
+            // probabely we could write something much more complicated using C++ !
+            sprintf (newName, "%s%06d%s", skel, imageNum, extent);
+            tokens[3] = newName;
+            tokensForFileName.clear();    
+         }
+         else
+            tokens[3] = name;
          userFileIdentifier = tokens[0] + token + tokens[1] + token + tokens[2] + token 
                     + tokens[3] + token + tokens[4] + token;
-      std::cout << "userFileIdentifier2: "<< userFileIdentifier << std::endl;
       }   
-       std::cout << "                           [" <<
-              userFileIdentifier  << "]" << std::endl;
+      if (verbose) 
+         std::cout << "[" << userFileIdentifier  << "]" << std::endl;
                
       // storing in a map ensures automatic sorting !      
       sf[userFileIdentifier] = f;
@@ -370,7 +390,7 @@ int main(int argc, char *argv[])
        
       fullFilename =  currentFile->GetFileName();
       lastFilename =  gdcm::Util::GetName( fullFilename ); 
-      std::cout << "Try to write [" <<lastFilename << "]" << std::endl;
+      std::cout << "Rewrite [" <<lastFilename << "]" << std::endl;
      
       tokens.clear();
       gdcm::Util::Tokenize (it2->first, tokens, token);
@@ -530,20 +550,26 @@ int main(int argc, char *argv[])
       if (currentFile->IsVRCoherent(0x0021) == 1 )
          stringVR = "  ";
       else
-        stringVR = "IS";  
+        stringVR = "IS";
+  
       currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, stringVR);
       currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, stringVR); 
-           
-      if (flag == 0)
-      {       
-         flag = 1;
-      }
-      else
-      {
+      
+      if (taggrid)
          frameIndex++;
-         flag = 0;
-      }
-                    
+      else     
+      {     
+         if (flag == 0)
+         {       
+            flag = 1;
+         }
+         else
+         {
+            frameIndex++;
+            flag = 0;
+         }
+      } 
+                 
       if (split)
       
          //fullWriteFilename = currentPhaseEncodingDirectionWriteDir + gdcm::GDCM_FILESEPARATOR 
@@ -565,6 +591,12 @@ int main(int argc, char *argv[])
       fh = gdcm::FileHelper::New(currentFile);     
       fh->GetImageDataRaw(); // Don't convert (Gray Pixels + LUT) into (RGB pixels) ?!?
       fh->SetWriteTypeToDcmExplVR();
+      // We didn't modify pixels -> keep unchanged the following :
+      // 'Media Storage SOP Class UID' (0x0002,0x0002)
+      // 'SOP Class UID'               (0x0008,0x0016)
+      // 'Image Type'                  (0x0008,0x0008)
+      // 'Conversion Type'             (0x0008,0x0064)
+      fh->SetContentType(gdcm::UNMODIFIED_PIXELS_IMAGE);
       if (!fh->Write(fullWriteFilename))
       {
          std::cout << "Fail to write :[" << fullWriteFilename << "]"