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