QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgsmapcanvastracer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapcanvastracer.cpp
3  ---------------------
4  begin : January 2016
5  copyright : (C) 2016 by Martin Dobias
6  email : wonder dot sk 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 #include "qgsmapcanvastracer.h"
16 
17 #include "qgsapplication.h"
18 #include "qgsmapcanvas.h"
19 #include "qgsproject.h"
20 #include "qgsmessagebar.h"
21 #include "qgsmessagebaritem.h"
22 #include "qgssnappingutils.h"
23 #include "qgsvectorlayer.h"
24 #include "qgssnappingconfig.h"
25 #include "qgssettings.h"
26 
27 #include <QAction>
28 
29 #include <QGlobalStatic>
30 
31 typedef QHash<QgsMapCanvas *, QgsMapCanvasTracer *> TracerCanvasHash;
33 
35  : mCanvas( canvas )
36  , mMessageBar( messageBar )
37 
38 {
39  sTracers()->insert( canvas, this );
40 
41  // when things change we just invalidate the graph - and set up new parameters again only when necessary
46  connect( canvas, &QgsMapCanvas::currentLayerChanged, this, &QgsMapCanvasTracer::onCurrentLayerChanged );
48  connect( canvas, &QObject::destroyed, this, [this]() { mCanvas = nullptr; } );
49 
50  // arbitrarily chosen limit that should allow for fairly fast initialization
51  // of the underlying graph structure
52  setMaxFeatureCount( QgsSettings().value( QStringLiteral( "/qgis/digitizing/tracing_max_feature_count" ), 10000 ).toInt() );
53 }
54 
56 {
57  sTracers->remove( mCanvas );
58 }
59 
61 {
62  return sTracers->value( canvas, nullptr );
63 }
64 
66 {
67  Q_UNUSED( addingVertex )
68 
69  if ( !mMessageBar )
70  return;
71 
72  // remove previous message (if any)
73  mMessageBar->popWidget( mLastMessage );
74  mLastMessage = nullptr;
75 
76  QString message;
77  switch ( err )
78  {
79  case ErrTooManyFeatures:
80  message = tr( "Disabled - there are too many features displayed. Try zooming in or disable some layers." );
81  break;
82  case ErrNone:
83  default:
84  break;
85  }
86 
87  if ( message.isEmpty() && hasTopologyProblem() )
88  {
89  message = tr( "Tracing may not work correctly. Please check topology of the input layers." );
90  }
91 
92  if ( message.isEmpty() )
93  return;
94 
95  mLastMessage = new QgsMessageBarItem( tr( "Tracing" ), message, Qgis::Warning,
96  QgsSettings().value( QStringLiteral( "/qgis/messageTimeout" ), 5 ).toInt() );
97  mMessageBar->pushItem( mLastMessage );
98 }
99 
101 {
104  setRenderContext( &ctx );
105  setExtent( mCanvas->extent() );
106 
107  QList<QgsVectorLayer *> layers;
108  QList<QgsMapLayer *> visibleLayers = mCanvas->mapSettings().layers();
109 
110  switch ( mCanvas->snappingUtils()->config().mode() )
111  {
112  default:
114  {
115  QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() );
116  if ( vl && visibleLayers.contains( vl ) )
117  layers << vl;
118  }
119  break;
121  {
122  const auto constVisibleLayers = visibleLayers;
123  for ( QgsMapLayer *layer : constVisibleLayers )
124  {
125  QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
126  if ( vl )
127  layers << vl;
128  }
129  }
130  break;
132  {
133  const auto constLayers = mCanvas->snappingUtils()->layers();
134  for ( const QgsSnappingUtils::LayerConfig &cfg : constLayers )
135  {
136  if ( visibleLayers.contains( cfg.layer ) )
137  layers << cfg.layer;
138  }
139  }
140  break;
141  }
142 
143  setLayers( layers );
144 }
145 
146 void QgsMapCanvasTracer::onCurrentLayerChanged()
147 {
148  // no need to bother if we are not snapping
149  if ( mCanvas->snappingUtils()->config().mode() == QgsSnappingConfig::ActiveLayer )
150  invalidateGraph();
151 }
QgsMapCanvas::currentLayerChanged
void currentLayerChanged(QgsMapLayer *layer)
Emitted when the current layer is changed.
QgsMapCanvas::transformContextChanged
void transformContextChanged()
Emitted when the canvas transform context is changed.
QgsMapCanvas::extent
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
Definition: qgsmapcanvas.cpp:1056
qgsmessagebaritem.h
QgsMapCanvas::destinationCrsChanged
void destinationCrsChanged()
Emitted when map CRS has changed.
qgsmapcanvas.h
QgsRenderContext::fromMapSettings
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
Definition: qgsrendercontext.cpp:197
QgsMapCanvas::mapSettings
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
Definition: qgsmapcanvas.cpp:391
Qgis::Warning
@ Warning
Definition: qgis.h:91
QgsSnappingUtils::config
QgsSnappingConfig config
Definition: qgssnappingutils.h:53
QgsMapCanvas
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:85
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:58
QgsSettings
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QgsTracer::layers
QList< QgsVectorLayer * > layers() const
Gets layers used for tracing.
Definition: qgstracer.h:55
QgsMessageBar::popWidget
bool popWidget(QgsMessageBarItem *item)
Remove the specified item from the bar, and display the next most recent one in the stack.
Definition: qgsmessagebar.cpp:160
Q_GLOBAL_STATIC
Q_GLOBAL_STATIC(TracerCanvasHash, sTracers)
QgsMapCanvas::snappingUtils
QgsSnappingUtils * snappingUtils() const
Returns snapping utility class that is associated with map canvas.
Definition: qgsmapcanvas.cpp:2419
qgssnappingconfig.h
qgsapplication.h
QgsTracer::invalidateGraph
void invalidateGraph()
Destroy the existing graph structure if any (de-initialize)
Definition: qgstracer.cpp:689
qgsmapcanvastracer.h
QgsTracer::setRenderContext
void setRenderContext(const QgsRenderContext *renderContext)
Sets the renderContext used for tracing only on visible features.
Definition: qgstracer.cpp:643
QgsSnappingConfig::ActiveLayer
@ ActiveLayer
On the active layer.
Definition: qgssnappingconfig.h:46
QgsTracer::setDestinationCrs
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the crs and transform context used for tracing.
Definition: qgstracer.cpp:636
QgsMapSettings::transformContext
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
Definition: qgsmapsettings.cpp:401
QgsSnappingUtils::configChanged
void configChanged(const QgsSnappingConfig &snappingConfig)
Emitted when the snapping settings object changes.
QgsMessageBarItem
Represents an item shown within a QgsMessageBar widget.
Definition: qgsmessagebaritem.h:39
QgsMapCanvasTracer
Extension of QgsTracer that provides extra functionality:
Definition: qgsmapcanvastracer.h:42
QgsMapCanvas::layersChanged
void layersChanged()
Emitted when a new set of layers has been received.
QgsMapCanvasTracer::~QgsMapCanvasTracer
~QgsMapCanvasTracer() override
Definition: qgsmapcanvastracer.cpp:55
QgsMessageBar::pushItem
void pushItem(QgsMessageBarItem *item)
Display a message item on the bar, after hiding the currently visible one and putting it in a stack.
Definition: qgsmessagebar.cpp:274
QgsTracer::ErrTooManyFeatures
@ ErrTooManyFeatures
Max feature count threshold was reached while reading features.
Definition: qgstracer.h:135
QgsMapCanvas::extentsChanged
void extentsChanged()
Emitted when the extents of the map change.
QgsTracer::setExtent
void setExtent(const QgsRectangle &extent)
Sets extent to which graph's features will be limited (empty extent means no limit)
Definition: qgstracer.cpp:649
QgsMessageBar
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:61
QgsTracer::setMaxFeatureCount
void setMaxFeatureCount(int count)
Gets maximum possible number of features in graph. If the number is exceeded, graph is not created.
Definition: qgstracer.h:111
qgsmessagebar.h
QgsSnappingConfig::AdvancedConfiguration
@ AdvancedConfiguration
On a per layer configuration basis.
Definition: qgssnappingconfig.h:48
QgsMapCanvasTracer::configure
void configure() override
Sets configuration from current snapping settings and canvas settings.
Definition: qgsmapcanvastracer.cpp:100
QgsTracer::hasTopologyProblem
bool hasTopologyProblem() const
Whether there was an error during graph creation due to noding exception, indicating some input data ...
Definition: qgstracer.h:129
QgsMapCanvasTracer::tracerForCanvas
static QgsMapCanvasTracer * tracerForCanvas(QgsMapCanvas *canvas)
Retrieve instance of this class associated with given canvas (if any).
Definition: qgsmapcanvastracer.cpp:60
qgsvectorlayer.h
QgsSnappingConfig::mode
SnappingMode mode() const
Returns the mode (all layers, active layer, per layer settings)
Definition: qgssnappingconfig.cpp:254
QgsMapSettings::destinationCrs
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
Definition: qgsmapsettings.cpp:318
QgsSnappingUtils::layers
QList< QgsSnappingUtils::LayerConfig > layers() const
Query layers used for snapping.
Definition: qgssnappingutils.h:168
QgsTracer::ErrNone
@ ErrNone
No error.
Definition: qgstracer.h:134
QgsVectorLayer
Represents a vector layer which manages a vector based data sets.
Definition: qgsvectorlayer.h:387
QgsMapLayer
Base class for all map layer types.
Definition: qgsmaplayer.h:83
qgssettings.h
TracerCanvasHash
QHash< QgsMapCanvas *, QgsMapCanvasTracer * > TracerCanvasHash
Definition: qgsmapcanvastracer.cpp:31
QgsSnappingConfig::AllLayers
@ AllLayers
On all vector layers.
Definition: qgssnappingconfig.h:47
QgsMapSettings::layers
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
Definition: qgsmapsettings.cpp:282
QgsMapCanvasTracer::reportError
void reportError(PathError err, bool addingVertex)
Report a path finding error to the user.
Definition: qgsmapcanvastracer.cpp:65
QgsMapCanvas::currentLayer
QgsMapLayer * currentLayer()
returns current layer (set by legend widget)
Definition: qgsmapcanvas.cpp:512
QgsTracer::PathError
PathError
Possible errors that may happen when calling findShortestPath()
Definition: qgstracer.h:133
QgsSnappingUtils::LayerConfig
Configures how a certain layer should be handled in a snapping operation.
Definition: qgssnappingutils.h:122
QgsTracer::setLayers
void setLayers(const QList< QgsVectorLayer * > &layers)
Sets layers used for tracing.
Definition: qgstracer.cpp:604
qgsproject.h
qgssnappingutils.h
QgsMapCanvasTracer::QgsMapCanvasTracer
QgsMapCanvasTracer(QgsMapCanvas *canvas, QgsMessageBar *messageBar=nullptr)
Create tracer associated with a particular map canvas, optionally message bar for reporting.
Definition: qgsmapcanvastracer.cpp:34