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();