]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeAttributeDescriptor.cpp
correct sscan_f problems.
[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           std::string e = key.substr(6,4);
106           std::stringstream val;
107           val <<  std::dec << g.c_str() ;
108           val >> std::hex >> group;
109           val.clear();
110           val << std::dec << e.c_str();
111           val >> std::hex >> elem;
112           //sscanf_s(key.c_str(),"D%04x_%04x ",&group,&elem);  
113           GimmickDebugMessage(3,"GetDicomGroupElementFromKey '"<<key<<"' : "                     <<group<<"|"<<elem<<std::endl);
114         }
115       else 
116         { 
117           GimmickMessage(5,"GetDicomGroupElementFromKey '"<<key<<"' : "
118                          <<" not a DICOM key format"<<std::endl);
119         }
120       return;
121     }
122
123         //=====================================================================
124         /// test if the type is a date
125         bool AttributeDescriptor::isDateEntry() const
126         {
127                  
128                 bool btest = false;
129                 // Retrieve the name from gdcm dict
130                 GDCM_NAME_SPACE::DictEntry* entry =     GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
131                 if(     entry != 0)
132                 {
133                         if( entry->GetVR().str() == "DA" )
134                         {
135                                 btest = true;
136                         }
137                 }
138                 return btest;
139         }
140
141         //=====================================================================
142         /// test if the type is a time
143         bool AttributeDescriptor::isTimeEntry() const
144         {
145                  
146                 bool btest = false;
147                 // Retrieve the name from gdcm dict
148                 GDCM_NAME_SPACE::DictEntry* entry =     GDCM_NAME_SPACE::Global::GetDicts()->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
149                 if(     entry != 0)
150                 {
151                         if( entry->GetVR().str() == "TM" )
152                         {
153                                 btest = true;
154                         }
155                 }
156                 return btest;
157         }
158
159
160     //=====================================================================
161         /// Decodes the type of the attribute
162      void AttributeDescriptor::DecodeType(unsigned int& typ) const
163           {
164                   
165                 
166                   // Retrieve the name from gdcm dict
167                 GDCM_NAME_SPACE::DictEntry* entry =
168                 GDCM_NAME_SPACE::Global::GetDicts()
169                 ->GetDefaultPubDict()->GetEntry(GetGroup(),GetElement());
170
171                 if (entry==0) 
172                 {
173                         typ = 2;
174                         return;
175                 }
176                 std::string type = entry->GetVR().str();
177                 GimmickDebugMessage(3,"VR Value is "<<type<<"!"<<std::endl);
178                 if(type=="AS" ||
179                 type=="DA" ||
180                 type=="FL" ||
181                 type=="FD" ||
182                 type=="IS" ||
183                 type=="SL" ||
184                 type=="SS" ||
185                 type=="UI" ||
186                 type=="US" ||
187                 type=="SH")
188                 {
189                         // Numerical 
190                         typ = 1;
191                 }
192                 else
193                 {
194                         // String
195                         typ = 2;
196                 }
197                 
198           }
199           //=====================================================================
200
201   } // EO namespace tree
202
203 } // EO namespace creaImageIO