comparison Framework/Scene2DViewport/AngleMeasureTool.cpp @ 865:a29c13497557

Added operators to ScenePoint2D + highlight support on MouseOver for measuring tools
author Benjamin Golinvaux <bgo@osimis.io>
date Tue, 25 Jun 2019 15:24:13 +0200
parents 2fd96a637a59
children c71ef52602a0
comparison
equal deleted inserted replaced
864:ae3eccd0f545 865:a29c13497557
41 // layers 41 // layers
42 AngleMeasureTool::AngleMeasureTool( 42 AngleMeasureTool::AngleMeasureTool(
43 MessageBroker& broker, boost::weak_ptr<ViewportController> controllerW) 43 MessageBroker& broker, boost::weak_ptr<ViewportController> controllerW)
44 : MeasureTool(broker, controllerW) 44 : MeasureTool(broker, controllerW)
45 , layerHolder_(boost::make_shared<LayerHolder>(controllerW,1,5)) 45 , layerHolder_(boost::make_shared<LayerHolder>(controllerW,1,5))
46 , angleHighlightArea_(AngleHighlightArea_None)
46 { 47 {
47 48
48 } 49 }
49 50
50 AngleMeasureTool::~AngleMeasureTool() 51 AngleMeasureTool::~AngleMeasureTool()
73 { 74 {
74 side2End_ = pt; 75 side2End_ = pt;
75 RefreshScene(); 76 RefreshScene();
76 } 77 }
77 78
79 void AngleMeasureTool::SetAngleHighlightArea(AngleHighlightArea area)
80 {
81 if (angleHighlightArea_ != area)
82 {
83 angleHighlightArea_ = area;
84 RefreshScene();
85 }
86 }
87
88 void AngleMeasureTool::ResetHighlightState()
89 {
90 SetAngleHighlightArea(AngleHighlightArea_None);
91 }
92
93 void AngleMeasureTool::Highlight(ScenePoint2D p)
94 {
95 AngleHighlightArea angleHighlightArea = AngleHitTest(p);
96 SetAngleHighlightArea(angleHighlightArea);
97 }
98
99 AngleMeasureTool::AngleHighlightArea AngleMeasureTool::AngleHitTest(ScenePoint2D p) const
100 {
101 const double pixelToScene =
102 GetScene()->GetCanvasToSceneTransform().ComputeZoom();
103 const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD;
104
105 {
106 const double sqDistanceFromSide1End = ScenePoint2D::SquaredDistancePtPt(p, side1End_);
107 if (sqDistanceFromSide1End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD)
108 return AngleHighlightArea_Side1End;
109 }
110
111 {
112 const double sqDistanceFromSide2End = ScenePoint2D::SquaredDistancePtPt(p, side2End_);
113 if (sqDistanceFromSide2End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD)
114 return AngleHighlightArea_Side2End;
115 }
116
117 {
118 const double sqDistanceFromCenter = ScenePoint2D::SquaredDistancePtPt(p, center_);
119 if (sqDistanceFromCenter <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD)
120 return AngleHighlightArea_Center;
121 }
122
123 {
124 const double sqDistanceFromSide1 = ScenePoint2D::SquaredDistancePtSegment(center_, side1End_, p);
125 if (sqDistanceFromSide1 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD)
126 return AngleHighlightArea_Side1;
127 }
128
129 {
130 const double sqDistanceFromSide2 = ScenePoint2D::SquaredDistancePtSegment(center_, side2End_, p);
131 if (sqDistanceFromSide2 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD)
132 return AngleHighlightArea_Side2;
133 }
134
135 return AngleHighlightArea_None;
136 }
78 137
79 bool AngleMeasureTool::HitTest(ScenePoint2D p) const 138 bool AngleMeasureTool::HitTest(ScenePoint2D p) const
80 { 139 {
81 throw std::logic_error("The method or operation is not implemented."); 140 return AngleHitTest(p) != AngleHighlightArea_None;
82 } 141 }
83 142
84 void AngleMeasureTool::SetCenter(ScenePoint2D pt) 143 void AngleMeasureTool::SetCenter(ScenePoint2D pt)
85 { 144 {
86 center_ = pt; 145 center_ = pt;
99 { 158 {
100 // Fill the polyline layer with the measurement lines 159 // Fill the polyline layer with the measurement lines
101 PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); 160 PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0);
102 polylineLayer->ClearAllChains(); 161 polylineLayer->ClearAllChains();
103 162
104 const Color color(0, 183, 17); 163 const Color color(TOOL_ANGLE_LINES_COLOR_RED, TOOL_ANGLE_LINES_COLOR_GREEN, TOOL_ANGLE_LINES_COLOR_BLUE);
164 const Color highlightColor(TOOL_ANGLE_LINES_HL_COLOR_RED, TOOL_ANGLE_LINES_HL_COLOR_GREEN, TOOL_ANGLE_LINES_HL_COLOR_BLUE);
105 165
106 // sides 166 // sides
107 { 167 {
108 { 168 {
109 PolylineSceneLayer::Chain chain; 169 PolylineSceneLayer::Chain chain;
110 chain.push_back(side1End_); 170 chain.push_back(side1End_);
111 chain.push_back(center_); 171 chain.push_back(center_);
112 polylineLayer->AddChain(chain, false, color); 172
173 if ((angleHighlightArea_ == AngleHighlightArea_Side1) || (angleHighlightArea_ == AngleHighlightArea_Side2))
174 polylineLayer->AddChain(chain, false, highlightColor);
175 else
176 polylineLayer->AddChain(chain, false, color);
113 } 177 }
114 { 178 {
115 PolylineSceneLayer::Chain chain; 179 PolylineSceneLayer::Chain chain;
116 chain.push_back(side2End_); 180 chain.push_back(side2End_);
117 chain.push_back(center_); 181 chain.push_back(center_);
118 polylineLayer->AddChain(chain, false, color); 182 if ((angleHighlightArea_ == AngleHighlightArea_Side1) || (angleHighlightArea_ == AngleHighlightArea_Side2))
183 polylineLayer->AddChain(chain, false, highlightColor);
184 else
185 polylineLayer->AddChain(chain, false, color);
119 } 186 }
120 } 187 }
121 188
122 // Create the handles 189 // Create the handles
123 { 190 {
124 { 191 {
125 PolylineSceneLayer::Chain chain; 192 PolylineSceneLayer::Chain chain;
126 //TODO: take DPI into account 193 //TODO: take DPI into account
127 AddSquare(chain, GetScene(), side1End_, 194 AddSquare(chain, GetScene(), side1End_,
128 GetController()->GetHandleSideLengthS()); 195 GetController()->GetHandleSideLengthS());
129 polylineLayer->AddChain(chain, true, color); 196
197 if (angleHighlightArea_ == AngleHighlightArea_Side1End)
198 polylineLayer->AddChain(chain, true, highlightColor);
199 else
200 polylineLayer->AddChain(chain, true, color);
201
130 } 202 }
131 { 203 {
132 PolylineSceneLayer::Chain chain; 204 PolylineSceneLayer::Chain chain;
133 //TODO: take DPI into account 205 //TODO: take DPI into account
134 AddSquare(chain, GetScene(), side2End_, 206 AddSquare(chain, GetScene(), side2End_,
135 GetController()->GetHandleSideLengthS()); 207 GetController()->GetHandleSideLengthS());
136 polylineLayer->AddChain(chain, true, color); 208
209 if (angleHighlightArea_ == AngleHighlightArea_Side2End)
210 polylineLayer->AddChain(chain, true, highlightColor);
211 else
212 polylineLayer->AddChain(chain, true, color);
137 } 213 }
138 } 214 }
139 215
140 // Create the arc 216 // Create the arc
141 { 217 {
142 PolylineSceneLayer::Chain chain; 218 PolylineSceneLayer::Chain chain;
143 219
144 AddShortestArc(chain, side1End_, center_, side2End_, 220 AddShortestArc(chain, side1End_, center_, side2End_,
145 controller->GetAngleToolArcRadiusS()); 221 controller->GetAngleToolArcRadiusS());
146 polylineLayer->AddChain(chain, false, color); 222 if (angleHighlightArea_ == AngleHighlightArea_Center)
223 polylineLayer->AddChain(chain, false, highlightColor);
224 else
225 polylineLayer->AddChain(chain, false, color);
147 } 226 }
148 } 227 }
149 { 228 {
150 // Set the text layer 229 // Set the text layer
151 230