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