]> Creatis software - gdcm.git/blob - src/gdcmObject.cxx
a91aec1f9c1c635f43bdd5998731b86eab087bf5
[gdcm.git] / src / gdcmObject.cxx
1 // gdcmObject.cxx
2 //-----------------------------------------------------------------------------
3 #include "gdcmObject.h"
4 #include "gdcmUtil.h"
5
6 //-----------------------------------------------------------------------------
7 // Constructor / Destructor
8 /**
9  * \ingroup gdcmObject
10  * \brief  Constructor 
11  * @param  begin  iterator on the first Header Entry (i.e Dicom Element)
12  *                related to this 'Object'
13  * @param  end  iterator on the last Header Entry 
14  *              (i.e Dicom Element) related to this 'Object'             
15  * @param ptagHT pointer to the HTable (gdcmObject needs it 
16  *               to build the gdcmHeaderEntries)
17  * @param plistEntries pointer to the chained List (gdcmObject needs it 
18  *               to build the gdcmHeaderEntries)
19  */
20 gdcmObject::gdcmObject(ListTag::iterator begin, ListTag::iterator end,
21               TagHeaderEntryHT *ptagHT, ListTag *plistEntries) {
22    beginObj = begin;
23    endObj   = end;
24    this->ptagHT = ptagHT;
25    this->plistEntries = plistEntries;
26    if(begin==end)
27       dbg.Verbose(0, "gdcmObject::gdcmObject empty list");
28 }
29
30 /**
31  * \ingroup gdcmObject
32  * \brief   Canonical destructor.
33  */
34 gdcmObject::~gdcmObject(void) {
35 }
36
37 //-----------------------------------------------------------------------------
38 // Print
39 /**
40  * \ingroup gdcmObject
41  * \brief   Prints the Object
42  * @return
43  */ 
44 void gdcmObject::Print(std::ostream &os) {
45    if(printLevel>=0) {
46       ListTag::iterator i;
47       //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
48       for(i=beginObj;;++i) {
49          (*i)->SetPrintLevel(printLevel);
50          (*i)->Print(os);
51          if (i == endObj) break;
52       }
53    }
54 }
55
56 //-----------------------------------------------------------------------------
57 // Public
58 /**
59  * \ingroup gdcmObject
60  * \brief   Get the value of an Header Entries (i.e Dicom Element) by number
61  * @return
62  */ 
63 std::string gdcmObject::GetEntryByNumber(guint16 group, guint16 element) {
64    //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
65    for(ListTag::iterator i=beginObj;;++i) {
66       if ( (*i)->GetGroup()==group && (*i)->GetElement()==element)
67          return (*i)->GetValue();
68       if (i == endObj) break;  
69    }   
70    return GDCM_UNFOUND;
71 }
72
73 /**
74  * \ingroup gdcmObject
75  * \brief   Get the value of an Header Entries (i.e Dicom Element) by name
76  * @param   name : name of the searched element.
77  * @return
78  */ 
79 std::string gdcmObject::GetEntryByName(TagName name)  {
80    gdcmDict *PubDict=gdcmGlobal::GetDicts()->GetDefaultPubDict();
81    gdcmDictEntry *dictEntry = (*PubDict).GetDictEntryByName(name); 
82
83    if( dictEntry == NULL)
84       return GDCM_UNFOUND;
85    return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement()); 
86 }
87
88 /**
89  * \ingroup gdcmParser
90  * \brief   Sets Entry (Dicom Element) value of an element,
91  *          specified by it's tag (Group, Number) 
92  *          and the length, too ...
93  *          If the Element is not found, it's just created !
94  * \warning we suppose, right now, the element belongs to a Public Group
95  *          (NOT a shadow one)       
96  * @param   val string value to set
97  * @param   group Group of the searched tag.
98  * @param   element Element of the searched tag.
99  * @return  true if element was found or created successfully
100  */
101  bool gdcmObject::SetEntryByNumber(std::string val,guint16 group, 
102                                                    guint16 element) {
103
104    gdcmHeaderEntry *a;
105    for(ListTag::iterator i=beginObj;;++i) { 
106       if ( (*i)->GetGroup() == 0xfffe && (*i)->GetElement() == 0xe000 ) 
107          continue;
108       if ( group   < (*i)->GetGroup() || 
109            (group == (*i)->GetGroup() && element < (*i)->GetElement()) ){
110          // instead of ReplaceOrCreateByNumber 
111          // that is a method of gdcmParser :-( 
112          gdcmHeaderEntry *Entry;
113          TagKey key = gdcmDictEntry::TranslateToKey(group, element);
114          if ( ! ptagHT->count(key)) {
115            // we assume the element belongs to a Public Group (not a shadow one)
116            // we assume a Public Dictionnary *is* loaded
117            gdcmDict *PubDict         = gdcmGlobal::GetDicts()->GetDefaultPubDict();
118            // if the invoqued (group,elem) doesn't exist inside the Dictionary
119            // we create a VirtualDictEntry
120            gdcmDictEntry *DictEntry  = PubDict->GetDictEntryByNumber(group, element);
121            if (DictEntry == NULL) {
122               DictEntry=gdcmGlobal::GetDicts()->NewVirtualDictEntry(group,element,"UN","??","??");
123            } 
124            // we assume the constructor didn't fail
125            Entry = new gdcmHeaderEntry(DictEntry);
126            // ----
127            // TODO
128            // ----
129            // better we don't assume too much !
130            // in the next release, gdcmObject will be used 
131            // to describe any Header Entry ...
132          } else {
133             Entry = ptagHT->find(key)->second;
134          }
135          Entry->SetValue(val); 
136          Entry->SetLength(val.length());
137          plistEntries->insert(i,Entry); 
138          return true;
139       }    
140       if (group == (*i)->GetGroup() && element == (*i)->GetElement() ) {
141          (*i)->SetValue(val);
142          (*i)->SetLength(val.length()); 
143          return true;    
144       }   
145    }                                                
146 }
147 /**
148  * \ingroup gdcmObject
149  * \brief   Builds a hash table (multimap) containing 
150  *          pointers to all Header Entries (i.e Dicom Element)
151  *          related to this 'object'
152  * @return
153  */ 
154 TagHeaderEntryHT gdcmObject::GetEntry(void) {
155    TagHeaderEntryHT HT;
156    //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
157    for(ListTag::iterator i=beginObj;;++i) {
158       HT.insert( PairHT( (*i)->GetKey(),(*i)) );
159       if (i == endObj) break;      
160    }
161    return(HT);
162 }
163
164 /**
165  * \ingroup gdcmObject
166  * \brief   Builds a Chained List containing 
167  *          pointers to all Header Entries (i.e Dicom Element)
168  *          related to this 'object'
169  * @return
170  */ 
171 ListTag gdcmObject::GetListEntry(void) {
172    ListTag list;
173    //for(ListTag::iterator i=beginObj;i!=endObj;++i) // JPR
174    for(ListTag::iterator i=beginObj;;++i) {
175       list.push_back(*i);
176       if (i == endObj) break;      
177    }
178    return(list);
179 }
180
181
182 //-----------------------------------------------------------------------------
183 // Protected
184 /*
185  * \ingroup gdcmObject
186  * \brief   add the 'Object' related Dicom Elements to the listEntries
187  *          of a partially created DICOMDIR
188  */
189 void gdcmObject::FillObject(std::list<gdcmElement> elemList) {
190    std::list<gdcmElement>::iterator it;
191    guint16 tmpGr,tmpEl;
192    gdcmDictEntry *dictEntry;
193    gdcmHeaderEntry *entry;
194       
195    debInsertion = this->fin(); 
196    ++debInsertion;
197    finInsertion=debInsertion;
198    
199    for(it=elemList.begin();it!=elemList.end();++it)
200    {
201       tmpGr=it->group;
202       tmpEl=it->elem;
203       dictEntry=gdcmGlobal::GetDicts()->GetDefaultPubDict()->GetDictEntryByNumber(tmpGr,tmpEl);
204       entry=new gdcmHeaderEntry(dictEntry);
205       entry->SetOffset(0); // just to avoid missprinting //JPR
206       entry->SetValue(it->value);
207
208       if(dictEntry->GetGroup()==0xfffe) 
209          {
210             entry->SetLength(entry->GetValue().length());        
211          }
212       else if( (dictEntry->GetVR()=="UL") || (dictEntry->GetVR()=="SL") ) 
213          {
214             entry->SetLength(4);
215          } 
216       else if( (dictEntry->GetVR()=="US") || (dictEntry->GetVR()=="SS") ) 
217          {
218             entry->SetLength(2); 
219          } 
220       else if(dictEntry->GetVR()=="SQ") 
221          {
222             entry->SetLength(0xffffffff);
223          }
224       else
225          {
226             entry->SetLength(entry->GetValue().length());        
227          }                                
228       ptagHT->insert( PairHT(entry->GetKey(),entry) ); // add in the (multimap) H Table
229       plistEntries->insert(debInsertion ,entry);       // en tete de liste des Patients
230       ++finInsertion;                                      
231    }
232      
233    i=fin();
234    i++;
235    j=debInsertion;
236    j--;
237 }   
238 //-----------------------------------------------------------------------------
239 // Private
240
241 //-----------------------------------------------------------------------------