]> Creatis software - gdcm.git/blobdiff - Example/AnonymizeNoLoad.cxx
Fix mistypings
[gdcm.git] / Example / AnonymizeNoLoad.cxx
index 0da55c1c97dd5230e39fc18da31b8dc3f3399067..dc7eadc9aea8e294e038fab4fbffbecc6c170845 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: AnonymizeNoLoad.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/06/14 09:09:50 $
-  Version:   $Revision: 1.2 $
+  Date:      $Date: 2007/06/06 13:03:57 $
+  Version:   $Revision: 1.21 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -19,6 +19,7 @@
 #include "gdcmFileHelper.h"
 #include "gdcmCommon.h"
 #include "gdcmDebug.h"
+#include "gdcmDirList.h"
 
 #include "gdcmArgMgr.h"
 
 int main(int argc, char *argv[])
 {
    START_USAGE(usage)
-   " \n AnonymizeNoLoad :\n",
-   " Anonymize a gdcm-readable Dicom image even if pixels aren't gdcm readable",
-   "          Warning : Warning : the image is overwritten",
-   "                    to preserve image integrity, use a copy.",
-   " usage: AnonymizeNoLoad filein=inputFileName fileout=[debug] ",
-   "        debug    : user wants to run the program in 'debug mode' ",
+   "\n AnonymizeNoLoad :\n                                                    ",
+   "Anonymize a gdcm-parsable Dicom image even if pixels aren't gdcm readable ",
+   "         Warning : the image is OVERWRITTEN                               ",
+   "                   to preserve image integrity, use a copy.               ",
+   "usage: AnonymizeNoLoad {filein=inputFileName|dirin=inputDirectoryName}    ",
+   "                       [rubout=listOfElementsToRubOut]                    ",
+   "                       [ { [noshadowseq] | [noshadow][noseq] } ] [debug]  ",
+   "       inputFileName : Name of the (single) file user wants to anonymize  ",
+   "       inputDirectoryName : user wants to anonymize *all* the files       ",
+   "                            within the (single Patient!) directory        ",
+   "       listOfElementsToRubOut : group-elem,g2-e2,... (in hexa, no space)  ",
+   "                                of extra Elements to rub out              ",
+   "       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'   ",
    FINISH_USAGE
 
-   // ----- Initialize Arguments Manager ------   
-   gdcm::ArgMgr *am = new gdcm::ArgMgr(argc, argv);
+   // ----- Initialize Arguments Manager ------
   
-   if (am->ArgMgrDefined("usage")) 
+   GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
+  
+   if (am->ArgMgrDefined("usage") || argc == 1) 
    {
       am->ArgMgrUsage(usage); // Display 'usage'
       delete am;
@@ -46,94 +58,193 @@ int main(int argc, char *argv[])
    }
 
    if (am->ArgMgrDefined("debug"))
-      gdcm::Debug::DebugOn();
-
-   char *fileName = am->ArgMgrWantString("filein",usage);
+      GDCM_NAME_SPACE::Debug::DebugOn();
 
-   int loadMode;
-   if ( am->ArgMgrDefined("noshadow") && am->ArgMgrDefined("noseq") )
-       loadMode = NO_SEQ | NO_SHADOW;  
-   else if ( am->ArgMgrDefined("noshadow") )
-      loadMode = NO_SHADOW;
-   else if ( am->ArgMgrDefined("noseq") )
-      loadMode = NO_SEQ;
-   else
-      loadMode = 0;
+   const char *fileName = am->ArgMgrGetString("filein");
+   const char *dirName  = am->ArgMgrGetString("dirin");
 
-   delete am;  // we don't need Argument Manager any longer
+   if ( (fileName == 0 && dirName == 0)
+        ||
+        (fileName != 0 && dirName != 0) )
+   {
+       std::cout <<std::endl
+                 << "Either 'filein=' or 'dirin=' must be present;" 
+                 << std::endl << "Not both" << std::endl;
+       am->ArgMgrUsage(usage); // Display 'usage'  
+       delete am;
+       return 0;
+ }
+   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;
+   }
 
