Mercurial > hg > orthanc
annotate Core/DicomFormat/DicomMap.cpp @ 41:c1097a676eca
better naming for preview images
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 31 Aug 2012 11:45:48 +0200 |
parents | 2cefaf5b3c2e |
children | a15e90e5d6fc |
rev | line source |
---|---|
0 | 1 /** |
2 * Palantir - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012 Medical Physics Department, CHU of Liege, | |
4 * Belgium | |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 **/ | |
19 | |
20 | |
21 #include "DicomMap.h" | |
22 | |
23 #include <stdio.h> | |
24 #include <memory> | |
25 #include "DicomString.h" | |
26 #include "../PalantirException.h" | |
27 | |
28 | |
29 namespace Palantir | |
30 { | |
31 static DicomTag patientTags[] = | |
32 { | |
33 DicomTag(0x0010, 0x0010), // PatientName | |
34 DicomTag(0x0010, 0x0020), // PatientID | |
35 DicomTag(0x0010, 0x0030), // PatientBirthDate | |
36 DicomTag(0x0010, 0x0040), // PatientSex | |
38 | 37 DicomTag(0x0010, 0x1000) // OtherPatientIDs |
38 //DicomTag(0x0010, 0x1010), // PatientAge | |
39 //DicomTag(0x0010, 0x1040) // PatientAddress | |
0 | 40 }; |
41 | |
42 static DicomTag studyTags[] = | |
43 { | |
44 DicomTag(0x0008, 0x0020), // StudyDate | |
45 DicomTag(0x0008, 0x0030), // StudyTime | |
38 | 46 DicomTag(0x0008, 0x0050), // AccessionNumber |
0 | 47 DicomTag(0x0008, 0x1030), // StudyDescription |
48 DicomTag(0x0020, 0x000d), // StudyInstanceUID | |
38 | 49 DicomTag(0x0020, 0x0010) // StudyID |
50 //DicomTag(0x0010, 0x1020), // PatientSize | |
51 //DicomTag(0x0010, 0x1030) // PatientWeight | |
0 | 52 }; |
53 | |
54 static DicomTag seriesTags[] = | |
55 { | |
56 DicomTag(0x0008, 0x0021), // SeriesDate | |
57 DicomTag(0x0008, 0x0031), // SeriesTime | |
58 DicomTag(0x0008, 0x0060), // Modality | |
59 DicomTag(0x0008, 0x0070), // Manufacturer | |
60 DicomTag(0x0008, 0x1010), // StationName | |
61 DicomTag(0x0008, 0x103e), // SeriesDescription | |
38 | 62 //DicomTag(0x0010, 0x1080), // MilitaryRank |
63 DicomTag(0x0018, 0x0015), // BodyPartExamined | |
0 | 64 DicomTag(0x0018, 0x0024), // SequenceName |
65 DicomTag(0x0018, 0x1030), // ProtocolName | |
66 DicomTag(0x0020, 0x000e), // SeriesInstanceUID | |
67 DicomTag(0x0020, 0x0011), // SeriesNumber | |
41
c1097a676eca
better naming for preview images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
38
diff
changeset
|
68 DicomTag(0x0020, 0x1002), // ImagesInAcquisition |
0 | 69 DicomTag(0x0054, 0x0081) // NumberOfSlices |
70 }; | |
71 | |
72 static DicomTag instanceTags[] = | |
73 { | |
74 DicomTag(0x0008, 0x0012), // InstanceCreationDate | |
75 DicomTag(0x0008, 0x0013), // InstanceCreationTime | |
76 DicomTag(0x0008, 0x0018), // SOPInstanceUID | |
77 DicomTag(0x0020, 0x0012), // AcquisitionNumber | |
78 DicomTag(0x0020, 0x0013), // InstanceNumber | |
79 DicomTag(0x0054, 0x1330) // ImageIndex | |
80 }; | |
81 | |
82 | |
83 | |
84 | |
85 void DicomMap::SetValue(uint16_t group, | |
86 uint16_t element, | |
87 DicomValue* value) | |
88 { | |
89 DicomTag tag(group, element); | |
90 Map::iterator it = map_.find(tag); | |
91 | |
92 if (it != map_.end()) | |
93 { | |
94 delete it->second; | |
95 it->second = value; | |
96 } | |
97 else | |
98 { | |
99 map_.insert(std::make_pair(tag, value)); | |
100 } | |
101 } | |
102 | |
103 void DicomMap::SetValue(DicomTag tag, | |
104 DicomValue* value) | |
105 { | |
106 SetValue(tag.GetGroup(), tag.GetElement(), value); | |
107 } | |
108 | |
109 | |
110 | |
111 | |
112 void DicomMap::Clear() | |
113 { | |
114 for (Map::iterator it = map_.begin(); it != map_.end(); it++) | |
115 { | |
116 delete it->second; | |
117 } | |
118 | |
119 map_.clear(); | |
120 } | |
121 | |
122 | |
123 void DicomMap::ExtractTags(DicomMap& result, | |
124 const DicomTag* tags, | |
125 size_t count) const | |
126 { | |
127 result.Clear(); | |
128 | |
129 for (unsigned int i = 0; i < count; i++) | |
130 { | |
131 Map::const_iterator it = map_.find(tags[i]); | |
132 if (it != map_.end()) | |
133 { | |
134 result.SetValue(it->first, it->second->Clone()); | |
135 } | |
136 } | |
137 } | |
138 | |
139 | |
140 void DicomMap::ExtractPatientInformation(DicomMap& result) const | |
141 { | |
142 ExtractTags(result, patientTags, sizeof(patientTags) / sizeof(DicomTag)); | |
143 } | |
144 | |
145 void DicomMap::ExtractStudyInformation(DicomMap& result) const | |
146 { | |
147 ExtractTags(result, studyTags, sizeof(studyTags) / sizeof(DicomTag)); | |
148 } | |
149 | |
150 void DicomMap::ExtractSeriesInformation(DicomMap& result) const | |
151 { | |
152 ExtractTags(result, seriesTags, sizeof(seriesTags) / sizeof(DicomTag)); | |
153 } | |
154 | |
155 void DicomMap::ExtractInstanceInformation(DicomMap& result) const | |
156 { | |
157 ExtractTags(result, instanceTags, sizeof(instanceTags) / sizeof(DicomTag)); | |
158 } | |
159 | |
160 | |
161 DicomMap* DicomMap::Clone() const | |
162 { | |
163 std::auto_ptr<DicomMap> result(new DicomMap); | |
164 | |
165 for (Map::const_iterator it = map_.begin(); it != map_.end(); it++) | |
166 { | |
167 result->map_.insert(std::make_pair(it->first, it->second->Clone())); | |
168 } | |
169 | |
170 return result.release(); | |
171 } | |
172 | |
173 | |
174 const DicomValue& DicomMap::GetValue(const DicomTag& tag) const | |
175 { | |
176 Map::const_iterator it = map_.find(tag); | |
177 | |
178 if (it == map_.end()) | |
179 { | |
180 throw PalantirException("Inexistent tag"); | |
181 } | |
182 else | |
183 { | |
184 return *it->second; | |
185 } | |
186 } | |
187 | |
188 | |
189 void DicomMap::Remove(const DicomTag& tag) | |
190 { | |
191 Map::iterator it = map_.find(tag); | |
192 if (it != map_.end()) | |
193 { | |
194 delete it->second; | |
195 map_.erase(it); | |
196 } | |
197 } | |
198 | |
199 | |
200 static void SetupFindTemplate(DicomMap& result, | |
201 const DicomTag* tags, | |
202 size_t count) | |
203 { | |
204 result.Clear(); | |
205 | |
206 for (size_t i = 0; i < count; i++) | |
207 { | |
208 result.SetValue(tags[i], ""); | |
209 } | |
210 } | |
211 | |
212 void DicomMap::SetupFindPatientTemplate(DicomMap& result) | |
213 { | |
214 SetupFindTemplate(result, patientTags, sizeof(patientTags) / sizeof(DicomTag)); | |
215 } | |
216 | |
217 void DicomMap::SetupFindStudyTemplate(DicomMap& result) | |
218 { | |
219 SetupFindTemplate(result, studyTags, sizeof(studyTags) / sizeof(DicomTag)); | |
220 result.SetValue(DicomTag::ACCESSION_NUMBER, ""); | |
221 result.SetValue(DicomTag::PATIENT_ID, ""); | |
222 } | |
223 | |
224 void DicomMap::SetupFindSeriesTemplate(DicomMap& result) | |
225 { | |
226 SetupFindTemplate(result, seriesTags, sizeof(seriesTags) / sizeof(DicomTag)); | |
227 result.SetValue(DicomTag::ACCESSION_NUMBER, ""); | |
228 result.SetValue(DicomTag::PATIENT_ID, ""); | |
229 result.SetValue(DicomTag::STUDY_UID, ""); | |
230 } | |
231 | |
232 void DicomMap::SetupFindInstanceTemplate(DicomMap& result) | |
233 { | |
234 SetupFindTemplate(result, instanceTags, sizeof(instanceTags) / sizeof(DicomTag)); | |
235 result.SetValue(DicomTag::ACCESSION_NUMBER, ""); | |
236 result.SetValue(DicomTag::PATIENT_ID, ""); | |
237 result.SetValue(DicomTag::STUDY_UID, ""); | |
238 result.SetValue(DicomTag::SERIES_UID, ""); | |
239 } | |
240 | |
241 | |
242 void DicomMap::CopyTagIfExists(const DicomMap& source, | |
243 const DicomTag& tag) | |
244 { | |
245 if (source.HasTag(tag)) | |
246 { | |
247 SetValue(tag, source.GetValue(tag)); | |
248 } | |
249 } | |
250 } |