X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmObject.cxx;h=d5f2848f5073881b54c00d26458b3aaad22322aa;hb=912de5d1cc942f7386c83d32c5d847ef5bb2bf17;hp=a91aec1f9c1c635f43bdd5998731b86eab087bf5;hpb=8c5d11e469d0c09fa518a2b81ad0d13b279c33f2;p=gdcm.git diff --git a/src/gdcmObject.cxx b/src/gdcmObject.cxx index a91aec1f..d5f2848f 100644 --- a/src/gdcmObject.cxx +++ b/src/gdcmObject.cxx @@ -1,149 +1,57 @@ -// gdcmObject.cxx -//----------------------------------------------------------------------------- +/*========================================================================= + + Program: gdcm + Module: $RCSfile: gdcmObject.cxx,v $ + Language: C++ + Date: $Date: 2004/08/01 00:59:21 $ + Version: $Revision: 1.24 $ + + 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.htm 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 "gdcmObject.h" -#include "gdcmUtil.h" +#include "gdcmGlobal.h" +#include "gdcmDebug.h" +#include "gdcmValEntry.h" //----------------------------------------------------------------------------- -// Constructor / Destructor /** * \ingroup gdcmObject * \brief Constructor - * @param begin iterator on the first Header Entry (i.e Dicom Element) - * related to this 'Object' - * @param end iterator on the last Header Entry - * (i.e Dicom Element) related to this 'Object' + * * @param ptagHT pointer to the HTable (gdcmObject needs it - * to build the gdcmHeaderEntries) - * @param plistEntries pointer to the chained List (gdcmObject needs it - * to build the gdcmHeaderEntries) + * to build the gdcmDocEntries) + * @param depth Sequence depth level */ -gdcmObject::gdcmObject(ListTag::iterator begin, ListTag::iterator end, - TagHeaderEntryHT *ptagHT, ListTag *plistEntries) { - beginObj = begin; - endObj = end; - this->ptagHT = ptagHT; - this->plistEntries = plistEntries; - if(begin==end) - dbg.Verbose(0, "gdcmObject::gdcmObject empty list"); + +gdcmObject::gdcmObject(TagDocEntryHT *ptagHT, int depth) + : gdcmSQItem (depth) +{ + PtagHT = ptagHT; } + /** * \ingroup gdcmObject * \brief Canonical destructor. */ -gdcmObject::~gdcmObject(void) { +gdcmObject::~gdcmObject() +{ } -//----------------------------------------------------------------------------- -// Print -/** - * \ingroup gdcmObject - * \brief Prints the Object - * @return - */ -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; - } - } -} + //----------------------------------------------------------------------------- // Public -/** - * \ingroup gdcmObject - * \brief Get the value of an Header Entries (i.e Dicom Element) by number - * @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(); - if (i == endObj) break; - } - return GDCM_UNFOUND; -} - -/** - * \ingroup gdcmObject - * \brief Get the value of an Header Entries (i.e Dicom Element) by name - * @param name : name of the searched element. - * @return - */ -std::string gdcmObject::GetEntryByName(TagName name) { - gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict(); - gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name); - if( dictEntry == NULL) - return GDCM_UNFOUND; - return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement()); -} -/** - * \ingroup gdcmParser - * \brief Sets Entry (Dicom Element) value of an element, - * specified by it's tag (Group, Number) - * 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 or created successfully - */ - bool gdcmObject::SetEntryByNumber(std::string val,guint16 group, - guint16 element) { - - gdcmHeaderEntry *a; - 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 the element belongs to a Public Group (not a shadow one) - // we assume a Public Dictionnary *is* loaded - gdcmDict *PubDict = gdcmGlobal::GetDicts()->GetDefaultPubDict(); - // if the invoqued (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()); - return true; - } - } -} /** * \ingroup gdcmObject * \brief Builds a hash table (multimap) containing @@ -151,91 +59,65 @@ std::string gdcmObject::GetEntryByName(TagName name) { * related to this 'object' * @return */ -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; - } - return(HT); -} - -/** - * \ingroup gdcmObject - * \brief Builds a Chained List containing - * pointers to all Header Entries (i.e Dicom Element) - * related to this 'object' - * @return - */ -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; +TagDocEntryHT gdcmObject::GetEntry() +{ + TagDocEntryHT HT; + docEntries=GetDocEntries(); + for(ListDocEntry::iterator i = docEntries.begin(); + i != docEntries.end(); ++i) + { + HT[(*i)->GetKey()]=*i; } - return(list); + return HT; } - //----------------------------------------------------------------------------- // Protected -/* - * \ingroup gdcmObject +/** * \brief add the 'Object' related Dicom Elements to the listEntries * of a partially created DICOMDIR */ -void gdcmObject::FillObject(std::list elemList) { +void gdcmObject::FillObject(std::list elemList) +{ + // FillObject rempli le SQItem qui sera accroche au bon endroit + std::list::iterator it; - guint16 tmpGr,tmpEl; + uint16_t tmpGr,tmpEl; gdcmDictEntry *dictEntry; - gdcmHeaderEntry *entry; + gdcmValEntry *entry; - debInsertion = this->fin(); - ++debInsertion; - finInsertion=debInsertion; - - for(it=elemList.begin();it!=elemList.end();++it) + // for all the Elements found in they own part of the DicomDir dict. + for(it = elemList.begin(); it != elemList.end(); ++it) { - tmpGr=it->group; - tmpEl=it->elem; - dictEntry=gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl); - entry=new gdcmHeaderEntry(dictEntry); - entry->SetOffset(0); // just to avoid missprinting //JPR + tmpGr = it->group; + tmpEl = it->elem; + dictEntry = gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl); + entry = new gdcmValEntry(dictEntry); + entry->SetOffset(0); // just to avoid further missprinting entry->SetValue(it->value); + // dealing with value length ... + if(dictEntry->GetGroup()==0xfffe) - { - entry->SetLength(entry->GetValue().length()); - } - else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") ) - { - entry->SetLength(4); - } - else if( (dictEntry->GetVR()=="US") || (dictEntry->GetVR()=="SS") ) - { - entry->SetLength(2); - } - else if(dictEntry->GetVR()=="SQ") - { - entry->SetLength(0xffffffff); - } + { + entry->SetLength(entry->GetValue().length()); + } + else if( dictEntry->GetVR() == "UL" || dictEntry->GetVR() == "SL" ) + { + entry->SetLength(4); + } + else if( dictEntry->GetVR() == "US" || dictEntry->GetVR() == "SS" ) + { + entry->SetLength(2); + } + else if( dictEntry->GetVR() == "SQ" ) + { + entry->SetLength(0xffffffff); + } else - { - 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 - ++finInsertion; - } - - i=fin(); - i++; - j=debInsertion; - j--; + { + entry->SetLength(entry->GetValue().length()); + } + AddDocEntry(entry); + } } -//----------------------------------------------------------------------------- -// Private - -//-----------------------------------------------------------------------------