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