]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeAttributeDescriptor.cpp
c6a694f8cff678e267d621f9da6a8d7585e4c902
[creaImageIO.git] / src2 / creaImageIOTreeAttributeDescriptor.cpp
1 #include <creaImageIOTreeAttributeDescriptor.h>
2 #include <creaImageIOSystem.h>
3
4 #include <gdcmGlobal.h>
5 #include <gdcmDictSet.h>
6
7 #include <boost/algorithm/string/replace.hpp>
8
9 namespace creaImageIO
10 {
11
12   namespace tree
13   {
14
15     //========================================================================
16     void AttributeDescriptor::CleanName(std::string& str) const
17     {
18       // quote must be doubled for SQL
19       //    crea::Utils::Replace( str, "'", "''" );
20       boost::algorithm::replace_all(str,"'","''");
21       // Found strange strings which contained NULL char INSIDE string 
22       int i,size=str.size();
23       for (i=0;i<size;++i) 
24         {
25           if (str[i]==0) 
26             {
27               str = str.substr(0,i);
28               break;
29             }
30         }
31     }
32     //========================================================================
33
34     //=====================================================================
35     // Ctor with key, name and flags
36      AttributeDescriptor::AttributeDescriptor(const std::string& key,
37                                              const std::string& name,
38                                              unsigned int flags)
39       : mKey(key), mName(name), mGroup(0), mElement(0), mFlags(flags)
40     {
41
42       CleanName(mName);
43       GimmickDebugMessage(3,"AttributeDescriptor : '"<<key
44                           <<"' ["<<flags<<"]"<<std::endl);
45       GimmickDebugMessage(3,"='"<<mName<<"'"<<std::endl);
46     }
47
48     //=====================================================================
49
50      //=====================================================================
51    // Ctor with dicom group, elem and flags
52     // The key is built as 'Dgroup_elem'
53     // The user name is retreived from dicom dictionnary
54     AttributeDescriptor::AttributeDescriptor(unsigned short group,
55                                              unsigned short element,
56                                              unsigned int flags)
57       : mGroup(group), mElement(element), mFlags(flags)
58     {
59       
60       //GDCM_NAME_SPACE::TagKey tag(group,element);
61       char ctag[12];
62       sprintf(ctag,"D%04x_%04x",group,element);
63       mKey = ctag;
64
65       GimmickDebugMessage(3,"AttributeDescriptor : '"<<mKey
66                           <<"' ["<<flags<<"]"<<std::endl);
67
68       // Retrieve the name from gdcm dict
69       GDCM_NAME_SPACE::DictEntry* entry =
70         GDCM_NAME_SPACE::Global::GetDicts()
71         ->GetDefaultPubDict()->GetEntry(mGroup,mElement);
72           
73       if (entry)
74         {
75           mName = entry->GetName();
76           CleanName(mName);
77           GimmickDebugMessage(3,"='"<<mName<<"'"<<std::endl);
78         }
79       else
80         {
81           GimmickMessage(1,"!! WARNING : tag '"<<mKey
82                          <<"' is not in DICOM dictionnary ! "
83                          <<"Considering it as a user attribute"
84                          << std::endl);
85           mName = "UNKNOWN";
86           mGroup = mElement = 0;
87         }
88       
89     }
90     //=====================================================================
91
92
93     //=====================================================================
94     /// Extracts group and element from a key of the form "Dgroup_elem" 
95     void AttributeDescriptor::GetDicomGroupElementFromKey(const std::string& key,
96                                                           unsigned short& group,
97                                                           unsigned short& elem)
98     {
99       group = elem = 0;
100       if ( (key.size()==10) &&
101            (key[0] == 'D') &&
102            (key[5] == '_') )
103         {
104           std::string g = key.substr(1,4);
105           sscanf(key.c_str(),"D %04x _ %04x ",&group,&elem);  
106           sscanf(g.c_str(),"%04x",&group);
107           GimmickDebugMessage(3,"GetDicomGroupElementFromKey '"<<g<<"' : "
108                          <<group<<"|"<<elem<<std::endl);
109         }
110       else 
111         { 
112           GimmickMessage(5,"GetDicomGroupElementFromKey '"<<key<<"' : "
113                          <<" not a DICOM key format"<<std::endl);
114         }
115       return;
116     }
117
118         //=====================================================================
119         /// test if the type is a date
120         bool AttributeDescriptor::isDateEntry() const
121         {
122                  
123                 bool btest = false;
124                 // Retrieve the name from gdcm dict
125                 GDCM_NAME_SPACE::DictEntry* entry =     GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
126                 if(     entry != 0)
127                 {
128                         if( entry->GetVR().str() == "DA" )
129                         {
130                                 btest = true;
131                         }
132                 }
133                 return btest;
134         }
135
136         //=====================================================================
137         /// test if the type is a time
138         bool AttributeDescriptor::isTimeEntry() const
139         {
140                  
141                 bool btest = false;
142                 // Retrieve the name from gdcm dict
143                 GDCM_NAME_SPACE::DictEntry* entry =     GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
144                 if(     entry != 0)
145                 {
146                         if( entry->GetVR().str() == "TM" )
147                         {
148                                 btest = true;
149                         }
150                 }
151                 return btest;
152         }
153
154
155     //=====================================================================
156         /// Decodes the type of the attribute
157      void AttributeDescriptor::DecodeType(unsigned int& typ) const
158           {
159                   
160                 
161                   // Retrieve the name from gdcm dict
162                 GDCM_NAME_SPACE::DictEntry* entry =
163                 GDCM_NAME_SPACE::Global::GetDicts()
164                 ->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
165
166                 if (entry==0) 
167                 {
168                         typ = 2;
169                         return;
170                 }
171                 std::string type = entry->GetVR().str();
172                 GimmickDebugMessage(3,"VR Value is "<<type<<"!"<<std::endl);
173                 if(type=="AS" ||
174                 type=="DA" ||
175                 type=="FL" ||
176                 type=="FD" ||
177                 type=="IS" ||
178                 type=="SL" ||
179                 type=="SS" ||
180                 type=="UI" ||
181                 type=="US" ||
182                 type=="SH")
183                 {
184                         // Numerical 
185                         typ = 1;
186                 }
187                 else
188                 {
189                         // String
190                         typ = 2;
191                 }
192                 
193           }
194           //=====================================================================
195
196   } // EO namespace tree
197
198 } // EO namespace creaImageIO