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