Mercurial > hg > orthanc-stone
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 |