#include "gdcmReader.h"
#include "gdcmImage.h"
#include "gdcmImageWriter.h"
#include "gdcmDataElement.h"
#include "gdcmPrivateTag.h"
#include "gdcmUIDGenerator.h"
#include <iostream>
#include <string>
#include <map>
bool PrintNameValueMapping( gdcm::SequenceOfItems *sqi_values,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
using namespace gdcm;
typedef VRToType<VR::UL>::Type UL;
std::map< UL, std::string > names;
assert( sqi_names );
assert( sqi_values );
SequenceOfItems::SizeType s = sqi_names->GetNumberOfItems();
PrivateTag tindex(0x7fe1,0x71,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tname (0x7fe1,0x72,"GEMS_Ultrasound_MovieGroup_001");
for( SequenceOfItems::SizeType i = 1; i <= s; ++i )
{
const Item & item = sqi_names->GetItem( i );
const DataSet & ds = item.GetNestedDataSet();
if( !ds.FindDataElement( tindex )
|| !ds.FindDataElement( tname ) )
{
return false;
}
const DataElement & index = ds.GetDataElement( tindex );
const DataElement & name = ds.GetDataElement( tname );
if( index.IsEmpty() || name.IsEmpty() )
{
return false;
}
gdcm::Element<VR::UL, VM::VM1> el1;
el1.SetFromDataElement( index );
gdcm::Element<VR::LO, VM::VM1> el2;
el2.SetFromDataElement( name );
names.insert( std::make_pair( el1.GetValue(), el2.GetValue() ) );
}
SequenceOfItems::SizeType s2 = sqi_values->GetNumberOfItems();
assert( s2 <= s );
PrivateTag tindex2(0x7fe1,0x48,"GEMS_Ultrasound_MovieGroup_001");
for( SequenceOfItems::SizeType i = 1; i <= s2; ++i )
{
const Item & item = sqi_values->GetItem( i );
const DataSet & ds = item.GetNestedDataSet();
if( !ds.FindDataElement( tindex2 ) )
{
return false;
}
const DataElement & index2 = ds.GetDataElement( tindex2 );
if( index2.IsEmpty() )
{
return false;
}
gdcm::Element<VR::FD, VM::VM1_2> el1;
el1.SetFromDataElement( index2 );
UL copy = (UL)el1.GetValue();
#if 1
std::cout << indent;
std::cout << "( " << names[ copy ];
#endif
PrivateTag tvalueint(0x7fe1,0x49,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluefloat1(0x7fe1,0x51,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluefloat(0x7fe1,0x52,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvalueul(0x7fe1,0x53,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluesl(0x7fe1,0x54,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvalueob(0x7fe1,0x55,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluetext(0x7fe1,0x57,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluefd(0x7fe1,0x77,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluesl3(0x7fe1,0x79,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluesl2(0x7fe1,0x86,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluefd1(0x7fe1,0x87,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvaluefloat2(0x7fe1,0x88,"GEMS_Ultrasound_MovieGroup_001");
#if 1
std::cout << " ) = ";
#endif
if( ds.FindDataElement( tvalueint ) )
{
const DataElement & value = ds.GetDataElement( tvalueint );
gdcm::Element<VR::UL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluefloat1 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat1 );
gdcm::Element<VR::FL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluefloat ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat );
gdcm::Element<VR::FD,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluesl ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl );
gdcm::Element<VR::SL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvalueul ) )
{
const DataElement & value = ds.GetDataElement( tvalueul );
gdcm::Element<VR::UL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
assert( el2.GetLength() == 1 );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvalueob ) )
{
const DataElement & value = ds.GetDataElement( tvalueob );
std::cout << value << std::endl;
}
else if( ds.FindDataElement( tvaluetext ) )
{
const DataElement & value = ds.GetDataElement( tvaluetext );
gdcm::Element<VR::LT,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluesl2 ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl2 );
gdcm::Element<VR::SL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 4 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluesl3 ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl3 );
gdcm::Element<VR::SL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefd ) )
{
const DataElement & value = ds.GetDataElement( tvaluefd );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefloat2 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat2 );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 2 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefd1 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefd1 );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 4 );
std::cout << std::endl;
}
else
{
std::cout << "(no value)" << std::endl;
assert( ds.Size() == 2 );
}
}
return true;
}
bool PrintNameValueMapping2( gdcm::PrivateTag const & privtag, const gdcm::DataSet & ds ,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
if( !ds.FindDataElement( privtag ) ) return 1;
const gdcm::DataElement& seq_values = ds.GetDataElement( privtag );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi = seq_values.GetValueAsSQ();
return PrintNameValueMapping( sqi, sqi_names, indent);
}
bool PrintNameValueMapping3( gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2, const gdcm::DataSet & ds ,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
if( !ds.FindDataElement( privtag1 ) )
{
assert( 0 );
return false;
}
const gdcm::DataElement& values10name = ds.GetDataElement( privtag1 );
gdcm::Element<gdcm::VR::LO,gdcm::VM::VM1> el;
el.SetFromDataElement( values10name );
std::cout << std::endl;
std::cout << " <" << el.GetValue().c_str() << ">" << std::endl;
return PrintNameValueMapping2( privtag2, ds, sqi_names, indent);
}
bool print73( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
const gdcm::PrivateTag tseq_values73(0x7fe1,0x73,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values73 ) )
{
std::cout << indent << "No group 73" << std::endl;
return false;
}
const gdcm::DataElement& seq_values73 = ds10.GetDataElement( tseq_values73 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values73 = seq_values73.GetValueAsSQ();
size_t ni3 = sqi_values73->GetNumberOfItems();
for( size_t i3 = 1; i3 <= ni3; ++i3 )
{
gdcm::Item &item_73 = sqi_values73->GetItem(i3);
gdcm::DataSet &ds73 = item_73.GetNestedDataSet();
assert( ds73.Size() == 3 );
const gdcm::PrivateTag tseq_values74name(0x7fe1,0x74,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values75(0x7fe1,0x75,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values74name, tseq_values75, ds73, sqi_dict, indent);
std::cout << std::endl;
}
return true;
}
bool print83( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
const gdcm::PrivateTag tseq_values83(0x7fe1,0x83,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values83 ) )
{
std::cout << indent << "No group 83" << std::endl;
return false;
}
const gdcm::DataElement& seq_values83 = ds10.GetDataElement( tseq_values83 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values83 = seq_values83.GetValueAsSQ();
size_t ni3 = sqi_values83->GetNumberOfItems();
for( size_t i3 = 1; i3 <= ni3; ++i3 )
{
gdcm::Item &item_83 = sqi_values83->GetItem(i3);
gdcm::DataSet &ds83 = item_83.GetNestedDataSet();
assert( ds83.Size() == 3 );
const gdcm::PrivateTag tseq_values84name(0x7fe1,0x84,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values85(0x7fe1,0x85,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values84name, tseq_values85, ds83, sqi_dict, indent);
std::cout << std::endl;
}
return true;
}
bool PrintNameValueMapping4( gdcm::PrivateTag const & privtag0, const gdcm::DataSet & subds, gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2,
gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
(void)indent;
if( !subds.FindDataElement( privtag0 ) )
{
assert( 0 );
return 1;
}
const gdcm::DataElement& seq_values10 = subds.GetDataElement( privtag0 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values10 = seq_values10.GetValueAsSQ();
size_t ni1 = sqi_values10->GetNumberOfItems();
for( size_t i1 = 1; i1 <= ni1; ++i1 )
{
gdcm::Item &item_10 = sqi_values10->GetItem(i1);
gdcm::DataSet &ds10 = item_10.GetNestedDataSet();
assert( ds10.Size() == 2 + 3 );
PrintNameValueMapping3( privtag1, privtag2, ds10, sqi_dict, " " );
std::cout << std::endl;
const gdcm::PrivateTag tseq_values20(0x7fe1,0x20,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values20 ) )
{
assert( 0 );
return 1;
}
const gdcm::DataElement& seq_values20 = ds10.GetDataElement( tseq_values20 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values20 = seq_values20.GetValueAsSQ();
size_t ni2 = sqi_values20->GetNumberOfItems();
for( size_t i2 = 1; i2 <= ni2; ++i2 )
{
gdcm::Item &item_20 = sqi_values20->GetItem(i2);
gdcm::DataSet &ds20 = item_20.GetNestedDataSet();
size_t count = ds20.Size(); (void)count;
assert( ds20.Size() == 2 + 3 || ds20.Size() == 2 + 2 );
const gdcm::PrivateTag tseq_values20name(0x7fe1,0x24,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values26(0x7fe1,0x26,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values20name, tseq_values26, ds20, sqi_dict, " ");
std::cout << std::endl;
print83(ds20, sqi_dict, " ");
}
print83(ds10, sqi_dict, " ");
}
return true;
}
int main(int argc, char *argv[])
{
if( argc < 2 ) return 1;
using namespace gdcm;
const char *filename = argv[1];
gdcm::Reader reader;
reader.SetFileName( filename );
reader.Read();
gdcm::File &file = reader.GetFile();
gdcm::DataSet &ds = file.GetDataSet();
const PrivateTag tseq(0x7fe1,0x1,"GEMS_Ultrasound_MovieGroup_001");
if( !ds.FindDataElement( tseq ) ) return 1;
const DataElement& seq = ds.GetDataElement( tseq );
SmartPointer<SequenceOfItems> sqi = seq.GetValueAsSQ();
assert( sqi->GetNumberOfItems() == 1 );
Item &item = sqi->GetItem(1);
DataSet &subds = item.GetNestedDataSet();
const PrivateTag tseq_dict(0x7fe1,0x70,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_dict ) ) return 1;
const DataElement& seq_dict = subds.GetDataElement( tseq_dict );
SmartPointer<SequenceOfItems> sqi_dict = seq_dict.GetValueAsSQ();
const PrivateTag tseq_values8(0x7fe1,0x8,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_values8 ) ) return 1;
const DataElement& seq_values8 = subds.GetDataElement( tseq_values8 );
SmartPointer<SequenceOfItems> sqi_values8 = seq_values8.GetValueAsSQ();
const PrivateTag tseq_values8name(0x7fe1,0x2,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_values8name ) ) return 1;
const DataElement& values8name = subds.GetDataElement( tseq_values8name );
{
Element<VR::LO,VM::VM1> el;
el.SetFromDataElement( values8name );
std::cout << el.GetValue() << std::endl;
}
size_t count = subds.Size(); (void)count;
assert( subds.Size() == 3 + 2 + 1 || subds.Size() == 3 + 2 + 2);
PrintNameValueMapping( sqi_values8, sqi_dict, " ");
const PrivateTag tseq_values10(0x7fe1,0x10,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq_values10name(0x7fe1,0x12,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq_values18(0x7fe1,0x18,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping4( tseq_values10, subds, tseq_values10name, tseq_values18, sqi_dict," ");
print73( subds, sqi_dict, " " );
#if 0
gdcm::DataSet::ConstIterator it = subds.Begin();
for( ; it != subds.End(); ++it )
{
const gdcm::DataElement &de = *it;
std::cout << de.GetTag() << std::endl;
}
#endif
return 0;
}