Mercurial > hg > orthanc
annotate OrthancServer/RadiotherapyRestApi.cpp @ 544:a482948c1fd6 dicom-rt
fix
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 04 Sep 2013 14:19:14 +0200 |
parents | c8347eef225b |
children |
rev | line source |
---|---|
526 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2013 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 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
22 * | |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
33 #include "RadiotherapyRestApi.h" | |
34 | |
35 #include "ServerToolbox.h" | |
36 | |
37 #define RETRIEVE_CONTEXT(call) \ | |
38 OrthancRestApi& contextApi = \ | |
39 dynamic_cast<OrthancRestApi&>(call.GetContext()); \ | |
40 ServerContext& context = contextApi.GetContext() | |
41 | |
42 | |
532
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
43 // DICOM tags for RT-STRUCT |
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
44 |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
45 /** |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
46 * REFERENCE: http://www.dabsoft.ch/dicom/3/C.8.8.6/ |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
47 * |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
48 * IMPORTANT: The points/vertices coordinates are reported in [mm]. |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
49 * |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
50 * TODO: Support "Contour Offset Vector" |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
51 **/ |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
52 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
53 |
526 | 54 #define REFERENCED_STUDY_SEQUENCE "0008,1110" |
55 #define REFERENCED_SOP_INSTANCE_UID "0008,1155" | |
56 #define FRAME_OF_REFERENCE_UID "0020,0052" | |
57 #define REFERENCED_FRAME_OF_REFERENCE_SEQUENCE "3006,0010" | |
529 | 58 #define STRUCTURE_SET_ROI_SEQUENCE "3006,0020" |
59 #define ROI_NUMBER "3006,0022" | |
60 #define ROI_NAME "3006,0026" | |
61 #define ROI_GENERATION_ALGORITHM "3006,0036" | |
62 #define ROI_CONTOUR_SEQUENCE "3006,0039" | |
63 #define REFERENCED_ROI_NUMBER "3006,0084" | |
64 #define ROI_DISPLAY_COLOR "3006,002a" | |
532
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
65 #define CONTOUR_SEQUENCE "3006,0040" |
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
66 #define CONTOUR_IMAGE_SEQUENCE "3006,0016" |
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
67 #define CONTOUR_GEOMETRIC_TYPE "3006,0042" |
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
68 #define NUMBER_OF_CONTOUR_POINTS "3006,0046" |
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
69 #define CONTOUR_DATA "3006,0050" |
535 | 70 #define CONTOUR_SLAB_THICKNESS "3006,0044" |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
71 #define SLICE_THICKNESS "0018,0050" |
532
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
72 |
526 | 73 |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
74 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
75 #include <boost/geometry.hpp> |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
76 #include <boost/geometry/geometries/point.hpp> |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
77 #include <boost/geometry/geometries/point_xy.hpp> |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
78 #include <boost/geometry/geometries/polygon.hpp> |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
79 #include <boost/geometry/geometries/linestring.hpp> |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
80 |
526 | 81 namespace Orthanc |
82 { | |
83 static bool CheckSeriesModality(Json::Value& study, | |
84 Json::Value& series, | |
85 Json::Value& content, | |
86 ServerContext& context, | |
87 const std::string& seriesId, | |
88 const std::string& modality) | |
89 { | |
90 if (!context.GetIndex().LookupResource(series, seriesId, ResourceType_Series)) | |
91 { | |
92 return false; | |
93 } | |
94 | |
95 // Retrieve the parent study | |
96 std::string studyId = series["ParentStudy"].asString(); | |
97 if (!context.GetIndex().LookupResource(study, studyId, ResourceType_Study)) | |
98 { | |
99 return false; | |
100 } | |
101 | |
102 // Check the modality and that there is a single instance inside the series | |
103 if (!series["MainDicomTags"].isMember("Modality") || | |
104 series["MainDicomTags"]["Modality"].asString() != modality || | |
105 series["Instances"].size() != 1) | |
106 { | |
107 return false; | |
108 } | |
109 | |
110 // Retrieve the instance data | |
111 std::string instanceId = series["Instances"][0].asString(); | |
112 | |
113 context.ReadJson(content, instanceId); | |
114 | |
115 return true; | |
116 } | |
117 | |
118 | |
535 | 119 static bool ContourToPoints(Json::Value& result, |
120 const Json::Value& source) | |
121 { | |
122 std::vector<std::string> points; | |
123 Toolbox::Split(points, source.asString(), '\\'); | |
124 | |
125 if (points.size() % 3 != 0) | |
126 { | |
127 return false; | |
128 } | |
129 | |
130 result = Json::arrayValue; | |
131 | |
132 for (size_t k = 0; k < points.size(); k += 3) | |
133 { | |
134 Json::Value p = Json::arrayValue; | |
135 | |
136 try | |
137 { | |
138 p.append(boost::lexical_cast<float>(points[k])); | |
139 p.append(boost::lexical_cast<float>(points[k + 1])); | |
140 p.append(boost::lexical_cast<float>(points[k + 2])); | |
141 } | |
142 catch (boost::bad_lexical_cast) | |
143 { | |
144 return false; | |
145 } | |
146 | |
147 result.append(p); | |
148 } | |
149 | |
150 return true; | |
151 } | |
152 | |
153 | |
526 | 154 static bool GetRtStructuresInfo(Json::Value& study, |
155 Json::Value& series, | |
156 Json::Value& content, | |
157 std::string& frameOfReference, | |
158 ServerContext& context, | |
159 const std::string& seriesId) | |
160 { | |
161 if (!CheckSeriesModality(study, series, content, context, seriesId, "RTSTRUCT")) | |
162 { | |
163 return false; | |
164 } | |
165 | |
544 | 166 // Check that the "ReferencedStudySequence" (if any) is the same as the parent study. |
167 if (content.isMember(REFERENCED_STUDY_SEQUENCE)) | |
526 | 168 { |
544 | 169 if (content[REFERENCED_STUDY_SEQUENCE]["Value"].size() != 1 || |
170 !content[REFERENCED_STUDY_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) || | |
171 content[REFERENCED_STUDY_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString() != | |
172 study["MainDicomTags"]["StudyInstanceUID"].asString()) | |
173 { | |
174 return false; | |
175 } | |
526 | 176 } |
177 | |
178 // Lookup for the frame of reference. Orthanc does not support | |
179 // RTSTRUCT with multiple frames of reference. | |
180 if (!content.isMember(REFERENCED_FRAME_OF_REFERENCE_SEQUENCE) || | |
181 content[REFERENCED_FRAME_OF_REFERENCE_SEQUENCE]["Value"].size() != 1 || | |
182 !content[REFERENCED_FRAME_OF_REFERENCE_SEQUENCE]["Value"][0].isMember(FRAME_OF_REFERENCE_UID)) | |
183 { | |
184 return false; | |
185 } | |
186 | |
187 frameOfReference = content[REFERENCED_FRAME_OF_REFERENCE_SEQUENCE]["Value"][0][FRAME_OF_REFERENCE_UID]["Value"].asString(); | |
188 | |
189 return true; | |
190 } | |
191 | |
192 | |
535 | 193 static bool GetRtStructuresRoi(Json::Value& result, |
194 Json::Value& contourSequence, | |
195 std::string& instanceId, | |
196 ServerContext& context, | |
197 const std::string& seriesId, | |
198 const std::string& roiNumber) | |
199 { | |
200 Json::Value study, series, content; | |
201 std::string frameOfReference; | |
202 | |
203 if (!GetRtStructuresInfo(study, series, content, frameOfReference, context, seriesId)) | |
204 { | |
205 return false; | |
206 } | |
207 | |
208 if (!content.isMember(STRUCTURE_SET_ROI_SEQUENCE) || | |
209 !content.isMember(ROI_CONTOUR_SEQUENCE)) | |
210 { | |
211 return false; | |
212 } | |
213 | |
214 instanceId = series["Instances"][0].asString(); | |
215 | |
216 bool found = false; | |
217 | |
218 for (Json::Value::ArrayIndex i = 0; i < content[STRUCTURE_SET_ROI_SEQUENCE]["Value"].size(); i++) | |
219 { | |
220 const Json::Value& roi = content[STRUCTURE_SET_ROI_SEQUENCE]["Value"][i]; | |
221 | |
222 if (roi.isMember(ROI_NUMBER) && | |
223 roi.isMember(ROI_NAME) && | |
224 roi[ROI_NUMBER]["Value"].asString() == roiNumber) | |
225 { | |
226 result["InternalIndex"] = i; | |
227 result["Number"] = boost::lexical_cast<unsigned int>(roiNumber); | |
228 result["Name"] = roi[ROI_NAME]["Value"].asString(); | |
229 result["GenerationAlgorithm"] = roi[ROI_GENERATION_ALGORITHM]["Value"].asString(); | |
230 found = true; | |
231 } | |
232 } | |
233 | |
234 if (!found) | |
235 { | |
236 return false; | |
237 } | |
238 | |
239 for (Json::Value::ArrayIndex i = 0; i < content[ROI_CONTOUR_SEQUENCE]["Value"].size(); i++) | |
240 { | |
241 const Json::Value& contour = content[ROI_CONTOUR_SEQUENCE]["Value"][i]; | |
242 | |
243 if (contour.isMember(REFERENCED_ROI_NUMBER) && | |
244 contour.isMember(ROI_DISPLAY_COLOR) && | |
245 contour.isMember(CONTOUR_SEQUENCE) && | |
246 contour[REFERENCED_ROI_NUMBER]["Value"].asString() == roiNumber) | |
247 { | |
248 std::vector<std::string> color; | |
249 Toolbox::Split(color, contour[ROI_DISPLAY_COLOR]["Value"].asString(), '\\'); | |
250 | |
251 result["DisplayColor"] = Json::arrayValue; | |
252 if (color.size() != 3) | |
253 { | |
254 return false; | |
255 } | |
256 | |
257 for (size_t k = 0; k < color.size(); k++) | |
258 { | |
259 try | |
260 { | |
261 result["DisplayColor"].append(boost::lexical_cast<int>(color[k])); | |
262 } | |
263 catch (boost::bad_lexical_cast) | |
264 { | |
265 return false; | |
266 } | |
267 } | |
268 | |
269 contourSequence = contour[CONTOUR_SEQUENCE]["Value"]; | |
270 | |
271 return true; | |
272 } | |
273 } | |
274 | |
275 return false; | |
276 } | |
277 | |
278 | |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
279 static bool GetClosedPlanarPoints(Json::Value& result, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
280 ServerContext& context, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
281 const std::string& instanceId, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
282 const Json::Value& roi, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
283 unsigned int index) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
284 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
285 boost::mutex::scoped_lock lock(context.GetDicomFileMutex()); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
286 ParsedDicomFile& dicom = context.GetDicomFile(instanceId); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
287 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
288 ParsedDicomFile::SequencePath path; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
289 path.push_back(std::make_pair(DicomTag(0x3006, 0x0039 /* ROIContourSequence */), roi["InternalIndex"].asInt())); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
290 path.push_back(std::make_pair(DicomTag(0x3006, 0x0040 /* ContourSequence */), index)); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
291 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
292 std::string contourData; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
293 std::string numberOfPoints; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
294 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
295 if (dicom.GetTagValue(contourData, path, DicomTag(0x3006, 0x0050 /* ContourData */)) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
296 dicom.GetTagValue(numberOfPoints, path, DicomTag(0x3006, 0x0046 /* NumberOfContourPoints */)) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
297 ContourToPoints(result, contourData) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
298 result.size() == boost::lexical_cast<unsigned int>(numberOfPoints)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
299 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
300 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
301 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
302 else |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
303 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
304 return false; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
305 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
306 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
307 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
308 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
309 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
310 static bool LookupReferencedInstance(Json::Value& result, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
311 ServerContext& context, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
312 const Json::Value& contour) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
313 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
314 if (contour.isMember(CONTOUR_IMAGE_SEQUENCE) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
315 contour[CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
316 contour[CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
317 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
318 std::string uid = contour[CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
319 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
320 std::list<std::string> instance; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
321 context.GetIndex().LookupTagValue(instance, DICOM_TAG_SOP_INSTANCE_UID, uid); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
322 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
323 if (instance.size() == 1 && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
324 context.GetIndex().LookupResource(result, instance.front(), ResourceType_Instance)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
325 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
326 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
327 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
328 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
329 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
330 return false; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
331 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
332 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
333 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
334 static bool GetRtStructuresClosedPlanarThickness(float& result, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
335 ServerContext& context, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
336 const Json::Value& contour) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
337 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
338 if (contour.isMember(CONTOUR_SLAB_THICKNESS)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
339 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
340 result = boost::lexical_cast<float>(contour[CONTOUR_SLAB_THICKNESS]["Value"].asString()); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
341 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
342 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
343 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
344 // No slab thickness is explicitely specified: Fallback to |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
345 // the thickness of the referred instance |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
346 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
347 Json::Value instance; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
348 if (LookupReferencedInstance(instance, context, contour)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
349 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
350 Json::Value info; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
351 context.ReadJson(info, instance["ID"].asString()); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
352 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
353 if (info.isMember(SLICE_THICKNESS)) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
354 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
355 result = boost::lexical_cast<float>(info[SLICE_THICKNESS]["Value"].asString()); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
356 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
357 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
358 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
359 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
360 return false; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
361 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
362 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
363 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
364 |
526 | 365 static void GetRtStructuresInfo(RestApi::GetCall& call) |
366 { | |
367 RETRIEVE_CONTEXT(call); | |
368 | |
369 Json::Value study, series, content; | |
370 std::string frameOfReference; | |
371 if (GetRtStructuresInfo(study, series, content, frameOfReference, context, call.GetUriComponent("id", ""))) | |
372 { | |
373 Json::Value result; | |
374 | |
375 result["Study"] = study["ID"]; | |
376 | |
377 | |
378 // Lookup the series with the same frame of reference inside this study | |
379 result["RelatedSeries"] = Json::arrayValue; | |
380 | |
381 for (Json::Value::ArrayIndex i = 0; i < study["Series"].size(); i++) | |
382 { | |
383 Json::Value otherSeries; | |
384 if (context.GetIndex().LookupResource(otherSeries, study["Series"][i].asString(), ResourceType_Series) && | |
385 otherSeries["Instances"].size() > 0) | |
386 { | |
387 Json::Value info; | |
388 context.ReadJson(info, otherSeries["Instances"][0].asString()); | |
389 | |
390 if (info.isMember(FRAME_OF_REFERENCE_UID)) | |
391 { | |
392 result["RelatedSeries"].append(study["Series"][i].asString()); | |
393 } | |
394 } | |
395 } | |
396 | |
529 | 397 |
526 | 398 call.GetOutput().AnswerJson(result); |
399 } | |
400 } | |
401 | |
402 | |
529 | 403 static void GetRtStructuresListOfROIs(RestApi::GetCall& call) |
404 { | |
405 RETRIEVE_CONTEXT(call); | |
406 | |
407 Json::Value study, series, content; | |
408 std::string frameOfReference; | |
409 if (GetRtStructuresInfo(study, series, content, frameOfReference, context, call.GetUriComponent("id", ""))) | |
410 { | |
411 Json::Value result(Json::arrayValue); | |
412 | |
413 if (content.isMember(STRUCTURE_SET_ROI_SEQUENCE)) | |
414 { | |
415 for (Json::Value::ArrayIndex i = 0; i < content[STRUCTURE_SET_ROI_SEQUENCE]["Value"].size(); i++) | |
416 { | |
417 if (content[STRUCTURE_SET_ROI_SEQUENCE]["Value"][i].isMember(ROI_NUMBER)) | |
418 { | |
535 | 419 result.append(boost::lexical_cast<int>(content[STRUCTURE_SET_ROI_SEQUENCE]["Value"][i][ROI_NUMBER]["Value"].asString())); |
529 | 420 } |
421 } | |
422 } | |
423 | |
424 call.GetOutput().AnswerJson(result); | |
425 } | |
426 } | |
427 | |
428 | |
429 static void GetRtStructuresROI(RestApi::GetCall& call) | |
430 { | |
535 | 431 RETRIEVE_CONTEXT(call); |
432 | |
433 Json::Value roi, contour; | |
434 std::string instanceId; | |
435 | |
436 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
437 call.GetUriComponent("id", ""), | |
438 call.GetUriComponent("roi", ""))) | |
439 { | |
440 roi.removeMember("InternalIndex"); | |
441 call.GetOutput().AnswerJson(roi); | |
442 } | |
443 } | |
444 | |
445 | |
446 static void GetRtStructuresROIPoints(RestApi::GetCall& call) | |
447 { | |
448 RETRIEVE_CONTEXT(call); | |
449 | |
450 Json::Value roi, contour; | |
451 std::string instanceId; | |
452 | |
453 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
454 call.GetUriComponent("id", ""), | |
455 call.GetUriComponent("roi", ""))) | |
456 { | |
457 Json::Value result = Json::arrayValue; | |
458 | |
459 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) | |
460 { | |
461 if (contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "POINT") | |
462 { | |
463 Json::Value p; | |
464 if (ContourToPoints(p, contour[i][CONTOUR_DATA]["Value"].asString()) && | |
465 p.size() == 1) | |
466 { | |
467 result.append(p[0]); | |
468 } | |
469 } | |
470 } | |
471 | |
472 call.GetOutput().AnswerJson(result); | |
473 } | |
474 } | |
475 | |
476 | |
477 static void GetRtStructuresListOfClosedPlanars(RestApi::GetCall& call) | |
478 { | |
479 RETRIEVE_CONTEXT(call); | |
480 | |
481 Json::Value roi, contour; | |
482 std::string instanceId; | |
483 | |
484 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
485 call.GetUriComponent("id", ""), | |
486 call.GetUriComponent("roi", ""))) | |
487 { | |
488 Json::Value result = Json::arrayValue; | |
489 | |
490 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) | |
491 { | |
492 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && | |
493 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && | |
494 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && | |
495 contour[i].isMember(CONTOUR_DATA) && | |
496 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && | |
497 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && | |
498 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") | |
499 { | |
500 result.append(i); | |
501 } | |
502 } | |
503 | |
504 call.GetOutput().AnswerJson(result); | |
505 } | |
506 } | |
507 | |
508 | |
509 static void GetRtStructuresSingleClosedPlanar(RestApi::GetCall& call) | |
510 { | |
511 RETRIEVE_CONTEXT(call); | |
512 | |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
513 Json::Value roi, contour, result; |
535 | 514 std::string instanceId; |
515 | |
516 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
517 call.GetUriComponent("id", ""), | |
518 call.GetUriComponent("roi", ""))) | |
519 { | |
520 unsigned int index = boost::lexical_cast<unsigned int>(call.GetUriComponent("polygon", "")); | |
521 | |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
522 if (GetClosedPlanarPoints(result, context, instanceId, roi, index)) |
535 | 523 { |
524 call.GetOutput().AnswerJson(result); | |
525 } | |
526 } | |
527 } | |
528 | |
529 | |
530 static void GetRtStructuresClosedPlanarThickness(RestApi::GetCall& call) | |
531 { | |
532 RETRIEVE_CONTEXT(call); | |
533 | |
534 Json::Value roi, contour; | |
535 std::string instanceId; | |
536 | |
537 if (GetRtStructuresRoi(roi, contour, instanceId, context, | |
538 call.GetUriComponent("id", ""), | |
539 call.GetUriComponent("roi", ""))) | |
540 { | |
541 unsigned int index = boost::lexical_cast<unsigned int>(call.GetUriComponent("polygon", "")); | |
542 | |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
543 float thickness; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
544 if (GetRtStructuresClosedPlanarThickness(thickness, context, contour[index])) |
535 | 545 { |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
546 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(thickness), "text/plain"); |
535 | 547 } |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
548 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
549 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
550 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
551 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
552 static bool ComputeClosedPlanarArea(double& area, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
553 const Json::Value& vertices) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
554 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
555 if (vertices.size() <= 1) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
556 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
557 area = 0; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
558 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
559 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
560 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
561 // Check that all the points share the same z coordinates |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
562 for (Json::Value::ArrayIndex i = 1; i < vertices.size(); i++) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
563 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
564 static float THRESHOLD = 10.0f * std::numeric_limits<float>::epsilon(); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
565 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
566 assert(vertices[i].size() == 3); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
567 if (fabs(vertices[i][2].asFloat() - vertices[0][2].asFloat()) > THRESHOLD) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
568 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
569 // This point has not the same z coordinate |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
570 return false; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
571 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
572 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
573 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
574 // Calculate the area of a cartesian polygon |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
575 // TODO - What happens if self-crossing polygon? |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
576 typedef boost::geometry::model::d2::point_xy<float> point_type; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
577 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
578 boost::geometry::model::linestring<point_type> points; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
579 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
580 points.resize(vertices.size()); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
581 for (Json::Value::ArrayIndex i = 0; i < vertices.size(); i++) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
582 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
583 float x = vertices[i][0].asFloat(); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
584 float y = vertices[i][1].asFloat(); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
585 points[i] = boost::geometry::make<point_type>(x, y); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
586 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
587 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
588 boost::geometry::model::polygon<point_type> poly; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
589 boost::geometry::append(poly, points); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
590 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
591 area = abs(boost::geometry::area(poly)); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
592 return true; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
593 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
594 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
595 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
596 static void GetRtStructuresClosedPlanarArea(RestApi::GetCall& call) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
597 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
598 RETRIEVE_CONTEXT(call); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
599 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
600 Json::Value roi, contour, vertices; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
601 std::string instanceId; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
602 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
603 if (GetRtStructuresRoi(roi, contour, instanceId, context, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
604 call.GetUriComponent("id", ""), |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
605 call.GetUriComponent("roi", ""))) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
606 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
607 unsigned int index = boost::lexical_cast<unsigned int>(call.GetUriComponent("polygon", "")); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
608 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
609 double area; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
610 if (GetClosedPlanarPoints(vertices, context, instanceId, roi, index) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
611 ComputeClosedPlanarArea(area, vertices)) |
535 | 612 { |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
613 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(area), "text/plain"); |
535 | 614 } |
615 } | |
616 } | |
617 | |
618 | |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
619 static void GetRtStructuresInstanceOfClosedPlanar(RestApi::GetCall& call) |
535 | 620 { |
529 | 621 RETRIEVE_CONTEXT(call); |
622 | |
535 | 623 Json::Value roi, contour; |
624 std::string instanceId; | |
532
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
625 |
535 | 626 if (GetRtStructuresRoi(roi, contour, instanceId, context, |
627 call.GetUriComponent("id", ""), | |
628 call.GetUriComponent("roi", ""))) | |
629 { | |
630 unsigned int index = boost::lexical_cast<unsigned int>(call.GetUriComponent("polygon", "")); | |
532
b22312081388
extract roi geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
529
diff
changeset
|
631 |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
632 Json::Value result; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
633 if (LookupReferencedInstance(result, context, contour[index])) |
535 | 634 { |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
635 call.GetOutput().AnswerJson(result); |
529 | 636 } |
637 } | |
638 } | |
639 | |
640 | |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
641 static void GetRtStructuresListOfInstances(RestApi::GetCall& call) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
642 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
643 RETRIEVE_CONTEXT(call); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
644 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
645 Json::Value roi, contour; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
646 std::string instanceId; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
647 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
648 if (GetRtStructuresRoi(roi, contour, instanceId, context, |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
649 call.GetUriComponent("id", ""), |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
650 call.GetUriComponent("roi", ""))) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
651 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
652 Json::Value result = Json::arrayValue; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
653 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
654 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
655 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
656 if (contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
657 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
658 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID)) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
659 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
660 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
661 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
662 std::list<std::string> instance; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
663 context.GetIndex().LookupTagValue(instance, DICOM_TAG_SOP_INSTANCE_UID, uid); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
664 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
665 if (instance.size() == 1) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
666 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
667 result.append(instance.front()); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
668 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
669 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
670 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
671 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
672 call.GetOutput().AnswerJson(result); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
673 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
674 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
675 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
676 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
677 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
678 static void GetRtStructuresClosedPlanarsOfInstance(RestApi::GetCall& call) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
679 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
680 RETRIEVE_CONTEXT(call); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
681 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
682 Json::Value roi, contour, instance; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
683 std::string instanceId; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
684 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
685 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
686 GetRtStructuresRoi(roi, contour, instanceId, context, |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
687 call.GetUriComponent("id", ""), |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
688 call.GetUriComponent("roi", ""))) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
689 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
690 Json::Value result = Json::arrayValue; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
691 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
692 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
693 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
694 if (contour[i].isMember(CONTOUR_DATA) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
695 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
696 contour[i].isMember(NUMBER_OF_CONTOUR_POINTS) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
697 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
698 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
699 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
700 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR") |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
701 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
702 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
703 |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
704 Json::Value points; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
705 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString() && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
706 GetClosedPlanarPoints(points, context, instanceId, roi, i)) |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
707 { |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
708 result.append(points); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
709 } |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
710 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
711 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
712 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
713 call.GetOutput().AnswerJson(result); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
714 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
715 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
716 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
717 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
718 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
719 static void GetRtStructuresPointsOfInstance(RestApi::GetCall& call) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
720 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
721 RETRIEVE_CONTEXT(call); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
722 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
723 Json::Value roi, contour, instance; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
724 std::string instanceId; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
725 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
726 if (context.GetIndex().LookupResource(instance, call.GetUriComponent("instance", ""), ResourceType_Instance) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
727 GetRtStructuresRoi(roi, contour, instanceId, context, |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
728 call.GetUriComponent("id", ""), |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
729 call.GetUriComponent("roi", ""))) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
730 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
731 Json::Value result = Json::arrayValue; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
732 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
733 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
734 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
735 if (contour[i].isMember(CONTOUR_DATA) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
736 contour[i].isMember(CONTOUR_IMAGE_SEQUENCE) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
737 contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
738 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"].size() == 1 && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
739 contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0].isMember(REFERENCED_SOP_INSTANCE_UID) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
740 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "POINT") |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
741 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
742 std::string uid = contour[i][CONTOUR_IMAGE_SEQUENCE]["Value"][0][REFERENCED_SOP_INSTANCE_UID]["Value"].asString(); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
743 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
744 if (uid == instance["MainDicomTags"]["SOPInstanceUID"].asString()) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
745 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
746 Json::Value p; |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
747 if (ContourToPoints(p, contour[i][CONTOUR_DATA]["Value"].asString()) && |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
748 p.size() == 1) |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
749 { |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
750 result.append(p[0]); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
751 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
752 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
753 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
754 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
755 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
756 call.GetOutput().AnswerJson(result); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
757 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
758 } |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
759 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
760 |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
761 static void GetRtStructuresVolume(RestApi::GetCall& call) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
762 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
763 RETRIEVE_CONTEXT(call); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
764 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
765 Json::Value roi, contour, vertices; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
766 std::string instanceId; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
767 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
768 if (GetRtStructuresRoi(roi, contour, instanceId, context, |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
769 call.GetUriComponent("id", ""), |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
770 call.GetUriComponent("roi", ""))) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
771 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
772 double volume = 0; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
773 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
774 for (Json::Value::ArrayIndex i = 0; i < contour.size(); i++) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
775 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
776 double area; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
777 float thickness; |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
778 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
779 if (contour[i].isMember(CONTOUR_GEOMETRIC_TYPE) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
780 contour[i][CONTOUR_GEOMETRIC_TYPE]["Value"].asString() == "CLOSED_PLANAR" && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
781 GetClosedPlanarPoints(vertices, context, instanceId, roi, i) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
782 ComputeClosedPlanarArea(area, vertices) && |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
783 GetRtStructuresClosedPlanarThickness(thickness, context, contour[i])) |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
784 { |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
785 volume += area * static_cast<double>(thickness); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
786 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
787 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
788 |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
789 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(volume), "text/plain"); |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
790 } |
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
791 } |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
792 |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
793 |
526 | 794 RadiotherapyRestApi::RadiotherapyRestApi(ServerContext& context) : OrthancRestApi(context) |
795 { | |
796 Register("/series/{id}/rt-structures", GetRtStructuresInfo); | |
529 | 797 Register("/series/{id}/rt-structures/roi", GetRtStructuresListOfROIs); |
535 | 798 Register("/series/{id}/rt-structures/roi/{roi}/info", GetRtStructuresROI); |
799 Register("/series/{id}/rt-structures/roi/{roi}/points", GetRtStructuresROIPoints); | |
800 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar", GetRtStructuresListOfClosedPlanars); | |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
801 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/vertices", GetRtStructuresSingleClosedPlanar); |
535 | 802 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/thickness", GetRtStructuresClosedPlanarThickness); |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
803 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/instance", GetRtStructuresInstanceOfClosedPlanar); |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
804 Register("/series/{id}/rt-structures/roi/{roi}/closed-planar/{polygon}/area", GetRtStructuresClosedPlanarArea); |
538
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
805 Register("/series/{id}/rt-structures/roi/{roi}/instances", GetRtStructuresListOfInstances); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
806 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/closed-planar", GetRtStructuresClosedPlanarsOfInstance); |
505d6deb9947
access contours by instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
535
diff
changeset
|
807 Register("/series/{id}/rt-structures/roi/{roi}/instances/{instance}/points", GetRtStructuresPointsOfInstance); |
541
c8347eef225b
volume of structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
538
diff
changeset
|
808 Register("/series/{id}/rt-structures/roi/{roi}/volume", GetRtStructuresVolume); |
526 | 809 } |
529 | 810 |
526 | 811 } |
812 | |
813 | |
814 // curl http://localhost:8042/series/0b9e2bb2-605a59aa-f27c0260-9cc4faf6-9d8bf457/rt-structures | |
815 // curl http://localhost:8042/series/ef041e6b-c855e775-f7e0f7fe-dc3c17dc-533cb8c5/rt-structures |