X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmElValSet.cxx;h=35ca9ec87613eb153ecd773dc7a5b5aeebd5586b;hb=06e5584ba82b9878b3e544a53c9575cf363fdb8c;hp=2d15a1793801eaed1367ae58766cbe35e135664a;hpb=10aa56aa534bae643e3833474a49309330235196;p=gdcm.git diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index 2d15a179..35ca9ec8 100644 --- a/src/gdcmElValSet.cxx +++ b/src/gdcmElValSet.cxx @@ -1,5 +1,14 @@ // 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" @@ -14,7 +23,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 +35,7 @@ TagElValueHT & gdcmElValSet::GetTagHt(void) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param newElValue * @return */ void gdcmElValSet::Add(gdcmElValue * newElValue) { @@ -36,11 +45,22 @@ 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 ) { + string key = TranslateToKey(Group, Elem ); + return (tagHt.count(key)); +} + +/** + * \ingroup gdcmElValSet + * \brief + */ +void gdcmElValSet::Print(ostream & os) { size_t o; short int g, e; @@ -56,24 +76,28 @@ 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; + //d = _CreateCleanString(v); // replace non printable characters by '.' + d2=v; 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 << "\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) << "]"; + } + } + //free(d); os << endl; } } @@ -81,10 +105,8 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { /** * \ingroup gdcmElValSet * \brief - * @param - * @return */ - void gdcmElValSet::PrintByName(ostream & os) { +void gdcmElValSet::PrintByName(ostream & os) { for (TagElValueNameHT::iterator tag = NameHt.begin(); tag != NameHt.end(); ++tag){ @@ -98,7 +120,8 @@ void gdcmElValSet::Add(gdcmElValue * newElValue) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param group + * @param element * @return */ gdcmElValue* gdcmElValSet::GetElementByNumber(guint16 group, guint16 element) { @@ -111,7 +134,6 @@ gdcmElValue* gdcmElValSet::GetElementByNumber(guint16 group, guint16 element) { /** * \ingroup gdcmElValSet * \brief - * @param * @return */ gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { @@ -123,32 +145,34 @@ gdcmElValue* gdcmElValSet::GetElementByName(string TagName) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param group + * @param element * @return */ 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) { 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, @@ -173,7 +197,8 @@ int gdcmElValSet::SetElValueByNumber(string content, /** * \ingroup gdcmElValSet * \brief - * @param + * @param content + * @param TagName * @return */ int gdcmElValSet::SetElValueByName(string content, string TagName) { @@ -217,9 +242,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,12 +272,11 @@ 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) { @@ -243,15 +286,11 @@ int gdcmElValSet::SetElValueLengthByName(guint32 length, string TagName) { 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; @@ -288,13 +327,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 +352,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,7 +380,8 @@ void gdcmElValSet::UpdateGroupLength(bool SkipSequence, FileType type) { /** * \ingroup gdcmElValSet * \brief - * @param + * @param type + * @param _fp * @return */ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { @@ -372,18 +408,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 << "\n"; 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,42 +434,44 @@ 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