Program: gdcm
Module: $RCSfile: gdcmDicomDirElement.cxx,v $
Language: C++
- Date: $Date: 2004/06/23 03:36:24 $
- Version: $Revision: 1.13 $
+ Date: $Date: 2007/05/23 14:18:08 $
+ Version: $Revision: 1.45 $
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.htm for details.
+ 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
=========================================================================*/
-#include <fstream>
-#include <stdio.h> // For sprintf
-#include <iostream>
-
#include "gdcmDicomDirElement.h"
#include "gdcmUtil.h"
#include "gdcmDebug.h"
#include "gdcmDictSet.h"
+#include <fstream>
+#include <iostream>
+namespace GDCM_NAME_SPACE
+{
//-----------------------------------------------------------------------------
-// Constructor / Destructor
+/// \brief auto generate function, to fill up the default elements for
+/// a DICOMDIR, if relevant file is not found on user's disk
+void FillDefaultDIRDict(DicomDirElement *dde);
+//-----------------------------------------------------------------------------
+// Constructor / Destructor
/**
* \brief constructor : populates the chained lists
* from the file 'Dicts/DicomDir.dic'
*/
-gdcmDicomDirElement::gdcmDicomDirElement() {
- std::string filename=gdcmDictSet::BuildDictPath() + std::string(DICT_ELEM);
+DicomDirElement::DicomDirElement()
+{
+ std::string filename = DictSet::BuildDictPath() + DICT_ELEM;
std::ifstream from(filename.c_str());
- dbg.Error(!from, "gdcmDicomDirElement::gdcmDicomDirElement: can't open dictionary",filename.c_str());
-
- char buff[1024];
- std::string type;
- gdcmElement elem;
-
- while (!from.eof()) {
- eatwhite(from);
- from.getline(buff, 1024, ' ');
- type = buff;
-
- if( (type=="metaElem") || (type=="patientElem") ||
- (type=="studyElem") || (type=="serieElem") ||
- (type=="imageElem") )
+ if ( !from )
+ {
+ gdcmWarningMacro( "Can't open DicomDirElement dictionary"
+ << filename.c_str());
+ FillDefaultDIRDict( this );
+ }
+ else
+ {
+ char buff[1024];
+ char buff2[1024];
+ std::string strType;
+ DicomElement elem;
+ DicomDirType type;
+ while (!from.eof())
{
- from >> std::hex >> elem.group >> elem.elem;
-
- eatwhite(from);
- from.getline(buff, 1024, '"');
- eatwhite(from);
- from.getline(buff, 1024, '"');
- elem.value = buff;
-
- if(type=="metaElem")
- DicomDirMetaList.push_back(elem);
- else if(type=="patientElem")
- DicomDirPatientList.push_back(elem);
- else if(type=="studyElem")
- DicomDirStudyList.push_back(elem);
- else if(type=="serieElem")
- DicomDirSerieList.push_back(elem);
- else if(type=="imageElem")
- DicomDirImageList.push_back(elem);
+ from >> std::ws;
+ from.getline(buff, 1024, ' ');
+ strType = buff;
+
+ if ( strType == "imageElem" )
+ type = DD_IMAGE;
+ else if ( strType == "serieElem" )
+ type = DD_SERIE;
+ else if ( strType == "studyElem" )
+ type = DD_STUDY;
+ else if ( strType == "patientElem" )
+ type = DD_PATIENT;
+ else if ( strType == "metaElem" )
+ type = DD_META;
+ else
+ {
+ gdcmWarningMacro("Unknown type (" << strType
+ << ") found in the file : "
+ << filename.c_str());
+ type = DD_UNKNOWN;
+ }
+
+ if ( type!=DD_UNKNOWN )
+ {
+ from >> std::hex >> elem.Group >> elem.Elem;// >> elem.VR;
+
+ from.getline(buff2, 1024, '"');
+ from >> std::ws;
+ from.getline(buff2, 1024, '"');
+ elem.VR[0] = buff2[0];
+ elem.VR[1] = buff2[1];
+ // std::cout << "VR : [" << elem.VR[0] << elem.VR[1] << "]" << std::endl; // JPR
+ from >> std::ws;
+ from.getline(buff, 1024, '"');
+ from >> std::ws;
+ from.getline(buff, 1024, '"');
+ elem.Value = buff;
+
+ AddEntry(type, elem);
+ }
+ from.getline(buff, 1024, '\n');
}
- from.getline(buff, 1024, '\n');
+ from.close();
}
- from.close();
}
/**
- * \ingroup gdcmDicomDirElement
* \brief canonical destructor
*/
-gdcmDicomDirElement::~gdcmDicomDirElement() {
+DicomDirElement::~DicomDirElement()
+{
DicomDirMetaList.clear();
DicomDirPatientList.clear();
DicomDirStudyList.clear();
DicomDirImageList.clear();
}
+//-----------------------------------------------------------------------------
+// Public
+/**
+ * \brief Add an entry to one of the DicomDir Elements
+ * (Patient, Study, Serie, Image)
+ * @param type Element type (DD_PATIENT, DD_STUDY, DD_SERIE, DD_IMAGE)
+ * @param elem elem
+ */
+bool DicomDirElement::AddEntry(DicomDirType type, DicomElement const &elem)
+{
+ switch( type )
+ {
+ case DD_IMAGE :
+ DicomDirImageList.push_back(elem);
+ break;
+ case DD_SERIE :
+ DicomDirSerieList.push_back(elem);
+ break;
+ case DD_STUDY :
+ DicomDirStudyList.push_back(elem);
+ break;
+ case DD_PATIENT :
+ DicomDirPatientList.push_back(elem);
+ break;
+ case DD_META :
+ DicomDirMetaList.push_back(elem);
+ break;
+ default :
+ return false;
+ }
+ return true;
+}
+
+/**
+ * \brief Add an entry to one of the DicomDir Elements
+ * (Patient, Study, Serie, Image)
+ * @param type Element type (DD_PATIENT, DD_STUDY, DD_SERIE, DD_IMAGE)
+ * @param group Group number of the entry to be added
+ * @param elem Element number of the entry to be added
+ * @param vr Value Representation of the entry to be added
+ */
+void DicomDirElement::AddDicomDirElement(DicomDirType type,
+ uint16_t group, uint16_t elem, VRKey vr)
+{
+ DicomElement el;
+ el.Group = group;
+ el.Elem = elem;
+ el.VR = vr;
+ el.Value = "";
+ AddEntry(type, el);
+}
+
+//-----------------------------------------------------------------------------
+// Protected
+
+//-----------------------------------------------------------------------------
+// Private
+
//-----------------------------------------------------------------------------
// Print
/**
- * \ingroup gdcmDicomDirElement
* \brief Print all
- * \todo add a 'Print Level' check
* @param os The output stream to be written to.
*/
-void gdcmDicomDirElement::Print(std::ostream &os) {
+void DicomDirElement::Print(std::ostream &os,std::string const &)
+{
std::ostringstream s;
- std::list<gdcmElement>::iterator it;
- char greltag[10]; //group element tag
+ std::list<DicomElement>::iterator it;
+ TagKey greltag;
s << "Meta Elements :"<<std::endl;
- for (it = DicomDirMetaList.begin();it!=DicomDirMetaList.end();++it)
+ for (it = DicomDirMetaList.begin(); it != DicomDirMetaList.end(); ++it)
{
- sprintf(greltag,"%04x|%04x ",it->group,it->elem);
- s << " ("<<greltag<<") = "<< it->value<<std::endl;
+ greltag = DictEntry::TranslateToKey(it->Group,it->Elem);
+ s << " (" << greltag << ") = " << it->Value << std::endl;
}
s << "Patient Elements :"<<std::endl;
- for (it = DicomDirPatientList.begin();it!=DicomDirPatientList.end();++it)
+ for (it = DicomDirPatientList.begin(); it != DicomDirPatientList.end(); ++it)
{
- sprintf(greltag,"%04x|%04x ",it->group,it->elem);
- s << " ("<<greltag<<") = "<< it->value<<std::endl;
+ greltag = DictEntry::TranslateToKey(it->Group,it->Elem);
+ s << " (" << greltag << ") = " << it->Value << std::endl;
}
s << "Study Elements :"<<std::endl;
- for (it = DicomDirStudyList.begin();it!=DicomDirStudyList.end();++it)
+ for (it = DicomDirStudyList.begin(); it != DicomDirStudyList.end(); ++it)
{
- sprintf(greltag,"%04x|%04x ",it->group,it->elem);
- s << " ("<<greltag<<") = "<< it->value<<std::endl;
+ greltag = DictEntry::TranslateToKey(it->Group, it->Elem);
+ s << " (" << greltag << ") = " << it->Value << std::endl;
}
s << "Serie Elements :"<<std::endl;
- for (it = DicomDirSerieList.begin();it!=DicomDirSerieList.end();++it)
+ for (it = DicomDirSerieList.begin(); it != DicomDirSerieList.end(); ++it)
{
- sprintf(greltag,"%04x|%04x ",it->group,it->elem);
- s << " ("<<greltag<<") = "<< it->value<<std::endl;
+ greltag = DictEntry::TranslateToKey( it->Group, it->Elem);
+ s << " (" << greltag << ") = " << it->Value << std::endl;
}
s << "Image Elements :"<<std::endl;
- for (it = DicomDirImageList.begin();it!=DicomDirImageList.end();++it)
+ for (it = DicomDirImageList.begin(); it != DicomDirImageList.end(); ++it)
{
- sprintf(greltag,"%04x|%04x ",it->group,it->elem);
- s << " ("<<greltag<<") = "<< it->value<<std::endl;
+ greltag = DictEntry::TranslateToKey(it->Group, it->Elem);
+ s << " (" << greltag << ") = " << it->Value << std::endl;
}
os << s.str();
}
//-----------------------------------------------------------------------------
-// Public
-
-//-----------------------------------------------------------------------------
-// Protected
-
-//-----------------------------------------------------------------------------
-// Private
-
-//-----------------------------------------------------------------------------
+} // end namespace gdcm