00001 #include <creaImageIOTreeDescriptor.h>
00002 #include <boost/algorithm/string/split.hpp>
00003 #include <boost/algorithm/string/replace.hpp>
00004 #include <creaImageIOSystem.h>
00005 #include <boost/filesystem.hpp>
00006
00007
00008 #include <fstream>
00009
00010
00011 namespace creaImageIO
00012 {
00013
00014 namespace tree
00015 {
00016
00017
00019 const unsigned int AttributeDescriptor::PRIVATE = 1;
00021 const unsigned int AttributeDescriptor::IDENTIFIER = 2;
00023 const unsigned int AttributeDescriptor::EDITABLE = 3;
00025 const unsigned int AttributeDescriptor::LABEL = 4;
00026
00027
00028
00029 Descriptor::Descriptor()
00030 {
00031 CreateLevel0Descriptor();
00032 }
00033
00034
00035
00036 Descriptor::~Descriptor()
00037 {
00038 }
00039
00040
00041
00042 void Descriptor::CreateLevel0Descriptor()
00043 {
00044 Add(LevelDescriptor("Root"));
00045 }
00046
00047
00048
00050 void Descriptor::CreateDefault()
00051 {
00052
00053 Clear();
00054
00055
00056 CreateLevel0Descriptor();
00057
00058 Add(AttributeDescriptor("Name","Name",
00059 AttributeDescriptor::LABEL),0);
00060
00061
00062 Add(LevelDescriptor("Patient"));
00063 Add(AttributeDescriptor("NumberOfChildren","#Series",0),1);
00064 Add(AttributeDescriptor(0x0010,0x0010,
00065 AttributeDescriptor::LABEL),1);
00066 Add(AttributeDescriptor(0x0010,0x0040),1);
00067 Add(AttributeDescriptor(0x0010,0x0030),1);
00068 Add(AttributeDescriptor(0x0010,0x0020,
00069 AttributeDescriptor::IDENTIFIER),1);
00070
00071
00072 Add(LevelDescriptor("Series"));
00073 Add(AttributeDescriptor("NumberOfChildren","#Images",0),2);
00074 Add(AttributeDescriptor(0x0008,0x0060,
00075 AttributeDescriptor::LABEL),2);
00076 Add(AttributeDescriptor(0x0008,0x1030),2);
00077 Add(AttributeDescriptor(0x0008,0x103E),2);
00078 Add(AttributeDescriptor(0x0008,0x0080),2);
00079 Add(AttributeDescriptor(0x0008,0x0081),2);
00080 Add(AttributeDescriptor(0x0008,0x1010),2);
00081 Add(AttributeDescriptor(0x0008,0x1048),2);
00082 Add(AttributeDescriptor(0x0008,0x1050),2);
00083 Add(AttributeDescriptor(0x0018,0x1030),2);
00084
00085 Add(AttributeDescriptor(0x0020,0x0010),2);
00086 Add(AttributeDescriptor(0x0008,0x0020),2);
00087 Add(AttributeDescriptor(0x0008,0x0030),2);
00088 Add(AttributeDescriptor(0x0008,0x0050),2);
00089 Add(AttributeDescriptor(0x0008,0x0005),2);
00090 Add(AttributeDescriptor(0x0008,0x0021),2);
00091 Add(AttributeDescriptor(0x0008,0x0031),2);
00092
00093 Add(AttributeDescriptor(0x0020,0x000D
00094 ),2);
00095 Add(AttributeDescriptor(0x0020,0x000E,
00096 AttributeDescriptor::IDENTIFIER),2);
00097
00098
00099
00100
00101
00102 Add(LevelDescriptor("Image"));
00103
00104 Add(AttributeDescriptor(0x0020,0x0013),3);
00105
00106 Add(AttributeDescriptor(0x0028,0x0010),3);
00107 Add(AttributeDescriptor(0x0028,0x0011),3);
00108 Add(AttributeDescriptor(0x0028,0x0012),3);
00109 Add(AttributeDescriptor(0x0028,0x0002),3);
00110 Add(AttributeDescriptor(0x0028,0x0008),3);
00111 Add(AttributeDescriptor(0x0028,0x0004),3);
00112 Add(AttributeDescriptor(0x0028,0x0103),3);
00113
00114 Add(AttributeDescriptor(0x0020,0x0032),3);
00115 Add(AttributeDescriptor(0x0020,0x0037),3);
00116 Add(AttributeDescriptor(0x0020,0x1041),3);
00117 Add(AttributeDescriptor(0x0028,0x0006),3);
00118
00119 Add(AttributeDescriptor(0x0028,0x0030),3);
00120 Add(AttributeDescriptor(0x0028,0x0100),3);
00121 Add(AttributeDescriptor(0x0028,0x0101),3);
00122
00123 Add(AttributeDescriptor(0x0008,0x0008),3);
00124 Add(AttributeDescriptor(0x0008,0x0023),3);
00125 Add(AttributeDescriptor(0x0008,0x0033),3);
00126
00127 Add(AttributeDescriptor(0x0020,0x4000),3);
00128
00129 Add(AttributeDescriptor(0x0004,0x1500,
00130 AttributeDescriptor::LABEL),3);
00131 Add(AttributeDescriptor(0x0028,0x1052),3);
00132 Add(AttributeDescriptor(0x0028,0x1053),3);
00133
00134 Add(AttributeDescriptor(0x0050,0x0004),3);
00135
00136 Add(AttributeDescriptor(0x0020,0x0052
00137 ),3);
00138 Add(AttributeDescriptor(0x0008,0x0016),3);
00139 Add(AttributeDescriptor("FullFileName",
00140 "Full file name",
00141 AttributeDescriptor::IDENTIFIER),3);
00142
00143 }
00144
00146
00147
00148
00150 void Descriptor::createDescriptorfromFile(const std::string &i_name)
00151 {
00152 Clear();
00153
00154
00155 std::ifstream i_file(i_name.c_str());
00156 std::stringstream buffer;
00157 buffer << i_file.rdbuf();
00158 std::string line;
00159 bool bname;
00160 int ilevel = -1;
00161
00162
00163 while(std::getline(buffer, line))
00164 {
00165 if(line =="<level>")
00166 {
00167 ilevel++;
00168 bname = true;
00169 }
00170 else if(bname)
00171 {
00172
00173 Add(LevelDescriptor(line));
00174 bname = false;
00175 }
00176 else if(line.empty())
00177 {
00178 return;
00179 }
00180 else
00181 {
00182
00183 std::vector<std::string> descriptors;
00184 std::string separator = " ";
00185 std::string::size_type last_pos = line.find_first_not_of(separator);
00186
00187 std::string::size_type pos = line.find_first_of(separator, last_pos);
00188 while(std::string::npos != pos || std::string::npos != last_pos)
00189 {
00190 descriptors.push_back(line.substr(last_pos, pos - last_pos));
00191 last_pos = line.find_first_not_of(separator, pos);
00192 pos = line.find_first_of(separator, last_pos);
00193 }
00194
00195
00196 unsigned int flag = 0;
00197 if(descriptors.size() == 4)
00198 {
00199 std::stringstream val;
00200 val << std::dec << descriptors[3];
00201 val>> flag;
00202 }
00203
00204
00205 if(descriptors[0] == "D")
00206 { std::stringstream val, val2;
00207 unsigned short group;
00208 unsigned short element;
00209 val << std::dec << descriptors[1] ;
00210 val >> std::hex >> group;
00211 val2 << std::dec << descriptors[2];
00212 val2 >> std::hex >> element;
00213 Add(AttributeDescriptor( group,element,flag), ilevel);
00214 }
00215
00216 else if(descriptors[0].find("#") != -1)
00217 {
00218
00219 }
00220 else
00221 { boost::algorithm::replace_all(descriptors[2],"_"," ");
00222 Add(AttributeDescriptor( descriptors[1].c_str(),descriptors[2].c_str(),flag), ilevel);
00223 }
00224 }
00225 }
00226 }
00227
00228
00229
00230
00232 void Descriptor::Add(const LevelDescriptor& d)
00233 {
00234 mLevelDescriptorList.push_back(d);
00235 }
00236
00237
00238
00240 void Descriptor::Add(const AttributeDescriptor& d, int l)
00241 {
00242 mLevelDescriptorList[l].Add(d);
00243
00244 }
00245
00246
00247
00249 void Descriptor::Clear()
00250 {
00251 mLevelDescriptorList.clear();
00252 }
00253
00254
00255
00256
00258 void Descriptor::BuildAttributeMap( std::map<std::string,std::string>& map ) const
00259 {
00260 map.clear();
00261 LevelDescriptorListType::const_iterator l;
00262 for (l = GetLevelDescriptorList().begin();
00263 l!= GetLevelDescriptorList().end();
00264 ++l)
00265 {
00266 LevelDescriptor::AttributeDescriptorListType::const_iterator a;
00267 for (a = l->GetAttributeDescriptorList().begin();
00268 a!= l->GetAttributeDescriptorList().end();
00269 ++a)
00270 {
00271 map[a->GetKey()]="";
00272 }
00273 }
00274 }
00275
00276
00277
00278
00279
00280 const std::string Descriptor::isExist(const std::string i_attr)
00281 {
00282 std::string name = "";
00283 LevelDescriptorListType::const_iterator l = GetLevelDescriptorList().begin();
00284 for (; l!= GetLevelDescriptorList().end(); ++l)
00285 {
00286 LevelDescriptor::AttributeDescriptorListType::const_iterator a = l->GetAttributeDescriptorList().begin();
00287 for(;a!= l->GetAttributeDescriptorList().end(); ++a)
00288 {
00289 if (a->GetKey() == i_attr)
00290 {
00291 name = l->GetName();
00292 break;
00293 }
00294 }
00295 }
00296 return name.c_str();
00297 }
00298 }
00299 }