ReadGEMSSDO.cxx
/*=========================================================================
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 "gdcmDataElement.h"
#include "gdcmPrivateTag.h"
#include <iostream>
#include <string>
using namespace gdcm;
struct SDOElement
{
typedef std::vector<std::string>::size_type SizeType;
const char *GetData(SizeType index) const {
return Data[index].c_str();
}
SizeType GetNumberOfData() const {
return Data.size();
}
void SetData(SizeType index, const char *data) {
Data[index] = data;
}
const char *GetDataFormat() const {
return DataFormat.c_str();
}
void SetDataFormat(const char *dataformat, SizeType num) {
DataFormat = dataformat;
Data.resize( num );
}
void Print( std::ostream &os ) const {
os << DataFormat << ":" << std::endl;
std::vector<std::string>::const_iterator it = Data.begin();
size_t s = 0;
for( ; it != Data.end(); ++it )
{
os << " (" << s++ << ") " << *it << std::endl;
}
}
private:
std::string DataFormat;
std::vector<std::string> Data;
};
class SDOHeader
{
public:
typedef std::vector<SDOElement> SDOElements;
typedef SDOElements::size_type SizeType;
SizeType GetNumberOfSDOElements() const {
return InternalSDODataSet.size();
}
void AddSDOElement(SDOElement const &sdoelement) {
InternalSDODataSet.push_back( sdoelement );
}
const SDOElement &GetSDOElement(SizeType index) const {
return InternalSDODataSet[index];
}
const SDOElement &GetSDOElementByName(const char *) const {
return InternalSDODataSet[0];
}
void LoadFromAttributes(std::string const &s1, std::string const &s2)
{
std::string tok;
std::string tok2;
std::stringstream strstr(s1);
std::stringstream strstr2(s2);
SDOElement element;
// Do format
size_t count = 0;
while ( std::getline ( strstr2, tok, '\\' ) )
{
//std::cout << tok << " ";
std::getline ( strstr2, tok2, '\\' );
//std::cout << tok2 << std::endl;
count += atoi( tok2.c_str() );
element.SetDataFormat( tok.c_str(), atoi( tok2.c_str() ) );
for( size_t t = 0; t < element.GetNumberOfData(); ++t )
{
std::getline ( strstr, tok, '\\' );
element.SetData(t, tok.c_str() );
}
AddSDOElement( element );
}
//while ( std::getline ( strstr, tok, '^' ) )
// while ( std::getline ( strstr, tok, '\\' ) )
// {
// std::cout << tok << std::endl;
// count++;
// }
// std::cout << "Count: " << count << std::endl;
// count = 0;
// std::cout << "Count: " << count << std::endl;
}
void Print( std::ostream &os ) const {
SDOElements::const_iterator it = InternalSDODataSet.begin();
for( ; it != InternalSDODataSet.end(); ++it )
{
it->Print ( os );
}
}
private:
SDOElements InternalSDODataSet;
};
bool sdo_decode( DataElement const &stringdata, DataElement const &stringdataformat )
{
const char *sd = stringdata.GetByteValue()->GetPointer();
const size_t len_sd = stringdata.GetByteValue()->GetLength();
std::string s1 = std::string( sd, len_sd );
const char *sdf = stringdataformat.GetByteValue()->GetPointer();
const size_t len_sdf = stringdataformat.GetByteValue()->GetLength();
std::string s2 = std::string( sdf, len_sdf );
// std::cout << s1 << std::endl;
// std::cout << s2 << std::endl;
SDOHeader header;
header.LoadFromAttributes( s1, s2 );
header.Print( std::cout );
return true;
}
int main(int argc, char *argv[])
{
if( argc < 2 )
{
std::cerr << argv[0] << " input.dcm" << std::endl;
return 1;
}
const char *filename = argv[1];
Reader reader;
reader.SetFileName( filename );
if( !reader.Read() )
{
return 1;
}
File &file = reader.GetFile();
DataSet &ds = file.GetDataSet();
// StringData (0033,xx1F) 3 "GEMS_GENIE_1" List of SDO parameters stored as
// list of strings
const PrivateTag tstringdata(0x33,0x1f,"GEMS_GENIE_1");
// StringDataFormat (0033,xx23) 3 "GEMS_GENIE_1" Format of string parameters;
// contains information about name and number of strings in list
const PrivateTag tstringdataformat(0x33,0x23,"GEMS_GENIE_1");
if( !ds.FindDataElement( tstringdata ) ) return 1;
const DataElement& stringdata = ds.GetDataElement( tstringdata );
if( !ds.FindDataElement( tstringdataformat ) ) return 1;
const DataElement& stringdataformat = ds.GetDataElement( tstringdataformat );
sdo_decode( stringdata, stringdataformat );
return 0;
}
gdcm::ByteValue::GetPointer
const char * GetPointer() const
Definition gdcmByteValue.h:110
gdcm::ByteValue::GetLength
VL GetLength() const override
Definition gdcmByteValue.h:77
gdcm::DataElement
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
gdcm::DataElement::GetByteValue
const ByteValue * GetByteValue() const
Definition gdcmDataElement.h:133
gdcm::DataSet
Class to represent a Data Set (which contains Data Elements).
Definition gdcmDataSet.h:56
gdcm::DataSet::GetDataElement
const DataElement & GetDataElement(const Tag &t) const
Definition gdcmDataSet.h:188
gdcm::DataSet::FindDataElement
bool FindDataElement(const PrivateTag &t) const
Look up if private tag 't' is present in the dataset:
gdcm::File
a DICOM File
Definition gdcmFile.h:34
gdcm::File::GetDataSet
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
gdcm::PrivateTag
Class to represent a Private DICOM Data Element (Attribute) Tag (Group, Element, Owner).
Definition gdcmPrivateTag.h:39
gdcm::Reader
Reader ala DOM (Document Object Model).
Definition gdcmReader.h:54
gdcm::Reader::GetFile
const File & GetFile() const
Set/Get File.
Definition gdcmReader.h:72
gdcm::Reader::Read
virtual bool Read()
Main function to read a file.
gdcm::Reader::SetFileName
void SetFileName(const char *filename_native)
gdcmDataElement.h
gdcmPrivateTag.h
gdcmReader.h
gdcm
Definition gdcmASN1.h:21