Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp @ 1979:b31e494e34c5
cppcheck
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 29 Oct 2022 17:10:21 +0200 |
parents | 95449b0e064a |
children | 0aac8f552d89 |
rev | line source |
---|---|
1804 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1871
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
1804 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public License | |
10 * as published by the Free Software Foundation, either version 3 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with this program. If not, see | |
20 * <http://www.gnu.org/licenses/>. | |
21 **/ | |
22 | |
23 | |
24 #include "AnnotationsSceneLayer.h" | |
25 | |
26 #include "MacroSceneLayer.h" | |
27 #include "PolylineSceneLayer.h" | |
28 #include "TextSceneLayer.h" | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
29 #include "TextureBaseSceneLayer.h" // TODO REMOVE |
1804 | 30 |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
31 #include <Images/ImageTraits.h> |
1804 | 32 #include <OrthancException.h> |
33 | |
34 #include <boost/math/constants/constants.hpp> | |
35 #include <list> | |
36 | |
37 static const double HANDLE_SIZE = 10.0; | |
38 static const double PI = boost::math::constants::pi<double>(); | |
39 | |
40 static const char* const KEY_ANNOTATIONS = "annotations"; | |
41 static const char* const KEY_TYPE = "type"; | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
42 static const char* const KEY_X = "x"; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
43 static const char* const KEY_Y = "y"; |
1804 | 44 static const char* const KEY_X1 = "x1"; |
45 static const char* const KEY_Y1 = "y1"; | |
46 static const char* const KEY_X2 = "x2"; | |
47 static const char* const KEY_Y2 = "y2"; | |
48 static const char* const KEY_X3 = "x3"; | |
49 static const char* const KEY_Y3 = "y3"; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
50 static const char* const KEY_UNITS = "units"; |
1804 | 51 |
52 static const char* const VALUE_ANGLE = "angle"; | |
53 static const char* const VALUE_CIRCLE = "circle"; | |
54 static const char* const VALUE_SEGMENT = "segment"; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
55 static const char* const VALUE_MILLIMETERS = "millimeters"; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
56 static const char* const VALUE_PIXELS = "pixels"; |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
57 static const char* const VALUE_PIXEL_PROBE = "pixel-probe"; |
1804 | 58 |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
59 #if 0 |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
60 static OrthancStone::Color COLOR_PRIMITIVES(192, 192, 192); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
61 static OrthancStone::Color COLOR_HOVER(0, 255, 0); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
62 static OrthancStone::Color COLOR_TEXT(255, 0, 0); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
63 #else |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
64 static OrthancStone::Color COLOR_PRIMITIVES(0x40, 0x82, 0xad); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
65 static OrthancStone::Color COLOR_HOVER(0x40, 0xad, 0x79); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
66 static OrthancStone::Color COLOR_TEXT(0x4e, 0xde, 0x99); |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
67 #endif |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
68 |
1804 | 69 |
70 namespace OrthancStone | |
71 { | |
72 class AnnotationsSceneLayer::GeometricPrimitive : public boost::noncopyable | |
73 { | |
74 private: | |
75 bool modified_; | |
76 Annotation& parentAnnotation_; | |
77 Color color_; | |
78 Color hoverColor_; | |
79 bool isHover_; | |
80 int depth_; | |
81 | |
82 public: | |
83 GeometricPrimitive(Annotation& parentAnnotation, | |
84 int depth) : | |
85 modified_(true), | |
86 parentAnnotation_(parentAnnotation), | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
87 color_(COLOR_PRIMITIVES), |
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
88 hoverColor_(COLOR_HOVER), |
1804 | 89 isHover_(false), |
90 depth_(depth) | |
91 { | |
92 } | |
93 | |
94 virtual ~GeometricPrimitive() | |
95 { | |
96 } | |
97 | |
98 Annotation& GetParentAnnotation() const | |
99 { | |
100 return parentAnnotation_; | |
101 } | |
102 | |
103 int GetDepth() const | |
104 { | |
105 return depth_; | |
106 } | |
107 | |
108 void SetHover(bool hover) | |
109 { | |
110 if (hover != isHover_) | |
111 { | |
112 isHover_ = hover; | |
113 modified_ = true; | |
114 } | |
115 } | |
116 | |
117 bool IsHover() const | |
118 { | |
119 return isHover_; | |
120 } | |
121 | |
122 void SetModified(bool modified) | |
123 { | |
124 modified_ = modified; | |
125 } | |
126 | |
127 bool IsModified() const | |
128 { | |
129 return modified_; | |
130 } | |
131 | |
132 void SetColor(const Color& color) | |
133 { | |
134 SetModified(true); | |
135 color_ = color; | |
136 } | |
137 | |
138 void SetHoverColor(const Color& color) | |
139 { | |
140 SetModified(true); | |
141 hoverColor_ = color; | |
142 } | |
143 | |
144 const Color& GetColor() const | |
145 { | |
146 return color_; | |
147 } | |
148 | |
149 const Color& GetHoverColor() const | |
150 { | |
151 return hoverColor_; | |
152 } | |
153 | |
154 virtual bool IsHit(const ScenePoint2D& p, | |
155 const Scene2D& scene) const = 0; | |
156 | |
157 // Always called, even if not modified | |
158 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
159 const Scene2D& scene) = 0; | |
160 | |
161 // Only called if modified | |
162 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
163 const Scene2D& scene) = 0; | |
164 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
165 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
166 const Scene2D& scene) = 0; |
1804 | 167 |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
168 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
169 const Scene2D& scene) = 0; |
1804 | 170 }; |
171 | |
172 | |
173 class AnnotationsSceneLayer::Annotation : public boost::noncopyable | |
174 { | |
175 private: | |
176 typedef std::list<GeometricPrimitive*> GeometricPrimitives; | |
177 | |
178 AnnotationsSceneLayer& that_; | |
179 GeometricPrimitives primitives_; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
180 Units units_; |
1804 | 181 |
182 public: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
183 explicit Annotation(AnnotationsSceneLayer& that, |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
184 Units units) : |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
185 that_(that), |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
186 units_(units) |
1804 | 187 { |
188 that.AddAnnotation(this); | |
189 } | |
190 | |
191 virtual ~Annotation() | |
192 { | |
193 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
194 { | |
195 that_.DeletePrimitive(*it); | |
196 } | |
197 } | |
198 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
199 Units GetUnits() const |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
200 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
201 return units_; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
202 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
203 |
1804 | 204 GeometricPrimitive* AddPrimitive(GeometricPrimitive* primitive) |
205 { | |
206 if (primitive == NULL) | |
207 { | |
208 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
209 } | |
210 else | |
211 { | |
212 assert(that_.primitives_.find(primitive) == that_.primitives_.end()); | |
213 primitives_.push_back(primitive); // For automated deallocation | |
214 that_.primitives_.insert(primitive); | |
215 return primitive; | |
216 } | |
217 } | |
218 | |
219 template <typename T> | |
220 T& AddTypedPrimitive(T* primitive) | |
221 { | |
222 AddPrimitive(primitive); | |
223 return *primitive; | |
224 } | |
225 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
226 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
227 const Scene2D& scene) = 0; |
1804 | 228 |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
229 virtual void UpdateProbe(const Scene2D& scene) = 0; |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
230 |
1804 | 231 virtual void Serialize(Json::Value& target) = 0; |
232 }; | |
233 | |
234 | |
235 class AnnotationsSceneLayer::Handle : public GeometricPrimitive | |
236 { | |
237 private: | |
238 ScenePoint2D center_; | |
239 ScenePoint2D delta_; | |
240 | |
241 public: | |
242 explicit Handle(Annotation& parentAnnotation, | |
243 const ScenePoint2D& center) : | |
244 GeometricPrimitive(parentAnnotation, 0), // Highest priority | |
245 center_(center), | |
246 delta_(0, 0) | |
247 { | |
248 } | |
249 | |
250 void SetSize(unsigned int size) | |
251 { | |
252 SetModified(true); | |
253 } | |
254 | |
255 void SetCenter(const ScenePoint2D& center) | |
256 { | |
257 SetModified(true); | |
258 center_ = center; | |
259 delta_ = ScenePoint2D(0, 0); | |
260 } | |
261 | |
262 ScenePoint2D GetCenter() const | |
263 { | |
264 return center_ + delta_; | |
265 } | |
266 | |
267 virtual bool IsHit(const ScenePoint2D& p, | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
268 const Scene2D& scene) const ORTHANC_OVERRIDE |
1804 | 269 { |
270 const double zoom = scene.GetSceneToCanvasTransform().ComputeZoom(); | |
271 | |
272 double dx = (center_.GetX() + delta_.GetX() - p.GetX()) * zoom; | |
273 double dy = (center_.GetY() + delta_.GetY() - p.GetY()) * zoom; | |
274 | |
275 return (std::abs(dx) <= HANDLE_SIZE / 2.0 && | |
276 std::abs(dy) <= HANDLE_SIZE / 2.0); | |
277 } | |
278 | |
279 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
280 const Scene2D& scene) ORTHANC_OVERRIDE | |
281 { | |
282 const double zoom = scene.GetSceneToCanvasTransform().ComputeZoom(); | |
283 | |
284 // TODO: take DPI into account | |
285 double x1 = center_.GetX() + delta_.GetX() - (HANDLE_SIZE / 2.0) / zoom; | |
286 double y1 = center_.GetY() + delta_.GetY() - (HANDLE_SIZE / 2.0) / zoom; | |
287 double x2 = center_.GetX() + delta_.GetX() + (HANDLE_SIZE / 2.0) / zoom; | |
288 double y2 = center_.GetY() + delta_.GetY() + (HANDLE_SIZE / 2.0) / zoom; | |
289 | |
290 PolylineSceneLayer::Chain chain; | |
291 chain.reserve(4); | |
292 chain.push_back(ScenePoint2D(x1, y1)); | |
293 chain.push_back(ScenePoint2D(x2, y1)); | |
294 chain.push_back(ScenePoint2D(x2, y2)); | |
295 chain.push_back(ScenePoint2D(x1, y2)); | |
296 | |
297 if (IsHover()) | |
298 { | |
299 polyline.AddChain(chain, true /* closed */, GetHoverColor()); | |
300 } | |
301 else | |
302 { | |
303 polyline.AddChain(chain, true /* closed */, GetColor()); | |
304 } | |
305 } | |
306 | |
307 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
308 const Scene2D& scene) ORTHANC_OVERRIDE | |
309 { | |
310 } | |
311 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
312 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
313 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 314 { |
315 SetModified(true); | |
316 delta_ = delta; | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
317 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 318 } |
319 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
320 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
321 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 322 { |
323 SetModified(true); | |
324 center_ = center_ + delta; | |
325 delta_ = ScenePoint2D(0, 0); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
326 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 327 } |
328 }; | |
329 | |
330 | |
331 class AnnotationsSceneLayer::Segment : public GeometricPrimitive | |
332 { | |
333 private: | |
334 ScenePoint2D p1_; | |
335 ScenePoint2D p2_; | |
336 ScenePoint2D delta_; | |
337 | |
338 public: | |
339 Segment(Annotation& parentAnnotation, | |
340 const ScenePoint2D& p1, | |
341 const ScenePoint2D& p2) : | |
342 GeometricPrimitive(parentAnnotation, 1), // Can only be selected if no handle matches | |
343 p1_(p1), | |
344 p2_(p2), | |
345 delta_(0, 0) | |
346 { | |
347 } | |
348 | |
349 void SetPosition(const ScenePoint2D& p1, | |
350 const ScenePoint2D& p2) | |
351 { | |
352 SetModified(true); | |
353 p1_ = p1; | |
354 p2_ = p2; | |
355 delta_ = ScenePoint2D(0, 0); | |
356 } | |
357 | |
358 ScenePoint2D GetPosition1() const | |
359 { | |
360 return p1_ + delta_; | |
361 } | |
362 | |
363 ScenePoint2D GetPosition2() const | |
364 { | |
365 return p2_ + delta_; | |
366 } | |
367 | |
368 virtual bool IsHit(const ScenePoint2D& p, | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
369 const Scene2D& scene) const ORTHANC_OVERRIDE |
1804 | 370 { |
371 const double zoom = scene.GetSceneToCanvasTransform().ComputeZoom(); | |
372 return (ScenePoint2D::SquaredDistancePtSegment(p1_ + delta_, p2_ + delta_, p) * zoom * zoom <= | |
373 (HANDLE_SIZE / 2.0) * (HANDLE_SIZE / 2.0)); | |
374 } | |
375 | |
376 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
377 const Scene2D& scene) ORTHANC_OVERRIDE | |
378 { | |
379 PolylineSceneLayer::Chain chain; | |
380 chain.reserve(2); | |
381 chain.push_back(p1_ + delta_); | |
382 chain.push_back(p2_ + delta_); | |
383 | |
384 if (IsHover()) | |
385 { | |
386 polyline.AddChain(chain, false /* closed */, GetHoverColor()); | |
387 } | |
388 else | |
389 { | |
390 polyline.AddChain(chain, false /* closed */, GetColor()); | |
391 } | |
392 } | |
393 | |
394 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
395 const Scene2D& scene) ORTHANC_OVERRIDE | |
396 { | |
397 } | |
398 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
399 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
400 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 401 { |
402 SetModified(true); | |
403 delta_ = delta; | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
404 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 405 } |
406 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
407 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
408 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 409 { |
410 SetModified(true); | |
411 p1_ = p1_ + delta; | |
412 p2_ = p2_ + delta; | |
413 delta_ = ScenePoint2D(0, 0); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
414 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 415 } |
416 }; | |
417 | |
418 | |
419 class AnnotationsSceneLayer::Circle : public GeometricPrimitive | |
420 { | |
421 private: | |
422 ScenePoint2D p1_; | |
423 ScenePoint2D p2_; | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
424 ScenePoint2D delta_; |
1804 | 425 |
426 public: | |
427 Circle(Annotation& parentAnnotation, | |
428 const ScenePoint2D& p1, | |
429 const ScenePoint2D& p2) : | |
430 GeometricPrimitive(parentAnnotation, 2), | |
431 p1_(p1), | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
432 p2_(p2), |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
433 delta_(0, 0) |
1804 | 434 { |
435 } | |
436 | |
437 void SetPosition(const ScenePoint2D& p1, | |
438 const ScenePoint2D& p2) | |
439 { | |
440 SetModified(true); | |
441 p1_ = p1; | |
442 p2_ = p2; | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
443 delta_ = ScenePoint2D(0, 0); |
1804 | 444 } |
445 | |
446 ScenePoint2D GetPosition1() const | |
447 { | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
448 return p1_ + delta_; |
1804 | 449 } |
450 | |
451 ScenePoint2D GetPosition2() const | |
452 { | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
453 return p2_ + delta_; |
1804 | 454 } |
455 | |
456 virtual bool IsHit(const ScenePoint2D& p, | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
457 const Scene2D& scene) const ORTHANC_OVERRIDE |
1804 | 458 { |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
459 const double zoom = scene.GetSceneToCanvasTransform().ComputeZoom(); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
460 |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
461 ScenePoint2D middle((p1_.GetX() + p2_.GetX()) / 2.0, |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
462 (p1_.GetY() + p2_.GetY()) / 2.0); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
463 |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
464 const double radius = ScenePoint2D::DistancePtPt(middle, p1_); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
465 const double distance = ScenePoint2D::DistancePtPt(middle, p - delta_); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
466 |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
467 return std::abs(radius - distance) * zoom <= HANDLE_SIZE / 2.0; |
1804 | 468 } |
469 | |
470 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
471 const Scene2D& scene) ORTHANC_OVERRIDE | |
472 { | |
473 static unsigned int NUM_SEGMENTS = 128; | |
474 | |
475 ScenePoint2D middle((p1_.GetX() + p2_.GetX()) / 2.0, | |
476 (p1_.GetY() + p2_.GetY()) / 2.0); | |
477 | |
478 const double radius = ScenePoint2D::DistancePtPt(middle, p1_); | |
479 | |
480 double increment = 2.0 * PI / static_cast<double>(NUM_SEGMENTS - 1); | |
481 | |
482 PolylineSceneLayer::Chain chain; | |
483 chain.reserve(NUM_SEGMENTS); | |
484 | |
485 double theta = 0; | |
486 for (unsigned int i = 0; i < NUM_SEGMENTS; i++) | |
487 { | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
488 chain.push_back(ScenePoint2D(delta_.GetX() + middle.GetX() + radius * cos(theta), |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
489 delta_.GetY() + middle.GetY() + radius * sin(theta))); |
1804 | 490 theta += increment; |
491 } | |
492 | |
493 if (IsHover()) | |
494 { | |
495 polyline.AddChain(chain, false /* closed */, GetHoverColor()); | |
496 } | |
497 else | |
498 { | |
499 polyline.AddChain(chain, false /* closed */, GetColor()); | |
500 } | |
501 } | |
502 | |
503 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
504 const Scene2D& scene) ORTHANC_OVERRIDE | |
505 { | |
506 } | |
507 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
508 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
509 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 510 { |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
511 SetModified(true); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
512 delta_ = delta; |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
513 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 514 } |
515 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
516 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
517 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 518 { |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
519 SetModified(true); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
520 p1_ = p1_ + delta; |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
521 p2_ = p2_ + delta; |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
522 delta_ = ScenePoint2D(0, 0); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
523 GetParentAnnotation().SignalMove(*this, scene); |
1804 | 524 } |
525 }; | |
526 | |
527 | |
528 class AnnotationsSceneLayer::Arc : public GeometricPrimitive | |
529 { | |
530 private: | |
531 ScenePoint2D start_; | |
532 ScenePoint2D middle_; | |
533 ScenePoint2D end_; | |
534 double radius_; // in pixels | |
535 | |
536 void ComputeAngles(double& fullAngle, | |
537 double& startAngle, | |
538 double& endAngle) const | |
539 { | |
540 const double x1 = start_.GetX(); | |
541 const double y1 = start_.GetY(); | |
542 const double xc = middle_.GetX(); | |
543 const double yc = middle_.GetY(); | |
544 const double x2 = end_.GetX(); | |
545 const double y2 = end_.GetY(); | |
546 | |
547 startAngle = atan2(y1 - yc, x1 - xc); | |
548 endAngle = atan2(y2 - yc, x2 - xc); | |
549 | |
550 fullAngle = endAngle - startAngle; | |
551 | |
552 while (fullAngle < -PI) | |
553 { | |
554 fullAngle += 2.0 * PI; | |
555 } | |
556 | |
557 while (fullAngle >= PI) | |
558 { | |
559 fullAngle -= 2.0 * PI; | |
560 } | |
561 } | |
562 | |
563 public: | |
564 Arc(Annotation& parentAnnotation, | |
565 const ScenePoint2D& start, | |
566 const ScenePoint2D& middle, | |
567 const ScenePoint2D& end) : | |
568 GeometricPrimitive(parentAnnotation, 2), | |
569 start_(start), | |
570 middle_(middle), | |
571 end_(end), | |
572 radius_(20) | |
573 { | |
574 } | |
575 | |
576 double GetAngle() const | |
577 { | |
578 double fullAngle, startAngle, endAngle; | |
579 ComputeAngles(fullAngle, startAngle, endAngle); | |
580 return fullAngle; | |
581 } | |
582 | |
583 void SetStart(const ScenePoint2D& p) | |
584 { | |
585 SetModified(true); | |
586 start_ = p; | |
587 } | |
588 | |
589 void SetMiddle(const ScenePoint2D& p) | |
590 { | |
591 SetModified(true); | |
592 middle_ = p; | |
593 } | |
594 | |
595 void SetEnd(const ScenePoint2D& p) | |
596 { | |
597 SetModified(true); | |
598 end_ = p; | |
599 } | |
600 | |
601 virtual bool IsHit(const ScenePoint2D& p, | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
602 const Scene2D& scene) const ORTHANC_OVERRIDE |
1804 | 603 { |
604 return false; | |
605 } | |
606 | |
607 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
608 const Scene2D& scene) ORTHANC_OVERRIDE | |
609 { | |
610 static unsigned int NUM_SEGMENTS = 64; | |
611 | |
612 const double radius = radius_ / scene.GetSceneToCanvasTransform().ComputeZoom(); | |
613 | |
614 double fullAngle, startAngle, endAngle; | |
615 ComputeAngles(fullAngle, startAngle, endAngle); | |
616 | |
617 double increment = fullAngle / static_cast<double>(NUM_SEGMENTS - 1); | |
618 | |
619 PolylineSceneLayer::Chain chain; | |
620 chain.reserve(NUM_SEGMENTS); | |
621 | |
622 double theta = startAngle; | |
623 for (unsigned int i = 0; i < NUM_SEGMENTS; i++) | |
624 { | |
625 chain.push_back(ScenePoint2D(middle_.GetX() + radius * cos(theta), | |
626 middle_.GetY() + radius * sin(theta))); | |
627 theta += increment; | |
628 } | |
629 | |
630 if (IsHover()) | |
631 { | |
632 polyline.AddChain(chain, false /* closed */, GetHoverColor()); | |
633 } | |
634 else | |
635 { | |
636 polyline.AddChain(chain, false /* closed */, GetColor()); | |
637 } | |
638 } | |
639 | |
640 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
641 const Scene2D& scene) ORTHANC_OVERRIDE | |
642 { | |
643 } | |
644 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
645 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
646 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 647 { |
648 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // No hit is possible | |
649 } | |
650 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
651 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
652 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 653 { |
654 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // No hit is possible | |
655 } | |
656 }; | |
657 | |
658 | |
659 class AnnotationsSceneLayer::Text : public GeometricPrimitive | |
660 { | |
661 private: | |
662 AnnotationsSceneLayer& that_; | |
663 bool first_; | |
664 size_t subLayer_; | |
665 std::unique_ptr<TextSceneLayer> content_; | |
666 | |
667 public: | |
668 Text(AnnotationsSceneLayer& that, | |
669 Annotation& parentAnnotation) : | |
670 GeometricPrimitive(parentAnnotation, 2), | |
671 that_(that), | |
1817 | 672 first_(true), |
673 subLayer_(0) // dummy initialization | |
1804 | 674 { |
675 } | |
676 | |
677 virtual ~Text() | |
678 { | |
679 if (!first_) | |
680 { | |
681 that_.TagSubLayerToRemove(subLayer_); | |
682 } | |
683 } | |
684 | |
685 void SetContent(const TextSceneLayer& content) | |
686 { | |
687 SetModified(true); | |
688 content_.reset(dynamic_cast<TextSceneLayer*>(content.Clone())); | |
1977 | 689 } |
690 | |
691 void SetText(const std::string& text) | |
692 { | |
693 if (content_.get() == NULL) | |
694 { | |
695 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
696 } | |
697 else | |
698 { | |
699 SetModified(true); | |
700 content_->SetText(text); | |
701 } | |
702 } | |
703 | |
704 void SetPosition(double x, | |
705 double y) | |
706 { | |
707 if (content_.get() == NULL) | |
708 { | |
709 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
710 } | |
711 else | |
712 { | |
713 SetModified(true); | |
714 content_->SetPosition(x, y); | |
715 } | |
716 } | |
1804 | 717 |
718 virtual bool IsHit(const ScenePoint2D& p, | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
719 const Scene2D& scene) const ORTHANC_OVERRIDE |
1804 | 720 { |
721 return false; | |
722 } | |
723 | |
724 virtual void RenderPolylineLayer(PolylineSceneLayer& polyline, | |
725 const Scene2D& scene) ORTHANC_OVERRIDE | |
726 { | |
727 } | |
728 | |
729 virtual void RenderOtherLayers(MacroSceneLayer& macro, | |
730 const Scene2D& scene) ORTHANC_OVERRIDE | |
731 { | |
732 if (content_.get() != NULL) | |
733 { | |
734 std::unique_ptr<TextSceneLayer> layer(reinterpret_cast<TextSceneLayer*>(content_->Clone())); | |
735 | |
736 layer->SetColor(IsHover() ? GetHoverColor() : GetColor()); | |
737 | |
738 if (first_) | |
739 { | |
740 subLayer_ = macro.AddLayer(layer.release()); | |
741 first_ = false; | |
742 } | |
743 else | |
744 { | |
745 macro.UpdateLayer(subLayer_, layer.release()); | |
746 } | |
747 } | |
748 } | |
749 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
750 virtual void MovePreview(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
751 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 752 { |
753 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // No hit is possible | |
754 } | |
755 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
756 virtual void MoveDone(const ScenePoint2D& delta, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
757 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 758 { |
759 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // No hit is possible | |
760 } | |
761 }; | |
762 | |
763 | |
764 class AnnotationsSceneLayer::EditPrimitiveTracker : public IFlexiblePointerTracker | |
765 { | |
766 private: | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
767 AnnotationsSceneLayer& that_; |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
768 GeometricPrimitive& primitive_; |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
769 ScenePoint2D sceneClick_; |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
770 AffineTransform2D canvasToScene_; |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
771 bool alive_; |
1804 | 772 |
773 public: | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
774 EditPrimitiveTracker(AnnotationsSceneLayer& that, |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
775 GeometricPrimitive& primitive, |
1804 | 776 const ScenePoint2D& sceneClick, |
777 const AffineTransform2D& canvasToScene) : | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
778 that_(that), |
1804 | 779 primitive_(primitive), |
780 sceneClick_(sceneClick), | |
781 canvasToScene_(canvasToScene), | |
782 alive_(true) | |
783 { | |
784 } | |
785 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
786 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
787 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 788 { |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
789 primitive_.MovePreview(event.GetMainPosition().Apply(canvasToScene_) - sceneClick_, scene); |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
790 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 791 } |
792 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
793 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
794 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 795 { |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
796 primitive_.MoveDone(event.GetMainPosition().Apply(canvasToScene_) - sceneClick_, scene); |
1804 | 797 alive_ = false; |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
798 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 799 } |
800 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
801 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
802 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 803 { |
804 } | |
805 | |
806 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
807 { | |
808 return alive_; | |
809 } | |
810 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
811 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 812 { |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
813 //primitive_.MoveDone(ScenePoint2D(0, 0), scene); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
814 primitive_.MoveDone(sceneClick_, scene); // TODO Check this |
1804 | 815 } |
816 }; | |
817 | |
818 | |
819 class AnnotationsSceneLayer::SegmentAnnotation : public Annotation | |
820 { | |
821 private: | |
822 bool showLabel_; | |
823 Handle& handle1_; | |
824 Handle& handle2_; | |
825 Segment& segment_; | |
826 Text& label_; | |
827 | |
828 void UpdateLabel() | |
829 { | |
830 if (showLabel_) | |
831 { | |
832 TextSceneLayer content; | |
833 | |
834 double x1 = handle1_.GetCenter().GetX(); | |
835 double y1 = handle1_.GetCenter().GetY(); | |
836 double x2 = handle2_.GetCenter().GetX(); | |
837 double y2 = handle2_.GetCenter().GetY(); | |
838 | |
839 // Put the label to the right of the right-most handle | |
840 if (x1 < x2) | |
841 { | |
842 content.SetPosition(x2, y2); | |
843 } | |
844 else | |
845 { | |
846 content.SetPosition(x1, y1); | |
847 } | |
848 | |
849 content.SetAnchor(BitmapAnchor_CenterLeft); | |
850 content.SetBorder(10); | |
851 | |
852 double dx = x1 - x2; | |
853 double dy = y1 - y2; | |
854 char buf[32]; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
855 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
856 switch (GetUnits()) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
857 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
858 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
859 sprintf(buf, "%0.2f cm", sqrt(dx * dx + dy * dy) / 10.0); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
860 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
861 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
862 case Units_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
863 sprintf(buf, "%0.1f px", sqrt(dx * dx + dy * dy)); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
864 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
865 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
866 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
867 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
868 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
869 |
1804 | 870 content.SetText(buf); |
871 | |
872 label_.SetContent(content); | |
873 } | |
874 } | |
875 | |
876 public: | |
877 SegmentAnnotation(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
878 Units units, |
1804 | 879 bool showLabel, |
880 const ScenePoint2D& p1, | |
881 const ScenePoint2D& p2) : | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
882 Annotation(that, units), |
1804 | 883 showLabel_(showLabel), |
884 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), | |
885 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), | |
886 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), | |
887 label_(AddTypedPrimitive<Text>(new Text(that, *this))) | |
888 { | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
889 label_.SetColor(COLOR_TEXT); |
1804 | 890 UpdateLabel(); |
891 } | |
892 | |
893 Handle& GetHandle1() const | |
894 { | |
895 return handle1_; | |
896 } | |
897 | |
898 Handle& GetHandle2() const | |
899 { | |
900 return handle2_; | |
901 } | |
902 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
903 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
904 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 905 { |
906 if (&primitive == &handle1_ || | |
907 &primitive == &handle2_) | |
908 { | |
909 segment_.SetPosition(handle1_.GetCenter(), handle2_.GetCenter()); | |
910 } | |
911 else if (&primitive == &segment_) | |
912 { | |
913 handle1_.SetCenter(segment_.GetPosition1()); | |
914 handle2_.SetCenter(segment_.GetPosition2()); | |
915 } | |
916 | |
917 UpdateLabel(); | |
918 } | |
919 | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
920 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
921 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
922 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
923 |
1804 | 924 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
925 { | |
926 target = Json::objectValue; | |
927 target[KEY_TYPE] = VALUE_SEGMENT; | |
928 target[KEY_X1] = handle1_.GetCenter().GetX(); | |
929 target[KEY_Y1] = handle1_.GetCenter().GetY(); | |
930 target[KEY_X2] = handle2_.GetCenter().GetX(); | |
931 target[KEY_Y2] = handle2_.GetCenter().GetY(); | |
932 } | |
933 | |
934 static void Unserialize(AnnotationsSceneLayer& target, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
935 Units units, |
1804 | 936 const Json::Value& source) |
937 { | |
938 if (source.isMember(KEY_X1) && | |
939 source.isMember(KEY_Y1) && | |
940 source.isMember(KEY_X2) && | |
941 source.isMember(KEY_Y2) && | |
942 source[KEY_X1].isNumeric() && | |
943 source[KEY_Y1].isNumeric() && | |
944 source[KEY_X2].isNumeric() && | |
945 source[KEY_Y2].isNumeric()) | |
946 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
947 new SegmentAnnotation(target, units, true, |
1804 | 948 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
949 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble())); | |
950 } | |
951 else | |
952 { | |
953 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize an segment annotation"); | |
954 } | |
955 } | |
956 }; | |
957 | |
1977 | 958 |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
959 // Use this class to avoid unnecessary probing if neither the scene, |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
960 // nor the probe, has changed |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
961 class AnnotationsSceneLayer::ProbingAnnotation : public Annotation |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
962 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
963 private: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
964 int probedLayer_; |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
965 bool probeChanged_; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
966 uint64_t lastLayerRevision_; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
967 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
968 protected: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
969 virtual void UpdateProbeForLayer(const ISceneLayer& layer) = 0; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
970 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
971 void TagProbeAsChanged() |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
972 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
973 probeChanged_ = true; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
974 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
975 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
976 public: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
977 ProbingAnnotation(AnnotationsSceneLayer& that, |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
978 Units units, |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
979 int probedLayer) : |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
980 Annotation(that, units), |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
981 probedLayer_(probedLayer), |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
982 probeChanged_(true), |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
983 lastLayerRevision_(0) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
984 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
985 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
986 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
987 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
988 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
989 if (scene.HasLayer(probedLayer_)) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
990 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
991 const ISceneLayer& layer = scene.GetLayer(probedLayer_); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
992 if (probeChanged_ || |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
993 layer.GetRevision() != lastLayerRevision_) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
994 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
995 UpdateProbeForLayer(layer); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
996 probeChanged_ = false; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
997 lastLayerRevision_ = layer.GetRevision(); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
998 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
999 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1000 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1001 }; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1002 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1003 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1004 class AnnotationsSceneLayer::PixelProbeAnnotation : public ProbingAnnotation |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1005 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1006 private: |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1007 Handle& handle_; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1008 Text& label_; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1009 |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1010 protected: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1011 virtual void UpdateProbeForLayer(const ISceneLayer& layer) ORTHANC_OVERRIDE |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1012 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1013 if (layer.GetType() == ISceneLayer::Type_FloatTexture || |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1014 layer.GetType() == ISceneLayer::Type_ColorTexture) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1015 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1016 const TextureBaseSceneLayer& texture = dynamic_cast<const TextureBaseSceneLayer&>(layer); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1017 const AffineTransform2D sceneToTexture = AffineTransform2D::Invert(texture.GetTransform()); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1018 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1019 double sceneX = handle_.GetCenter().GetX(); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1020 double sceneY = handle_.GetCenter().GetY(); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1021 sceneToTexture.Apply(sceneX, sceneY); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1022 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1023 int x = static_cast<int>(std::floor(sceneX)); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1024 int y = static_cast<int>(std::floor(sceneY)); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1025 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1026 const Orthanc::ImageAccessor& image = texture.GetTexture(); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1027 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1028 if (x >= 0 && |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1029 y >= 0 && |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1030 x < static_cast<int>(image.GetWidth()) && |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1031 y < static_cast<int>(image.GetHeight())) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1032 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1033 char buf[64]; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1034 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1035 switch (image.GetFormat()) |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1036 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1037 case Orthanc::PixelFormat_Float32: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1038 sprintf(buf, "%.01f\n", Orthanc::ImageTraits<Orthanc::PixelFormat_Float32>::GetFloatPixel( |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1039 image, static_cast<unsigned int>(x), static_cast<unsigned int>(y))); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1040 break; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1041 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1042 case Orthanc::PixelFormat_RGB24: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1043 { |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1044 Orthanc::PixelTraits<Orthanc::PixelFormat_RGB24>::PixelType pixel; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1045 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel( |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1046 pixel, image, static_cast<unsigned int>(x), static_cast<unsigned int>(y)); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1047 sprintf(buf, "(%d,%d,%d)\n", pixel.red_, pixel.green_, pixel.blue_); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1048 break; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1049 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1050 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1051 default: |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1052 break; |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1053 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1054 |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1055 label_.SetText(buf); |
1979 | 1056 } |
1057 else | |
1058 { | |
1059 label_.SetText("?"); | |
1060 } | |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1061 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1062 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1063 |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1064 public: |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1065 PixelProbeAnnotation(AnnotationsSceneLayer& that, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1066 Units units, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1067 const ScenePoint2D& p, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1068 int probedLayer) : |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1069 ProbingAnnotation(that, units, probedLayer), |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1070 handle_(AddTypedPrimitive<Handle>(new Handle(*this, p))), |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1071 label_(AddTypedPrimitive<Text>(new Text(that, *this))) |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1072 { |
1977 | 1073 TextSceneLayer content; |
1074 content.SetPosition(handle_.GetCenter().GetX(), handle_.GetCenter().GetY()); | |
1075 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1076 content.SetBorder(10); | |
1077 content.SetText("?"); | |
1078 | |
1079 label_.SetContent(content); | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1080 label_.SetColor(COLOR_TEXT); |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1081 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1082 |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1083 Handle& GetHandle() const |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1084 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1085 return handle_; |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1086 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1087 |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1088 virtual void SignalMove(GeometricPrimitive& primitive, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1089 const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1090 { |
1977 | 1091 label_.SetPosition(handle_.GetCenter().GetX(), handle_.GetCenter().GetY()); |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1092 TagProbeAsChanged(); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1093 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1094 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1095 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1096 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1097 target = Json::objectValue; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1098 target[KEY_TYPE] = VALUE_PIXEL_PROBE; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1099 target[KEY_X] = handle_.GetCenter().GetX(); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1100 target[KEY_Y] = handle_.GetCenter().GetY(); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1101 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1102 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1103 static void Unserialize(AnnotationsSceneLayer& target, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1104 Units units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1105 int probedLayer, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1106 const Json::Value& source) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1107 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1108 if (source.isMember(KEY_X) && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1109 source.isMember(KEY_Y) && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1110 source[KEY_X].isNumeric() && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1111 source[KEY_Y].isNumeric()) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1112 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1113 new PixelProbeAnnotation(target, units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1114 ScenePoint2D(source[KEY_X].asDouble(), source[KEY_Y].asDouble()), |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1115 probedLayer); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1116 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1117 else |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1118 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1119 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize a pixel probe"); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1120 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1121 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1122 }; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1123 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1124 |
1804 | 1125 class AnnotationsSceneLayer::AngleAnnotation : public Annotation |
1126 { | |
1127 private: | |
1128 Handle& startHandle_; | |
1129 Handle& middleHandle_; | |
1130 Handle& endHandle_; | |
1131 Segment& segment1_; | |
1132 Segment& segment2_; | |
1133 Arc& arc_; | |
1134 Text& label_; | |
1135 | |
1136 void UpdateLabel() | |
1137 { | |
1138 TextSceneLayer content; | |
1139 | |
1140 const double x1 = startHandle_.GetCenter().GetX(); | |
1141 const double x2 = middleHandle_.GetCenter().GetX(); | |
1142 const double y2 = middleHandle_.GetCenter().GetY(); | |
1143 const double x3 = endHandle_.GetCenter().GetX(); | |
1144 | |
1145 if (x2 < x1 && | |
1146 x2 < x3) | |
1147 { | |
1148 content.SetAnchor(BitmapAnchor_CenterRight); | |
1149 } | |
1150 else | |
1151 { | |
1152 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1153 } | |
1154 | |
1155 content.SetPosition(x2, y2); | |
1156 content.SetBorder(10); | |
1157 | |
1158 char buf[32]; | |
1159 sprintf(buf, "%.01f%c%c", std::abs(arc_.GetAngle()) / PI * 180.0, | |
1160 0xc2, 0xb0 /* two bytes corresponding to degree symbol in UTF-8 */); | |
1161 content.SetText(buf); | |
1162 | |
1163 label_.SetContent(content); | |
1164 } | |
1165 | |
1166 public: | |
1167 AngleAnnotation(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1168 Units units, |
1804 | 1169 const ScenePoint2D& start, |
1170 const ScenePoint2D& middle, | |
1171 const ScenePoint2D& end) : | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1172 Annotation(that, units), |
1804 | 1173 startHandle_(AddTypedPrimitive<Handle>(new Handle(*this, start))), |
1174 middleHandle_(AddTypedPrimitive<Handle>(new Handle(*this, middle))), | |
1175 endHandle_(AddTypedPrimitive<Handle>(new Handle(*this, end))), | |
1176 segment1_(AddTypedPrimitive<Segment>(new Segment(*this, start, middle))), | |
1177 segment2_(AddTypedPrimitive<Segment>(new Segment(*this, middle, end))), | |
1178 arc_(AddTypedPrimitive<Arc>(new Arc(*this, start, middle, end))), | |
1179 label_(AddTypedPrimitive<Text>(new Text(that, *this))) | |
1180 { | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
1181 label_.SetColor(COLOR_TEXT); |
1804 | 1182 UpdateLabel(); |
1183 } | |
1184 | |
1185 Handle& GetEndHandle() const | |
1186 { | |
1187 return endHandle_; | |
1188 } | |
1189 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1190 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1191 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1192 { |
1193 if (&primitive == &startHandle_) | |
1194 { | |
1195 segment1_.SetPosition(startHandle_.GetCenter(), middleHandle_.GetCenter()); | |
1196 arc_.SetStart(startHandle_.GetCenter()); | |
1197 } | |
1198 else if (&primitive == &middleHandle_) | |
1199 { | |
1200 segment1_.SetPosition(startHandle_.GetCenter(), middleHandle_.GetCenter()); | |
1201 segment2_.SetPosition(middleHandle_.GetCenter(), endHandle_.GetCenter()); | |
1202 arc_.SetMiddle(middleHandle_.GetCenter()); | |
1203 } | |
1204 else if (&primitive == &endHandle_) | |
1205 { | |
1206 segment2_.SetPosition(middleHandle_.GetCenter(), endHandle_.GetCenter()); | |
1207 arc_.SetEnd(endHandle_.GetCenter()); | |
1208 } | |
1209 else if (&primitive == &segment1_) | |
1210 { | |
1211 startHandle_.SetCenter(segment1_.GetPosition1()); | |
1212 middleHandle_.SetCenter(segment1_.GetPosition2()); | |
1213 segment2_.SetPosition(segment1_.GetPosition2(), segment2_.GetPosition2()); | |
1214 arc_.SetStart(segment1_.GetPosition1()); | |
1215 arc_.SetMiddle(segment1_.GetPosition2()); | |
1216 } | |
1217 else if (&primitive == &segment2_) | |
1218 { | |
1219 middleHandle_.SetCenter(segment2_.GetPosition1()); | |
1220 endHandle_.SetCenter(segment2_.GetPosition2()); | |
1221 segment1_.SetPosition(segment1_.GetPosition1(), segment2_.GetPosition1()); | |
1222 arc_.SetMiddle(segment2_.GetPosition1()); | |
1223 arc_.SetEnd(segment2_.GetPosition2()); | |
1224 } | |
1225 | |
1226 UpdateLabel(); | |
1227 } | |
1228 | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1229 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1230 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1231 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1232 |
1804 | 1233 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
1234 { | |
1235 target = Json::objectValue; | |
1236 target[KEY_TYPE] = VALUE_ANGLE; | |
1237 target[KEY_X1] = startHandle_.GetCenter().GetX(); | |
1238 target[KEY_Y1] = startHandle_.GetCenter().GetY(); | |
1239 target[KEY_X2] = middleHandle_.GetCenter().GetX(); | |
1240 target[KEY_Y2] = middleHandle_.GetCenter().GetY(); | |
1241 target[KEY_X3] = endHandle_.GetCenter().GetX(); | |
1242 target[KEY_Y3] = endHandle_.GetCenter().GetY(); | |
1243 } | |
1244 | |
1245 static void Unserialize(AnnotationsSceneLayer& target, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1246 Units units, |
1804 | 1247 const Json::Value& source) |
1248 { | |
1249 if (source.isMember(KEY_X1) && | |
1250 source.isMember(KEY_Y1) && | |
1251 source.isMember(KEY_X2) && | |
1252 source.isMember(KEY_Y2) && | |
1253 source.isMember(KEY_X3) && | |
1254 source.isMember(KEY_Y3) && | |
1255 source[KEY_X1].isNumeric() && | |
1256 source[KEY_Y1].isNumeric() && | |
1257 source[KEY_X2].isNumeric() && | |
1258 source[KEY_Y2].isNumeric() && | |
1259 source[KEY_X3].isNumeric() && | |
1260 source[KEY_Y3].isNumeric()) | |
1261 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1262 new AngleAnnotation(target, units, |
1804 | 1263 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
1264 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble()), | |
1265 ScenePoint2D(source[KEY_X3].asDouble(), source[KEY_Y3].asDouble())); | |
1266 } | |
1267 else | |
1268 { | |
1269 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize an angle annotation"); | |
1270 } | |
1271 } | |
1272 }; | |
1273 | |
1274 | |
1275 class AnnotationsSceneLayer::CircleAnnotation : public Annotation | |
1276 { | |
1277 private: | |
1278 Handle& handle1_; | |
1279 Handle& handle2_; | |
1280 Segment& segment_; | |
1281 Circle& circle_; | |
1282 Text& label_; | |
1283 | |
1284 void UpdateLabel() | |
1285 { | |
1286 TextSceneLayer content; | |
1287 | |
1288 double x1 = handle1_.GetCenter().GetX(); | |
1289 double y1 = handle1_.GetCenter().GetY(); | |
1290 double x2 = handle2_.GetCenter().GetX(); | |
1291 double y2 = handle2_.GetCenter().GetY(); | |
1292 | |
1293 // Put the label to the right of the right-most handle | |
1294 if (x1 < x2) | |
1295 { | |
1296 content.SetPosition(x2, y2); | |
1297 } | |
1298 else | |
1299 { | |
1300 content.SetPosition(x1, y1); | |
1301 } | |
1302 | |
1303 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1304 content.SetBorder(10); | |
1305 | |
1306 double dx = x1 - x2; | |
1307 double dy = y1 - y2; | |
1308 double diameter = sqrt(dx * dx + dy * dy); // in millimeters | |
1309 | |
1310 double area = PI * diameter * diameter / 4.0; | |
1311 | |
1312 char buf[32]; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1313 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1314 switch (GetUnits()) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1315 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1316 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1317 sprintf(buf, "%0.2f cm\n%0.2f cm%c%c", |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1318 diameter / 10.0, |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1319 area / 100.0, |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1320 0xc2, 0xb2 /* two bytes corresponding to two power in UTF-8 */); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1321 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1322 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1323 case Units_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1324 // Don't report area (pixel-times-pixel is a strange unit) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1325 sprintf(buf, "%0.1f px", diameter); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1326 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1327 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1328 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1329 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1330 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1331 |
1804 | 1332 content.SetText(buf); |
1333 | |
1334 label_.SetContent(content); | |
1335 } | |
1336 | |
1337 public: | |
1338 CircleAnnotation(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1339 Units units, |
1804 | 1340 const ScenePoint2D& p1, |
1341 const ScenePoint2D& p2) : | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1342 Annotation(that, units), |
1804 | 1343 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), |
1344 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), | |
1345 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), | |
1346 circle_(AddTypedPrimitive<Circle>(new Circle(*this, p1, p2))), | |
1347 label_(AddTypedPrimitive<Text>(new Text(that, *this))) | |
1348 { | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
1349 label_.SetColor(COLOR_TEXT); |
1804 | 1350 UpdateLabel(); |
1351 } | |
1352 | |
1353 Handle& GetHandle2() const | |
1354 { | |
1355 return handle2_; | |
1356 } | |
1357 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1358 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1359 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1360 { |
1361 if (&primitive == &handle1_ || | |
1362 &primitive == &handle2_) | |
1363 { | |
1364 segment_.SetPosition(handle1_.GetCenter(), handle2_.GetCenter()); | |
1365 circle_.SetPosition(handle1_.GetCenter(), handle2_.GetCenter()); | |
1366 } | |
1367 else if (&primitive == &segment_) | |
1368 { | |
1369 handle1_.SetCenter(segment_.GetPosition1()); | |
1370 handle2_.SetCenter(segment_.GetPosition2()); | |
1371 circle_.SetPosition(segment_.GetPosition1(), segment_.GetPosition2()); | |
1372 } | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1373 else if (&primitive == &circle_) |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1374 { |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1375 handle1_.SetCenter(circle_.GetPosition1()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1376 handle2_.SetCenter(circle_.GetPosition2()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1377 segment_.SetPosition(circle_.GetPosition1(), circle_.GetPosition2()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1378 } |
1804 | 1379 |
1380 UpdateLabel(); | |
1381 } | |
1382 | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1383 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1384 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1385 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1386 |
1804 | 1387 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
1388 { | |
1389 target = Json::objectValue; | |
1390 target[KEY_TYPE] = VALUE_CIRCLE; | |
1391 target[KEY_X1] = handle1_.GetCenter().GetX(); | |
1392 target[KEY_Y1] = handle1_.GetCenter().GetY(); | |
1393 target[KEY_X2] = handle2_.GetCenter().GetX(); | |
1394 target[KEY_Y2] = handle2_.GetCenter().GetY(); | |
1395 } | |
1396 | |
1397 static void Unserialize(AnnotationsSceneLayer& target, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1398 Units units, |
1804 | 1399 const Json::Value& source) |
1400 { | |
1401 if (source.isMember(KEY_X1) && | |
1402 source.isMember(KEY_Y1) && | |
1403 source.isMember(KEY_X2) && | |
1404 source.isMember(KEY_Y2) && | |
1405 source[KEY_X1].isNumeric() && | |
1406 source[KEY_Y1].isNumeric() && | |
1407 source[KEY_X2].isNumeric() && | |
1408 source[KEY_Y2].isNumeric()) | |
1409 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1410 new CircleAnnotation(target, units, |
1804 | 1411 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
1412 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble())); | |
1413 } | |
1414 else | |
1415 { | |
1416 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize an circle annotation"); | |
1417 } | |
1418 } | |
1419 }; | |
1420 | |
1421 | |
1422 class AnnotationsSceneLayer::CreateSegmentOrCircleTracker : public IFlexiblePointerTracker | |
1423 { | |
1424 private: | |
1425 AnnotationsSceneLayer& that_; | |
1426 Annotation* annotation_; | |
1427 AffineTransform2D canvasToScene_; | |
1428 Handle* handle2_; | |
1429 | |
1430 public: | |
1431 CreateSegmentOrCircleTracker(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1432 Units units, |
1804 | 1433 bool isCircle, |
1434 const ScenePoint2D& sceneClick, | |
1435 const AffineTransform2D& canvasToScene) : | |
1436 that_(that), | |
1437 annotation_(NULL), | |
1438 canvasToScene_(canvasToScene), | |
1439 handle2_(NULL) | |
1440 { | |
1441 if (isCircle) | |
1442 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1443 annotation_ = new CircleAnnotation(that, units, sceneClick, sceneClick); |
1804 | 1444 handle2_ = &dynamic_cast<CircleAnnotation*>(annotation_)->GetHandle2(); |
1445 } | |
1446 else | |
1447 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1448 annotation_ = new SegmentAnnotation(that, units, true /* show label */, sceneClick, sceneClick); |
1804 | 1449 handle2_ = &dynamic_cast<SegmentAnnotation*>(annotation_)->GetHandle2(); |
1450 } | |
1451 | |
1452 assert(annotation_ != NULL && | |
1453 handle2_ != NULL); | |
1454 } | |
1455 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1456 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1457 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1458 { |
1459 if (annotation_ != NULL) | |
1460 { | |
1461 assert(handle2_ != NULL); | |
1462 handle2_->SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1463 annotation_->SignalMove(*handle2_, scene); |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1464 |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1465 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1466 } |
1467 } | |
1468 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1469 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1470 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1471 { |
1472 annotation_ = NULL; // IsAlive() becomes false | |
1473 | |
1474 that_.BroadcastMessage(AnnotationAddedMessage(that_)); | |
1475 } | |
1476 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1477 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1478 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1479 { |
1480 } | |
1481 | |
1482 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1483 { | |
1484 return (annotation_ != NULL); | |
1485 } | |
1486 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1487 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1488 { |
1489 if (annotation_ != NULL) | |
1490 { | |
1491 that_.DeleteAnnotation(annotation_); | |
1492 annotation_ = NULL; | |
1493 } | |
1494 } | |
1495 }; | |
1496 | |
1497 | |
1498 class AnnotationsSceneLayer::CreateAngleTracker : public IFlexiblePointerTracker | |
1499 { | |
1500 private: | |
1501 AnnotationsSceneLayer& that_; | |
1502 SegmentAnnotation* segment_; | |
1503 AngleAnnotation* angle_; | |
1504 AffineTransform2D canvasToScene_; | |
1505 | |
1506 public: | |
1507 CreateAngleTracker(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1508 Units units, |
1804 | 1509 const ScenePoint2D& sceneClick, |
1510 const AffineTransform2D& canvasToScene) : | |
1511 that_(that), | |
1512 segment_(NULL), | |
1513 angle_(NULL), | |
1514 canvasToScene_(canvasToScene) | |
1515 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1516 segment_ = new SegmentAnnotation(that, units, false /* no length label */, sceneClick, sceneClick); |
1804 | 1517 } |
1518 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1519 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1520 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1521 { |
1522 if (segment_ != NULL) | |
1523 { | |
1524 segment_->GetHandle2().SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1525 segment_->SignalMove(segment_->GetHandle2(), scene); |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1526 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1527 } |
1528 | |
1529 if (angle_ != NULL) | |
1530 { | |
1531 angle_->GetEndHandle().SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1532 angle_->SignalMove(angle_->GetEndHandle(), scene); |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1533 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1534 } |
1535 } | |
1536 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1537 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1538 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1539 { |
1540 if (segment_ != NULL) | |
1541 { | |
1542 // End of first step: The first segment is available, now create the angle | |
1543 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1544 angle_ = new AngleAnnotation(that_, segment_->GetUnits(), segment_->GetHandle1().GetCenter(), |
1804 | 1545 segment_->GetHandle2().GetCenter(), |
1546 segment_->GetHandle2().GetCenter()); | |
1547 | |
1548 that_.DeleteAnnotation(segment_); | |
1549 segment_ = NULL; | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1550 |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1551 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1552 } |
1553 else | |
1554 { | |
1555 angle_ = NULL; // IsAlive() becomes false | |
1556 | |
1557 that_.BroadcastMessage(AnnotationAddedMessage(that_)); | |
1558 } | |
1559 } | |
1560 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1561 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1562 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1563 { |
1564 } | |
1565 | |
1566 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1567 { | |
1568 return (segment_ != NULL || | |
1569 angle_ != NULL); | |
1570 } | |
1571 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1572 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1573 { |
1574 if (segment_ != NULL) | |
1575 { | |
1576 that_.DeleteAnnotation(segment_); | |
1577 segment_ = NULL; | |
1578 } | |
1579 | |
1580 if (angle_ != NULL) | |
1581 { | |
1582 that_.DeleteAnnotation(angle_); | |
1583 angle_ = NULL; | |
1584 } | |
1585 } | |
1586 }; | |
1587 | |
1588 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1589 class AnnotationsSceneLayer::CreatePixelProbeTracker : public IFlexiblePointerTracker |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1590 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1591 public: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1592 CreatePixelProbeTracker(AnnotationsSceneLayer& that, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1593 Units units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1594 const ScenePoint2D& sceneClick, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1595 const Scene2D& scene, |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1596 int probedLayer) |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1597 { |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1598 PixelProbeAnnotation* annotation = new PixelProbeAnnotation(that, units, sceneClick, probedLayer); |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1599 annotation->UpdateProbe(scene); |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1600 that.BroadcastMessage(AnnotationAddedMessage(that)); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1601 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1602 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1603 virtual void PointerMove(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1604 const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1605 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1606 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1607 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1608 virtual void PointerUp(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1609 const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1610 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1611 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1612 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1613 virtual void PointerDown(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1614 const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1615 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1616 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1617 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1618 virtual bool IsAlive() const ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1619 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1620 return false; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1621 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1622 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1623 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1624 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1625 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1626 }; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1627 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1628 |
1804 | 1629 // Dummy tracker that is only used for deletion, in order to warn |
1630 // the caller that the mouse action was taken into consideration | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1631 class AnnotationsSceneLayer::RemoveTracker : public IFlexiblePointerTracker |
1804 | 1632 { |
1633 public: | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1634 RemoveTracker() |
1804 | 1635 { |
1636 } | |
1637 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1638 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1639 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1640 { |
1641 } | |
1642 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1643 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1644 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1645 { |
1646 } | |
1647 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1648 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1649 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1650 { |
1651 } | |
1652 | |
1653 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1654 { | |
1655 return false; | |
1656 } | |
1657 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1658 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1659 { |
1660 } | |
1661 }; | |
1662 | |
1663 | |
1664 void AnnotationsSceneLayer::AddAnnotation(Annotation* annotation) | |
1665 { | |
1666 assert(annotation != NULL); | |
1667 assert(annotations_.find(annotation) == annotations_.end()); | |
1668 annotations_.insert(annotation); | |
1669 } | |
1670 | |
1671 | |
1672 void AnnotationsSceneLayer::DeleteAnnotation(Annotation* annotation) | |
1673 { | |
1674 if (annotation != NULL) | |
1675 { | |
1676 assert(annotations_.find(annotation) != annotations_.end()); | |
1677 annotations_.erase(annotation); | |
1678 delete annotation; | |
1679 } | |
1680 } | |
1681 | |
1682 | |
1683 void AnnotationsSceneLayer::DeletePrimitive(GeometricPrimitive* primitive) | |
1684 { | |
1685 if (primitive != NULL) | |
1686 { | |
1687 assert(primitives_.find(primitive) != primitives_.end()); | |
1688 primitives_.erase(primitive); | |
1689 delete primitive; | |
1690 } | |
1691 } | |
1692 | |
1693 | |
1694 void AnnotationsSceneLayer::TagSubLayerToRemove(size_t subLayerIndex) | |
1695 { | |
1696 assert(subLayersToRemove_.find(subLayerIndex) == subLayersToRemove_.end()); | |
1697 subLayersToRemove_.insert(subLayerIndex); | |
1698 } | |
1699 | |
1700 | |
1701 AnnotationsSceneLayer::AnnotationsSceneLayer(size_t macroLayerIndex) : | |
1702 activeTool_(Tool_Edit), | |
1703 macroLayerIndex_(macroLayerIndex), | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1704 polylineSubLayer_(0), // dummy initialization |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1705 units_(Units_Pixels), |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1706 probedLayer_(0) |
1804 | 1707 { |
1708 } | |
1709 | |
1710 | |
1711 void AnnotationsSceneLayer::Clear() | |
1712 { | |
1713 for (Annotations::iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1714 { | |
1715 assert(*it != NULL); | |
1716 delete *it; | |
1717 } | |
1718 | |
1719 annotations_.clear(); | |
1812
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
1720 |
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
1721 ClearHover(); |
1804 | 1722 } |
1723 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1724 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1725 void AnnotationsSceneLayer::SetUnits(Units units) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1726 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1727 if (units_ != units) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1728 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1729 Clear(); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1730 units_ = units; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1731 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1732 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1733 |
1804 | 1734 |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1735 void AnnotationsSceneLayer::AddSegmentAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1736 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1737 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1738 annotations_.insert(new SegmentAnnotation(*this, units_, true /* show label */, p1, p2)); |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1739 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1740 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1741 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1742 void AnnotationsSceneLayer::AddCircleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1743 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1744 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1745 annotations_.insert(new CircleAnnotation(*this, units_, p1, p2)); |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1746 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1747 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1748 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1749 void AnnotationsSceneLayer::AddAngleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1750 const ScenePoint2D& p2, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1751 const ScenePoint2D& p3) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1752 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1753 annotations_.insert(new AngleAnnotation(*this, units_, p1, p2, p3)); |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1754 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1755 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1756 |
1804 | 1757 void AnnotationsSceneLayer::Render(Scene2D& scene) |
1758 { | |
1977 | 1759 // First, update the probes |
1760 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1761 { | |
1762 assert(*it != NULL); | |
1763 (*it)->UpdateProbe(scene); | |
1764 } | |
1765 | |
1804 | 1766 MacroSceneLayer* macro = NULL; |
1767 | |
1768 if (scene.HasLayer(macroLayerIndex_)) | |
1769 { | |
1770 macro = &dynamic_cast<MacroSceneLayer&>(scene.GetLayer(macroLayerIndex_)); | |
1771 } | |
1772 else | |
1773 { | |
1774 macro = &dynamic_cast<MacroSceneLayer&>(scene.SetLayer(macroLayerIndex_, new MacroSceneLayer)); | |
1775 polylineSubLayer_ = macro->AddLayer(new PolylineSceneLayer); | |
1776 } | |
1777 | |
1778 for (SubLayers::const_iterator it = subLayersToRemove_.begin(); it != subLayersToRemove_.end(); ++it) | |
1779 { | |
1780 assert(macro->HasLayer(*it)); | |
1781 macro->DeleteLayer(*it); | |
1782 } | |
1783 | |
1784 subLayersToRemove_.clear(); | |
1785 | |
1786 std::unique_ptr<PolylineSceneLayer> polyline(new PolylineSceneLayer); | |
1787 | |
1788 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1789 { | |
1790 assert(*it != NULL); | |
1791 GeometricPrimitive& primitive = **it; | |
1792 | |
1793 primitive.RenderPolylineLayer(*polyline, scene); | |
1794 | |
1795 if (primitive.IsModified()) | |
1796 { | |
1797 primitive.RenderOtherLayers(*macro, scene); | |
1798 primitive.SetModified(false); | |
1799 } | |
1800 } | |
1801 | |
1802 macro->UpdateLayer(polylineSubLayer_, polyline.release()); | |
1803 } | |
1804 | |
1805 | |
1806 bool AnnotationsSceneLayer::ClearHover() | |
1807 { | |
1808 bool needsRefresh = false; | |
1809 | |
1810 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1811 { | |
1812 assert(*it != NULL); | |
1813 if ((*it)->IsHover()) | |
1814 { | |
1815 (*it)->SetHover(false); | |
1816 needsRefresh = true; | |
1817 } | |
1818 } | |
1819 | |
1820 return needsRefresh; | |
1821 } | |
1822 | |
1823 | |
1824 bool AnnotationsSceneLayer::SetMouseHover(const ScenePoint2D& p, | |
1825 const Scene2D& scene) | |
1826 { | |
1827 if (activeTool_ == Tool_None) | |
1828 { | |
1829 return ClearHover(); | |
1830 } | |
1831 else | |
1832 { | |
1833 bool needsRefresh = false; | |
1834 | |
1835 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
1836 | |
1837 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1838 { | |
1839 assert(*it != NULL); | |
1840 bool hover = (*it)->IsHit(s, scene); | |
1841 | |
1842 if ((*it)->IsHover() != hover) | |
1843 { | |
1844 needsRefresh = true; | |
1845 } | |
1846 | |
1847 (*it)->SetHover(hover); | |
1848 } | |
1849 | |
1850 return needsRefresh; | |
1851 } | |
1852 } | |
1853 | |
1854 | |
1855 IFlexiblePointerTracker* AnnotationsSceneLayer::CreateTracker(const ScenePoint2D& p, | |
1856 const Scene2D& scene) | |
1857 { | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1858 /** |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1859 * WARNING: The created trackers must NOT keep a reference to "scene"! |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1860 **/ |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1861 |
1804 | 1862 if (activeTool_ == Tool_None) |
1863 { | |
1864 return NULL; | |
1865 } | |
1866 else | |
1867 { | |
1868 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
1869 | |
1870 GeometricPrimitive* bestHit = NULL; | |
1871 | |
1872 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1873 { | |
1874 assert(*it != NULL); | |
1875 if ((*it)->IsHit(s, scene)) | |
1876 { | |
1877 if (bestHit == NULL || | |
1878 bestHit->GetDepth() > (*it)->GetDepth()) | |
1879 { | |
1880 bestHit = *it; | |
1881 } | |
1882 } | |
1883 } | |
1884 | |
1885 if (bestHit != NULL) | |
1886 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1887 if (activeTool_ == Tool_Remove) |
1804 | 1888 { |
1889 DeleteAnnotation(&bestHit->GetParentAnnotation()); | |
1890 BroadcastMessage(AnnotationRemovedMessage(*this)); | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1891 return new RemoveTracker; |
1804 | 1892 } |
1893 else | |
1894 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1895 return new EditPrimitiveTracker(*this, *bestHit, s, scene.GetCanvasToSceneTransform()); |
1804 | 1896 } |
1897 } | |
1898 else | |
1899 { | |
1900 switch (activeTool_) | |
1901 { | |
1902 case Tool_Segment: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1903 return new CreateSegmentOrCircleTracker(*this, units_, false /* segment */, s, scene.GetCanvasToSceneTransform()); |
1804 | 1904 |
1905 case Tool_Circle: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1906 return new CreateSegmentOrCircleTracker(*this, units_, true /* circle */, s, scene.GetCanvasToSceneTransform()); |
1804 | 1907 |
1908 case Tool_Angle: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1909 return new CreateAngleTracker(*this, units_, s, scene.GetCanvasToSceneTransform()); |
1804 | 1910 |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1911 case Tool_PixelProbe: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1912 return new CreatePixelProbeTracker(*this, units_, s, scene, probedLayer_); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1913 |
1804 | 1914 default: |
1915 return NULL; | |
1916 } | |
1917 } | |
1918 } | |
1919 } | |
1920 | |
1921 | |
1922 void AnnotationsSceneLayer::Serialize(Json::Value& target) const | |
1923 { | |
1924 Json::Value annotations = Json::arrayValue; | |
1925 | |
1926 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1927 { | |
1928 assert(*it != NULL); | |
1929 | |
1930 Json::Value item; | |
1931 (*it)->Serialize(item); | |
1932 annotations.append(item); | |
1933 } | |
1934 | |
1935 target = Json::objectValue; | |
1936 target[KEY_ANNOTATIONS] = annotations; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1937 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1938 switch (units_) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1939 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1940 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1941 target[KEY_UNITS] = VALUE_MILLIMETERS; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1942 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1943 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1944 case Units_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1945 target[KEY_UNITS] = VALUE_PIXELS; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1946 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1947 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1948 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1949 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1950 } |
1804 | 1951 } |
1952 | |
1953 | |
1954 void AnnotationsSceneLayer::Unserialize(const Json::Value& serialized) | |
1955 { | |
1956 Clear(); | |
1957 | |
1958 if (serialized.type() != Json::objectValue || | |
1959 !serialized.isMember(KEY_ANNOTATIONS) || | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1960 !serialized.isMember(KEY_UNITS) || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1961 serialized[KEY_ANNOTATIONS].type() != Json::arrayValue || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1962 serialized[KEY_UNITS].type() != Json::stringValue) |
1804 | 1963 { |
1964 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize a set of annotations"); | |
1965 } | |
1966 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1967 const std::string& u = serialized[KEY_UNITS].asString(); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1968 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1969 if (u == VALUE_MILLIMETERS) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1970 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1971 units_ = Units_Millimeters; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1972 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1973 else if (u == VALUE_PIXELS) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1974 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1975 units_ = Units_Pixels; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1976 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1977 else |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1978 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1979 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Unknown units: " + u); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1980 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1981 |
1804 | 1982 const Json::Value& annotations = serialized[KEY_ANNOTATIONS]; |
1983 | |
1984 for (Json::Value::ArrayIndex i = 0; i < annotations.size(); i++) | |
1985 { | |
1986 if (annotations[i].type() != Json::objectValue || | |
1987 !annotations[i].isMember(KEY_TYPE) || | |
1988 annotations[i][KEY_TYPE].type() != Json::stringValue) | |
1989 { | |
1990 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
1991 } | |
1992 | |
1993 const std::string& type = annotations[i][KEY_TYPE].asString(); | |
1994 | |
1995 if (type == VALUE_ANGLE) | |
1996 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1997 AngleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 1998 } |
1999 else if (type == VALUE_CIRCLE) | |
2000 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2001 CircleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2002 } |
2003 else if (type == VALUE_SEGMENT) | |
2004 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2005 SegmentAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2006 } |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2007 else if (type == VALUE_PIXEL_PROBE) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2008 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2009 PixelProbeAnnotation::Unserialize(*this, units_, probedLayer_, annotations[i]); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2010 } |
1804 | 2011 else |
2012 { | |
2013 LOG(ERROR) << "Cannot unserialize unknown type of annotation: " << type; | |
2014 } | |
2015 } | |
2016 } | |
2017 } |