Mercurial > hg > orthanc-stone
comparison Samples/Common/MeasureTools.cpp @ 644:f939f449482c
Ongoing tracker work.
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Fri, 10 May 2019 16:15:55 +0200 |
parents | 6a144a45b2d8 |
children | 1e9ed656318e |
comparison
equal
deleted
inserted
replaced
634:6a144a45b2d8 | 644:f939f449482c |
---|---|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | 19 **/ |
20 | 20 |
21 #include <Core/Logging.h> | 21 #include <Core/Logging.h> |
22 #include "MeasureTools.h" | 22 #include "MeasureTools.h" |
23 #include <boost/math/constants/constants.hpp> | |
23 | 24 |
24 namespace OrthancStone | 25 namespace OrthancStone |
25 { | 26 { |
26 void MeasureTool::Enable() | 27 void MeasureTool::Enable() |
27 { | 28 { |
90 TextSceneLayer* concreteLayer = dynamic_cast<TextSceneLayer*>(layer); | 91 TextSceneLayer* concreteLayer = dynamic_cast<TextSceneLayer*>(layer); |
91 assert(concreteLayer != NULL); | 92 assert(concreteLayer != NULL); |
92 return concreteLayer; | 93 return concreteLayer; |
93 } | 94 } |
94 | 95 |
96 namespace | |
97 { | |
98 /** | |
99 This function will create a square around the center point supplied in | |
100 scene coordinates, with a side length given in canvas coordinates. The | |
101 square sides are parallel to the canvas boundaries. | |
102 */ | |
103 void AddSquare(PolylineSceneLayer::Chain& chain, | |
104 const Scene2D& scene, | |
105 const ScenePoint2D& centerS, | |
106 const double& sideLength) | |
107 { | |
108 chain.clear(); | |
109 chain.reserve(4); | |
110 ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); | |
111 //TODO: take DPI into account | |
112 double handleLX = centerC.GetX() - sideLength / 2; | |
113 double handleTY = centerC.GetY() - sideLength / 2; | |
114 double handleRX = centerC.GetX() + sideLength / 2; | |
115 double handleBY = centerC.GetY() + sideLength / 2; | |
116 ScenePoint2D LTC(handleLX, handleTY); | |
117 ScenePoint2D RTC(handleRX, handleTY); | |
118 ScenePoint2D RBC(handleRX, handleBY); | |
119 ScenePoint2D LBC(handleLX, handleBY); | |
120 | |
121 ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); | |
122 ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); | |
123 ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); | |
124 ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); | |
125 | |
126 chain.push_back(startLT); | |
127 chain.push_back(startRT); | |
128 chain.push_back(startRB); | |
129 chain.push_back(startLB); | |
130 } | |
131 | |
132 void AddCircle(PolylineSceneLayer::Chain& chain, | |
133 const Scene2D& scene, | |
134 const ScenePoint2D& centerS, | |
135 const double& radiusS) | |
136 { | |
137 chain.clear(); | |
138 chain.reserve(4); | |
139 //ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); | |
140 //TODO: take DPI into account | |
141 | |
142 // TODO: automatically compute the number for segments for smooth | |
143 // display based on the radius in pixels. | |
144 int lineCount = 50; | |
145 | |
146 double angleIncr = (2.0 * boost::math::constants::pi<double>()) | |
147 / static_cast<double>(lineCount); | |
148 | |
149 double theta = 0; | |
150 for (int i = 0; i < lineCount; ++i) | |
151 { | |
152 double offsetX = radiusS * cos(theta); | |
153 double offsetY = radiusS * sin(theta); | |
154 double pointX = centerS.GetX() + offsetX; | |
155 double pointY = centerS.GetY() + offsetY; | |
156 chain.push_back(ScenePoint2D(pointX, pointY)); | |
157 theta += angleIncr; | |
158 } | |
159 } | |
160 | |
161 #if 0 | |
162 void AddEllipse(PolylineSceneLayer::Chain& chain, | |
163 const Scene2D& scene, | |
164 const ScenePoint2D& centerS, | |
165 const double& halfHAxis, | |
166 const double& halfVAxis) | |
167 { | |
168 chain.clear(); | |
169 chain.reserve(4); | |
170 ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); | |
171 //TODO: take DPI into account | |
172 double handleLX = centerC.GetX() - sideLength / 2; | |
173 double handleTY = centerC.GetY() - sideLength / 2; | |
174 double handleRX = centerC.GetX() + sideLength / 2; | |
175 double handleBY = centerC.GetY() + sideLength / 2; | |
176 ScenePoint2D LTC(handleLX, handleTY); | |
177 ScenePoint2D RTC(handleRX, handleTY); | |
178 ScenePoint2D RBC(handleRX, handleBY); | |
179 ScenePoint2D LBC(handleLX, handleBY); | |
180 | |
181 ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); | |
182 ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); | |
183 ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); | |
184 ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); | |
185 | |
186 chain.push_back(startLT); | |
187 chain.push_back(startRT); | |
188 chain.push_back(startRB); | |
189 chain.push_back(startLB); | |
190 } | |
191 #endif | |
192 | |
193 | |
194 } | |
195 | |
196 | |
95 void LineMeasureTool::RefreshScene() | 197 void LineMeasureTool::RefreshScene() |
96 { | 198 { |
97 if (IsEnabled()) | 199 if (IsEnabled()) |
98 { | 200 { |
99 if (!layersCreated) | 201 if (!layersCreated) |
101 // Create the layers if need be | 203 // Create the layers if need be |
102 | 204 |
103 assert(textZIndex_ == -1); | 205 assert(textZIndex_ == -1); |
104 { | 206 { |
105 polylineZIndex_ = GetScene().GetMaxDepth() + 100; | 207 polylineZIndex_ = GetScene().GetMaxDepth() + 100; |
106 LOG(INFO) << "set polylineZIndex_ to: " << polylineZIndex_; | 208 //LOG(INFO) << "set polylineZIndex_ to: " << polylineZIndex_; |
107 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer()); | 209 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer()); |
108 GetScene().SetLayer(polylineZIndex_, layer.release()); | 210 GetScene().SetLayer(polylineZIndex_, layer.release()); |
109 } | 211 } |
110 { | 212 { |
111 textZIndex_ = GetScene().GetMaxDepth() + 100; | 213 textZIndex_ = GetScene().GetMaxDepth() + 100; |
112 LOG(INFO) << "set textZIndex_ to: " << textZIndex_; | 214 //LOG(INFO) << "set textZIndex_ to: " << textZIndex_; |
113 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer()); | 215 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer()); |
114 GetScene().SetLayer(textZIndex_, layer.release()); | 216 GetScene().SetLayer(textZIndex_, layer.release()); |
115 } | 217 } |
116 layersCreated = true; | 218 layersCreated = true; |
117 } | 219 } |
134 polylineLayer->AddChain(chain, false); | 236 polylineLayer->AddChain(chain, false); |
135 } | 237 } |
136 | 238 |
137 // handles | 239 // handles |
138 { | 240 { |
139 ScenePoint2D startC = start_.Apply(GetScene().GetSceneToCanvasTransform()); | 241 //void AddSquare(PolylineSceneLayer::Chain& chain,const Scene2D& scene,const ScenePoint2D& centerS,const double& sideLength) |
140 double squareSize = 10.0; //TODO: take DPI into account | 242 |
141 double startHandleLX = startC.GetX() - squareSize/2; | 243 { |
142 double startHandleTY = startC.GetY() - squareSize / 2; | 244 PolylineSceneLayer::Chain chain; |
143 double startHandleRX = startC.GetX() + squareSize / 2; | 245 AddSquare(chain, GetScene(), start_, 10.0); //TODO: take DPI into account |
144 double startHandleBY = startC.GetY() + squareSize / 2; | 246 polylineLayer->AddChain(chain, true); |
145 ScenePoint2D startLTC(startHandleLX, startHandleTY); | 247 } |
146 ScenePoint2D startRTC(startHandleRX, startHandleTY); | 248 |
147 ScenePoint2D startRBC(startHandleRX, startHandleBY); | 249 { |
148 ScenePoint2D startLBC(startHandleLX, startHandleBY); | 250 PolylineSceneLayer::Chain chain; |
149 | 251 AddSquare(chain, GetScene(), end_, 10.0); //TODO: take DPI into account |
150 ScenePoint2D startLT = startLTC.Apply(GetScene().GetCanvasToSceneTransform()); | 252 polylineLayer->AddChain(chain, true); |
151 ScenePoint2D startRT = startRTC.Apply(GetScene().GetCanvasToSceneTransform()); | 253 } |
152 ScenePoint2D startRB = startRBC.Apply(GetScene().GetCanvasToSceneTransform()); | 254 |
153 ScenePoint2D startLB = startLBC.Apply(GetScene().GetCanvasToSceneTransform()); | 255 //ScenePoint2D startC = start_.Apply(GetScene().GetSceneToCanvasTransform()); |
154 | 256 //double squareSize = 10.0; |
155 PolylineSceneLayer::Chain chain; | 257 //double startHandleLX = startC.GetX() - squareSize/2; |
156 chain.push_back(startLT); | 258 //double startHandleTY = startC.GetY() - squareSize / 2; |
157 chain.push_back(startRT); | 259 //double startHandleRX = startC.GetX() + squareSize / 2; |
158 chain.push_back(startRB); | 260 //double startHandleBY = startC.GetY() + squareSize / 2; |
159 chain.push_back(startLB); | 261 //ScenePoint2D startLTC(startHandleLX, startHandleTY); |
160 polylineLayer->AddChain(chain, true); | 262 //ScenePoint2D startRTC(startHandleRX, startHandleTY); |
263 //ScenePoint2D startRBC(startHandleRX, startHandleBY); | |
264 //ScenePoint2D startLBC(startHandleLX, startHandleBY); | |
265 | |
266 //ScenePoint2D startLT = startLTC.Apply(GetScene().GetCanvasToSceneTransform()); | |
267 //ScenePoint2D startRT = startRTC.Apply(GetScene().GetCanvasToSceneTransform()); | |
268 //ScenePoint2D startRB = startRBC.Apply(GetScene().GetCanvasToSceneTransform()); | |
269 //ScenePoint2D startLB = startLBC.Apply(GetScene().GetCanvasToSceneTransform()); | |
270 | |
271 //PolylineSceneLayer::Chain chain; | |
272 //chain.push_back(startLT); | |
273 //chain.push_back(startRT); | |
274 //chain.push_back(startRB); | |
275 //chain.push_back(startLB); | |
276 //polylineLayer->AddChain(chain, true); | |
161 } | 277 } |
162 | 278 |
163 | |
164 | |
165 } | 279 } |
166 { | 280 { |
167 // Set the text layer proporeties | 281 // Set the text layer proporeties |
168 | 282 |
169 TextSceneLayer* textLayer = GetTextLayer(); | 283 TextSceneLayer* textLayer = GetTextLayer(); |