QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsmapmouseevent.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapmouseevent.cpp - mouse event in map coordinates and ability to snap
3  ----------------------
4  begin : October 2014
5  copyright : (C) Denis Rouzaud
6  email : [email protected]
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 
17 #include "qgsmapmouseevent.h"
18 #include "qgsmapcanvas.h"
19 
20 #include "qgssnappingutils.h"
21 #include "qgssnappingconfig.h"
22 
23 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QMouseEvent *event )
24  : QMouseEvent( event->type(), event->pos(), event->button(), event->buttons(), event->modifiers() )
25  , mHasCachedSnapResult( false )
26  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( event->pos() ) : QgsPointXY() )
27  , mMapPoint( mOriginalMapPoint )
28  , mPixelPoint( event->pos() )
29  , mMapCanvas( mapCanvas )
30 {
31 }
32 
33 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QEvent::Type type, QPoint pos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
34  : QMouseEvent( type, pos, button, buttons, modifiers )
35  , mHasCachedSnapResult( false )
36  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( pos ) : QgsPointXY() )
37  , mMapPoint( mOriginalMapPoint )
38  , mPixelPoint( pos )
39  , mMapCanvas( mapCanvas )
40 {
41 }
42 
44 {
45  // Use cached result
46  if ( mHasCachedSnapResult )
47  return mMapPoint;
48 
49  mHasCachedSnapResult = true;
50 
51  QgsSnappingUtils *snappingUtils = mMapCanvas->snappingUtils();
52  mSnapMatch = snappingUtils->snapToMap( mMapPoint );
53 
54  if ( mSnapMatch.isValid() )
55  {
56  mMapPoint = mSnapMatch.point();
57  mPixelPoint = mapToPixelCoordinates( mMapPoint );
58  }
59  else
60  {
61  mMapPoint = mOriginalMapPoint;
62  mPixelPoint = pos();
63  }
64 
65  return mMapPoint;
66 }
67 
69 {
70  mMapPoint = point;
71  mPixelPoint = mapToPixelCoordinates( point );
72 }
73 
75 {
76  if ( precision <= 0 )
77  return;
78 
79  try
80  {
81  QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), crs, mMapCanvas->mapSettings().transformContext() );
82 
83  QgsPointXY pt = ct.transform( mMapPoint );
84 
85  pt.setX( std::round( pt.x() / precision ) * precision );
86  pt.setY( std::round( pt.y() / precision ) * precision );
87 
88  pt = ct.transform( pt, QgsCoordinateTransform::ReverseTransform );
89 
90  setMapPoint( pt );
91  }
92  catch ( QgsCsException &e )
93  {
94  Q_UNUSED( e )
95  }
96 }
97 
98 QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point )
99 {
100  double x = point.x(), y = point.y();
101 
102  mMapCanvas->mapSettings().mapToPixel().transformInPlace( x, y );
103 
104  return QPoint( std::round( x ), std::round( y ) );
105 }
int precision
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
double y
Definition: qgspointxy.h:48
A class to represent a 2D point.
Definition: qgspointxy.h:43
QgsMapMouseEvent(QgsMapCanvas *mapCanvas, QMouseEvent *event)
Creates a new QgsMapMouseEvent.
const QgsCoordinateReferenceSystem & crs
void setMapPoint(const QgsPointXY &point)
Set the (snapped) point this event points to in map coordinates.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:73
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
const QgsMapToPixel & mapToPixel() const
void setX(double x)
Sets the x value of the point.
Definition: qgspointxy.h:104
double x
Definition: qgspointxy.h:47
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords...
Transform from destination to source CRS.
This class represents a coordinate reference system (CRS).
This class has all the configuration of snapping and can return answers to snapping queries...
Class for doing transforms between two map coordinate systems.
void snapToGrid(double precision, const QgsCoordinateReferenceSystem &crs)
Snaps the mapPoint to a grid with the given precision.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
QgsPointLocator::Match snapToMap(QPoint point, QgsPointLocator::MatchFilter *filter=nullptr)
Snap to map according to the current configuration. Optional filter allows discarding unwanted matche...
QgsSnappingUtils * snappingUtils() const
Returns snapping utility class that is associated with map canvas.
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration