QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsmaptoolextent.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaptoolextent.h - map tool that emits an extent
3  ---------------------
4  begin : July 2017
5  copyright : (C) 2017 by Mathieu Pellerin
6  email : nirvn dot asia at gmail dot com
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 
18 #include "qgsmaptoolextent.h"
19 #include "qgsmapcanvas.h"
20 #include "qgswkbtypes.h"
21 #include "qgsmapmouseevent.h"
22 
23 
25  : QgsMapTool( canvas )
26 {
28 }
29 
31 {
33 }
34 
36 {
37  mRubberBand->reset( QgsWkbTypes::PolygonGeometry );
38 
40 }
41 
43 {
44  if ( !mDraw )
45  return;
46 
47 
48  QgsPointXY p = toMapCoordinates( e->pos() );
49  if ( mRatio.width() > 0 && mRatio.height() > 0 )
50  {
51  double width = std::fabs( p.x() - mStartPoint.x() );
52  double height = width * ( mRatio.width() / mRatio.height() );
53  if ( p.y() - mStartPoint.y() < 0 )
54  height *= -1;
55  p.setY( mStartPoint.y() + height );
56  }
57 
58  mEndPoint = toMapCoordinates( e->pos() );
59  calculateEndPoint( mEndPoint );
60  drawExtent();
61 }
62 
64 {
65  mStartPoint = toMapCoordinates( e->pos() );
66  mEndPoint = mStartPoint;
67  drawExtent();
68 
69  mDraw = true;
70 }
71 
73 {
74  if ( !mDraw )
75  return;
76 
77  mEndPoint = toMapCoordinates( e->pos() );
78  calculateEndPoint( mEndPoint );
79  drawExtent();
80 
81  emit extentChanged( extent() );
82 
83  mDraw = false;
84 }
85 
87 {
88  if ( mStartPoint.x() != mEndPoint.x() && mStartPoint.y() != mEndPoint.y() )
89  {
90  return QgsRectangle( mStartPoint, mEndPoint );
91  }
92  else
93  {
94  return QgsRectangle();
95  }
96 }
97 
98 void QgsMapToolExtent::calculateEndPoint( QgsPointXY &point )
99 {
100  if ( mRatio.width() > 0 && mRatio.height() > 0 )
101  {
102  double width = std::fabs( point.x() - mStartPoint.x() );
103  double height = width * mRatio.height() / mRatio.width();
104  if ( point.y() - mStartPoint.y() < 0 )
105  height *= -1;
106  point.setY( mStartPoint.y() + height );
107  }
108 }
109 
110 void QgsMapToolExtent::drawExtent()
111 {
112  if ( qgsDoubleNear( mStartPoint.x(), mEndPoint.x() ) && qgsDoubleNear( mStartPoint.y(), mEndPoint.y() ) )
113  return;
114 
115  mRubberBand->reset( QgsWkbTypes::PolygonGeometry );
116 
117  QgsRectangle rect( mStartPoint, mEndPoint );
118 
119  mRubberBand->reset( QgsWkbTypes::PolygonGeometry );
120  mRubberBand->addPoint( QgsPointXY( rect.xMinimum(), rect.yMinimum() ), false );
121  mRubberBand->addPoint( QgsPointXY( rect.xMaximum(), rect.yMinimum() ), false );
122  mRubberBand->addPoint( QgsPointXY( rect.xMaximum(), rect.yMaximum() ), false );
123  mRubberBand->addPoint( QgsPointXY( rect.xMinimum(), rect.yMaximum() ), true );
124 
125  mRubberBand->show();
126 }
void reset(T *p=nullptr)
Will reset the managed pointer to p.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:86
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
void canvasMoveEvent(QgsMapMouseEvent *e) override
Mouse move event for overriding. Default implementation does nothing.
void deactivate() override
called when map tool is being deactivated
QgsRectangle extent() const
Returns the current extent drawn onto the canvas.
void canvasReleaseEvent(QgsMapMouseEvent *e) override
Mouse release event for overriding. Default implementation does nothing.
void canvasPressEvent(QgsMapMouseEvent *e) override
Mouse press event for overriding. Default implementation does nothing.
void activate() override
called when set as currently active map tool
void extentChanged(const QgsRectangle &extent)
signal emitted on extent change
QgsMapToolExtent(QgsMapCanvas *canvas)
constructor
Abstract base class for all map tools.
Definition: qgsmaptool.h:66
QgsMapCanvas * canvas() const
returns pointer to the tool's map canvas
Definition: qgsmaptool.cpp:195
QgsPointXY toMapCoordinates(QPoint point)
Transforms a point from screen coordinates to map coordinates.
Definition: qgsmaptool.cpp:41
virtual void activate()
called when set as currently active map tool
Definition: qgsmaptool.cpp:80
virtual void deactivate()
called when map tool is being deactivated
Definition: qgsmaptool.cpp:96
A class to represent a 2D point.
Definition: qgspointxy.h:44
double y
Definition: qgspointxy.h:48
Q_GADGET double x
Definition: qgspointxy.h:47
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Definition: qgspointxy.h:117
A rectangle specified with double values.
Definition: qgsrectangle.h:42
A class for drawing transient features (e.g.
Definition: qgsrubberband.h:50
void reset(QgsWkbTypes::GeometryType geometryType=QgsWkbTypes::LineGeometry)
Clears all the geometries in this rubberband.
void addPoint(const QgsPointXY &p, bool doUpdate=true, int geometryIndex=0, int ringIndex=0)
Adds a vertex to the rubberband and update canvas.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:316