Skip to content

Commit 5d70c8a

Browse files
committed
qgs3dmaptoolmeasureline: Add support for snapping
1 parent 78ace0f commit 5d70c8a

File tree

3 files changed

+28
-30
lines changed

3 files changed

+28
-30
lines changed

src/app/3d/qgs3dmapcanvaswidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ Qgs3DMapCanvasWidget::Qgs3DMapCanvasWidget( const QString &name, bool isDocked )
371371

372372
mMapToolIdentify = new Qgs3DMapToolIdentify( mCanvas );
373373

374-
mMapToolMeasureLine = new Qgs3DMapToolMeasureLine( mCanvas );
374+
mMapToolMeasureLine = new Qgs3DMapToolMeasureLine( mCanvas, mSnapper.get() );
375375

376376
mMapToolChangeAttribute = new Qgs3DMapToolPointCloudChangeAttribute( mCanvas );
377377

src/app/3d/qgs3dmaptoolmeasureline.cpp

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,22 @@
1818
#include <memory>
1919

2020
#include "qgs3dmapcanvas.h"
21-
#include "qgs3dmapscene.h"
21+
#include "qgs3dmapsettings.h"
2222
#include "qgs3dmeasuredialog.h"
23-
#include "qgs3dutils.h"
24-
#include "qgsabstractterrainsettings.h"
23+
#include "qgs3dsnappingmanager.h"
2524
#include "qgsframegraph.h"
2625
#include "qgsmaplayer.h"
2726
#include "qgspoint.h"
28-
#include "qgsraycastcontext.h"
2927
#include "qgsrubberband3d.h"
3028
#include "qgswindow3dengine.h"
3129

3230
#include <QKeyEvent>
3331

3432
#include "moc_qgs3dmaptoolmeasureline.cpp"
3533

36-
Qgs3DMapToolMeasureLine::Qgs3DMapToolMeasureLine( Qgs3DMapCanvas *canvas )
34+
Qgs3DMapToolMeasureLine::Qgs3DMapToolMeasureLine( Qgs3DMapCanvas *canvas, Qgs3DSnappingManager *snapper )
3735
: Qgs3DMapTool( canvas )
36+
, mSnapper( snapper )
3837
{
3938
// Dialog
4039
mDialog = std::make_unique<Qgs3DMeasureDialog>( this );
@@ -48,6 +47,8 @@ void Qgs3DMapToolMeasureLine::activate()
4847
{
4948
mRubberBand = std::make_unique<QgsRubberBand3D>( *mCanvas->mapSettings(), mCanvas->engine(), mCanvas->engine()->frameGraph()->rubberBandsRootEntity() );
5049

50+
mSnapper->start( mCanvas );
51+
5152
restart();
5253
updateSettings();
5354

@@ -60,6 +61,8 @@ void Qgs3DMapToolMeasureLine::deactivate()
6061
{
6162
mRubberBand.reset();
6263

64+
mSnapper->finish();
65+
6366
// Hide dialog
6467
mDialog->hide();
6568
}
@@ -76,28 +79,14 @@ void Qgs3DMapToolMeasureLine::handleClick( const QPoint &screenPos )
7679
restart();
7780
}
7881

79-
QgsRayCastContext context;
80-
context.setSingleResult( false );
81-
context.setMaximumDistance( mCanvas->cameraController()->camera()->farPlane() );
82-
context.setAngleThreshold( 0.5f );
83-
const QgsRayCastResult results = mCanvas->castRay( screenPos, context );
84-
85-
if ( results.isEmpty() )
86-
return;
87-
88-
QgsVector3D mapCoords;
89-
double minDist = -1;
90-
const QList<QgsRayCastHit> allHits = results.allHits();
91-
for ( const QgsRayCastHit &hit : allHits )
82+
bool snapSuccess;
83+
const QgsPoint snapPoint = mSnapper->screenToMap( screenPos, &snapSuccess );
84+
if ( !snapSuccess )
9285
{
93-
const double resDist = hit.distance();
94-
if ( minDist < 0 || resDist < minDist )
95-
{
96-
minDist = resDist;
97-
mapCoords = hit.mapCoordinates();
98-
}
86+
return;
9987
}
100-
addPoint( QgsPoint( mapCoords.x(), mapCoords.y(), mapCoords.z() ) );
88+
89+
addPoint( snapPoint );
10190
mDialog->show();
10291
}
10392

@@ -148,6 +137,8 @@ void Qgs3DMapToolMeasureLine::restart()
148137

149138
mRubberBand->reset();
150139
mRubberBand->setHideLastMarker( true );
140+
141+
mSnapper->reset();
151142
}
152143

153144
void Qgs3DMapToolMeasureLine::undo()
@@ -188,11 +179,15 @@ void Qgs3DMapToolMeasureLine::mouseMoveEvent( QMouseEvent *event )
188179
mMouseHasMoved = true;
189180
}
190181

191-
if ( mPoints.isEmpty() || mDone )
182+
bool snapSuccess;
183+
const QgsPoint snapPoint = mSnapper->screenToMap( event->pos(), &snapSuccess );
184+
185+
if ( !snapSuccess || mPoints.isEmpty() || mDone )
186+
{
192187
return;
188+
}
193189

194-
const QgsPoint pointMap = Qgs3DUtils::screenPointToMapCoordinates( event->pos(), mCanvas->size(), mCanvas->cameraController(), mCanvas->mapSettings() );
195-
mRubberBand->moveLastPoint( pointMap );
190+
mRubberBand->moveLastPoint( snapPoint );
196191
}
197192

198193
void Qgs3DMapToolMeasureLine::mouseReleaseEvent( QMouseEvent *event )

src/app/3d/qgs3dmaptoolmeasureline.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgspoint.h"
2323

2424
class Qgs3DMeasureDialog;
25+
class Qgs3DSnappingManager;
2526
class QgsRubberBand3D;
2627

2728

@@ -30,7 +31,7 @@ class Qgs3DMapToolMeasureLine : public Qgs3DMapTool
3031
Q_OBJECT
3132

3233
public:
33-
Qgs3DMapToolMeasureLine( Qgs3DMapCanvas *canvas );
34+
Qgs3DMapToolMeasureLine( Qgs3DMapCanvas *canvas, Qgs3DSnappingManager *snapper );
3435
~Qgs3DMapToolMeasureLine() override;
3536

3637
//! When we have added our last point, and not following
@@ -78,6 +79,8 @@ class Qgs3DMapToolMeasureLine : public Qgs3DMapTool
7879
//! Check if mouse was moved between mousePress and mouseRelease
7980
bool mMouseHasMoved = false;
8081
QPoint mMouseClickPos;
82+
83+
Qgs3DSnappingManager *mSnapper;
8184
};
8285

8386
#endif // QGS3DMAPTOOLMEASURELINE_H

0 commit comments

Comments
 (0)