Mercurial > hg > orthanc-stone
comparison OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp @ 1789:462d7a0e064e
added line measures to sdl single frame viewer sample
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 17 May 2021 11:55:21 +0200 |
parents | 9ac2a65d4172 |
children | 9b650ab68d4c |
comparison
equal
deleted
inserted
replaced
1788:4fd065ad1fc0 | 1789:462d7a0e064e |
---|---|
116 } | 116 } |
117 | 117 |
118 LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) | 118 LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) |
119 { | 119 { |
120 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); | 120 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); |
121 ViewportController& controller = lock->GetController(); | 121 if (lock.get() != NULL) |
122 const Scene2D& scene = controller.GetScene(); | 122 { |
123 | 123 ViewportController& controller = lock->GetController(); |
124 const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); | 124 const Scene2D& scene = controller.GetScene(); |
125 const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = | 125 |
126 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * | 126 const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); |
127 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; | 127 const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = |
128 | 128 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * |
129 const double sqDistanceFromStart = | 129 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; |
130 ScenePoint2D::SquaredDistancePtPt(p, start_); | 130 |
131 | 131 const double sqDistanceFromStart = |
132 if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 132 ScenePoint2D::SquaredDistancePtPt(p, start_); |
133 return LineHighlightArea_Start; | 133 |
134 | 134 if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) |
135 const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); | 135 return LineHighlightArea_Start; |
136 | 136 |
137 if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 137 const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); |
138 return LineHighlightArea_End; | 138 |
139 | 139 if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) |
140 const double sqDistanceFromPtSegment = | 140 return LineHighlightArea_End; |
141 ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); | 141 |
142 | 142 const double sqDistanceFromPtSegment = |
143 if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 143 ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); |
144 return LineHighlightArea_Segment; | 144 |
145 if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | |
146 return LineHighlightArea_Segment; | |
147 } | |
145 | 148 |
146 return LineHighlightArea_None; | 149 return LineHighlightArea_None; |
147 } | 150 } |
148 | 151 |
149 bool LineMeasureTool::HitTest(ScenePoint2D p) | 152 bool LineMeasureTool::HitTest(ScenePoint2D p) |
152 } | 155 } |
153 | 156 |
154 boost::shared_ptr<IFlexiblePointerTracker> LineMeasureTool::CreateEditionTracker(const PointerEvent& e) | 157 boost::shared_ptr<IFlexiblePointerTracker> LineMeasureTool::CreateEditionTracker(const PointerEvent& e) |
155 { | 158 { |
156 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); | 159 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); |
157 ViewportController& controller = lock->GetController(); | 160 if (lock.get() != NULL) |
158 const Scene2D& scene = controller.GetScene(); | 161 { |
159 | 162 ViewportController& controller = lock->GetController(); |
160 ScenePoint2D scenePos = e.GetMainPosition().Apply( | 163 const Scene2D& scene = controller.GetScene(); |
161 scene.GetCanvasToSceneTransform()); | 164 |
162 | 165 ScenePoint2D scenePos = e.GetMainPosition().Apply( |
163 if (!HitTest(scenePos)) | 166 scene.GetCanvasToSceneTransform()); |
164 return boost::shared_ptr<IFlexiblePointerTracker>(); | 167 |
165 | 168 if (!HitTest(scenePos)) |
166 boost::shared_ptr<EditLineMeasureTracker> editLineMeasureTracker( | 169 return boost::shared_ptr<IFlexiblePointerTracker>(); |
167 new EditLineMeasureTracker(shared_from_this(), viewport_, e)); | 170 |
168 return editLineMeasureTracker; | 171 boost::shared_ptr<EditLineMeasureTracker> editLineMeasureTracker( |
172 new EditLineMeasureTracker(shared_from_this(), viewport_, e)); | |
173 return editLineMeasureTracker; | |
174 } | |
175 else | |
176 { | |
177 return NULL; | |
178 } | |
169 } | 179 } |
170 | 180 |
171 boost::shared_ptr<MeasureToolMemento> LineMeasureTool::GetMemento() const | 181 boost::shared_ptr<MeasureToolMemento> LineMeasureTool::GetMemento() const |
172 { | 182 { |
173 boost::shared_ptr<LineMeasureToolMemento> memento(new LineMeasureToolMemento()); | 183 boost::shared_ptr<LineMeasureToolMemento> memento(new LineMeasureToolMemento()); |