-   // ============================================================
-   //   Parse the input file.
-   // ============================================================
+   int rubOutNb;
+   uint16_t *elemsToRubOut = am->ArgMgrGetXInt16Enum("rubout", &rubOutNb);
 
-   gdcm::File *f1;
-   f1 = new gdcm::File( );
-   f1->SetLoadMode(loadMode);
-   int res = f1->Load(fileName);
+   /* if unused Param we give up */
+   if ( am->ArgMgrPrintUnusedLabels() )
+   {
+      am->ArgMgrUsage(usage);
+      delete am;
+      return 0;
+   } 
+   delete am;  // ------ we don't need Arguments Manager any longer ------
 
-   // gdcm::File::IsReadable() is no usable here, because we deal with
-   // any kind of gdcm::Readable *document*
-   // not only gdcm::File (as opposed to gdcm::DicomDir)
-   if ( !res ) 
+   GDCM_NAME_SPACE::File *f;
+   if ( fileName != 0 ) // ====== Deal with a single file ======
    {
-       std::cout <<std::endl
-           << "Sorry, " << fileName <<"  not a gdcm-readable "
-           << "DICOM / ACR Document"
-           << std::endl;
-        delete f1;
-        return 1;
+
+   // 
+   //   Parse the input file.
+   // 
+      f = GDCM_NAME_SPACE::File::New( );
+      f->SetLoadMode(loadMode);
+      f->SetFileName( fileName );
+
+      // GDCM_NAME_SPACE::File::IsReadable() is no usable here, because we deal with
+      // any kind of GDCM_NAME_SPACE::Readable *document*
+      // not only GDCM_NAME_SPACE::File (as opposed to GDCM_NAME_SPACE::DicomDir)
+      if ( !f->Load() ) 
+      {
+          std::cout <<std::endl
+              << "Sorry, " << fileName <<"  not a gdcm-readable "
+              << "DICOM / ACR Document"
+              << std::endl;
+           f->Delete();
+           return 1;
+      }
+      std::cout << fileName << " is readable " << std::endl;
+
+      // 
+      //      No need to load the pixels in memory.
+      //      File will be overwritten
+      // 
+
+      // 
+      //  Choose the fields to anonymize.
+      // 
+
+      // Institution name 
+      f->AddAnonymizeElement( 0x0008, 0x0080, "gdcm-Xanadoo Hospital" ); 
+      // Patient's name 
+      f->AddAnonymizeElement( 0x0010, 0x0010, "gdcm^Fantomas" );      
+      // Patient's ID
+      f->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
+      // Patient's Birthdate
+      f->AddAnonymizeElement( 0x0010, 0x0030,"11111111" );
+      // Patient's Adress
+      f->AddAnonymizeElement( 0x0010, 0x1040,"gdcm at Sing-sing.org" );
+      // Patient's Mother's Birth Name
+      f->AddAnonymizeElement( 0x0010, 0x1060,"gdcm^Vampirella" );      
+      // Study Instance UID
+      f->AddAnonymizeElement( 0x0020, 0x000d, "9.99.999.9999" );
+      // Telephone
+      f->AddAnonymizeElement(0x0010, 0x2154, "3615" );
+
+      for (int ri=0; ri<rubOutNb; ri++)
+      {
+         printf("%04x,%04x\n",elemsToRubOut[2*ri], elemsToRubOut[2*ri+1]);
+         f->AddAnonymizeElement((uint32_t)elemsToRubOut[2*ri], 
+                                (uint32_t)elemsToRubOut[2*ri+1],"*" ); 
+      }
+
+      // Aware use will add new fields here
+
+      // 
+      //      Overwrite the file
+      // 
+
+      std::cout <<"Let's AnonymizeNoLoad " << std::endl;
+
+      // The GDCM_NAME_SPACE::File remains untouched in memory
+
+      f->AnonymizeNoLoad();
+
+      // No need to write the file : modif were done on disc !
+      //  ( The Dicom file is overwritten )
+      std::cout <<"End AnonymizeNoLoad" << std::endl;
+
+      // 
+      //      Remove the Anonymize list
+      //   
+      f->ClearAnonymizeList();
+      f->Delete();
+      return 0;
+
    }
