]> Creatis software - gdcm.git/blobdiff - Example/PrintFile.cxx
BUG: Solve the 'Shoot Yourself in the Foot' problem
[gdcm.git] / Example / PrintFile.cxx
index 91c2ff4239eb68fcd1ff6e33588078c60107cebf..9ff3a681d6ebd695db02b19f5dc24b2a9665d768 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: PrintFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/04/26 16:21:55 $
-  Version:   $Revision: 1.32 $
+  Date:      $Date: 2005/06/17 14:36:19 $
+  Version:   $Revision: 1.40 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
                                                                                 
 =========================================================================*/
 #include "gdcmFile.h"
-#include "gdcmDebug.h"
 #include "gdcmFileHelper.h"
+#include "gdcmDebug.h"
+
+#include "gdcmArgMgr.h"
 
 #include <iostream>
 
 int main(int argc, char *argv[])
 {
-   gdcm::File *e1;
-   gdcm::FileHelper   *f1;
-   std::string fileName;
+
+   START_USAGE(usage)
+   " \n PrintFile : \n",
+   " Display the header of a ACR-NEMA/PAPYRUS/DICOM File",
+   " usage: PrintFile filein=fileName [level=n] [noshadow] [noseq] [debug] ",
+   "        level = 0,1,2 : depending on the amount of details user wants to see",
+   "        noshadow : user doesn't want to load Private groups (odd number)",
+   "        noseq    : user doesn't want to load Sequences ",
+   "        debug    : user wants to run the program in 'debug mode' ",
+   "        showlut  : user wants to display the Palette Color (as an int array)",
+   FINISH_USAGE
+
+   // Initialize Arguments Manager   
+   gdcm::ArgMgr *am= new gdcm::ArgMgr(argc, argv);
   
-   if (argc == 1) 
+   if (argc == 1)
    {
-      std::cout << " usage : PrintFile fileName printLevel debug "
-          << "short (=NOSEQ + NOSHADOW)" 
-                << std::endl;
-    return 0;
+      am->ArgMgrUsage(usage); // Display 'usage'
+      delete am;
+      return 0;
    }
 
-   e1 = new gdcm::File();
+   char *fileName = am->ArgMgrWantString("filein",usage);
 
-   if (argc > 1) 
-   {
-      fileName=argv[1];
-   } 
+   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;
+
+   int level = am->ArgMgrGetInt("level", 2);
 
-   if (argc > 3)
+   if (am->ArgMgrDefined("debug"))
       gdcm::Debug::DebugOn();
 
-   if (argc > 4)
-      e1->SetLoadMode(NO_SEQ | NO_SHADOW);   
-   e1->Load( fileName.c_str() );
+   bool showlut = ( 0 != am->ArgMgrDefined("SHOWLUT") );
+   /* 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 ( !e1->IsReadable() )
+   // ----------- End Arguments Manager ---------
+   // gdcm::File::IsReadable() is no usable here, because we deal with
+   // any kind of gdcm-Parsable *document* 
+   // not only gdcm::File (as opposed to gdcm::DicomDir)
+
+   gdcm::File *e1 = new gdcm::File();
+   e1->SetLoadMode(loadMode);
+
+   bool res = e1->Load( fileName );
+   if ( !res )
    {
       delete e1;
       return 0;
    }
 
-   f1 = new gdcm::FileHelper(e1);
-
-   if (argc > 2)  // keep it here (f1 needs to be constructed !)
-   {
-      int level = atoi(argv[2]);   
-      f1->SetPrintLevel(level);
-   }
+   gdcm::FileHelper *f1 = new gdcm::FileHelper(e1);
+   f1->SetPrintLevel( level );
 
    f1->Print();   
 
    std::cout << "\n\n" << std::endl; 
 
    std::cout <<std::endl;
-   std::cout <<" dataSize " << f1->GetImageDataSize() << std::endl;
+   std::cout <<" dataSize    " << f1->GetImageDataSize()    << std::endl;
    std::cout <<" dataSizeRaw " << f1->GetImageDataRawSize() << std::endl;
 
    int nX,nY,nZ,sPP,planarConfig;
@@ -82,7 +114,7 @@ int main(int argc, char *argv[])
    sPP          = e1->GetSamplesPerPixel();
    planarConfig = e1->GetPlanarConfiguration();
    
-   std::cout << " pixelType= ["           << pixelType 
+   std::cout << " pixelType= ["            << pixelType 
              << "] SamplesPerPixel= ["     << sPP
              << "] PlanarConfiguration= [" << planarConfig 
              << "] "<< std::endl 
@@ -91,11 +123,11 @@ int main(int argc, char *argv[])
              << "] "<< std::endl;
 
    int numberOfScalarComponents=e1->GetNumberOfScalarComponents();
-   std::cout << " NumberOfScalarComponents = " << numberOfScalarComponents <<std::endl
+   std::cout << " NumberOfScalarComponents = " << numberOfScalarComponents 
+             <<std::endl
              << " LUT = " << (e1->HasLUT() ? "TRUE" : "FALSE")
              << std::endl;
 
-  
    if ( e1->GetEntryValue(0x0002,0x0010) == gdcm::GDCM_NOTLOADED ) 
    {
       std::cout << "Transfer Syntax not loaded. " << std::endl
@@ -105,9 +137,38 @@ int main(int argc, char *argv[])
    }
   
    std::string transferSyntaxName = e1->GetTransferSyntaxName();
-   std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" << std::endl;
+   std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" 
+             << std::endl;
    std::cout << " SwapCode= " << e1->GetSwapCode() << std::endl;
-   
+   // Display the LUT as an int array (for degugging purpose)
+   if ( e1->HasLUT() && showlut )
+   {
+      uint8_t* lutrgba = f1->GetLutRGBA();
+      if ( lutrgba == 0 )
+      {
+         std::cout << "Lut RGBA not built ?!?" << std::endl;
+      }
+      else
+      {
+         if ( f1->GetLutItemSize() == 8 )
+         {
+            for (int i=0;i<f1->GetLutItemNumber();i++)
+               std::cout << (int)(lutrgba[i*4])   << " "
+                         << (int)(lutrgba[i*4+1]) << " "
+                         << (int)(lutrgba[i*4+2]) << std::endl;
+         }
+         else // LutItemSize assumed to be = 16
+         {
+            uint16_t* lutrgba16 = (uint16_t*)lutrgba;
+            for (int i=0;i<f1->GetLutItemNumber();i++)
+               std::cout << lutrgba16[i*4]   << " "
+                         << lutrgba16[i*4+1] << " "
+                         << lutrgba16[i*4+2] << std::endl;
+         }
+      }
+   }
+     
    if(e1->IsReadable())
       std::cout <<std::endl<<fileName<<" is Readable"<<std::endl;
    else
@@ -115,7 +176,5 @@ int main(int argc, char *argv[])
    std::cout<<std::flush;
    delete e1;
    delete f1;
-
-   return 0;
-   
+   return 0;   
 }