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