]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeAttributeDescriptor.cpp
*** empty log message ***
[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           GimmickMessage(5,"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   } // EO namespace tree
120
121 } // EO namespace creaImageIO