/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.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 notice for more information. =========================================================================*/ #include "gdcmReader.h" #include "gdcmWriter.h" #include "gdcmItem.h" #include "gdcmImageReader.h" #include "gdcmSequenceOfItems.h" #include "gdcmFile.h" #include "gdcmTag.h" /* * This example is used to generate the file: * * gdcmConformanceTests/SequenceWithUndefinedLengthNotConvertibleToDefinedLength.dcm * * There is a flaw in the DICOM design were it is assumed that Sequence can be * either represented as undefined length or defined length. This should work * in most case, but the undefined length is a little more general and can * store sequence of items that a defined length cannot. * Deflated syntax was used in this case since this synthetic example can be * nicely compressed using this transfer syntax. * * Warning: do not try to compute the group length elements ! * Warning: You may need a 64bits machine for this example to work. */ int main(int argc, char *argv[]) { if( argc < 3 ) { std::cerr << argv[0] << " input.dcm output.dcm" << std::endl; return 1; } const char *filename = argv[1]; const char *outfilename = argv[2]; gdcm::Reader reader; reader.SetFileName( filename ); if( !reader.Read() ) { return 1; } gdcm::File &file = reader.GetFile(); gdcm::DataSet &ds = file.GetDataSet(); //const unsigned int nitems = 1000; const unsigned int ptr_len = 42; /*94967296 / nitems; */ //assert( ptr_len == 42949672 ); char *ptr = new char[ptr_len]; memset(ptr,0,ptr_len); // Create a Sequence gdcm::SmartPointer sq = new gdcm::SequenceOfItems(); sq->SetLengthToUndefined(); const char owner_str[] = "GDCM CONFORMANCE TESTS"; gdcm::DataElement owner( gdcm::Tag(0x4d4d, 0x10) ); owner.SetByteValue(owner_str, (uint32_t)strlen(owner_str)); owner.SetVR( gdcm::VR::LO ); for(unsigned int idx = 0; idx < 10/* nitems*/; ++idx) { // Create a dataelement gdcm::DataElement de( gdcm::Tag(0x4d4d, 0x1002) ); de.SetByteValue(ptr, ptr_len); de.SetVR( gdcm::VR::OB ); // Create an item gdcm::Item it; it.SetVLToUndefined(); gdcm::DataSet &nds = it.GetNestedDataSet(); nds.Insert(owner); nds.Insert(de); sq->AddItem(it); } // Insert sequence into data set gdcm::DataElement des( gdcm::Tag(0x4d4d,0x1001) ); des.SetVR(gdcm::VR::SQ); des.SetValue(*sq); des.SetVLToUndefined(); ds.Insert(owner); ds.Insert(des); gdcm::Writer w; w.SetFile( file ); //w.SetCheckFileMetaInformation( true ); w.SetFileName( outfilename ); if (!w.Write() ) { return 1; } return 0; }