QGIS API Documentation 3.39.0-Master (d85f3c2a281)
Loading...
Searching...
No Matches
qgsmaptooldigitizefeature.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaptooldigitizefeature.cpp
3
4 ---------------------
5 begin : 7.12.2017
6 copyright : (C) 2017 by David Signer
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
19#include "qgsfields.h"
20#include "qgsgeometry.h"
21#include "qgsmapcanvas.h"
22#include "qgsmapmouseevent.h"
23#include "qgsproject.h"
26#include "qgsvectorlayer.h"
28
29#include <QSettings>
30
39
44
58
59void QgsMapToolDigitizeFeature::layerGeometryCaptured( const QgsGeometry &geometry )
60{
61 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
62 if ( !vlayer )
63 vlayer = currentVectorLayer();
64
65 if ( !vlayer )
66 return;
67
68 QgsFeature f( vlayer->fields(), 0 );
69
70 if ( vlayer->isSpatial() )
71 {
72 const Qgis::WkbType layerWKBType = vlayer->wkbType();
73
74 QgsGeometry layerGeometry;
75
76 if ( mCheckGeometryType )
77 {
80 QVector<QgsGeometry> layerGeometries = geometry.coerceToType( layerWKBType, defaultZ, defaultM );
81 if ( layerGeometries.count() > 0 )
82 layerGeometry = layerGeometries.at( 0 );
83
84 if ( layerGeometry.wkbType() != layerWKBType && layerGeometry.wkbType() != QgsWkbTypes::linearType( layerWKBType ) )
85 {
86 emit messageEmitted( tr( "The digitized geometry type (%1) does not correspond to the layer geometry type (%2)." ).arg( QgsWkbTypes::displayString( layerGeometry.wkbType() ), QgsWkbTypes::displayString( layerWKBType ) ), Qgis::MessageLevel::Warning );
87 return;
88 }
89 }
90 else
91 {
92 layerGeometry = geometry;
93 }
94 f.setGeometry( layerGeometry );
95 }
96 f.setValid( true );
97 emit digitizingCompleted( f );
98 featureDigitized( f );
99}
100
102{
103 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
104 if ( !vlayer )
105 vlayer = currentVectorLayer();
106
107 if ( vlayer && vlayer->geometryType() == Qgis::GeometryType::Null )
108 {
109 layerGeometryCaptured( QgsGeometry() );
110 return;
111 }
112
113 if ( mLayer )
114 {
115 //remember current layer
116 mCurrentLayer = mCanvas->currentLayer();
117 //set the layer with the given
118 mCanvas->setCurrentLayer( mLayer );
119 }
120
122}
123
125{
127
128 if ( mCurrentLayer )
129 //set the layer back to the one remembered
130 mCanvas->setCurrentLayer( mCurrentLayer );
131 emit digitizingFinished();
132}
133
135{
136 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
137 if ( !vlayer )
138 vlayer = currentVectorLayer();
139
140 if ( vlayer && vlayer->geometryType() == Qgis::GeometryType::Null )
141 {
142 layerGeometryCaptured( QgsGeometry() );
143 }
144}
145
147{
148 if ( e->key() == Qt::Key_Escape )
149 {
150 emit digitizingCanceled();
151 }
153}
154
156{
157 return mCheckGeometryType;
158}
159
161{
162 mCheckGeometryType = checkGeometryType;
163}
164
166{
167 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayer );
168
169 if ( !vlayer )
170 //if no given layer take the current from canvas
171 vlayer = currentVectorLayer();
172
173 if ( !vlayer )
174 {
176 return;
177 }
178
179 QgsVectorDataProvider *provider = vlayer->dataProvider();
180
182 {
183 emit messageEmitted( tr( "The data provider for this layer does not support the addition of features." ), Qgis::MessageLevel::Warning );
184 return;
185 }
186
187 if ( !vlayer->isEditable() )
188 {
190 return;
191 }
192
193 //check we only use this tool for point/multipoint layers
194 if ( mode() == CapturePoint && vlayer->geometryType() != Qgis::GeometryType::Point && mCheckGeometryType )
195 {
196 emit messageEmitted( tr( "Wrong editing tool, cannot apply the 'capture point' tool on this vector layer" ), Qgis::MessageLevel::Warning );
197 return;
198 }
199
200 //check we only use the line tool for line/multiline layers
201 if ( mode() == CaptureLine && vlayer->geometryType() != Qgis::GeometryType::Line && mCheckGeometryType )
202 {
203 emit messageEmitted( tr( "Wrong editing tool, cannot apply the 'capture line' tool on this vector layer" ), Qgis::MessageLevel::Warning );
204 return;
205 }
206
207 //check we only use the polygon tool for polygon/multipolygon layers
208 if ( mode() == CapturePolygon && vlayer->geometryType() != Qgis::GeometryType::Polygon && mCheckGeometryType )
209 {
210 emit messageEmitted( tr( "Wrong editing tool, cannot apply the 'capture polygon' tool on this vector layer" ), Qgis::MessageLevel::Warning );
211 return;
212 }
213
215}
216
218{
219 mLayer = vl;
220}
221
@ AddFeatures
Allows adding features.
CaptureTechnique
Capture technique.
Definition qgis.h:376
@ Shape
Digitize shapes.
@ StraightSegments
Default capture mode - capture occurs with straight line segments.
@ CircularString
Capture in circular strings.
@ Streaming
Streaming points digitizing mode (points are automatically added as the mouse cursor moves).
@ Warning
Warning message.
Definition qgis.h:156
@ Polygon
Polygons.
@ Null
No geometry.
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:256
The QgsAdvancedDigitizingDockWidget class is a dockable widget used to handle the CAD tools on top of...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
A geometry is the spatial representation of a feature.
QVector< QgsGeometry > coerceToType(Qgis::WkbType type, double defaultZ=0, double defaultM=0) const
Attempts to coerce this geometry into the specified destination type.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for all map layer types.
Definition qgsmaplayer.h:76
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
virtual void cadCanvasReleaseEvent(QgsMapMouseEvent *e)
Override this method when subclassing this class.
QgsMapToolCaptureLayerGeometry is a base class for map tools digitizing layer geometries This map too...
void stopCapturing()
Stop capturing.
CaptureMode mode() const
The capture mode.
QFlags< Capability > Capabilities
CaptureMode
Different capture modes.
@ CapturePolygon
Capture polygons.
@ CapturePoint
Capture points.
@ CaptureLine
Capture lines.
@ ValidateGeometries
Tool supports geometry validation.
@ SupportsCurves
Supports curved geometries input.
void cadCanvasReleaseEvent(QgsMapMouseEvent *e) override
Override this method when subclassing this class.
void setCheckGeometryType(bool checkGeometryType)
Check if CaptureMode matches layer type.
void digitizingCanceled()
Emitted when the digitizing process was interrupted by the user.
void digitizingCompleted(const QgsFeature &feature)
Emitted whenever the digitizing has been successfully completed.
bool checkGeometryType() const
Check if CaptureMode matches layer type.
void digitizingFinished()
Emitted whenever the digitizing has been ended without digitizing any feature.
void keyPressEvent(QKeyEvent *e) override
Intercept key events like Esc or Del to delete the last point.
void activate() override
Registers this maptool with the cad dock widget.
void setLayer(QgsMapLayer *vl)
Change the layer edited by the map tool.
bool supportsTechnique(Qgis::CaptureTechnique technique) const override
Returns true if the tool supports the specified capture technique.
void deactivate() override
Unregisters this maptool from the cad dock widget.
void reactivate() override
Called when the map tool is being activated while it is already active.
QgsMapToolDigitizeFeature(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget, CaptureMode mode=QgsMapToolCapture::CaptureNone)
QgsMapToolDigitizeFeature is a map tool to digitize a feature geometry.
QgsMapToolCapture::Capabilities capabilities() const override
Returns flags containing the supported capabilities.
void notifyNotVectorLayer()
Display a timed message bar noting the active layer is not vector.
void notifyNotEditableLayer()
Display a timed message bar noting the active vector layer is not editable.
QgsVectorLayer * currentVectorLayer()
Returns the current vector layer of the map canvas or 0.
QPointer< QgsMapCanvas > mCanvas
The pointer to the map canvas.
Definition qgsmaptool.h:341
QString mToolName
The translated name of the map tool.
Definition qgsmaptool.h:359
void messageEmitted(const QString &message, Qgis::MessageLevel=Qgis::MessageLevel::Info)
emit a message
virtual void keyPressEvent(QKeyEvent *e)
Key event for overriding. Default implementation does nothing.
virtual void activate()
called when set as currently active map tool
virtual void deactivate()
called when map tool is being deactivated
static QgsProject * instance()
Returns the QgsProject singleton instance.
void cleared()
Emitted when the project is cleared (and additionally when an open project is cleared just before a n...
void readProject(const QDomDocument &document)
Emitted when a project is being read.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
static const QgsSettingsEntryDouble * settingsDigitizingDefaultMValue
Settings entry digitizing default m value.
static const QgsSettingsEntryDouble * settingsDigitizingDefaultZValue
Settings entry digitizing default z value.
This is the base class for vector data providers.
virtual Q_INVOKABLE Qgis::VectorProviderCapabilities capabilities() const
Returns flags containing the supported capabilities.
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
Q_INVOKABLE Qgis::WkbType wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
static Qgis::WkbType linearType(Qgis::WkbType type)
Returns the linear type for a WKB type.
static QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...