/*========================================================================= Program: gdcm Module: $RCSfile: exPresentationState.cxx,v $ Language: C++ Date: $Date: 2010/09/01 14:41:48 $ Version: $Revision: 1.5 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "gdcmFile.h" // ---------- //#include "gdcmValEntry.h" #include "gdcmDataEntry.h" // ---------- #include "gdcmSeqEntry.h" #include "gdcmSQItem.h" #include "gdcmDocEntrySet.h" //#include "gdcmSerieHelper.h" #include "gdcmDirList.h" #include "gdcmUtil.h" #include "gdcmArgMgr.h" GDCM_NAME_SPACE::SeqEntry *CheckIfSequenceExists(GDCM_NAME_SPACE::File *fPS, uint16_t gr, uint16_t el); GDCM_NAME_SPACE::SeqEntry *CheckIfSequenceExists(GDCM_NAME_SPACE::SQItem *si, uint16_t gr, uint16_t el); bool dealWithCurrentFile(const char *PSName); bool dealWithTopLevelItem(GDCM_NAME_SPACE::SQItem* currentItem); bool dealWithEndLevelItem(GDCM_NAME_SPACE::SQItem* currentItem); void displaySeekResult(GDCM_NAME_SPACE::SeqEntry* currentItem, uint16_t g, uint16_t e); void dealWithSequence(GDCM_NAME_SPACE::SeqEntry* se); // ------------------------------------------------------------------------------------------------------- int main(int argc, char *argv[]) { START_USAGE(usage) "\n exPresentationState :\n ", "Extracts and displays the Graphic annotation / Text Objet Sequences of gdcm-parsable Dicom file", " ", "usage: exPresentationState {filein=inputFileName|dirin=inputDirectoryName}", " [ { [noshadowseq] | [noshadow][noseq] } ] [debug] ", " filein : Name of the image file ", " PSFile : Name of the PresentationState file : ", " 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 ", " verbose : developper wants to run the program in 'verbose mode' ", " debug : developper wants to run the program in 'debug mode' ", " ", " you can use it as : ", " for i in `ls PS*`; do exPresentationState PSFile=$i; done ", " just to see ... ", FINISH_USAGE // ----- Initialize Arguments Manager ------ 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; return 0; } if (am->ArgMgrDefined("debug")) GDCM_NAME_SPACE::Debug::DebugOn(); bool verbose = am->ArgMgrDefined("verbose"); const char *fileName = am->ArgMgrGetString("filein"); const char *PSName = am->ArgMgrGetString("PSfile"); /* 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 ------ // ============================================================ // Read the input file. // ============================================================ GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New( ); // ================================================================================= bool resFile = dealWithCurrentFile(PSName); std::cout << "\n\n" <SetFileName( PSName ); fPS->SetMaxSizeLoadEntry(0xffff); bool res2 = fPS->Load(); if (!res2) { std::cout << "Sorry, " << PSName << " not a gdcm-readable " << "DICOM / ACR File" << std::endl; fPS->Delete(); return false; } GDCM_NAME_SPACE::SeqEntry *se; se = CheckIfSequenceExists( fPS, 0x0070, 0x0001); //displaySeekResult(se, 0x0070, 0x0001); if (!se) { std::cout << "[" << PSName << "] : Hopeless (" << std::hex << 0x0070 << "|" << 0x0001 << std::dec << " doesn't exist...)" <GetFirstSQItem(); // Get the first 'ROI' if (currentItem == NULL) { std::cout << "======== Deal With NOTHING! (Sequence 0070|0001 [Graphic Annotation Sequence] has NO item ?!?)" << std::endl; } int i =0; while (currentItem != NULL) { std::cout << "======== Deal With 'ROI' n." << i << std::endl; // do what you want with the current 'ROI' dealWithTopLevelItem(currentItem); //... currentItem = se->GetNextSQItem(); // Get the next 'ROI' i++; } /* bool res3 = TestPresentationState(f, fPS); if (res3) { std::cout << "[" << PSName << "] is a gdcm-readable PresentationState file" <Delete(); std::cout << "\n\n" <GetGroup(); uint16_t e = se->GetElement(); std::cout << std::hex << "\n------------------------ deal with " << g <<"|" << e << std::dec << " " << se->GetName() << std::endl; GDCM_NAME_SPACE::SQItem *si = se->GetFirstSQItem(); if (!si) { std::cout << "Sequence " << std::hex << g <<"|" << e << std::dec << "has no Item ?!?" << std::endl; return; } if (g == 0x0008) { si->Print(std::cout); } else if (g == 0x0070) { si->Print(std::cout); } else { std::cout << "Unexpected Group " << std::hex << g << std::hex << std::endl; } si = se->GetNextSQItem(); if (si) { std::cout << "Sequence " << std::hex << g <<"|" << e << std::dec << "should have only ONE Item ?!?" << std::endl; si->Print(std::cout); return; } } //---------------------------------------------------------------------------------------------------- void displaySeekResult(GDCM_NAME_SPACE::SeqEntry* se, uint16_t g, uint16_t e) { if (se) { // std::cout << std::hex << g << "|" << e << std::dec << " [" << se->GetName() << "] exists" <GetSeqEntry(gr, el); return se; } // ---------------------------------------------------------------------------------- GDCM_NAME_SPACE::SeqEntry *CheckIfSequenceExists( GDCM_NAME_SPACE::SQItem *si, uint16_t gr, uint16_t el) { GDCM_NAME_SPACE::SeqEntry *se= si->GetSeqEntry(gr, el); return se; }