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