Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp @ 1985:bb307007f8e2
improved interaction with rectangle probes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 31 Oct 2022 15:01:09 +0100 |
parents | 187a261d7ae2 |
children | e29783c92419 |
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(); |
1985
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1677 |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1678 const double y2 = y1 + handle2_.GetCenter().GetY() - handle1_.GetCenter().GetY(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1679 //const double y2 = handle2_.GetCenter().GetY(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1680 |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1681 handle1_.SetCenter(x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1682 handle2_.SetCenter(x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1683 segment2_.SetPosition(x2, y1, x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1684 segment3_.SetPosition(x2, y2, x1, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1685 segment4_.SetPosition(x1, y2, x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1686 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1687 else if (&primitive == &segment2_) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1688 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1689 const double y1 = segment2_.GetPosition1().GetY(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1690 const double x2 = segment2_.GetPosition2().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1691 const double y2 = segment2_.GetPosition2().GetY(); |
1985
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1692 |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1693 const double x1 = x2 + handle1_.GetCenter().GetX() - handle2_.GetCenter().GetX(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1694 //const double x1 = handle1_.GetCenter().GetX(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1695 |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1696 handle1_.SetCenter(x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1697 handle2_.SetCenter(x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1698 segment1_.SetPosition(x1, y1, x2, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1699 segment3_.SetPosition(x2, y2, x1, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1700 segment4_.SetPosition(x1, y2, x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1701 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1702 else if (&primitive == &segment3_) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1703 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1704 const double x1 = segment3_.GetPosition2().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1705 const double x2 = segment3_.GetPosition1().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1706 const double y2 = segment3_.GetPosition2().GetY(); |
1985
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1707 |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1708 const double y1 = y2 + handle1_.GetCenter().GetY() - handle2_.GetCenter().GetY(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1709 //const double y1 = handle1_.GetCenter().GetY(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1710 |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1711 handle1_.SetCenter(x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1712 handle2_.SetCenter(x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1713 segment1_.SetPosition(x1, y1, x2, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1714 segment2_.SetPosition(x2, y1, x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1715 segment4_.SetPosition(x1, y2, x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1716 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1717 else if (&primitive == &segment4_) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1718 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1719 const double x1 = segment4_.GetPosition2().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1720 const double y1 = segment4_.GetPosition2().GetY(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1721 const double y2 = segment4_.GetPosition1().GetY(); |
1985
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1722 |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1723 const double x2 = x1 + handle2_.GetCenter().GetX() - handle1_.GetCenter().GetX(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1724 //const double x2 = handle2_.GetCenter().GetX(); |
bb307007f8e2
improved interaction with rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1984
diff
changeset
|
1725 |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1726 handle1_.SetCenter(x1, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1727 handle2_.SetCenter(x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1728 segment1_.SetPosition(x1, y1, x2, y1); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1729 segment2_.SetPosition(x2, y1, x2, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1730 segment3_.SetPosition(x2, y2, x1, y2); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1731 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1732 else |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1733 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1734 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1735 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1736 |
1984
187a261d7ae2
computation of mean and stddev in rectangle probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1983
diff
changeset
|
1737 TagProbeAsChanged(); |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1738 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1739 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1740 virtual void Serialize(Json::Value& target) ORTHANC_OVERRIDE |
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 target = Json::objectValue; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1743 target[KEY_TYPE] = VALUE_RECTANGLE_PROBE; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1744 target[KEY_X1] = handle1_.GetCenter().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1745 target[KEY_Y1] = handle1_.GetCenter().GetY(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1746 target[KEY_X2] = handle2_.GetCenter().GetX(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1747 target[KEY_Y2] = handle2_.GetCenter().GetY(); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1748 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1749 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1750 static void Unserialize(AnnotationsSceneLayer& target, |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1751 Units units, |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1752 const Json::Value& source) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1753 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1754 if (source.isMember(KEY_X1) && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1755 source.isMember(KEY_Y1) && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1756 source.isMember(KEY_X2) && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1757 source.isMember(KEY_Y2) && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1758 source[KEY_X1].isNumeric() && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1759 source[KEY_Y1].isNumeric() && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1760 source[KEY_X2].isNumeric() && |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1761 source[KEY_Y2].isNumeric()) |
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 new RectangleProbeAnnotation(target, units, |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1764 ScenePoint2D(source[KEY_X1].asDouble(), source[KEY_Y1].asDouble()), |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1765 ScenePoint2D(source[KEY_X2].asDouble(), source[KEY_Y2].asDouble())); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1766 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1767 else |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1768 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1769 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
|
1770 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1771 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1772 }; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1773 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1774 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1775 class AnnotationsSceneLayer::CreateTwoHandlesTracker : public IFlexiblePointerTracker |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1776 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1777 private: |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1778 AnnotationsSceneLayer& layer_; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1779 Annotation* annotation_; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1780 AffineTransform2D canvasToScene_; |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1781 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1782 public: |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1783 CreateTwoHandlesTracker(Annotation& annotation, |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1784 const AffineTransform2D& canvasToScene) : |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1785 layer_(annotation.GetParentLayer()), |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1786 annotation_(&annotation), |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1787 canvasToScene_(canvasToScene) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1788 { |
1804 | 1789 assert(annotation_ != NULL && |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1790 annotation_->GetHandlesCount() >= 2); |
1804 | 1791 } |
1792 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1793 virtual void PointerMove(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 if (annotation_ != NULL) | |
1797 { | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1798 annotation_->GetHandle(1).SetCenter(event.GetMainPosition().Apply(canvasToScene_)); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1799 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
|
1800 |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1801 layer_.BroadcastMessage(AnnotationChangedMessage(layer_)); |
1804 | 1802 } |
1803 } | |
1804 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1805 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1806 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1807 { |
1808 annotation_ = NULL; // IsAlive() becomes false | |
1809 | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1810 layer_.BroadcastMessage(AnnotationAddedMessage(layer_)); |
1804 | 1811 } |
1812 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1813 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1814 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1815 { |
1816 } | |
1817 | |
1818 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1819 { | |
1820 return (annotation_ != NULL); | |
1821 } | |
1822 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1823 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1824 { |
1825 if (annotation_ != NULL) | |
1826 { | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1827 layer_.DeleteAnnotation(annotation_); |
1804 | 1828 annotation_ = NULL; |
1829 } | |
1830 } | |
1831 }; | |
1832 | |
1833 | |
1834 class AnnotationsSceneLayer::CreateAngleTracker : public IFlexiblePointerTracker | |
1835 { | |
1836 private: | |
1837 AnnotationsSceneLayer& that_; | |
1838 SegmentAnnotation* segment_; | |
1839 AngleAnnotation* angle_; | |
1840 AffineTransform2D canvasToScene_; | |
1841 | |
1842 public: | |
1843 CreateAngleTracker(AnnotationsSceneLayer& that, | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1844 Units units, |
1804 | 1845 const ScenePoint2D& sceneClick, |
1846 const AffineTransform2D& canvasToScene) : | |
1847 that_(that), | |
1848 segment_(NULL), | |
1849 angle_(NULL), | |
1850 canvasToScene_(canvasToScene) | |
1851 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
1852 segment_ = new SegmentAnnotation(that, units, false /* no length label */, sceneClick, sceneClick); |
1804 | 1853 } |
1854 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1855 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1856 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1857 { |
1858 if (segment_ != NULL) | |
1859 { | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1860 segment_->GetHandle(1).SetCenter(event.GetMainPosition().Apply(canvasToScene_)); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1861 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
|
1862 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1863 } |
1864 | |
1865 if (angle_ != NULL) | |
1866 { | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1867 angle_->GetHandle(2).SetCenter(event.GetMainPosition().Apply(canvasToScene_)); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1868 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
|
1869 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1870 } |
1871 } | |
1872 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1873 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1874 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1875 { |
1876 if (segment_ != NULL) | |
1877 { | |
1878 // End of first step: The first segment is available, now create the angle | |
1879 | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1880 angle_ = new AngleAnnotation(that_, segment_->GetUnits(), segment_->GetHandle(0).GetCenter(), |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1881 segment_->GetHandle(1).GetCenter(), |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1882 segment_->GetHandle(1).GetCenter()); |
1804 | 1883 |
1884 that_.DeleteAnnotation(segment_); | |
1885 segment_ = NULL; | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1886 |
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1887 that_.BroadcastMessage(AnnotationChangedMessage(that_)); |
1804 | 1888 } |
1889 else | |
1890 { | |
1891 angle_ = NULL; // IsAlive() becomes false | |
1892 | |
1893 that_.BroadcastMessage(AnnotationAddedMessage(that_)); | |
1894 } | |
1895 } | |
1896 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1897 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1898 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1899 { |
1900 } | |
1901 | |
1902 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1903 { | |
1904 return (segment_ != NULL || | |
1905 angle_ != NULL); | |
1906 } | |
1907 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1908 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1909 { |
1910 if (segment_ != NULL) | |
1911 { | |
1912 that_.DeleteAnnotation(segment_); | |
1913 segment_ = NULL; | |
1914 } | |
1915 | |
1916 if (angle_ != NULL) | |
1917 { | |
1918 that_.DeleteAnnotation(angle_); | |
1919 angle_ = NULL; | |
1920 } | |
1921 } | |
1922 }; | |
1923 | |
1924 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1925 class AnnotationsSceneLayer::CreatePixelProbeTracker : public IFlexiblePointerTracker |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1926 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1927 public: |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1928 CreatePixelProbeTracker(AnnotationsSceneLayer& that, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1929 Units units, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1930 const ScenePoint2D& sceneClick, |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1931 const Scene2D& scene) |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1932 { |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
1933 PixelProbeAnnotation* annotation = new PixelProbeAnnotation(that, units, sceneClick); |
1976
d71acf30970a
fixed serialization of pixel probes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1975
diff
changeset
|
1934 annotation->UpdateProbe(scene); |
1978
95449b0e064a
pixel probe is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1935 that.BroadcastMessage(AnnotationAddedMessage(that)); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1936 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1937 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1938 virtual void PointerMove(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1939 const Scene2D& scene) ORTHANC_OVERRIDE |
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 } |
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 virtual void PointerUp(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1944 const Scene2D& scene) ORTHANC_OVERRIDE |
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 } |
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 virtual void PointerDown(const PointerEvent& event, |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1949 const Scene2D& scene) ORTHANC_OVERRIDE |
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 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1952 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1953 virtual bool IsAlive() const ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1954 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1955 return false; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1956 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1957 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1958 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1959 { |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1960 } |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1961 }; |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1962 |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1963 |
1804 | 1964 // Dummy tracker that is only used for deletion, in order to warn |
1965 // 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
|
1966 class AnnotationsSceneLayer::RemoveTracker : public IFlexiblePointerTracker |
1804 | 1967 { |
1968 public: | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
1969 RemoveTracker() |
1804 | 1970 { |
1971 } | |
1972 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1973 virtual void PointerMove(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1974 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1975 { |
1976 } | |
1977 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1978 virtual void PointerUp(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1979 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1980 { |
1981 } | |
1982 | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1983 virtual void PointerDown(const PointerEvent& event, |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1984 const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1985 { |
1986 } | |
1987 | |
1988 virtual bool IsAlive() const ORTHANC_OVERRIDE | |
1989 { | |
1990 return false; | |
1991 } | |
1992 | |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
1993 virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE |
1804 | 1994 { |
1995 } | |
1996 }; | |
1997 | |
1998 | |
1999 void AnnotationsSceneLayer::AddAnnotation(Annotation* annotation) | |
2000 { | |
2001 assert(annotation != NULL); | |
2002 assert(annotations_.find(annotation) == annotations_.end()); | |
2003 annotations_.insert(annotation); | |
2004 } | |
2005 | |
2006 | |
2007 void AnnotationsSceneLayer::DeleteAnnotation(Annotation* annotation) | |
2008 { | |
2009 if (annotation != NULL) | |
2010 { | |
2011 assert(annotations_.find(annotation) != annotations_.end()); | |
2012 annotations_.erase(annotation); | |
2013 delete annotation; | |
2014 } | |
2015 } | |
2016 | |
2017 | |
2018 void AnnotationsSceneLayer::DeletePrimitive(GeometricPrimitive* primitive) | |
2019 { | |
2020 if (primitive != NULL) | |
2021 { | |
2022 assert(primitives_.find(primitive) != primitives_.end()); | |
2023 primitives_.erase(primitive); | |
2024 delete primitive; | |
2025 } | |
2026 } | |
2027 | |
2028 | |
2029 void AnnotationsSceneLayer::TagSubLayerToRemove(size_t subLayerIndex) | |
2030 { | |
2031 assert(subLayersToRemove_.find(subLayerIndex) == subLayersToRemove_.end()); | |
2032 subLayersToRemove_.insert(subLayerIndex); | |
2033 } | |
2034 | |
2035 | |
2036 AnnotationsSceneLayer::AnnotationsSceneLayer(size_t macroLayerIndex) : | |
2037 activeTool_(Tool_Edit), | |
2038 macroLayerIndex_(macroLayerIndex), | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2039 polylineSubLayer_(0), // dummy initialization |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2040 units_(Units_Pixels), |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2041 probedLayer_(0) |
1804 | 2042 { |
2043 } | |
2044 | |
2045 | |
2046 void AnnotationsSceneLayer::Clear() | |
2047 { | |
2048 for (Annotations::iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
2049 { | |
2050 assert(*it != NULL); | |
2051 delete *it; | |
2052 } | |
2053 | |
2054 annotations_.clear(); | |
1812
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
2055 |
db341679dc9f
ViewerViewport::StoneAnnotationsRegistry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1809
diff
changeset
|
2056 ClearHover(); |
1804 | 2057 } |
2058 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2059 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2060 void AnnotationsSceneLayer::SetUnits(Units units) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2061 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2062 if (units_ != units) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2063 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2064 Clear(); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2065 units_ = units; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2066 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2067 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2068 |
1804 | 2069 |
1806
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2070 void AnnotationsSceneLayer::AddSegmentAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2071 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2072 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2073 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
|
2074 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2075 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2076 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2077 void AnnotationsSceneLayer::AddCircleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2078 const ScenePoint2D& p2) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2079 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2080 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
|
2081 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2082 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2083 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2084 void AnnotationsSceneLayer::AddAngleAnnotation(const ScenePoint2D& p1, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2085 const ScenePoint2D& p2, |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2086 const ScenePoint2D& p3) |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2087 { |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2088 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
|
2089 } |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2090 |
0840a25c6d41
removed hard-coded test in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1804
diff
changeset
|
2091 |
1804 | 2092 void AnnotationsSceneLayer::Render(Scene2D& scene) |
2093 { | |
1977 | 2094 // First, update the probes |
2095 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
2096 { | |
2097 assert(*it != NULL); | |
2098 (*it)->UpdateProbe(scene); | |
2099 } | |
2100 | |
1804 | 2101 MacroSceneLayer* macro = NULL; |
2102 | |
2103 if (scene.HasLayer(macroLayerIndex_)) | |
2104 { | |
2105 macro = &dynamic_cast<MacroSceneLayer&>(scene.GetLayer(macroLayerIndex_)); | |
2106 } | |
2107 else | |
2108 { | |
2109 macro = &dynamic_cast<MacroSceneLayer&>(scene.SetLayer(macroLayerIndex_, new MacroSceneLayer)); | |
2110 polylineSubLayer_ = macro->AddLayer(new PolylineSceneLayer); | |
2111 } | |
2112 | |
2113 for (SubLayers::const_iterator it = subLayersToRemove_.begin(); it != subLayersToRemove_.end(); ++it) | |
2114 { | |
2115 assert(macro->HasLayer(*it)); | |
2116 macro->DeleteLayer(*it); | |
2117 } | |
2118 | |
2119 subLayersToRemove_.clear(); | |
2120 | |
2121 std::unique_ptr<PolylineSceneLayer> polyline(new PolylineSceneLayer); | |
2122 | |
2123 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
2124 { | |
2125 assert(*it != NULL); | |
2126 GeometricPrimitive& primitive = **it; | |
2127 | |
2128 primitive.RenderPolylineLayer(*polyline, scene); | |
2129 | |
2130 if (primitive.IsModified()) | |
2131 { | |
2132 primitive.RenderOtherLayers(*macro, scene); | |
2133 primitive.SetModified(false); | |
2134 } | |
2135 } | |
2136 | |
2137 macro->UpdateLayer(polylineSubLayer_, polyline.release()); | |
2138 } | |
2139 | |
2140 | |
2141 bool AnnotationsSceneLayer::ClearHover() | |
2142 { | |
2143 bool needsRefresh = false; | |
2144 | |
2145 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
2146 { | |
2147 assert(*it != NULL); | |
2148 if ((*it)->IsHover()) | |
2149 { | |
2150 (*it)->SetHover(false); | |
2151 needsRefresh = true; | |
2152 } | |
2153 } | |
2154 | |
2155 return needsRefresh; | |
2156 } | |
2157 | |
2158 | |
2159 bool AnnotationsSceneLayer::SetMouseHover(const ScenePoint2D& p, | |
2160 const Scene2D& scene) | |
2161 { | |
2162 if (activeTool_ == Tool_None) | |
2163 { | |
2164 return ClearHover(); | |
2165 } | |
2166 else | |
2167 { | |
2168 bool needsRefresh = false; | |
2169 | |
2170 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
2171 | |
2172 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
2173 { | |
2174 assert(*it != NULL); | |
2175 bool hover = (*it)->IsHit(s, scene); | |
2176 | |
2177 if ((*it)->IsHover() != hover) | |
2178 { | |
2179 needsRefresh = true; | |
2180 } | |
2181 | |
2182 (*it)->SetHover(hover); | |
2183 } | |
2184 | |
2185 return needsRefresh; | |
2186 } | |
2187 } | |
2188 | |
2189 | |
2190 IFlexiblePointerTracker* AnnotationsSceneLayer::CreateTracker(const ScenePoint2D& p, | |
2191 const Scene2D& scene) | |
2192 { | |
1972
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
2193 /** |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
2194 * 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
|
2195 **/ |
9c0adcc8feec
refactoring to simplify OneGesturePointerTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
2196 |
1804 | 2197 if (activeTool_ == Tool_None) |
2198 { | |
2199 return NULL; | |
2200 } | |
2201 else | |
2202 { | |
2203 const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform()); | |
2204 | |
2205 GeometricPrimitive* bestHit = NULL; | |
2206 | |
2207 for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it) | |
2208 { | |
2209 assert(*it != NULL); | |
2210 if ((*it)->IsHit(s, scene)) | |
2211 { | |
2212 if (bestHit == NULL || | |
2213 bestHit->GetDepth() > (*it)->GetDepth()) | |
2214 { | |
2215 bestHit = *it; | |
2216 } | |
2217 } | |
2218 } | |
2219 | |
2220 if (bestHit != NULL) | |
2221 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
2222 if (activeTool_ == Tool_Remove) |
1804 | 2223 { |
2224 DeleteAnnotation(&bestHit->GetParentAnnotation()); | |
2225 BroadcastMessage(AnnotationRemovedMessage(*this)); | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
2226 return new RemoveTracker; |
1804 | 2227 } |
2228 else | |
2229 { | |
1809
79a5838739a6
starting the integration of AnnotationsSceneLayer into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1806
diff
changeset
|
2230 return new EditPrimitiveTracker(*this, *bestHit, s, scene.GetCanvasToSceneTransform()); |
1804 | 2231 } |
2232 } | |
2233 else | |
2234 { | |
2235 switch (activeTool_) | |
2236 { | |
2237 case Tool_Segment: | |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2238 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2239 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
|
2240 return new CreateTwoHandlesTracker(*annotation, scene.GetCanvasToSceneTransform()); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2241 } |
1804 | 2242 |
2243 case Tool_Circle: | |
1983
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 CircleAnnotation(*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 } |
1804 | 2248 |
2249 case Tool_Angle: | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2250 return new CreateAngleTracker(*this, units_, s, scene.GetCanvasToSceneTransform()); |
1804 | 2251 |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2252 case Tool_PixelProbe: |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2253 return new CreatePixelProbeTracker(*this, units_, s, scene); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2254 |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2255 case Tool_RectangleProbe: |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2256 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2257 Annotation* annotation = new RectangleProbeAnnotation(*this, units_, s, s); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2258 return new CreateTwoHandlesTracker(*annotation, scene.GetCanvasToSceneTransform()); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2259 } |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2260 |
1804 | 2261 default: |
2262 return NULL; | |
2263 } | |
2264 } | |
2265 } | |
2266 } | |
2267 | |
2268 | |
2269 void AnnotationsSceneLayer::Serialize(Json::Value& target) const | |
2270 { | |
2271 Json::Value annotations = Json::arrayValue; | |
2272 | |
2273 for (Annotations::const_iterator it = annotations_.begin(); it != annotations_.end(); ++it) | |
2274 { | |
2275 assert(*it != NULL); | |
2276 | |
2277 Json::Value item; | |
2278 (*it)->Serialize(item); | |
2279 annotations.append(item); | |
2280 } | |
2281 | |
2282 target = Json::objectValue; | |
2283 target[KEY_ANNOTATIONS] = annotations; | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2284 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2285 switch (units_) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2286 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2287 case Units_Millimeters: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2288 target[KEY_UNITS] = VALUE_MILLIMETERS; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2289 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2290 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2291 case Units_Pixels: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2292 target[KEY_UNITS] = VALUE_PIXELS; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2293 break; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2294 |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2295 default: |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2296 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2297 } |
1804 | 2298 } |
2299 | |
2300 | |
2301 void AnnotationsSceneLayer::Unserialize(const Json::Value& serialized) | |
2302 { | |
2303 Clear(); | |
2304 | |
2305 if (serialized.type() != Json::objectValue || | |
2306 !serialized.isMember(KEY_ANNOTATIONS) || | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2307 !serialized.isMember(KEY_UNITS) || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2308 serialized[KEY_ANNOTATIONS].type() != Json::arrayValue || |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2309 serialized[KEY_UNITS].type() != Json::stringValue) |
1804 | 2310 { |
2311 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot unserialize a set of annotations"); | |
2312 } | |
2313 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2314 const std::string& u = serialized[KEY_UNITS].asString(); |
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 if (u == VALUE_MILLIMETERS) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2317 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2318 units_ = Units_Millimeters; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2319 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2320 else if (u == VALUE_PIXELS) |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2321 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2322 units_ = Units_Pixels; |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2323 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2324 else |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2325 { |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2326 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
|
2327 } |
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2328 |
1804 | 2329 const Json::Value& annotations = serialized[KEY_ANNOTATIONS]; |
2330 | |
2331 for (Json::Value::ArrayIndex i = 0; i < annotations.size(); i++) | |
2332 { | |
2333 if (annotations[i].type() != Json::objectValue || | |
2334 !annotations[i].isMember(KEY_TYPE) || | |
2335 annotations[i][KEY_TYPE].type() != Json::stringValue) | |
2336 { | |
2337 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
2338 } | |
2339 | |
2340 const std::string& type = annotations[i][KEY_TYPE].asString(); | |
2341 | |
2342 if (type == VALUE_ANGLE) | |
2343 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2344 AngleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2345 } |
2346 else if (type == VALUE_CIRCLE) | |
2347 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2348 CircleAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2349 } |
2350 else if (type == VALUE_SEGMENT) | |
2351 { | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1819
diff
changeset
|
2352 SegmentAnnotation::Unserialize(*this, units_, annotations[i]); |
1804 | 2353 } |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2354 else if (type == VALUE_PIXEL_PROBE) |
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2355 { |
1983
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2356 PixelProbeAnnotation::Unserialize(*this, units_, annotations[i]); |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2357 } |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2358 else if (type == VALUE_RECTANGLE_PROBE) |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2359 { |
20fa913272b7
drawing rectangle probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
2360 RectangleProbeAnnotation::Unserialize(*this, units_, annotations[i]); |
1975
5a434f5889f8
starting pixel probe
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1972
diff
changeset
|
2361 } |
1804 | 2362 else |
2363 { | |
2364 LOG(ERROR) << "Cannot unserialize unknown type of annotation: " << type; | |
2365 } | |
2366 } | |
2367 } | |
2368 } |