X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmObject.cxx;h=d4527bc1449dc9e5f58601fb2adc29a91e4cf5b7;hb=0aefbe64c65acfed527a7f18b352a2621f4bc92b;hp=66c40a80c6ef927779e32e6f504848945b28de26;hpb=55d77e0913ff360d639af1841c70d14dc8687584;p=gdcm.git diff --git a/src/gdcmObject.cxx b/src/gdcmObject.cxx index 66c40a80..d4527bc1 100644 --- a/src/gdcmObject.cxx +++ b/src/gdcmObject.cxx @@ -1,10 +1,10 @@ // gdcmObject.cxx //----------------------------------------------------------------------------- #include "gdcmObject.h" -#include "gdcmUtil.h" +#include "gdcmGlobal.h" +#include "gdcmDebug.h" //----------------------------------------------------------------------------- -// Constructor / Destructor /** * \ingroup gdcmObject * \brief Constructor @@ -44,11 +44,10 @@ gdcmObject::~gdcmObject(void) { void gdcmObject::Print(std::ostream &os) { if(printLevel>=0) { ListTag::iterator i; - //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR for(i=beginObj;;++i) { (*i)->SetPrintLevel(printLevel); (*i)->Print(os); - if (i == endObj) break; + if (i == endObj) break; } } } @@ -61,7 +60,6 @@ void gdcmObject::Print(std::ostream &os) { * @return */ std::string gdcmObject::GetEntryByNumber(guint16 group, guint16 element) { - //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR for(ListTag::iterator i=beginObj;;++i) { if ( (*i)->GetGroup()==group && (*i)->GetElement()==element) return (*i)->GetValue(); @@ -85,29 +83,93 @@ std::string gdcmObject::GetEntryByName(TagName name) { return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement()); } +/** + * \ingroup gdcmObject + * \brief Set the 'boundaries' gdcmObject (gdcmDicomDirPatient, + * gdcmDicomDirStudy, gdcmDicomDirSerie, gdcmDicomDirImage) + * comming for the parsing of a DICOMDIR file + * \warning NOT en user intended function + * @param flag = 0 when META to be dealt with + */ +void gdcmObject::ResetBoundaries(int flag) { + + if (flag) { // it's NOT a META + // upwards to fffe,e000 + for( i=j=debut(); + ((*i)->GetGroup() != 0xfffe) && ((*i)->GetElement() != 0xe000); + --i,j--) { + } + beginObj=j; + } + + // upwards again to fffe,e000 + if (fin()== (--(plistEntries->end())) ) // Don't try anything more when end + return; // of Chained List is reached + + for( i=j=fin(); + ((*i)->GetGroup() != 0xfffe) && ((*i)->GetElement() != 0xe000); + --i,j--) { + } + j--; + endObj=j; +} + /** * \ingroup gdcmParser * \brief Sets Entry (Dicom Element) value of an element, * specified by it's tag (Group, Number) - * and the length, too ... + * and the length, too ... + * If the Element is not found, it's just created ! + * \warning we suppose, right now, the element belongs to a Public Group + * (NOT a shadow one) * @param val string value to set * @param group Group of the searched tag. * @param element Element of the searched tag. - * @return true if element was found, else false + * @return true if element was found or created successfully */ bool gdcmObject::SetEntryByNumber(std::string val,guint16 group, - guint16 element) { - - //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR - for(ListTag::iterator i=beginObj;;++i) { - if ( (*i)->GetGroup()==group && (*i)->GetElement()==element) { + guint16 element) { + + for(ListTag::iterator i=beginObj;;++i) { + if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0xe000 ) + continue; + if ( group < (*i)->GetGroup() || + (group == (*i)->GetGroup() && element < (*i)->GetElement()) ){ + // instead of ReplaceOrCreateByNumber + // that is a method of gdcmParser :-( + gdcmHeaderEntry *Entry; + TagKey key = gdcmDictEntry::TranslateToKey(group, element); + if ( ! ptagHT->count(key)) { + // we assume a Public Dictionnary *is* loaded + gdcmDict *PubDict = gdcmGlobal::GetDicts()->GetDefaultPubDict(); + // if the invoked (group,elem) doesn't exist inside the Dictionary + // we create a VirtualDictEntry + gdcmDictEntry *DictEntry = PubDict->GetDictEntryByNumber(group, element); + if (DictEntry == NULL) { + DictEntry=gdcmGlobal::GetDicts()->NewVirtualDictEntry(group,element,"UN","??","??"); + } + // we assume the constructor didn't fail + Entry = new gdcmHeaderEntry(DictEntry); + // ---- + // TODO + // ---- + // better we don't assume too much ! + // in the next release, gdcmObject will be used + // to describe any Header Entry ... + } else { + Entry = ptagHT->find(key)->second; + } + Entry->SetValue(val); + Entry->SetLength(val.length()); + plistEntries->insert(i,Entry); + return true; + } + if (group == (*i)->GetGroup() && element == (*i)->GetElement() ) { (*i)->SetValue(val); - (*i)->SetLength(val.length()+1); - return true; - } - if (i == endObj) break; - } - return false; + (*i)->SetLength(val.length()); + return true; + } + } } /** * \ingroup gdcmObject @@ -118,7 +180,6 @@ std::string gdcmObject::GetEntryByName(TagName name) { */ TagHeaderEntryHT gdcmObject::GetEntry(void) { TagHeaderEntryHT HT; - //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR for(ListTag::iterator i=beginObj;;++i) { HT.insert( PairHT( (*i)->GetKey(),(*i)) ); if (i == endObj) break; @@ -135,7 +196,6 @@ TagHeaderEntryHT gdcmObject::GetEntry(void) { */ ListTag gdcmObject::GetListEntry(void) { ListTag list; - //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR for(ListTag::iterator i=beginObj;;++i) { list.push_back(*i); if (i == endObj) break; @@ -146,7 +206,7 @@ ListTag gdcmObject::GetListEntry(void) { //----------------------------------------------------------------------------- // Protected -/* +/** * \ingroup gdcmObject * \brief add the 'Object' related Dicom Elements to the listEntries * of a partially created DICOMDIR @@ -167,7 +227,7 @@ void gdcmObject::FillObject(std::list elemList) { tmpEl=it->elem; dictEntry=gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl); entry=new gdcmHeaderEntry(dictEntry); - entry->SetOffset(0); // just to avoid missprinting //JPR + entry->SetOffset(0); // just to avoid further missprinting entry->SetValue(it->value); if(dictEntry->GetGroup()==0xfffe) @@ -191,7 +251,7 @@ void gdcmObject::FillObject(std::list elemList) { entry->SetLength(entry->GetValue().length()); } ptagHT->insert( PairHT(entry->GetKey(),entry) ); // add in the (multimap) H Table - plistEntries->insert(debInsertion ,entry); // en tete de liste des Patients + plistEntries->insert(debInsertion ,entry); // add at the begining of the Patient list ++finInsertion; }