Program: gdcm
Module: $RCSfile: PrintFile.cxx,v $
Language: C++
- Date: $Date: 2005/08/28 17:02:34 $
- Version: $Revision: 1.47 $
+ Date: $Date: 2005/10/01 19:39:14 $
+ Version: $Revision: 1.61 $
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 "gdcmDocument.h"
#include "gdcmSeqEntry.h"
#include "gdcmSQItem.h"
#include "gdcmBinEntry.h"
#include "gdcmFileHelper.h"
#include "gdcmDebug.h"
#include "gdcmDirList.h"
-
+#include "gdcmGlobal.h"
+#include "gdcmDictSet.h"
#include "gdcmArgMgr.h"
-
+#include "gdcmOrientation.h"
#include <iostream>
{
START_USAGE(usage)
- " \n PrintFile : \n ",
- " Display the header of a ACR-NEMA/PAPYRUS/DICOM File ",
- " usage: PrintFile {filein=inputFileName|dirin=inputDirectoryName}[level=n]",
+ " \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",
- " 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)",
+ " 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
if (am->ArgMgrDefined("debug"))
gdcm::Debug::DebugOn();
- int loadMode = 0x00000000;
+ int loadMode = gdcm::LD_ALL;
if ( am->ArgMgrDefined("noshadowseq") )
- loadMode |= NO_SHADOWSEQ;
+ loadMode |= gdcm::LD_NOSHADOWSEQ;
else
{
if ( am->ArgMgrDefined("noshadow") )
- loadMode |= NO_SHADOW;
+ loadMode |= gdcm::LD_NOSHADOW;
if ( am->ArgMgrDefined("noseq") )
- loadMode |= NO_SEQ;
+ loadMode |= gdcm::LD_NOSEQ;
}
- int level = am->ArgMgrGetInt("level", 2);
+ 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() )
{
// ----------- 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
gdcm::File *f = new gdcm::File();
f->SetLoadMode(loadMode);
f->SetFileName( fileName );
- bool res = f->Load();
+ 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;
nX=f->GetXSize();
nY=f->GetYSize();
nZ=f->GetZSize();
- std::cout << " DIMX=" << nX << " DIMY=" << nY << " DIMZ=" << nZ << std::endl;
+ std::cout << " DIMX=" << nX << " DIMY=" << nY << " DIMZ=" << nZ
+ << std::endl;
pixelType = f->GetPixelType();
sPP = f->GetSamplesPerPixel();
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;
+
+ std::string strPatientOrientation =
+ f->GetEntryValue(0x0020,0x0020);
+ if ( strPatientOrientation != gdcm::GDCM_UNFOUND
+ && strPatientOrientation != "")
+ std::cout << "PatientOrientation (0x0020,0x0020)= ["
+ << strPatientOrientation << "]" << std::endl;
+
+ std::string strImageOrientationPatient =
+ f->GetEntryValue(0x0020,0x0037);
+ if ( strImageOrientationPatient != gdcm::GDCM_UNFOUND
+ && strImageOrientationPatient != "" )
+ std::cout << "ImageOrientationPatient (0x0020,0x0037)= ["
+ << strImageOrientationPatient << "]" << std::endl;
+
+ std::string strImageOrientationRET =
+ f->GetEntryValue(0x0020,0x0035);
+ if ( strImageOrientationRET != gdcm::GDCM_UNFOUND
+ && strImageOrientationRET != "" )
+ std::cout << "ImageOrientationRET (0x0020,0x0035)= ["
+ << strImageOrientationRET << "]" << std::endl;
+
+ // Let's compute 'user friendly' results about 'Orientation'
+ // ---------------------------------------------------------
+
+ gdcm::Orientation o;
+
+ if ( strImageOrientationPatient != gdcm::GDCM_UNFOUND ||
+ strImageOrientationRET != gdcm::GDCM_UNFOUND )
+ {
+
+ gdcm::OrientationType orient = o.GetOrientationType( f );
+
+ std::cout << "TypeOrientation = " << orient << " (-> "
+ << o.GetOrientationTypeString(orient) << " )" << std::endl;
+ }
+
+ std::string ori = o.GetOrientation ( f );
+ if (ori != "\\" )
+ std::cout << "Orientation [" << ori << "]" << std::endl;
+
+
// Display the LUT as an int array (for debugging purpose)
if ( f->HasLUT() && showlut )
{
int length; // LUT length in Bytes
int deb; // Subscript of the first Lut Value
int nbits; // Lut item size (in Bits)
- int nbRead; // nb of items in LUT descriptor (must be = 3)
+ int nbRead; // nb of items in LUT descriptor (must be = 3)
nbRead = sscanf( lutDescriptor.c_str(),
"%d\\%d\\%d",
std::cout << "Try LUT Data "<< std::endl;
ShowLutData(f);
}
+
+ //if( !f->gdcm::Document::IsReadable())
+ // Try downcast to please MSVC
+ if ( !((gdcm::Document *)f)->IsReadable() )
+ {
+ std::cout <<std::endl<<fileName<<" is NOT 'gdcm parsable'"<<std::endl;
+ }
if (f->IsReadable())
std::cout <<std::endl<<fileName<<" is Readable"<<std::endl;
- else
- std::cout <<std::endl<<fileName<<" is NOT Readable"<<std::endl;
+ else if ( f->GetSeqEntry(0x0041,0x1010) )
+ {
+ std::cout <<std::endl<<fileName<<" looks like a 'PAPYRUS image' file"
+ <<std::endl;
+ }
+ else if ( f->GetSeqEntry(0x0004,0x1220) )
+ {
+ std::cout <<std::endl<<fileName<<" looks like a 'DICOMDIR file'"
+ <<std::endl;
+ }
+ else
+ {
+ std::cout <<std::endl<<fileName<<" doesn't look like an image file "
+ <<std::endl;
+ }
+
std::cout<<std::flush;
delete f;
delete fh;
it != fileList.end();
++it )
{
+ std::cout << std::endl<<" Start processing :[" << it->c_str() << "]"
+ << std::endl;
f = new gdcm::File();
f->SetLoadMode(loadMode);
f->SetFileName( it->c_str() );
+
+ for (int ri=0; ri<forceLoadNb; ri++)
+ {
+ printf("%04x,%04x\n",elemsToForceLoad[2*ri],
+ elemsToForceLoad[2*ri+1]);
+ f->AddForceLoadElement((uint32_t)elemsToForceLoad[2*ri],
+ (uint32_t)elemsToForceLoad[2*ri+1]);
+ }
res = f->Load();
if ( !res )
<< 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;
+ std::cout << "use 'PrintFile filein=... debug' "
+ << "to try to guess the pb"
+ << std::endl;
delete f;
continue;
}
fh->SetPrintLevel( level );
fh->Print();
+ gdcm::Orientation o;
+ std::string ori = o.GetOrientation ( f );
+ if (ori != gdcm::GDCM_UNFOUND )
+ std::cout << "- Orientation [" << ori << "]" << std::endl;
+ gdcm::OrientationType d = o.GetOrientationType( f );
+
+ std::cout << "TypeOrientation = " << d << " (-> "
+ << o.GetOrientationTypeString(d) << std::endl;
+
if (f->IsReadable())
std::cout <<std::endl<<it->c_str()<<" is Readable"<<std::endl;
else