X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmElValSet.cxx;h=7f8773882786efbcfbe381dbbe500408a6569d5c;hb=412e45113080662e115ad6a5771ae607fab2e7ea;hp=2d15a1793801eaed1367ae58766cbe35e135664a;hpb=10aa56aa534bae643e3833474a49309330235196;p=gdcm.git diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index 2d15a179..7f877388 100644 --- a/src/gdcmElValSet.cxx +++ b/src/gdcmElValSet.cxx @@ -1,10 +1,18 @@ // gdcmElValSet.cxx +#ifdef _MSC_VER +// 'identifier' : class 'type' needs to have dll-interface to be used by +// clients of class 'type2' +#pragma warning ( disable : 4251 ) +// 'identifier' : identifier was truncated to 'number' characters in the +// debug information +#pragma warning ( disable : 4786 ) +#endif //_MSC_VER + #include #include "gdcmUtil.h" #include "gdcmElValSet.h" #include "gdcmTS.h" -using namespace std; gdcmElValSet::~gdcmElValSet() { for (TagElValueHT::iterator tag = tagHt.begin(); tag != tagHt.end(); ++tag) { @@ -14,7 +22,7 @@ gdcmElValSet::~gdcmElValSet() { } tagHt.clear(); // Since Add() adds symetrical in both tagHt and NameHt we can - // assume all the pointed gdcmElValues are allready cleaned-up when + // assume all the pointed gdcmElValues are already cleaned-up when // we cleaned tagHt. NameHt.clear(); } @@ -26,7 +34,7 @@ TagElValueHT & gdcmElValSet::GetTagHt(void) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param newElValue * @return */ void gdcmElValSet::Add(gdcmElValue * newElValue) { @@ -36,17 +44,27 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { /** * \ingroup gdcmElValSet - * \brief - * @param + * \brief Checks if a given Dicom element exists + * \ within a ElValSet + * @param Group + * @param Elem * @return */ - void gdcmElValSet::Print(ostream & os) { +int gdcmElValSet::CheckIfExistByNumber(guint16 Group, guint16 Elem ) { + std::string key = TranslateToKey(Group, Elem ); + return (tagHt.count(key)); +} + +/** + * \ingroup gdcmElValSet + * \brief + */ +void gdcmElValSet::Print(std::ostream & os) { size_t o; short int g, e; TSKey v; - char * d; - string d2; + std::string d2; gdcmTS * ts = gdcmGlobal::GetTS(); for (TagElValueHT::iterator tag = tagHt.begin(); @@ -56,49 +74,50 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { e = tag->second->GetElement(); v = tag->second->GetValue(); o = tag->second->GetOffset(); - d = _CreateCleanString(v); // TODO : trouver qq chose moins goret - d2=d; + d2 = _CreateCleanString(v); // replace non printable characters by '.' os << tag->first << ": "; - //os << "[" << v << "]"; - os << "[" << d2 << "]"; - os << "[" << tag->second->GetName() << "]"; - os << "[" << tag->second->GetVR() << "]"; - - if ( (g == 0x0002) && (e == 0x0010) ) { - os << " [" << ts->GetValue(v) << "]"; - } - - // liberer 'd' ici ? - os << " lgr : " << tag->second->GetLength(); os << ", Offset : " << o; - os << " x(" << hex << o << dec << ") "; - os << endl; + os << " x(" << std::hex << o << std::dec << ") "; + os << "\t[" << tag->second->GetVR() << "]"; + os << "\t[" << tag->second->GetName() << "]"; + os << "\t[" << d2 << "]"; + + // Display the UID value (instead of displaying the rough code) + if (g == 0x0002) { // Some more to be displayed ? + if ( (e == 0x0010) || (e == 0x0002) ) + os << " ==>\t[" << ts->GetValue(v) << "]"; + } else { + if (g == 0x0008) { + if ( (e == 0x0016) || (e == 0x1150) ) + os << " ==>\t[" << ts->GetValue(v) << "]"; + } + } + os << std::endl; } } /** * \ingroup gdcmElValSet * \brief - * @param - * @return */ - void gdcmElValSet::PrintByName(ostream & os) { +void gdcmElValSet::PrintByName(std::ostream & os) { for (TagElValueNameHT::iterator tag = NameHt.begin(); tag != NameHt.end(); ++tag){ os << tag->first << ": "; os << "[" << tag->second->GetValue() << "]"; os << "[" << tag->second->GetKey() << "]"; - os << "[" << tag->second->GetVR() << "]" << endl; + os << "[" << tag->second->GetVR() << "]" << std::endl; } } /** * \ingroup gdcmElValSet * \brief - * @param + * @param group + * @param element * @return */ gdcmElValue* gdcmElValSet::GetElementByNumber(guint16 group, guint16 element) { @@ -111,10 +130,9 @@ gdcmElValue* gdcmElValSet::GetElementByNumber(guint16 group, guint16 element) { /** * \ingroup gdcmElValSet * \brief - * @param * @return */ -gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { +gdcmElValue* gdcmElValSet::GetElementByName(std::string TagName) { if ( ! NameHt.count(TagName)) return (gdcmElValue*)0; return NameHt.find(TagName)->second; @@ -123,41 +141,43 @@ gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param group + * @param element * @return */ -string gdcmElValSet::GetElValueByNumber(guint16 group, guint16 element) { +std::string gdcmElValSet::GetElValueByNumber(guint16 group, guint16 element) { TagKey key = gdcmDictEntry::TranslateToKey(group, element); if ( ! tagHt.count(key)) - return "gdcm::Unfound"; + return GDCM_UNFOUND; return tagHt.find(key)->second->GetValue(); } /** * \ingroup gdcmElValSet * \brief - * @param * @return */ -string gdcmElValSet::GetElValueByName(string TagName) { +std::string gdcmElValSet::GetElValueByName(std::string TagName) { if ( ! NameHt.count(TagName)) - return "gdcm::Unfound"; + return GDCM_UNFOUND; return NameHt.find(TagName)->second->GetValue(); } /** * \ingroup gdcmElValSet * \brief - * @param + * @param content + * @param group + * @param element * @return */ -int gdcmElValSet::SetElValueByNumber(string content, +int gdcmElValSet::SetElValueByNumber(std::string content, guint16 group, guint16 element) { TagKey key = gdcmDictEntry::TranslateToKey(group, element); if ( ! tagHt.count(key)) return 0; tagHt[key]->SetValue(content); - string vr = tagHt[key]->GetVR(); + std::string vr = tagHt[key]->GetVR(); guint32 lgr; if( (vr == "US") || (vr == "SS") ) @@ -173,14 +193,15 @@ int gdcmElValSet::SetElValueByNumber(string content, /** * \ingroup gdcmElValSet * \brief - * @param + * @param content + * @param TagName * @return */ -int gdcmElValSet::SetElValueByName(string content, string TagName) { +int gdcmElValSet::SetElValueByName(std::string content, std::string TagName) { if ( ! NameHt.count(TagName)) return 0; NameHt[TagName]->SetValue(content); - string vr = NameHt[TagName]->GetVR(); + std::string vr = NameHt[TagName]->GetVR(); guint32 lgr; if( (vr == "US") || (vr == "SS") ) @@ -217,9 +238,28 @@ guint32 gdcmElValSet::GenerateFreeTagKeyInGroup(guint16 group) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param area + * @param group + * @param element * @return */ +int gdcmElValSet::SetVoidAreaByNumber(void * area, + guint16 group, guint16 element) { + TagKey key = gdcmDictEntry::TranslateToKey(group, element); + if ( ! tagHt.count(key)) + return 0; + tagHt[key]->SetVoidArea(area); + return 1 ; +} + +/** + * \ingroup gdcmElValSet + * \brief + * @param length + * @param group + * @param element + * @return int acts as a boolean + */ int gdcmElValSet::SetElValueLengthByNumber(guint32 length, guint16 group, guint16 element) { TagKey key = gdcmDictEntry::TranslateToKey(group, element); @@ -228,38 +268,33 @@ int gdcmElValSet::SetElValueLengthByNumber(guint32 length, tagHt[key]->SetLength(length); return 1 ; } - - /** * \ingroup gdcmElValSet * \brief - * @param + * @param length + * @param TagName * @return */ -int gdcmElValSet::SetElValueLengthByName(guint32 length, string TagName) { +int gdcmElValSet::SetElValueLengthByName(guint32 length, std::string TagName) { if ( ! NameHt.count(TagName)) return 0; NameHt.find(TagName)->second->SetLength(length); return 1 ; } - -// re-computes the length of a ACR-NEMA/Dicom group -// from a DcmHeader - /** * \ingroup gdcmElValSet - * \brief - * @param - * @return + * \brief Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader + * @param SkipSequence TRUE if we don't want to write Sequences (ACR-NEMA Files) + * @param type */ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { guint16 gr, el; - string vr; + std::string vr; gdcmElValue *elem; char trash[10]; - string str_trash; + std::string str_trash; GroupKey key; GroupHT groupHt; // to hold the length of each group @@ -288,13 +323,16 @@ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { if (SkipSequence && vr == "SQ") continue; + // Still unsolved problem : + // we cannot find the 'Sequence Delimitation Item' + // since it's at the end of the Hash Table + // (fffe,e0dd) + // pas SEQUENCE en ACR-NEMA - // WARNING : pb CERTAIN - // si on est descendu 'a l'interieur' des SQ - // + // WARNING : // --> la descente a l'interieur' des SQ - // devra etre faite avec une liste chainee, pas avec une HTable... - + // devrait etre faite avec une liste chainee, pas avec une HTable... + if ( groupHt.count(key) == 0) { // we just read the first elem of a given group if (el == 0x0000) { // the first elem is 0x0000 groupHt[key] = 0; // initialize group length @@ -310,14 +348,7 @@ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { groupHt[key] += 2 + 2 + 4 + elem->GetLength(); } } - - if(1) // unnormalized way to see what happened - for (GroupHT::iterator g = groupHt.begin(); - g != groupHt.end(); - ++g){ - printf("groupKey %s : %d\n",g->first.c_str(),g->second); - } - + unsigned short int gr_bid; for (GroupHT::iterator g = groupHt.begin(); // for each group we found @@ -345,23 +376,24 @@ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param type + * @param _fp * @return */ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { guint16 gr, el; guint32 lgr; const char * val; - string vr; + std::string vr; guint32 val_uint32; guint16 val_uint16; - vector tokens; + std::vector tokens; void *ptr; // Tout ceci ne marche QUE parce qu'on est sur un proc Little Endian - // restent à tester les echecs en écriture (apres chaque fwrite) + // restent à tester les echecs en écriture (apres chaque fwrite) for (TagElValueHT::iterator tag2=tagHt.begin(); tag2 != tagHt.end(); @@ -372,18 +404,21 @@ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { lgr = tag2->second->GetLength(); val = tag2->second->GetValue().c_str(); vr = tag2->second->GetVR(); + + // std::cout << "Tag "<< std::hex << gr << " " << el << std::endl; if ( type == ACR ) { - if (gr < 0x0008) continue; - // if (gr %2) continue; // pour voir - if (vr == "SQ" ) continue; + if (gr < 0x0008) continue; // ignore pure DICOM V3 groups + if (gr %2) continue; // ignore shadow groups + if (vr == "SQ" ) continue; // ignore Sequences + if (gr == 0xfffe ) continue; // ignore delimiters } fwrite ( &gr,(size_t)2 ,(size_t)1 ,_fp); //group fwrite ( &el,(size_t)2 ,(size_t)1 ,_fp); //element if ( (type == ExplicitVR) && (gr <= 0x0002) ) { - // On est en EXPLICIT VR + // EXPLICIT VR guint16 z=0, shortLgr; fwrite (vr.c_str(),(size_t)2 ,(size_t)1 ,_fp); @@ -395,48 +430,50 @@ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { shortLgr=lgr; fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,_fp); } - } else { + } else { // IMPLICIT VR fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp); } - tokens.erase(tokens.begin(),tokens.end()); - Tokenize (tag2->second->GetValue(), tokens, "\\"); - if (vr == "US" || vr == "SS") { + tokens.erase(tokens.begin(),tokens.end()); // clean any previous value + Tokenize (tag2->second->GetValue(), tokens, "\\"); for (unsigned int i=0; isecond->GetValue(), tokens, "\\"); for (unsigned int i=0; i