Mercurial > hg > orthanc
comparison OrthancFramework/Sources/DicomFormat/DicomMap.cpp @ 4933:312c6f4da888 more-tags
adding MainDicomTags signatures
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 09 Mar 2022 12:16:45 +0100 |
parents | b7ce2bb6b881 |
children | acd3f72e2a21 |
comparison
equal
deleted
inserted
replaced
4932:b7ce2bb6b881 | 4933:312c6f4da888 |
---|---|
24 #include "../PrecompiledHeaders.h" | 24 #include "../PrecompiledHeaders.h" |
25 #include "DicomMap.h" | 25 #include "DicomMap.h" |
26 | 26 |
27 #include <stdio.h> | 27 #include <stdio.h> |
28 #include <memory> | 28 #include <memory> |
29 #include <boost/algorithm/string/join.hpp> | |
29 | 30 |
30 #include "../Compatibility.h" | 31 #include "../Compatibility.h" |
31 #include "../Endianness.h" | 32 #include "../Endianness.h" |
32 #include "../Logging.h" | 33 #include "../Logging.h" |
33 #include "../OrthancException.h" | 34 #include "../OrthancException.h" |
46 }; | 47 }; |
47 typedef std::vector<MainDicomTag> MainDicomTags; | 48 typedef std::vector<MainDicomTag> MainDicomTags; |
48 | 49 |
49 } | 50 } |
50 | 51 |
52 | |
53 // WARNING: the DEFAULT list of main dicom tags below are the list as they | |
54 // were in Orthanc 1.10 before we introduced the dynamic main dicom tags. | |
55 // This list has not changed since Orthanc 1.4.2 and had a single change since | |
56 // Orthanc 0.9.5. | |
57 // These lists have a specific signature. When a resource does not have | |
58 // the metadata "MainDicomTagsSignature", we'll assume that they were stored | |
59 // with an Orthanc prior to 1.11. It is therefore very important that you never | |
60 // change these lists ! | |
51 | 61 |
52 static const MainDicomTag DEFAULT_PATIENT_MAIN_DICOM_TAGS[] = | 62 static const MainDicomTag DEFAULT_PATIENT_MAIN_DICOM_TAGS[] = |
53 { | 63 { |
54 // { DicomTag(0x0010, 0x1010), "PatientAge" }, | 64 // { DicomTag(0x0010, 0x1010), "PatientAge" }, |
55 // { DicomTag(0x0010, 0x1040), "PatientAddress" }, | 65 // { DicomTag(0x0010, 0x1040), "PatientAddress" }, |
161 std::map<ResourceType, std::map<DicomTag, std::string> > mainDicomTagsByTag_; | 171 std::map<ResourceType, std::map<DicomTag, std::string> > mainDicomTagsByTag_; |
162 std::map<ResourceType, std::map<std::string, DicomTag2> > mainDicomTagsByName_; | 172 std::map<ResourceType, std::map<std::string, DicomTag2> > mainDicomTagsByName_; |
163 std::map<ResourceType, std::set<DicomTag> > mainDicomTagsByLevel_; | 173 std::map<ResourceType, std::set<DicomTag> > mainDicomTagsByLevel_; |
164 std::set<DicomTag> allMainDicomTags_; | 174 std::set<DicomTag> allMainDicomTags_; |
165 | 175 |
176 std::map<ResourceType, std::string> signatures_; | |
177 std::map<ResourceType, std::string> defaultSignatures_; | |
178 | |
166 MainDicomTagsConfiguration() | 179 MainDicomTagsConfiguration() |
167 { | 180 { |
168 ResetDefaultMainDicomTags(); | 181 ResetDefaultMainDicomTags(); |
169 } | 182 } |
170 | 183 |
178 // by default, initialize with the previous static list (up to 1.10.0) | 191 // by default, initialize with the previous static list (up to 1.10.0) |
179 LoadDefaultMainDicomTags(ResourceType_Patient); | 192 LoadDefaultMainDicomTags(ResourceType_Patient); |
180 LoadDefaultMainDicomTags(ResourceType_Study); | 193 LoadDefaultMainDicomTags(ResourceType_Study); |
181 LoadDefaultMainDicomTags(ResourceType_Series); | 194 LoadDefaultMainDicomTags(ResourceType_Series); |
182 LoadDefaultMainDicomTags(ResourceType_Instance); | 195 LoadDefaultMainDicomTags(ResourceType_Instance); |
196 | |
197 defaultSignatures_[ResourceType_Patient] = signatures_[ResourceType_Patient]; | |
198 defaultSignatures_[ResourceType_Study] = signatures_[ResourceType_Study]; | |
199 defaultSignatures_[ResourceType_Series] = signatures_[ResourceType_Series]; | |
200 defaultSignatures_[ResourceType_Instance] = signatures_[ResourceType_Instance]; | |
201 } | |
202 | |
203 std::string ComputeSignature(const std::set<DicomTag>& tags) | |
204 { | |
205 // std::set are sorted by default (which is important for us !) | |
206 std::set<std::string> tagsIds; | |
207 for (std::set<DicomTag>::const_iterator it = tags.begin(); it != tags.end(); it++) | |
208 { | |
209 tagsIds.insert(it->Format()); | |
210 } | |
211 | |
212 std::string signatureText = boost::algorithm::join(tagsIds, "|"); | |
213 std::string signatureMD5; | |
214 Toolbox::ComputeMD5(signatureMD5, signatureText); | |
215 | |
216 return signatureMD5; | |
183 } | 217 } |
184 | 218 |
185 void LoadDefaultMainDicomTags(ResourceType level) | 219 void LoadDefaultMainDicomTags(ResourceType level) |
186 { | 220 { |
187 assert(mainDicomTagsByTag_.find(level) == mainDicomTagsByTag_.end()); | 221 assert(mainDicomTagsByTag_.find(level) == mainDicomTagsByTag_.end()); |
247 | 281 |
248 mainDicomTagsByTag_[level][tag] = name; | 282 mainDicomTagsByTag_[level][tag] = name; |
249 mainDicomTagsByName_[level][name] = DicomTag2(tag); | 283 mainDicomTagsByName_[level][name] = DicomTag2(tag); |
250 mainDicomTagsByLevel_[level].insert(tag); | 284 mainDicomTagsByLevel_[level].insert(tag); |
251 allMainDicomTags_.insert(tag); | 285 allMainDicomTags_.insert(tag); |
286 signatures_[level] = ComputeSignature(GetMainDicomTagsByLevel(level)); | |
252 } | 287 } |
253 | 288 |
254 const std::map<DicomTag, std::string>& GetMainDicomTags(ResourceType level) const | 289 const std::map<DicomTag, std::string>& GetMainDicomTags(ResourceType level) const |
255 { | 290 { |
256 assert(mainDicomTagsByTag_.find(level) != mainDicomTagsByTag_.end()); | 291 assert(mainDicomTagsByTag_.find(level) != mainDicomTagsByTag_.end()); |
274 | 309 |
275 const std::set<DicomTag>& GetAllMainDicomTags() const | 310 const std::set<DicomTag>& GetAllMainDicomTags() const |
276 { | 311 { |
277 return allMainDicomTags_; | 312 return allMainDicomTags_; |
278 } | 313 } |
314 | |
315 const std::string& GetMainDicomTagsSignature(ResourceType level) | |
316 { | |
317 assert(signatures_.find(level) != signatures_.end()); | |
318 | |
319 return signatures_[level]; | |
320 } | |
321 | |
322 const std::string& GetDefaultMainDicomTagsSignature(ResourceType level) | |
323 { | |
324 assert(defaultSignatures_.find(level) != defaultSignatures_.end()); | |
325 | |
326 return defaultSignatures_[level]; | |
327 } | |
328 | |
279 }; | 329 }; |
280 | 330 |
281 | 331 |
282 void DicomMap::SetValueInternal(uint16_t group, | 332 void DicomMap::SetValueInternal(uint16_t group, |
283 uint16_t element, | 333 uint16_t element, |
585 } | 635 } |
586 | 636 |
587 void DicomMap::ResetDefaultMainDicomTags() | 637 void DicomMap::ResetDefaultMainDicomTags() |
588 { | 638 { |
589 DicomMap::MainDicomTagsConfiguration::GetInstance().ResetDefaultMainDicomTags(); | 639 DicomMap::MainDicomTagsConfiguration::GetInstance().ResetDefaultMainDicomTags(); |
640 } | |
641 | |
642 const std::string& DicomMap::GetMainDicomTagsSignature(ResourceType level) | |
643 { | |
644 return DicomMap::MainDicomTagsConfiguration::GetInstance().GetMainDicomTagsSignature(level); | |
645 } | |
646 | |
647 const std::string& DicomMap::GetDefaultMainDicomTagsSignature(ResourceType level) | |
648 { | |
649 return DicomMap::MainDicomTagsConfiguration::GetInstance().GetDefaultMainDicomTagsSignature(level); | |
590 } | 650 } |
591 | 651 |
592 void DicomMap::GetTags(std::set<DicomTag>& tags) const | 652 void DicomMap::GetTags(std::set<DicomTag>& tags) const |
593 { | 653 { |
594 tags.clear(); | 654 tags.clear(); |