-   std::cout << fileName << " is readable " << std::endl;
-
-   // ============================================================
-   //   No need to load the pixels in memory.
-   //   File will be overwritten
-   // ============================================================
-
-
-   // ============================================================
-   //  Choose the fields to anonymize.
-   // ============================================================
-   // Institution name 
-   f1->AddAnonymizeElement( 0x0008, 0x0080, "Xanadoo" ); 
-   // Patient's name 
-   f1->AddAnonymizeElement( 0x0010, 0x0010, "Fantomas" );   
-   // Patient's ID
-   f1->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
-   // Patient's Birthdate
-   f1->AddAnonymizeElement( 0x0010, 0x0030,"11.11.1111" );
-   // Patient's Adress
-   f1->AddAnonymizeElement( 0x0010, 0x1040,"Sing-sing" );
-   // Patient's Mother's Birth Name
-   f1->AddAnonymizeElement( 0x0010, 0x1060,"Vampirella" );   
-   // Study Instance UID
-   f1->AddAnonymizeElement( 0x0020, 0x000d, "9.99.999.9999" );
-   // Telephone
-   f1->AddAnonymizeElement(0x0010, 0x2154, "3615" );
-
-  // Aware use will add new fields here
-
-   // ============================================================
-   //   Overwrite the file
-   // ============================================================
-
-   std::cout <<"Let's AnonymizeNoLoad " << std::endl;;
-
-   // The gdcm::File remains untouched in memory
-
-   f1->AnonymizeNoLoad();
-
-   // No need to write the File : modif were done on disc !
-   // File was overwritten ...
-
-   std::cout <<"End AnonymizeNoLoad" << std::endl;
-
-   // ============================================================
-   //   Remove the Anonymize list
-   // ============================================================  
-   f1->ClearAnonymizeList();
+   else  // ====== Deal with a (single Patient) Directory ======
+   {
+      std::cout << "dirName [" << dirName << "]" << std::endl;
+      GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list
+      GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
+      for( GDCM_NAME_SPACE::DirListType::iterator it  = fileList.begin();
+                                 it != fileList.end();
+                                 ++it )
+      {
+         f = GDCM_NAME_SPACE::File::New( );
+         f->SetLoadMode(loadMode);
+         f->SetFileName( it->c_str() );
+
+         if ( !f->Load() )
+         {
+            f->Delete();
+            continue;
+         }
+         // 
+         //  Choose the fields to anonymize.
+         // 
+         // Institution name 
+         f->AddAnonymizeElement( 0x0008, 0x0080, "gdcm-Xanadoo Hospital" ); 
+         // Patient's name 
+         f->AddAnonymizeElement( 0x0010, 0x0010, "gdcm^Fantomas" );   
+         // Patient's ID
+         f->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
+         // Patient's Birthdate
+         f->AddAnonymizeElement( 0x0010, 0x0030,"11111111" );
+         // Patient's Adress
+         f->AddAnonymizeElement( 0x0010, 0x1040,"gdcm at Sing-sing.org" );
+         // Patient's Mother's Birth Name
+         f->AddAnonymizeElement( 0x0010, 0x1060,"gdcm^Vampirella" );   
+         // Study Instance UID
+         // we may not brutaly overwrite it
+         //f->AddAnonymizeElement( 0x0020, 0x000d, "9.99.999.9999" );
+         // Telephone
+         f->AddAnonymizeElement(0x0010, 0x2154, "3615" );
+
+         // deal with user defined Elements set
+
+         for (int ri=0; ri<rubOutNb; ri++)
+         {
+            f->AddAnonymizeElement((uint32_t)elemsToRubOut[2*ri], 
+                                   (uint32_t)elemsToRubOut[2*ri+1],"*" ); 
+         }        
+         std::cout <<"Let's AnonymizeNoLoad " << it->c_str() << std::endl;
+
+         // The GDCM_NAME_SPACE::File remains untouched in memory
+         // The Dicom file is overwritten on disc
+
+         f->AnonymizeNoLoad();
+
+         // 
+         //   Remove the Anonymize list
+         //
+
+         f->ClearAnonymizeList();
     
-   delete f1;
+         f->Delete();
+      }
+   }
    return 0;
 }