/*========================================================================= Program: gdcm Module: $RCSfile: gdcmDicomDirElement.cxx,v $ Language: C++ 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.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 notices for more information. =========================================================================*/ #include "gdcmDicomDirElement.h" #include "gdcmUtil.h" #include "gdcmDebug.h" #include "gdcmDictSet.h" #include #include namespace GDCM_NAME_SPACE { //----------------------------------------------------------------------------- /// \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' */ DicomDirElement::DicomDirElement() { std::string filename = DictSet::BuildDictPath() + DICT_ELEM; std::ifstream from(filename.c_str()); 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::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.close(); } } /** * \brief canonical destructor */ DicomDirElement::~DicomDirElement() { DicomDirMetaList.clear(); DicomDirPatientList.clear(); DicomDirStudyList.clear(); DicomDirSerieList.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 /** * \brief Print all * @param os The output stream to be written to. */ void DicomDirElement::Print(std::ostream &os,std::string const &) { std::ostringstream s; std::list::iterator it; TagKey greltag; s << "Meta Elements :"<Group,it->Elem); s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Patient Elements :"<Group,it->Elem); s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Study Elements :"<Group, it->Elem); s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Serie Elements :"<Group, it->Elem); s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Image Elements :"<Group, it->Elem); s << " (" << greltag << ") = " << it->Value << std::endl; } os << s.str(); } //----------------------------------------------------------------------------- } // end namespace gdcm