45 , mCaptureMode( mode )
46 , mCaptureModeFromLayer( mode == CaptureNone )
53 this, &QgsMapToolCapture::currentLayerChanged );
64 mValidator->deleteLater();
71 if ( mTempRubberBand )
72 mTempRubberBand->show();
79 if ( mTempRubberBand )
80 mTempRubberBand->hide();
87 void QgsMapToolCapture::currentLayerChanged(
QgsMapLayer *layer )
89 if ( !mCaptureModeFromLayer )
118 bool QgsMapToolCapture::tracingEnabled()
126 QgsPointXY QgsMapToolCapture::tracingStartPoint()
137 return mTracingStartPoint;
144 QgsDebugMsg( QStringLiteral(
"transformation to layer coordinate failed" ) );
167 if ( points.isEmpty() )
183 if ( lastPoint == pt0 && points[0] != lastPoint )
192 mTempRubberBand->
addPoint( lastPoint,
false );
197 for (
int i = 0; i < points.count(); ++i )
198 mTempRubberBand->
addPoint( points.at( i ), i == points.count() - 1 );
205 bool QgsMapToolCapture::tracingAddVertex(
const QgsPointXY &point )
213 if ( !tracer->
init() )
239 if ( points.isEmpty() )
242 if ( !mCaptureCurve.
isEmpty() )
260 mCaptureCurve.
clear();
267 mSnappingMatches.removeLast();
274 for (
int i = 0; i < points.count(); ++i )
281 for (
int i = 0; i < points.count(); ++i )
283 if ( i == 0 && !mCaptureCurve.
isEmpty() && mCaptureCurve.
endPoint() == layerPoints[0] )
285 if ( i > 0 && points[i] == points[i - 1] )
287 mRubberBand->
addPoint( points[i], i == points.count() - 1 );
288 mCaptureCurve.
addVertex( layerPoints[i] );
309 if ( !mTempRubberBand && mCaptureCurve.
numPoints() > 0 )
318 if ( mCaptureMode !=
CapturePoint && mTempRubberBand && mCapturing )
320 bool hasTrace =
false;
321 if ( tracingEnabled() && mCaptureCurve.
numPoints() != 0 )
323 hasTrace = tracingMouseMove( e );
355 QgsDebugMsg( QStringLiteral(
"no vector layer" ) );
365 layerPoint.addMValue( 0.0 );
370 QgsDebugMsg( QStringLiteral(
"transformation to layer coordinate failed" ) );
380 return nextPoint( mapPoint, layerPoint );
388 ( sourceLayer->crs() == vlayer->
crs() ) )
406 QgsLineString line( geom.constGet()->vertexAt( vId ), geom.constGet()->vertexAt( vId2 ) );
412 layerPoint = geom.constGet()->
vertexAt( vId );
452 QgsDebugMsg( QStringLiteral(
"invalid capture mode" ) );
473 if ( !mTempRubberBand )
482 bool traceCreated =
false;
483 if ( tracingEnabled() )
485 traceCreated = tracingAddVertex( point );
490 mTracingStartPoint = traceCreated ? point :
QgsPointXY();
497 mSnappingMatches.append( match );
507 mTempRubberBand->
addPoint( *firstPoint );
531 lineString->
points( linePoints );
533 QgsPointSequence::const_iterator ptIt = linePoints.constBegin();
534 for ( ; ptIt != linePoints.constEnd(); ++ptIt )
539 if ( !mTempRubberBand )
545 mTempRubberBand->
reset();
558 for (
int i = 0; i < c->
length(); ++i )
566 mCaptureCurve.
clear();
571 return mSnappingMatches;
583 int captureListSize =
size();
585 if ( rubberBandSize < 1 || captureListSize < 1 )
592 if ( rubberBandSize > 1 )
594 if ( tempRubberBandSize > 1 )
597 mTempRubberBand->
movePoint( tempRubberBandSize - 2, *point );
606 vertexToRemove.
part = 0;
607 vertexToRemove.
ring = 0;
610 mSnappingMatches.removeAt( vertexToRemove.
vertex );
620 if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete )
627 else if ( e->key() == Qt::Key_Escape )
652 qDeleteAll( mGeomErrorMarkers );
653 mGeomErrorMarkers.clear();
659 mCaptureCurve.
clear();
660 mSnappingMatches.clear();
667 mTempRubberBand.
reset();
678 mCaptureCurve.
close();
681 void QgsMapToolCapture::validateGeometry()
684 if ( settings.
value( QStringLiteral(
"qgis/digitizing/validate_geometries" ), 1 ).toInt() == 0 )
689 mValidator->deleteLater();
690 mValidator =
nullptr;
694 while ( !mGeomErrorMarkers.isEmpty() )
696 delete mGeomErrorMarkers.takeFirst();
701 switch ( mCaptureMode )
715 exteriorRing->
close();
726 if ( settings.
value( QStringLiteral(
"qgis/digitizing/validate_geometries" ), 1 ).toInt() == 2 )
747 vm->setToolTip( e.what() );
749 vm->setZValue( vm->zValue() + 1 );
750 mGeomErrorMarkers << vm;
761 QVector<QgsPointXY> pointsXY;
770 mCaptureCurve.
points( pts );
777 mCaptureCurve.
clear();
779 mSnappingMatches.clear();
780 for (
int i = 0; i < line->
length(); ++i )
787 mCaptureCurve.
clear();
789 mSnappingMatches.clear();
790 for (
int i = 0; i < line->
length(); ++i )
bool isMeasure() const
Returns true if the geometry contains m values.
QgsPoint startPoint() const override
Returns the starting point of the curve.
Base class for all map layer types.
int numberOfVertices() const
Returns count of vertices in all lists of mPoint.
void points(QgsPointSequence &pt) const override
Returns a list of points within the curve.
virtual void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)=0
Transforms the geometry using a coordinate transform.
QgsLineString * curveToLine(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a new line string geometry corresponding to a segmentized approximation of the curve...
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
QgsVectorLayer * layer() const
The vector layer where the snap occurred.
This class is a composition of two QSettings instances:
void setZ(double z)
Sets the point's z-coordinate.
Use GEOS validation methods.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
QAction * actionEnableTracing() const
Access to action that user may use to toggle tracing on/off. May be nullptr if no action was associat...
A class to represent a 2D point.
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
void setPenWidth(int width)
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
bool deleteVertex(QgsVertexId position) override
Deletes a vertex within the geometry.
A geometry is the spatial representation of a feature.
bool isSnapped() const
Returns true if there is a snapped point cached.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
void clear() override
Clears the geometry, ie reset it to a null geometry.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
const QgsPointXY * getPoint(int i, int j=0) const
Returns a vertex.
Map canvas is a class for displaying all GIS data types on a canvas.
void reset(T *p=nullptr)
Will reset the managed pointer to p.
void addCurve(QgsCurve *c)
Adds a curve to the geometry (takes ownership)
QgsPoint vertexAt(QgsVertexId) const override
Returns the point corresponding to a specified vertex id.
bool pointAt(int node, QgsPoint &point, QgsVertexId::VertexType &type) const override
Returns the point and vertex id of a point within the curve.
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.
Extension of QgsTracer that provides extra functionality:
QgsCoordinateTransform layerTransform(const QgsMapLayer *layer) const
Returns the coordinate transform from layer's CRS to destination CRS.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
virtual QgsPoint endPoint() const =0
Returns the end point of the curve.
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets feature ID that should be fetched.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
QAction * actionEnableSnapping() const
Access to action that user may use to toggle snapping on/off.
Type
The WKB type describes the number of dimensions a geometry has.
bool dropMValue() override
Drops any measure values which exist in the geometry.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted...
static QgsMapCanvasTracer * tracerForCanvas(QgsMapCanvas *canvas)
Retrieve instance of this class associated with given canvas (if any).
Utility class for identifying a unique vertex within a geometry.
#define QgsDebugMsgLevel(str, level)
Max feature count threshold was reached while reading features.
A class for drawing transient features (e.g.
void removePoint(int index=0, bool doUpdate=true, int geometryIndex=0)
Removes a vertex from the rubberband and (optionally) updates canvas.
void setCenter(const QgsPointXY &point)
void addPoint(const QgsPointXY &p, bool doUpdate=true, int geometryIndex=0)
Adds a vertex to the rubberband and update canvas.
Use internal QgsGeometryValidator method.
void movePoint(const QgsPointXY &p, int geometryIndex=0)
Moves the rubber band point specified by index.
PathError
Possible errors that may happen when calling findShortestPath()
This class wraps a request for features to a vector layer (or directly its vector data provider)...
void close()
Closes the line string by appending the first point to the end of the line, if it is not already clos...
A class for marking vertices of features using e.g.
Abstract base class for curved geometry type.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
Point geometry type, with support for z-dimension and m-values.
void currentLayerChanged(QgsMapLayer *layer)
Emitted when the current layer is changed.
T * release()
Clears the pointer and returns it.
bool topologicalEditing() const
Convenience function to query topological editing status.
QgsMapLayer * currentLayer()
returns current layer (set by legend widget)
bool isEmpty() const override
Returns true if the geometry is empty.
QVector< QgsPoint > QgsPointSequence
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
void reportError(PathError err, bool addingVertex)
Report a path finding error to the user.
static void convertPointList(const QVector< QgsPointXY > &input, QgsPointSequence &output)
Upgrades a point list from QgsPointXY to QgsPoint.
QgsPointLocator::Match mapPointMatch() const
Returns the matching data from the most recently snapped point.
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords...
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
void setExteriorRing(QgsCurve *ring) override
Sets the exterior ring of the polygon.
QgsPointXY mapPoint() const
mapPoint returns the point in coordinates
int vertexIndex() const
for vertex / edge match (first vertex of the edge)
void addVertex(const QgsPoint &pt)
Adds a vertex to the end of the geometry.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
Line string geometry type, with support for z-dimension and m-values.
ValidationMethod
Available methods for validating geometries.
static QgsProject * instance()
Returns the QgsProject singleton instance.
virtual QgsLineString * curveToLine(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const =0
Returns a new line string geometry corresponding to a segmentized approximation of the curve...
void points(QgsPointSequence &pts) const override
Returns a list of points within the curve.
QVector< QgsPointXY > findShortestPath(const QgsPointXY &p1, const QgsPointXY &p2, PathError *error=nullptr)
Given two points, find the shortest path and return points on the way.
Class that shows snapping marker on map canvas for the current snapping match.
bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value.
void reset(QgsWkbTypes::GeometryType geometryType=QgsWkbTypes::LineGeometry)
Clears all the geometries in this rubberband.
bool init()
Build the internal data structures.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
Custom exception class for Coordinate Reference System related exceptions.
void close()
Appends first point if not already closed.
static QgsPoint closestPoint(const QgsAbstractGeometry &geometry, const QgsPoint &point)
Returns the nearest point on a segment of a geometry for the specified point.
double length() const override
Returns the planar, 2-dimensional length of the geometry.
QgsFeatureId featureId() const
The id of the feature to which the snapped geometry belongs.
bool nextFeature(QgsFeature &f)
bool isPointSnapped(const QgsPointXY &pt)
Find out whether the point is snapped to a vertex or edge (i.e. it can be used for tracing start/stop...
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
void setColor(const QColor &color)
Sets the stroke color for the marker.
Represents a vector layer which manages a vector based data sets.
void removeLastPoint(int geometryIndex=0, bool doUpdate=true)
Removes the last point.
int numPoints() const override
Returns the number of points in the curve.
void setIconType(int iconType)
void errorFound(const QgsGeometry::Error &error)
Sent when an error has been found during the validation process.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
QgsCoordinateReferenceSystem crs
QgsPoint endPoint() const override
Returns the end point of the curve.