From: jpr Date: Thu, 2 Sep 2004 12:58:59 +0000 (+0000) Subject: dded a modified version of Mathieu's TestCopyDicom.cxx X-Git-Tag: Version0.6.bp~231 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=5b4ab2e7e473455c7b5c4b2c21164df15451e19f;p=gdcm.git dded a modified version of Mathieu's TestCopyDicom.cxx (put here not to polute gdcm/Test) --- diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 2107d45d..07ed443b 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -46,3 +46,6 @@ TARGET_LINK_LIBRARIES(PrintDicomDir gdcm) ADD_EXECUTABLE(BuildUpDicomDir BuildUpDicomDir.cxx) TARGET_LINK_LIBRARIES(BuildUpDicomDir gdcm) + +ADD_EXECUTABLE(TestCopyDicom TestCopyDicom.cxx) +TARGET_LINK_LIBRARIES(TestCopyDicom gdcm) diff --git a/Example/TestCopyDicom.cxx b/Example/TestCopyDicom.cxx new file mode 100644 index 00000000..f1b4978f --- /dev/null +++ b/Example/TestCopyDicom.cxx @@ -0,0 +1,101 @@ +#include "gdcmHeader.h" +#include "gdcmFile.h" +#include "gdcmDocument.h" +#include "gdcmValEntry.h" + +// return true if the file exists +bool FileExists(const char* filename) +{ +#ifdef _MSC_VER +# define access _access +#endif +#ifndef R_OK +# define R_OK 04 +#endif + if ( access(filename, R_OK) != 0 ) + { + return false; + } + else + { + return true; + } +} + +bool RemoveFile(const char* source) +{ +#ifdef _MSC_VER +#define _unlink unlink +#endif + return unlink(source) != 0 ? false : true; +} + +// Here we load a gdcmFile and then try to create from scratch a copy of it, +// copying field by field the dicom image + +int main(int argc, char* argv[]) +{ + if (argc < 3) + { + std::cerr << "Usage :" << std::endl << + argv[0] << " input_dicom output_dicom" << std::endl; + return 1; + } + + if( FileExists( argv[2] ) ) + { + std::cerr << "Don't try to cheat, I am removing the file anyway" << std::endl; + if( !RemoveFile( argv[2] ) ) + { + std::cerr << "Ouch, the file exist, but I cannot remove it" << std::endl; + return 1; + } + } + gdcmFile *original = new gdcmFile( argv[1] ); + + std::cout << "--- Original ----------------------" << std::endl; + original->GetHeader()->Print(); + + gdcmFile *copy = new gdcmFile( argv[2] ); + + //First of all copy the header field by field + + // Warning :Accessor gdcmElementSet::GetEntry() should not exist + //It was commented out by Mathieu, that was a *good* idea + // (the user does NOT have to know the way we implemented the Header !) + + TagDocEntryHT & Ht = original->GetHeader()->GetEntry(); + + for (TagDocEntryHT::iterator tag = Ht.begin(); tag != Ht.end(); ++tag) + { + //std::cerr << "Reading: " << tag->second->GetVR() << std::endl; + tag->second->Print(); std::cout << std::endl; + + if (tag->second->GetVR() == "SQ") //to skip pb of SQ recursive exploration + continue; + // Well ... Should have dynamic cast here + copy->GetHeader()->ReplaceOrCreateByNumber( + ((gdcmValEntry*)(tag->second))->GetValue(), + tag->second->GetGroup(), + tag->second->GetElement() ); + + // todo : Setting Offset to 0 to avoid further missprint + } + + size_t dataSize = original->GetImageDataSize(); + void *imageData = original->GetImageData(); + + copy->SetImageData(imageData, dataSize); + + std::cout << "--- Copy ----------------------" << std::endl; + std::cout <GetHeader()->Print(); + std::cout << "--- ---- ----------------------" << std::endl; + + copy->WriteDcmExplVR( argv[2] ); + + return 0; +} + + +