Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp @ 1978:95449b0e064a
pixel probe is working
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 29 Oct 2022 16:56:16 +0200 |
parents | ba971d9082d3 |
children | b31e494e34c5 |
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); |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1056 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1057 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1058 } |
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1059 |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1060 public: |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1061 PixelProbeAnnotation(AnnotationsSceneLayer& that, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1062 Units units, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1063 const ScenePoint2D& p, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1064 int probedLayer) : |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1065 ProbingAnnotation(that, units, probedLayer), |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1066 handle_(AddTypedPrimitive<Handle>(new Handle(*this, p))), |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1067 label_(AddTypedPrimitive<Text>(new Text(that, *this))) |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1068 { |
1977 | 1069 TextSceneLayer content; |
1070 content.SetPosition(handle_.GetCenter().GetX(), handle_.GetCenter().GetY()); | |
1071 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1072 content.SetBorder(10); | |
1073 content.SetText("?"); | |
1074 | |
1075 label_.SetContent(content); | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1076 label_.SetColor(COLOR_TEXT); |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1077 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1078 |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1079 Handle& GetHandle() const |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1080 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1081 return handle_; |
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 |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1084 virtual void SignalMove(GeometricPrimitive& primitive, |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1085 const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1086 { |
1977 | 1087 label_.SetPosition(handle_.GetCenter().GetX(), handle_.GetCenter().GetY()); |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1088 TagProbeAsChanged(); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1089 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1090 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1091 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1092 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1093 target = Json::objectValue; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1094 target[KEY_TYPE] = VALUE_PIXEL_PROBE; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1095 target[KEY_X] = handle_.GetCenter().GetX(); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1096 target[KEY_Y] = handle_.GetCenter().GetY(); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1097 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1098 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1099 static void Unserialize(AnnotationsSceneLayer& target, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1100 Units units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1101 int probedLayer, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1102 const Json::Value& source) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1103 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1104 if (source.isMember(KEY_X) && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1105 source.isMember(KEY_Y) && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1106 source[KEY_X].isNumeric() && |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1107 source[KEY_Y].isNumeric()) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1108 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1109 new PixelProbeAnnotation(target, units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1110 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
|
1111 probedLayer); |
1975
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 else |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1114 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1115 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
|
1116 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1117 } |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1120 |
1804 | 1121 class AnnotationsSceneLayer::AngleAnnotation : public Annotation |
1122 { | |
1123 private: | |
1124 Handle& startHandle_; | |
1125 Handle& middleHandle_; | |
1126 Handle& endHandle_; | |
1127 Segment& segment1_; | |
1128 Segment& segment2_; | |
1129 Arc& arc_; | |
1130 Text& label_; | |
1131 | |
1132 void UpdateLabel() | |
1133 { | |
1134 TextSceneLayer content; | |
1135 | |
1136 const double x1 = startHandle_.GetCenter().GetX(); | |
1137 const double x2 = middleHandle_.GetCenter().GetX(); | |
1138 const double y2 = middleHandle_.GetCenter().GetY(); | |
1139 const double x3 = endHandle_.GetCenter().GetX(); | |
1140 | |
1141 if (x2 < x1 && | |
1142 x2 < x3) | |
1143 { | |
1144 content.SetAnchor(BitmapAnchor_CenterRight); | |
1145 } | |
1146 else | |
1147 { | |
1148 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1149 } | |
1150 | |
1151 content.SetPosition(x2, y2); | |
1152 content.SetBorder(10); | |
1153 | |
1154 char buf[32]; | |
1155 sprintf(buf, "%.01f%c%c", std::abs(arc_.GetAngle()) / PI * 180.0, | |
1156 0xc2, 0xb0 /* two bytes corresponding to degree symbol in UTF-8 */); | |
1157 content.SetText(buf); | |
1158 | |
1159 label_.SetContent(content); | |
1160 } | |
1161 | |
1162 public: | |
1163 AngleAnnotation(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1164 Units units, |
1804 | 1165 const ScenePoint2D& start, |
1166 const ScenePoint2D& middle, | |
1167 const ScenePoint2D& end) : | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1168 Annotation(that, units), |
1804 | 1169 startHandle_(AddTypedPrimitive<Handle>(new Handle(*this, start))), |
1170 middleHandle_(AddTypedPrimitive<Handle>(new Handle(*this, middle))), | |
1171 endHandle_(AddTypedPrimitive<Handle>(new Handle(*this, end))), | |
1172 segment1_(AddTypedPrimitive<Segment>(new Segment(*this, start, middle))), | |
1173 segment2_(AddTypedPrimitive<Segment>(new Segment(*this, middle, end))), | |
1174 arc_(AddTypedPrimitive<Arc>(new Arc(*this, start, middle, end))), | |
1175 label_(AddTypedPrimitive<Text>(new Text(that, *this))) | |
1176 { | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
1177 label_.SetColor(COLOR_TEXT); |
1804 | 1178 UpdateLabel(); |
1179 } | |
1180 | |
1181 Handle& GetEndHandle() const | |
1182 { | |
1183 return endHandle_; | |
1184 } | |
1185 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1186 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1187 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1188 { |
1189 if (&primitive == &startHandle_) | |
1190 { | |
1191 segment1_.SetPosition(startHandle_.GetCenter(), middleHandle_.GetCenter()); | |
1192 arc_.SetStart(startHandle_.GetCenter()); | |
1193 } | |
1194 else if (&primitive == &middleHandle_) | |
1195 { | |
1196 segment1_.SetPosition(startHandle_.GetCenter(), middleHandle_.GetCenter()); | |
1197 segment2_.SetPosition(middleHandle_.GetCenter(), endHandle_.GetCenter()); | |
1198 arc_.SetMiddle(middleHandle_.GetCenter()); | |
1199 } | |
1200 else if (&primitive == &endHandle_) | |
1201 { | |
1202 segment2_.SetPosition(middleHandle_.GetCenter(), endHandle_.GetCenter()); | |
1203 arc_.SetEnd(endHandle_.GetCenter()); | |
1204 } | |
1205 else if (&primitive == &segment1_) | |
1206 { | |
1207 startHandle_.SetCenter(segment1_.GetPosition1()); | |
1208 middleHandle_.SetCenter(segment1_.GetPosition2()); | |
1209 segment2_.SetPosition(segment1_.GetPosition2(), segment2_.GetPosition2()); | |
1210 arc_.SetStart(segment1_.GetPosition1()); | |
1211 arc_.SetMiddle(segment1_.GetPosition2()); | |
1212 } | |
1213 else if (&primitive == &segment2_) | |
1214 { | |
1215 middleHandle_.SetCenter(segment2_.GetPosition1()); | |
1216 endHandle_.SetCenter(segment2_.GetPosition2()); | |
1217 segment1_.SetPosition(segment1_.GetPosition1(), segment2_.GetPosition1()); | |
1218 arc_.SetMiddle(segment2_.GetPosition1()); | |
1219 arc_.SetEnd(segment2_.GetPosition2()); | |
1220 } | |
1221 | |
1222 UpdateLabel(); | |
1223 } | |
1224 | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1225 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1226 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1227 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1228 |
1804 | 1229 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
1230 { | |
1231 target = Json::objectValue; | |
1232 target[KEY_TYPE] = VALUE_ANGLE; | |
1233 target[KEY_X1] = startHandle_.GetCenter().GetX(); | |
1234 target[KEY_Y1] = startHandle_.GetCenter().GetY(); | |
1235 target[KEY_X2] = middleHandle_.GetCenter().GetX(); | |
1236 target[KEY_Y2] = middleHandle_.GetCenter().GetY(); | |
1237 target[KEY_X3] = endHandle_.GetCenter().GetX(); | |
1238 target[KEY_Y3] = endHandle_.GetCenter().GetY(); | |
1239 } | |
1240 | |
1241 static void Unserialize(AnnotationsSceneLayer& target, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1242 Units units, |
1804 | 1243 const Json::Value& source) |
1244 { | |
1245 if (source.isMember(KEY_X1) && | |
1246 source.isMember(KEY_Y1) && | |
1247 source.isMember(KEY_X2) && | |
1248 source.isMember(KEY_Y2) && | |
1249 source.isMember(KEY_X3) && | |
1250 source.isMember(KEY_Y3) && | |
1251 source[KEY_X1].isNumeric() && | |
1252 source[KEY_Y1].isNumeric() && | |
1253 source[KEY_X2].isNumeric() && | |
1254 source[KEY_Y2].isNumeric() && | |
1255 source[KEY_X3].isNumeric() && | |
1256 source[KEY_Y3].isNumeric()) | |
1257 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1258 new AngleAnnotation(target, units, |
1804 | 1259 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
1260 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble()), | |
1261 ScenePoint2D(source[KEY_X3].asDouble(), source[KEY_Y3].asDouble())); | |
1262 } | |
1263 else | |
1264 { | |
1265 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize an angle annotation"); | |
1266 } | |
1267 } | |
1268 }; | |
1269 | |
1270 | |
1271 class AnnotationsSceneLayer::CircleAnnotation : public Annotation | |
1272 { | |
1273 private: | |
1274 Handle& handle1_; | |
1275 Handle& handle2_; | |
1276 Segment& segment_; | |
1277 Circle& circle_; | |
1278 Text& label_; | |
1279 | |
1280 void UpdateLabel() | |
1281 { | |
1282 TextSceneLayer content; | |
1283 | |
1284 double x1 = handle1_.GetCenter().GetX(); | |
1285 double y1 = handle1_.GetCenter().GetY(); | |
1286 double x2 = handle2_.GetCenter().GetX(); | |
1287 double y2 = handle2_.GetCenter().GetY(); | |
1288 | |
1289 // Put the label to the right of the right-most handle | |
1290 if (x1 < x2) | |
1291 { | |
1292 content.SetPosition(x2, y2); | |
1293 } | |
1294 else | |
1295 { | |
1296 content.SetPosition(x1, y1); | |
1297 } | |
1298 | |
1299 content.SetAnchor(BitmapAnchor_CenterLeft); | |
1300 content.SetBorder(10); | |
1301 | |
1302 double dx = x1 - x2; | |
1303 double dy = y1 - y2; | |
1304 double diameter = sqrt(dx * dx + dy * dy); // in millimeters | |
1305 | |
1306 double area = PI * diameter * diameter / 4.0; | |
1307 | |
1308 char buf[32]; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1309 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1310 switch (GetUnits()) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1311 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1312 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1313 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
|
1314 diameter / 10.0, |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1315 area / 100.0, |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1316 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
|
1317 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1318 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1319 case Units_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1320 // 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
|
1321 sprintf(buf, "%0.1f px", diameter); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1322 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1323 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1324 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1325 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1326 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1327 |
1804 | 1328 content.SetText(buf); |
1329 | |
1330 label_.SetContent(content); | |
1331 } | |
1332 | |
1333 public: | |
1334 CircleAnnotation(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1335 Units units, |
1804 | 1336 const ScenePoint2D& p1, |
1337 const ScenePoint2D& p2) : | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1338 Annotation(that, units), |
1804 | 1339 handle1_(AddTypedPrimitive<Handle>(new Handle(*this, p1))), |
1340 handle2_(AddTypedPrimitive<Handle>(new Handle(*this, p2))), | |
1341 segment_(AddTypedPrimitive<Segment>(new Segment(*this, p1, p2))), | |
1342 circle_(AddTypedPrimitive<Circle>(new Circle(*this, p1, p2))), | |
1343 label_(AddTypedPrimitive<Text>(new Text(that, *this))) | |
1344 { | |
1819
fe402c678d18
improved color theme for annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
1345 label_.SetColor(COLOR_TEXT); |
1804 | 1346 UpdateLabel(); |
1347 } | |
1348 | |
1349 Handle& GetHandle2() const | |
1350 { | |
1351 return handle2_; | |
1352 } | |
1353 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1354 virtual void SignalMove(GeometricPrimitive& primitive, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1355 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1356 { |
1357 if (&primitive == &handle1_ || | |
1358 &primitive == &handle2_) | |
1359 { | |
1360 segment_.SetPosition(handle1_.GetCenter(), handle2_.GetCenter()); | |
1361 circle_.SetPosition(handle1_.GetCenter(), handle2_.GetCenter()); | |
1362 } | |
1363 else if (&primitive == &segment_) | |
1364 { | |
1365 handle1_.SetCenter(segment_.GetPosition1()); | |
1366 handle2_.SetCenter(segment_.GetPosition2()); | |
1367 circle_.SetPosition(segment_.GetPosition1(), segment_.GetPosition2()); | |
1368 } | |
1823
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1369 else if (&primitive == &circle_) |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1370 { |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1371 handle1_.SetCenter(circle_.GetPosition1()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1372 handle2_.SetCenter(circle_.GetPosition2()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1373 segment_.SetPosition(circle_.GetPosition1(), circle_.GetPosition2()); |
781e9fc8925e
dragging circle annotations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
1374 } |
1804 | 1375 |
1376 UpdateLabel(); | |
1377 } | |
1378 | |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1379 virtual void UpdateProbe(const Scene2D& scene) ORTHANC_OVERRIDE |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1380 { |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1381 } |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1382 |
1804 | 1383 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
1384 { | |
1385 target = Json::objectValue; | |
1386 target[KEY_TYPE] = VALUE_CIRCLE; | |
1387 target[KEY_X1] = handle1_.GetCenter().GetX(); | |
1388 target[KEY_Y1] = handle1_.GetCenter().GetY(); | |
1389 target[KEY_X2] = handle2_.GetCenter().GetX(); | |
1390 target[KEY_Y2] = handle2_.GetCenter().GetY(); | |
1391 } | |
1392 | |
1393 static void Unserialize(AnnotationsSceneLayer& target, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1394 Units units, |
1804 | 1395 const Json::Value& source) |
1396 { | |
1397 if (source.isMember(KEY_X1) && | |
1398 source.isMember(KEY_Y1) && | |
1399 source.isMember(KEY_X2) && | |
1400 source.isMember(KEY_Y2) && | |
1401 source[KEY_X1].isNumeric() && | |
1402 source[KEY_Y1].isNumeric() && | |
1403 source[KEY_X2].isNumeric() && | |
1404 source[KEY_Y2].isNumeric()) | |
1405 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1406 new CircleAnnotation(target, units, |
1804 | 1407 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
1408 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble())); | |
1409 } | |
1410 else | |
1411 { | |
1412 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize an circle annotation"); | |
1413 } | |
1414 } | |
1415 }; | |
1416 | |
1417 | |
1418 class AnnotationsSceneLayer::CreateSegmentOrCircleTracker : public IFlexiblePointerTracker | |
1419 { | |
1420 private: | |
1421 AnnotationsSceneLayer& that_; | |
1422 Annotation* annotation_; | |
1423 AffineTransform2D canvasToScene_; | |
1424 Handle* handle2_; | |
1425 | |
1426 public: | |
1427 CreateSegmentOrCircleTracker(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1428 Units units, |
1804 | 1429 bool isCircle, |
1430 const ScenePoint2D& sceneClick, | |
1431 const AffineTransform2D& canvasToScene) : | |
1432 that_(that), | |
1433 annotation_(NULL), | |
1434 canvasToScene_(canvasToScene), | |
1435 handle2_(NULL) | |
1436 { | |
1437 if (isCircle) | |
1438 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1439 annotation_ = new CircleAnnotation(that, units, sceneClick, sceneClick); |
1804 | 1440 handle2_ = &dynamic_cast<CircleAnnotation*>(annotation_)->GetHandle2(); |
1441 } | |
1442 else | |
1443 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1444 annotation_ = new SegmentAnnotation(that, units, true /* show label */, sceneClick, sceneClick); |
1804 | 1445 handle2_ = &dynamic_cast<SegmentAnnotation*>(annotation_)->GetHandle2(); |
1446 } | |
1447 | |
1448 assert(annotation_ != NULL && | |
1449 handle2_ != NULL); | |
1450 } | |
1451 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1452 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1453 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1454 { |
1455 if (annotation_ != NULL) | |
1456 { | |
1457 assert(handle2_ != NULL); | |
1458 handle2_->SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1459 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
|
1460 |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1461 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1462 } |
1463 } | |
1464 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1465 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1466 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1467 { |
1468 annotation_ = NULL; // IsAlive() becomes false | |
1469 | |
1470 that_.BroadcastMessage(AnnotationAddedMessage(that_)); | |
1471 } | |
1472 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1473 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1474 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1475 { |
1476 } | |
1477 | |
1478 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1479 { | |
1480 return (annotation_ != NULL); | |
1481 } | |
1482 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1483 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1484 { |
1485 if (annotation_ != NULL) | |
1486 { | |
1487 that_.DeleteAnnotation(annotation_); | |
1488 annotation_ = NULL; | |
1489 } | |
1490 } | |
1491 }; | |
1492 | |
1493 | |
1494 class AnnotationsSceneLayer::CreateAngleTracker : public IFlexiblePointerTracker | |
1495 { | |
1496 private: | |
1497 AnnotationsSceneLayer& that_; | |
1498 SegmentAnnotation* segment_; | |
1499 AngleAnnotation* angle_; | |
1500 AffineTransform2D canvasToScene_; | |
1501 | |
1502 public: | |
1503 CreateAngleTracker(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1504 Units units, |
1804 | 1505 const ScenePoint2D& sceneClick, |
1506 const AffineTransform2D& canvasToScene) : | |
1507 that_(that), | |
1508 segment_(NULL), | |
1509 angle_(NULL), | |
1510 canvasToScene_(canvasToScene) | |
1511 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1512 segment_ = new SegmentAnnotation(that, units, false /* no length label */, sceneClick, sceneClick); |
1804 | 1513 } |
1514 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1515 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1516 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1517 { |
1518 if (segment_ != NULL) | |
1519 { | |
1520 segment_->GetHandle2().SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1521 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
|
1522 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1523 } |
1524 | |
1525 if (angle_ != NULL) | |
1526 { | |
1527 angle_->GetEndHandle().SetCenter(event.GetMainPosition().Apply(canvasToScene_)); | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1528 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
|
1529 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1530 } |
1531 } | |
1532 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1533 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1534 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1535 { |
1536 if (segment_ != NULL) | |
1537 { | |
1538 // End of first step: The first segment is available, now create the angle | |
1539 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1540 angle_ = new AngleAnnotation(that_, segment_->GetUnits(), segment_->GetHandle1().GetCenter(), |
1804 | 1541 segment_->GetHandle2().GetCenter(), |
1542 segment_->GetHandle2().GetCenter()); | |
1543 | |
1544 that_.DeleteAnnotation(segment_); | |
1545 segment_ = NULL; | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1546 |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1547 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1548 } |
1549 else | |
1550 { | |
1551 angle_ = NULL; // IsAlive() becomes false | |
1552 | |
1553 that_.BroadcastMessage(AnnotationAddedMessage(that_)); | |
1554 } | |
1555 } | |
1556 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1557 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1558 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1559 { |
1560 } | |
1561 | |
1562 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1563 { | |
1564 return (segment_ != NULL || | |
1565 angle_ != NULL); | |
1566 } | |
1567 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1568 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1569 { |
1570 if (segment_ != NULL) | |
1571 { | |
1572 that_.DeleteAnnotation(segment_); | |
1573 segment_ = NULL; | |
1574 } | |
1575 | |
1576 if (angle_ != NULL) | |
1577 { | |
1578 that_.DeleteAnnotation(angle_); | |
1579 angle_ = NULL; | |
1580 } | |
1581 } | |
1582 }; | |
1583 | |
1584 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1585 class AnnotationsSceneLayer::CreatePixelProbeTracker : public IFlexiblePointerTracker |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1586 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1587 public: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1588 CreatePixelProbeTracker(AnnotationsSceneLayer& that, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1589 Units units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1590 const ScenePoint2D& sceneClick, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1591 const Scene2D& scene, |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1592 int probedLayer) |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1593 { |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1594 PixelProbeAnnotation* annotation = new PixelProbeAnnotation(that, units, sceneClick, probedLayer); |
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1595 annotation->UpdateProbe(scene); |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1596 that.BroadcastMessage(AnnotationAddedMessage(that)); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1597 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1598 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1599 virtual void PointerMove(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1600 const Scene2D& scene) ORTHANC_OVERRIDE |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1604 virtual void PointerUp(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1605 const Scene2D& scene) ORTHANC_OVERRIDE |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1609 virtual void PointerDown(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1610 const Scene2D& scene) ORTHANC_OVERRIDE |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1614 virtual bool IsAlive() const 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 return false; |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1619 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1620 { |
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 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1624 |
1804 | 1625 // Dummy tracker that is only used for deletion, in order to warn |
1626 // 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
|
1627 class AnnotationsSceneLayer::RemoveTracker : public IFlexiblePointerTracker |
1804 | 1628 { |
1629 public: | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1630 RemoveTracker() |
1804 | 1631 { |
1632 } | |
1633 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1634 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1635 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1636 { |
1637 } | |
1638 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1639 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1640 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1641 { |
1642 } | |
1643 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1644 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1645 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1646 { |
1647 } | |
1648 | |
1649 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1650 { | |
1651 return false; | |
1652 } | |
1653 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1654 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1655 { |
1656 } | |
1657 }; | |
1658 | |
1659 | |
1660 void AnnotationsSceneLayer::AddAnnotation(Annotation* annotation) | |
1661 { | |
1662 assert(annotation != NULL); | |
1663 assert(annotations_.find(annotation) == annotations_.end()); | |
1664 annotations_.insert(annotation); | |
1665 } | |
1666 | |
1667 | |
1668 void AnnotationsSceneLayer::DeleteAnnotation(Annotation* annotation) | |
1669 { | |
1670 if (annotation != NULL) | |
1671 { | |
1672 assert(annotations_.find(annotation) != annotations_.end()); | |
1673 annotations_.erase(annotation); | |
1674 delete annotation; | |
1675 } | |
1676 } | |
1677 | |
1678 | |
1679 void AnnotationsSceneLayer::DeletePrimitive(GeometricPrimitive* primitive) | |
1680 { | |
1681 if (primitive != NULL) | |
1682 { | |
1683 assert(primitives_.find(primitive) != primitives_.end()); | |
1684 primitives_.erase(primitive); | |
1685 delete primitive; | |
1686 } | |
1687 } | |
1688 | |
1689 | |
1690 void AnnotationsSceneLayer::TagSubLayerToRemove(size_t subLayerIndex) | |
1691 { | |
1692 assert(subLayersToRemove_.find(subLayerIndex) == subLayersToRemove_.end()); | |
1693 subLayersToRemove_.insert(subLayerIndex); | |
1694 } | |
1695 | |
1696 | |
1697 AnnotationsSceneLayer::AnnotationsSceneLayer(size_t macroLayerIndex) : | |
1698 activeTool_(Tool_Edit), | |
1699 macroLayerIndex_(macroLayerIndex), | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1700 polylineSubLayer_(0), // dummy initialization |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1701 units_(Units_Pixels), |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1702 probedLayer_(0) |
1804 | 1703 { |
1704 } | |
1705 | |
1706 | |
1707 void AnnotationsSceneLayer::Clear() | |
1708 { | |
1709 for (Annotations::iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1710 { | |
1711 assert(*it != NULL); | |
1712 delete *it; | |
1713 } | |
1714 | |
1715 annotations_.clear(); | |
1812
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
1716 |
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
1717 ClearHover(); |
1804 | 1718 } |
1719 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1720 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1721 void AnnotationsSceneLayer::SetUnits(Units units) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1722 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1723 if (units_ != units) |
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 Clear(); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1726 units_ = units; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1727 } |
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 |
1804 | 1730 |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1731 void AnnotationsSceneLayer::AddSegmentAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1732 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1733 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1734 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
|
1735 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1736 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1737 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1738 void AnnotationsSceneLayer::AddCircleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1739 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1740 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1741 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
|
1742 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1743 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1744 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1745 void AnnotationsSceneLayer::AddAngleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1746 const ScenePoint2D& p2, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1747 const ScenePoint2D& p3) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1748 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1749 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
|
1750 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1751 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
1752 |
1804 | 1753 void AnnotationsSceneLayer::Render(Scene2D& scene) |
1754 { | |
1977 | 1755 // First, update the probes |
1756 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1757 { | |
1758 assert(*it != NULL); | |
1759 (*it)->UpdateProbe(scene); | |
1760 } | |
1761 | |
1804 | 1762 MacroSceneLayer* macro = NULL; |
1763 | |
1764 if (scene.HasLayer(macroLayerIndex_)) | |
1765 { | |
1766 macro = &dynamic_cast<MacroSceneLayer&>(scene.GetLayer(macroLayerIndex_)); | |
1767 } | |
1768 else | |
1769 { | |
1770 macro = &dynamic_cast<MacroSceneLayer&>(scene.SetLayer(macroLayerIndex_, new MacroSceneLayer)); | |
1771 polylineSubLayer_ = macro->AddLayer(new PolylineSceneLayer); | |
1772 } | |
1773 | |
1774 for (SubLayers::const_iterator it = subLayersToRemove_.begin(); it != subLayersToRemove_.end(); ++it) | |
1775 { | |
1776 assert(macro->HasLayer(*it)); | |
1777 macro->DeleteLayer(*it); | |
1778 } | |
1779 | |
1780 subLayersToRemove_.clear(); | |
1781 | |
1782 std::unique_ptr<PolylineSceneLayer> polyline(new PolylineSceneLayer); | |
1783 | |
1784 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1785 { | |
1786 assert(*it != NULL); | |
1787 GeometricPrimitive& primitive = **it; | |
1788 | |
1789 primitive.RenderPolylineLayer(*polyline, scene); | |
1790 | |
1791 if (primitive.IsModified()) | |
1792 { | |
1793 primitive.RenderOtherLayers(*macro, scene); | |
1794 primitive.SetModified(false); | |
1795 } | |
1796 } | |
1797 | |
1798 macro->UpdateLayer(polylineSubLayer_, polyline.release()); | |
1799 } | |
1800 | |
1801 | |
1802 bool AnnotationsSceneLayer::ClearHover() | |
1803 { | |
1804 bool needsRefresh = false; | |
1805 | |
1806 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1807 { | |
1808 assert(*it != NULL); | |
1809 if ((*it)->IsHover()) | |
1810 { | |
1811 (*it)->SetHover(false); | |
1812 needsRefresh = true; | |
1813 } | |
1814 } | |
1815 | |
1816 return needsRefresh; | |
1817 } | |
1818 | |
1819 | |
1820 bool AnnotationsSceneLayer::SetMouseHover(const ScenePoint2D& p, | |
1821 const Scene2D& scene) | |
1822 { | |
1823 if (activeTool_ == Tool_None) | |
1824 { | |
1825 return ClearHover(); | |
1826 } | |
1827 else | |
1828 { | |
1829 bool needsRefresh = false; | |
1830 | |
1831 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
1832 | |
1833 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1834 { | |
1835 assert(*it != NULL); | |
1836 bool hover = (*it)->IsHit(s, scene); | |
1837 | |
1838 if ((*it)->IsHover() != hover) | |
1839 { | |
1840 needsRefresh = true; | |
1841 } | |
1842 | |
1843 (*it)->SetHover(hover); | |
1844 } | |
1845 | |
1846 return needsRefresh; | |
1847 } | |
1848 } | |
1849 | |
1850 | |
1851 IFlexiblePointerTracker* AnnotationsSceneLayer::CreateTracker(const ScenePoint2D& p, | |
1852 const Scene2D& scene) | |
1853 { | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1854 /** |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1855 * 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
|
1856 **/ |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1857 |
1804 | 1858 if (activeTool_ == Tool_None) |
1859 { | |
1860 return NULL; | |
1861 } | |
1862 else | |
1863 { | |
1864 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
1865 | |
1866 GeometricPrimitive* bestHit = NULL; | |
1867 | |
1868 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
1869 { | |
1870 assert(*it != NULL); | |
1871 if ((*it)->IsHit(s, scene)) | |
1872 { | |
1873 if (bestHit == NULL || | |
1874 bestHit->GetDepth() > (*it)->GetDepth()) | |
1875 { | |
1876 bestHit = *it; | |
1877 } | |
1878 } | |
1879 } | |
1880 | |
1881 if (bestHit != NULL) | |
1882 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1883 if (activeTool_ == Tool_Remove) |
1804 | 1884 { |
1885 DeleteAnnotation(&bestHit->GetParentAnnotation()); | |
1886 BroadcastMessage(AnnotationRemovedMessage(*this)); | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1887 return new RemoveTracker; |
1804 | 1888 } |
1889 else | |
1890 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1891 return new EditPrimitiveTracker(*this, *bestHit, s, scene.GetCanvasToSceneTransform()); |
1804 | 1892 } |
1893 } | |
1894 else | |
1895 { | |
1896 switch (activeTool_) | |
1897 { | |
1898 case Tool_Segment: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1899 return new CreateSegmentOrCircleTracker(*this, units_, false /* segment */, s, scene.GetCanvasToSceneTransform()); |
1804 | 1900 |
1901 case Tool_Circle: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1902 return new CreateSegmentOrCircleTracker(*this, units_, true /* circle */, s, scene.GetCanvasToSceneTransform()); |
1804 | 1903 |
1904 case Tool_Angle: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1905 return new CreateAngleTracker(*this, units_, s, scene.GetCanvasToSceneTransform()); |
1804 | 1906 |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1907 case Tool_PixelProbe: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1908 return new CreatePixelProbeTracker(*this, units_, s, scene, probedLayer_); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1909 |
1804 | 1910 default: |
1911 return NULL; | |
1912 } | |
1913 } | |
1914 } | |
1915 } | |
1916 | |
1917 | |
1918 void AnnotationsSceneLayer::Serialize(Json::Value& target) const | |
1919 { | |
1920 Json::Value annotations = Json::arrayValue; | |
1921 | |
1922 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
1923 { | |
1924 assert(*it != NULL); | |
1925 | |
1926 Json::Value item; | |
1927 (*it)->Serialize(item); | |
1928 annotations.append(item); | |
1929 } | |
1930 | |
1931 target = Json::objectValue; | |
1932 target[KEY_ANNOTATIONS] = annotations; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1933 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1934 switch (units_) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1935 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1936 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1937 target[KEY_UNITS] = VALUE_MILLIMETERS; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1938 break; |
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_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1941 target[KEY_UNITS] = VALUE_PIXELS; |
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 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1945 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1946 } |
1804 | 1947 } |
1948 | |
1949 | |
1950 void AnnotationsSceneLayer::Unserialize(const Json::Value& serialized) | |
1951 { | |
1952 Clear(); | |
1953 | |
1954 if (serialized.type() != Json::objectValue || | |
1955 !serialized.isMember(KEY_ANNOTATIONS) || | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1956 !serialized.isMember(KEY_UNITS) || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1957 serialized[KEY_ANNOTATIONS].type() != Json::arrayValue || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1958 serialized[KEY_UNITS].type() != Json::stringValue) |
1804 | 1959 { |
1960 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize a set of annotations"); | |
1961 } | |
1962 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1963 const std::string& u = serialized[KEY_UNITS].asString(); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1964 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1965 if (u == VALUE_MILLIMETERS) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1966 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1967 units_ = Units_Millimeters; |
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 else if (u == VALUE_PIXELS) |
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_Pixels; |
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 |
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 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
|
1976 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1977 |
1804 | 1978 const Json::Value& annotations = serialized[KEY_ANNOTATIONS]; |
1979 | |
1980 for (Json::Value::ArrayIndex i = 0; i < annotations.size(); i++) | |
1981 { | |
1982 if (annotations[i].type() != Json::objectValue || | |
1983 !annotations[i].isMember(KEY_TYPE) || | |
1984 annotations[i][KEY_TYPE].type() != Json::stringValue) | |
1985 { | |
1986 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
1987 } | |
1988 | |
1989 const std::string& type = annotations[i][KEY_TYPE].asString(); | |
1990 | |
1991 if (type == VALUE_ANGLE) | |
1992 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1993 AngleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 1994 } |
1995 else if (type == VALUE_CIRCLE) | |
1996 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1997 CircleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 1998 } |
1999 else if (type == VALUE_SEGMENT) | |
2000 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2001 SegmentAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2002 } |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2003 else if (type == VALUE_PIXEL_PROBE) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2004 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2005 PixelProbeAnnotation::Unserialize(*this, units_, probedLayer_, annotations[i]); |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2006 } |
1804 | 2007 else |
2008 { | |
2009 LOG(ERROR) << "Cannot unserialize unknown type of annotation: " << type; | |
2010 } | |
2011 } | |
2012 } | |
2013 } |