X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDicomDirElement.cxx;h=3d5733d505f80d23aa3185be9ba5c08b7b5478bc;hb=721d134c6e594b9a23bf1ce002ed87bfbc1576a7;hp=25afc82dcd1c4be3e4c53161654d51097272db32;hpb=bc3e7a63638ffb3aa7460bf579ae65002ac6770c;p=gdcm.git diff --git a/src/gdcmDicomDirElement.cxx b/src/gdcmDicomDirElement.cxx index 25afc82d..3d5733d5 100644 --- a/src/gdcmDicomDirElement.cxx +++ b/src/gdcmDicomDirElement.cxx @@ -1,144 +1,226 @@ -// gdcmDicomDirElement.cxx -//----------------------------------------------------------------------------- -#include -#include // For sprintf +/*========================================================================= + + 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" -#ifndef PUB_DICT_PATH -# define PUB_DICT_PATH "../Dicts/" -#endif -#define DICT_ELEM "DicomDir.dic" - +#include #include -#ifdef GDCM_NO_ANSI_STRING_STREAM -# include -# define ostringstream ostrstream -# else -# include -#endif +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 /** - * \ingroup gdcmDicomDirElement - * \brief constructor + * \brief constructor : populates the chained lists + * from the file 'Dicts/DicomDir.dic' */ - gdcmDicomDirElement::gdcmDicomDirElement(void) { - 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") - MetaList.push_back(elem); - else if(type=="patientElem") - PatientList.push_back(elem); - else if(type=="studyElem") - StudyList.push_back(elem); - else if(type=="serieElem") - SerieList.push_back(elem); - else if(type=="imageElem") - ImageList.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.close(); + } +} - from.getline(buff, 1024, '\n'); +/** + * \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; } - from.close(); + return true; } /** - * \ingroup gdcmDicomDirElement - * \brief destructor + * \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 */ - gdcmDicomDirElement::~gdcmDicomDirElement() { - MetaList.clear(); - PatientList.clear(); - StudyList.clear(); - SerieList.clear(); - ImageList.clear(); +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::iterator it; - char greltag[10]; //group element tag + std::list::iterator it; + TagKey greltag; s << "Meta Elements :"<group,it->elem); - s << " ("<value<Group,it->Elem); + s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Patient Elements :"<group,it->elem); - s << " ("<value<Group,it->Elem); + s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Study Elements :"<group,it->elem); - s << " ("<value<Group, it->Elem); + s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Serie Elements :"<group,it->elem); - s << " ("<value<Group, it->Elem); + s << " (" << greltag << ") = " << it->Value << std::endl; } s << "Image Elements :"<group,it->elem); - s << " ("<value<Group, it->Elem); + s << " (" << greltag << ") = " << it->Value << std::endl; } os << s.str(); } //----------------------------------------------------------------------------- -// Public - -//----------------------------------------------------------------------------- -// Protected - -//----------------------------------------------------------------------------- -// Private - -//----------------------------------------------------------------------------- +} // end namespace gdcm