X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmElValSet.cxx;h=000042a55bc34de61cbdb7b7774ff2b8e86e98b1;hb=52364c14a6ae132d7cedcfca51f49a6f411316a3;hp=1d6e42b3b74c28c4ede672797872a49e58050466;hpb=7589d23967892c94462e22a49ec50fcd225c5c38;p=gdcm.git diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index 1d6e42b3..000042a5 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(); } @@ -34,7 +42,6 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { NameHt[newElValue->GetName()] = newElValue; } - /** * \ingroup gdcmElValSet * \brief Checks if a given Dicom element exists @@ -44,7 +51,7 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { * @return */ int gdcmElValSet::CheckIfExistByNumber(guint16 Group, guint16 Elem ) { - string key = TranslateToKey(Group, Elem ); + std::string key = TranslateToKey(Group, Elem ); return (tagHt.count(key)); } @@ -57,8 +64,7 @@ void gdcmElValSet::Print(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(); @@ -68,25 +74,27 @@ void gdcmElValSet::Print(ostream & os) { 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 << "\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; } } @@ -101,7 +109,7 @@ void gdcmElValSet::PrintByName(ostream & os) { os << tag->first << ": "; os << "[" << tag->second->GetValue() << "]"; os << "[" << tag->second->GetKey() << "]"; - os << "[" << tag->second->GetVR() << "]" << endl; + os << "[" << tag->second->GetVR() << "]" << std::endl; } } @@ -124,7 +132,7 @@ gdcmElValue* gdcmElValSet::GetElementByNumber(guint16 group, guint16 element) { * \brief * @return */ -gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { +gdcmElValue* gdcmElValSet::GetElementByName(std::string TagName) { if ( ! NameHt.count(TagName)) return (gdcmElValue*)0; return NameHt.find(TagName)->second; @@ -137,10 +145,10 @@ gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { * @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(); } @@ -149,9 +157,9 @@ string gdcmElValSet::GetElValueByNumber(guint16 group, guint16 element) { * \brief * @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(); } @@ -163,13 +171,13 @@ string gdcmElValSet::GetElValueByName(string TagName) { * @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") ) @@ -189,11 +197,11 @@ int gdcmElValSet::SetElValueByNumber(string 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") ) @@ -230,11 +238,28 @@ guint32 gdcmElValSet::GenerateFreeTagKeyInGroup(guint16 group) { /** * \ingroup gdcmElValSet * \brief - * @param length + * @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); @@ -243,8 +268,6 @@ int gdcmElValSet::SetElValueLengthByNumber(guint32 length, tagHt[key]->SetLength(length); return 1 ; } - - /** * \ingroup gdcmElValSet * \brief @@ -252,7 +275,7 @@ int gdcmElValSet::SetElValueLengthByNumber(guint32 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); @@ -262,16 +285,16 @@ int gdcmElValSet::SetElValueLengthByName(guint32 length, string TagName) { /** * \ingroup gdcmElValSet * \brief Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader - * @param SkipSequence + * @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 @@ -300,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 @@ -322,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 @@ -358,18 +377,18 @@ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { * \ingroup gdcmElValSet * \brief * @param type - * @param _fp + * @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; + vector tokens; void *ptr; @@ -385,18 +404,21 @@ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { lgr = tag2->second->GetLength(); val = tag2->second->GetValue().c_str(); vr = tag2->second->GetVR(); + + // cout << "Tag "<< 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); @@ -408,35 +430,36 @@ 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