+
+ START_USAGE(usage)
+ " \n PrintFile : \n ",
+ " Display the header of a ACR-NEMA/PAPYRUS/DICOM File ",
+ " usage: PrintFile {filein=inputFileName|dirin=inputDirectoryName}[level=n]",
+ " [forceload=listOfElementsToForceLoad] ",
+ " [dict= privateDirectory] ",
+ " [ { [noshadowseq] | [noshadow][noseq] } ] [debug] ",
+ " level = 0,1,2 : depending on the amount of details user wants to see",
+ " listOfElementsToForceLoad : group-elem,g2-e2,... (in hexa, no space)",
+ " of Elements to load whatever their length ",
+ " privateDirectory : source file full path name of Shadow Group elems ",
+ " 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 : 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 || am->ArgMgrDefined("usage") )
+ {
+ am->ArgMgrUsage(usage); // Display 'usage'
+ delete am;
+ return 0;
+ }
+
+ char *fileName = am->ArgMgrGetString("filein",(char *)0);
+ char *dirName = am->ArgMgrGetString("dirin",(char *)0);
+
+ 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;
+ }
+
+ if (am->ArgMgrDefined("debug"))
+ gdcm::Debug::DebugOn();
+
+ int loadMode = gdcm::LD_ALL;
+ if ( am->ArgMgrDefined("noshadowseq") )
+ loadMode |= gdcm::LD_NOSHADOWSEQ;
+ else
+ {
+ if ( am->ArgMgrDefined("noshadow") )
+ loadMode |= gdcm::LD_NOSHADOW;
+ if ( am->ArgMgrDefined("noseq") )
+ loadMode |= gdcm::LD_NOSEQ;
+ }
+
+ int level = am->ArgMgrGetInt("level", 1);
+
+ int forceLoadNb;
+ uint16_t *elemsToForceLoad
+ = am->ArgMgrGetXInt16Enum("forceload", &forceLoadNb);
+
+ bool showlut = ( 0 != am->ArgMgrDefined("SHOWLUT") );
+
+ bool ddict = am->ArgMgrDefined("dict") ? true : false;
+ char *dict = 0;
+
+ if (ddict)
+ {
+ dict = am->ArgMgrGetString("dict",(char *)0);
+ }
+
+ /* 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
+
+ // ----------- End Arguments Manager ---------
+
+
+ if (ddict)
+ {
+ gdcm::Global::GetDicts()->GetDefaultPubDict()->AddDict(dict);
+ }
+
+ if ( fileName != 0 ) // ====== Deal with a single file ======
+ {
+ // 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 *f = new gdcm::File();
+ f->SetLoadMode(loadMode);
+ f->SetFileName( fileName );
+
+ for (int ri=0; ri<forceLoadNb; ri++)
+ {
+ f->AddForceLoadElement((uint32_t)elemsToForceLoad[2*ri],
+ (uint32_t)elemsToForceLoad[2*ri+1] );
+ }
+
+ bool res = f->Load();
+ if ( !res )
+ {
+ std::cout << "Cannot process file [" << fileName << "]" << 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;
+ delete f;
+ return 0;
+ }
+
+ gdcm::FileHelper *fh = new gdcm::FileHelper(f);
+ fh->SetPrintLevel( level );
+
+ fh->Print();
+
+ std::cout << "\n\n" << std::endl;
+
+ std::cout <<std::endl;
+ std::cout <<" dataSize " << fh->GetImageDataSize() << std::endl;
+ std::cout <<" dataSizeRaw " << fh->GetImageDataRawSize() << std::endl;
+
+ int nX,nY,nZ,sPP,planarConfig;
+ std::string pixelType;
+ nX=f->GetXSize();
+ nY=f->GetYSize();
+ nZ=f->GetZSize();
+ std::cout << " DIMX=" << nX << " DIMY=" << nY << " DIMZ=" << nZ
+ << std::endl;
+
+ pixelType = f->GetPixelType();
+ sPP = f->GetSamplesPerPixel();
+ planarConfig = f->GetPlanarConfiguration();
+
+ std::cout << " pixelType= [" << pixelType
+ << "] SamplesPerPixel= [" << sPP
+ << "] PlanarConfiguration= [" << planarConfig
+ << "] "<< std::endl
+ << " PhotometricInterpretation= ["
+ << f->GetEntryValue(0x0028,0x0004)
+ << "] "<< std::endl;
+
+ int numberOfScalarComponents=f->GetNumberOfScalarComponents();
+ std::cout << " NumberOfScalarComponents = " << numberOfScalarComponents
+ <<std::endl
+ << " LUT = " << (f->HasLUT() ? "TRUE" : "FALSE")
+ << std::endl;
+
+ if ( f->GetEntryValue(0x0002,0x0010) == gdcm::GDCM_NOTLOADED )
+ {
+ std::cout << "Transfer Syntax not loaded. " << std::endl
+ << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE"
+ << std::endl;
+ return 0;
+ }
+
+ std::string transferSyntaxName = f->GetTransferSyntaxName();
+ std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]"
+ << std::endl;
+ std::cout << " SwapCode= " << f->GetSwapCode() << std::endl;
+ std::cout << " ------" << std::endl;
+ //std::cout << "\n\n" << std::endl;
+ //std::cout << "X spacing " << f->GetXSpacing() << std::endl;
+ //std::cout << "Y spacing " << f->GetYSpacing() << std::endl;
+ //std::cout << "Z spacing " << f->GetZSpacing() << std::endl;
+
+ // Lets's get and print some usefull fields about 'Orientation'
+ // ------------------------------------------------------------
+
+ std::string strPatientPosition =
+ f->GetEntryValue(0x0018,0x5100);
+ if ( strPatientPosition != gdcm::GDCM_UNFOUND
+ && strPatientPosition != "" )
+ std::cout << "PatientPosition (0x0010,0x5100)= ["
+ << strPatientPosition << "]" << std::endl;