From 0a0c33dcf23b658bd354c8d0e8b4451913c444df Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Fri, 5 May 2017 22:26:21 +0800 Subject: [PATCH] Remove QgsGeometryCache class The geometry cache was only used for few geometry editing operations anyway. In earlier versions of QGIS the geometry cache was also used by old snapping classes which have been replaced by QgsPointLocator that also keeps a spatial index of geometries and it is not rebuilt on every re-render. Reasons for removal: - geometry cache was repopulated on every redraw of layers in editing mode, slowing down rendering - data structure for the cache was a simple map with features accessed by their ID (no spatial index) - the cache was only getting refreshed for the current view of the main map canvas (not a generic cache) - not used for snapping anymore where caching was important to avoid roundtrips to data provider --- doc/api_break.dox | 4 + python/core/core.sip | 1 - python/core/qgsgeometrycache.sip | 26 ----- python/core/qgsmaprendererjob.sip | 4 - python/core/qgsvectorlayer.sip | 1 - python/core/qgsvectorlayereditutils.sip | 3 - python/core/qgsvectorlayerundocommand.sip | 1 - src/core/CMakeLists.txt | 2 - src/core/qgsgeometrycache.cpp | 46 -------- src/core/qgsgeometrycache.h | 60 ---------- src/core/qgsmaprenderercustompainterjob.cpp | 13 --- src/core/qgsmaprendererjob.cpp | 12 -- src/core/qgsmaprendererjob.h | 13 --- src/core/qgsvectorlayer.cpp | 13 --- src/core/qgsvectorlayer.h | 7 -- src/core/qgsvectorlayereditutils.cpp | 118 +++++++------------- src/core/qgsvectorlayereditutils.h | 4 - src/core/qgsvectorlayerrenderer.cpp | 29 ----- src/core/qgsvectorlayerrenderer.h | 7 -- src/core/qgsvectorlayerundocommand.cpp | 14 +-- src/core/qgsvectorlayerundocommand.h | 2 - src/gui/qgsmapcanvas.cpp | 11 -- 22 files changed, 47 insertions(+), 344 deletions(-) delete mode 100644 python/core/qgsgeometrycache.sip delete mode 100644 src/core/qgsgeometrycache.cpp delete mode 100644 src/core/qgsgeometrycache.h diff --git a/doc/api_break.dox b/doc/api_break.dox index cc67becd21c..48104411049 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -264,6 +264,7 @@ should now call QgsCoordinateReferenceSystem::invalidateCache() and QgsCoordinat - QgsHtmlAnnotationItem. Use QgsHtmlAnnotation instead. - QgsHttpTransaction. This class was outdated and code should be ported to native Qt or Python implementations. - QgsGenericProjectionSelector. Use QgsProjectionSelectionTreeWidget instead. +- QgsGeometryCache. It got redundant after removal of old snapping classes (QgsSnapper + friends). - QgsLabel and QgsLabelAttributes. Replaced by labeling based on PAL library, see QgsLabelingEngine. - QgsLabelingEngineInterface. Replaced by QgsLabelingEngine. - QgsLegendInterface was removed. It was replaced by layer tree API (QgsLayerTreeNode class and others). @@ -1446,6 +1447,7 @@ and subclasses are not designed to be subclassed in PyQGIS. be used instead of a null pointer if no transformation is required. - prepareJobs() and drawLabeling() (neither available in PyQGIS) do not take QgsPalLabeling parameter anymore. All drawing of labels is done by QgsLabelingEngine. - drawOldLabeling(), drawNewLabeling() were removed. The method drawLabeling() should be used instead. +- setRequestedGeometryCacheForLayers() was removed. There is no extra caching done during rendering job. QgsMapTool {#qgis_api_break_3_0_QgsMapTool} @@ -2146,6 +2148,7 @@ QgsVectorLayerEditUtils {#qgis_api_break_3_0_QgsVectorLayerEditUtils} - addTopologicalPoints() now accepts a geometry reference, not a pointer. - insertSegmentVerticesForSnap() has been removed. +- cache() has been removed. QgsVectorLayerImport {#qgis_api_break_3_0_QgsVectorLayerImport} @@ -2168,6 +2171,7 @@ QgsVectorLayerUndoCommand {#qgis_api_break_3_0_QgsVectorLayerUndoCommand} ------------------------- - QgsVectorLayerUndoCommandChangeGeometry constructor now accepts a geometry reference, not a pointer. +- cache() has been removed. QgsVisibilityPresetCollection {#qgis_api_break_3_0_QgsVisibilityPresetCollection} diff --git a/python/core/core.sip b/python/core/core.sip index d21be5237e1..6c568f41e62 100644 --- a/python/core/core.sip +++ b/python/core/core.sip @@ -176,7 +176,6 @@ %Include qgscacheindex.sip %Include qgscacheindexfeatureid.sip %Include qgsfeaturestore.sip -%Include qgsgeometrycache.sip %Include qgslayerdefinition.sip %Include qgsprojectfiletransform.sip %Include qgsvectorlayereditutils.sip diff --git a/python/core/qgsgeometrycache.sip b/python/core/qgsgeometrycache.sip deleted file mode 100644 index 20930cea46d..00000000000 --- a/python/core/qgsgeometrycache.sip +++ /dev/null @@ -1,26 +0,0 @@ -class QgsGeometryCache -{ -%TypeHeaderCode -#include -%End - public: - QgsGeometryCache(); - - QgsGeometryMap &cachedGeometries(); - - //! fetch geometry from cache, return true if successful - bool geometry( QgsFeatureId fid, QgsGeometry &geometry ); - - //! store a geometry in the cache - void cacheGeometry( QgsFeatureId fid, const QgsGeometry &geom ); - - //! get rid of the cached geometry - void removeGeometry( QgsFeatureId fid ); - - /** Deletes the geometries in mCachedGeometries */ - void deleteCachedGeometries(); - - void setCachedGeometriesRect( const QgsRectangle &extent ); - const QgsRectangle &cachedGeometriesRect(); - -}; diff --git a/python/core/qgsmaprendererjob.sip b/python/core/qgsmaprendererjob.sip index ca1e057d683..2ededb20481 100644 --- a/python/core/qgsmaprendererjob.sip +++ b/python/core/qgsmaprendererjob.sip @@ -61,10 +61,6 @@ class QgsMapRendererJob : QObject //! Does not take ownership of the object. void setCache( QgsMapRendererCache *cache ); - //! Set which vector layers should be cached while rendering - //! @note The way how geometries are cached is really suboptimal - this method may be removed in future releases - void setRequestedGeometryCacheForLayers( const QStringList &layerIds ); - //! Find out how long it took to finish the job (in milliseconds) int renderingTime() const; diff --git a/python/core/qgsvectorlayer.sip b/python/core/qgsvectorlayer.sip index 0260be16267..968339ef7e8 100644 --- a/python/core/qgsvectorlayer.sip +++ b/python/core/qgsvectorlayer.sip @@ -1590,7 +1590,6 @@ Returns the current transparency for the vector layer virtual QString htmlMetadata() const; - void setSimplifyMethod( const QgsVectorSimplifyMethod &simplifyMethod ); %Docstring Set the simplification settings for fast rendering of features diff --git a/python/core/qgsvectorlayereditutils.sip b/python/core/qgsvectorlayereditutils.sip index 486445cd01e..b10ec6d2e3d 100644 --- a/python/core/qgsvectorlayereditutils.sip +++ b/python/core/qgsvectorlayereditutils.sip @@ -6,9 +6,6 @@ class QgsVectorLayerEditUtils public: QgsVectorLayerEditUtils( QgsVectorLayer *layer ); - QgsGeometryCache *cache(); - - /** Insert a new vertex before the given vertex number, * in the given ring, item (first number is index 0), and feature * Not meaningful for Point geometries diff --git a/python/core/qgsvectorlayerundocommand.sip b/python/core/qgsvectorlayerundocommand.sip index dfe95b0a66a..9e681d1bc81 100644 --- a/python/core/qgsvectorlayerundocommand.sip +++ b/python/core/qgsvectorlayerundocommand.sip @@ -17,7 +17,6 @@ class QgsVectorLayerUndoCommand : QUndoCommand //! Returns the layer associated with the undo command QgsVectorLayer *layer(); - QgsGeometryCache *cache(); virtual int id() const; virtual bool mergeWith( QUndoCommand * ); diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 296e357cac0..96bf91d0eb0 100755 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -155,7 +155,6 @@ SET(QGIS_CORE_SRCS qgsfieldproxymodel.cpp qgsfields.cpp qgsfontutils.cpp - qgsgeometrycache.cpp qgsgeometrysimplifier.cpp qgsgeometryvalidator.cpp qgsgml.cpp @@ -735,7 +734,6 @@ SET(QGIS_CORE_HDRS qgsfield_p.h qgsfields.h qgsfontutils.h - qgsgeometrycache.h qgshistogram.h qgsindexedfeature.h qgsinterval.h diff --git a/src/core/qgsgeometrycache.cpp b/src/core/qgsgeometrycache.cpp deleted file mode 100644 index 7f66e0f3a09..00000000000 --- a/src/core/qgsgeometrycache.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/*************************************************************************** - qgsgeometrycache.cpp - --------------------- - begin : March 2013 - copyright : (C) 2013 by Matthias Kuhn - email : matthias at opengis dot ch - *************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#include "qgsgeometrycache.h" -#include "qgsvectorlayereditbuffer.h" -#include "qgsgeometry.h" - -QgsGeometryCache::QgsGeometryCache() -{ -} - -bool QgsGeometryCache::geometry( QgsFeatureId fid, QgsGeometry &geometry ) -{ - // no need to check changed geometries because all changed geometries are also cached - - // first time this geometry has changed since last commit - if ( !mCachedGeometries.contains( fid ) ) - return false; - - geometry = mCachedGeometries[fid]; - return true; -} - -void QgsGeometryCache::cacheGeometry( QgsFeatureId fid, const QgsGeometry &geom ) -{ - mCachedGeometries[fid] = geom; -} - - -void QgsGeometryCache::deleteCachedGeometries() -{ - // Destroy any cached geometries - mCachedGeometries.clear(); - mCachedGeometriesRect = QgsRectangle(); -} diff --git a/src/core/qgsgeometrycache.h b/src/core/qgsgeometrycache.h deleted file mode 100644 index 411be0ede00..00000000000 --- a/src/core/qgsgeometrycache.h +++ /dev/null @@ -1,60 +0,0 @@ -/*************************************************************************** - qgsgeometrycache.h - --------------------- - begin : March 2013 - copyright : (C) 2013 by Matthias Kuhn - email : matthias at opengis dot ch - *************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef QGSGEOMETRYCACHE_H -#define QGSGEOMETRYCACHE_H - -#include "qgis_core.h" -#include "qgsgeometry.h" -#include "qgsfeature.h" -#include "qgsrectangle.h" - -#include - -/** \ingroup core - * \class QgsGeometryCache - */ -class CORE_EXPORT QgsGeometryCache -{ - public: - QgsGeometryCache(); - - inline QgsGeometryMap &cachedGeometries() { return mCachedGeometries; } - - //! fetch geometry from cache, return true if successful - bool geometry( QgsFeatureId fid, QgsGeometry &geometry ); - - //! store a geometry in the cache - void cacheGeometry( QgsFeatureId fid, const QgsGeometry &geom ); - - //! get rid of the cached geometry - void removeGeometry( QgsFeatureId fid ) { mCachedGeometries.remove( fid ); } - - //! Deletes the geometries in mCachedGeometries - void deleteCachedGeometries(); - - void setCachedGeometriesRect( const QgsRectangle &extent ) { mCachedGeometriesRect = extent; } - const QgsRectangle &cachedGeometriesRect() { return mCachedGeometriesRect; } - - protected: - - //! Cache of the committed geometries retrieved *for the current display* - QgsGeometryMap mCachedGeometries; - - //! Extent for which there are cached geometries - QgsRectangle mCachedGeometriesRect; - -}; - -#endif // QGSGEOMETRYCACHE_H diff --git a/src/core/qgsmaprenderercustompainterjob.cpp b/src/core/qgsmaprenderercustompainterjob.cpp index 7407d53d1de..5798f5d46c0 100644 --- a/src/core/qgsmaprenderercustompainterjob.cpp +++ b/src/core/qgsmaprenderercustompainterjob.cpp @@ -341,19 +341,6 @@ void QgsMapRendererJob::drawLabeling( const QgsMapSettings &settings, QgsRenderC } -void QgsMapRendererJob::updateLayerGeometryCaches() -{ - QMap::const_iterator it = mGeometryCaches.constBegin(); - for ( ; it != mGeometryCaches.constEnd(); ++it ) - { - const QgsGeometryCache &cache = it.value(); - if ( QgsVectorLayer *vl = qobject_cast( QgsProject::instance()->mapLayer( it.key() ) ) ) - * vl->cache() = cache; - } - mGeometryCaches.clear(); -} - - bool QgsMapRendererJob::needTemporaryImage( QgsMapLayer *ml ) { if ( ml->type() == QgsMapLayer::VectorLayer ) diff --git a/src/core/qgsmaprendererjob.cpp b/src/core/qgsmaprendererjob.cpp index fb73a549b78..3a6e18af9f4 100644 --- a/src/core/qgsmaprendererjob.cpp +++ b/src/core/qgsmaprendererjob.cpp @@ -226,8 +226,6 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter *painter, QgsLabelingEn bool requiresLabelRedraw = !( mCache && mCache->hasCacheImage( LABEL_CACHE_ID ) ); - mGeometryCaches.clear(); - while ( li.hasPrevious() ) { QgsMapLayer *ml = li.previous(); @@ -341,14 +339,6 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter *painter, QgsLabelingEn if ( hasStyleOverride ) ml->styleManager()->restoreOverrideStyle(); - if ( mRequestedGeomCacheForLayers.contains( ml->id() ) ) - { - if ( QgsVectorLayerRenderer *vlr = dynamic_cast( job.renderer ) ) - { - vlr->setGeometryCachePointer( &mGeometryCaches[ ml->id()] ); - } - } - } // while (li.hasPrevious()) return layerJobs; @@ -428,8 +418,6 @@ void QgsMapRendererJob::cleanupJobs( LayerRenderJobs &jobs ) jobs.clear(); - - updateLayerGeometryCaches(); } void QgsMapRendererJob::cleanupLabelJob( LabelRenderJob &job ) diff --git a/src/core/qgsmaprendererjob.h b/src/core/qgsmaprendererjob.h index 1eae71ece57..a411e543b9c 100644 --- a/src/core/qgsmaprendererjob.h +++ b/src/core/qgsmaprendererjob.h @@ -30,7 +30,6 @@ #include "qgsmapsettings.h" -#include "qgsgeometrycache.h" class QgsLabelingEngine; class QgsLabelingResults; @@ -186,10 +185,6 @@ class CORE_EXPORT QgsMapRendererJob : public QObject //! Does not take ownership of the object. void setCache( QgsMapRendererCache *cache ); - //! Set which vector layers should be cached while rendering - //! \note The way how geometries are cached is really suboptimal - this method may be removed in future releases - void setRequestedGeometryCacheForLayers( const QStringList &layerIds ) { mRequestedGeomCacheForLayers = layerIds; } - //! Find out how long it took to finish the job (in milliseconds) int renderingTime() const { return mRenderingTime; } @@ -279,14 +274,6 @@ class CORE_EXPORT QgsMapRendererJob : public QObject bool needTemporaryImage( QgsMapLayer *ml ); - //! called when rendering has finished to update all layers' geometry caches - void updateLayerGeometryCaches(); - - //! list of layer IDs for which the geometry cache should be updated - QStringList mRequestedGeomCacheForLayers; - //! map of geometry caches - QMap mGeometryCaches; - const QgsFeatureFilterProvider *mFeatureFilterProvider = nullptr; }; diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 4b3866715e8..c7c02dbad9f 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -49,7 +49,6 @@ #include "qgsfeature.h" #include "qgsfeaturerequest.h" #include "qgsfields.h" -#include "qgsgeometrycache.h" #include "qgsgeometry.h" #include "qgslogger.h" #include "qgsmaplayerlegend.h" @@ -142,7 +141,6 @@ QgsVectorLayer::QgsVectorLayer( const QString &vectorLayerPath, , mFeatureBlendMode( QPainter::CompositionMode_SourceOver ) // Default to normal feature blending , mLayerTransparency( 0 ) , mVertexMarkerOnlyForSelection( false ) - , mCache( new QgsGeometryCache() ) , mEditBuffer( nullptr ) , mJoinBuffer( nullptr ) , mExpressionFieldBuffer( nullptr ) @@ -190,7 +188,6 @@ QgsVectorLayer::~QgsVectorLayer() delete mEditBuffer; delete mJoinBuffer; delete mExpressionFieldBuffer; - delete mCache; delete mLabeling; delete mDiagramLayerSettings; delete mDiagramRenderer; @@ -2438,11 +2435,6 @@ bool QgsVectorLayer::commitChanges() QgsMessageLog::logMessage( tr( "Commit errors:\n %1" ).arg( mCommitErrors.join( QStringLiteral( "\n " ) ) ) ); } - if ( mCache ) - { - mCache->deleteCachedGeometries(); - } - updateFields(); mDataProvider->updateExtents(); @@ -2490,11 +2482,6 @@ bool QgsVectorLayer::rollBack( bool deleteBuffer ) } emit editingStopped(); - if ( mCache ) - { - mCache->deleteCachedGeometries(); - } - if ( rollbackExtent ) updateExtents(); diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index 0332caf96eb..a81cb795d57 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -54,7 +54,6 @@ class QgsEditorWidgetWrapper; class QgsExpressionFieldBuffer; class QgsFeatureRenderer; class QgsGeometry; -class QgsGeometryCache; class QgsGeometryVertexIndex; class QgsMapToPixel; class QgsRectangle; @@ -1487,9 +1486,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte QString htmlMetadata() const override; - //! \note not available in Python bindings - inline QgsGeometryCache *cache() SIP_SKIP { return mCache; } - /** Set the simplification settings for fast rendering of features * \since QGIS 2.2 */ @@ -1971,9 +1967,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte //! Annotation form for this layer QString mAnnotationForm; - //! cache for some vector layer data - currently only geometries for faster editing - QgsGeometryCache *mCache = nullptr; - //! stores information about uncommitted changes to layer QgsVectorLayerEditBuffer *mEditBuffer = nullptr; friend class QgsVectorLayerEditBuffer; diff --git a/src/core/qgsvectorlayereditutils.cpp b/src/core/qgsvectorlayereditutils.cpp index 3ca8a2499b5..fd4e97fa142 100644 --- a/src/core/qgsvectorlayereditutils.cpp +++ b/src/core/qgsvectorlayereditutils.cpp @@ -16,7 +16,6 @@ #include "qgsvectordataprovider.h" #include "qgsfeatureiterator.h" -#include "qgsgeometrycache.h" #include "qgsvectorlayereditbuffer.h" #include "qgslinestring.h" #include "qgslogger.h" @@ -39,16 +38,11 @@ bool QgsVectorLayerEditUtils::insertVertex( double x, double y, QgsFeatureId atF if ( !L->hasGeometryType() ) return false; - QgsGeometry geometry; - if ( !cache()->geometry( atFeatureId, geometry ) ) - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) - return false; // geometry not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) + return false; // geometry not found - geometry = f.geometry(); - } + QgsGeometry geometry = f.geometry(); geometry.insertVertex( x, y, beforeVertex ); @@ -61,16 +55,11 @@ bool QgsVectorLayerEditUtils::insertVertex( const QgsPointV2 &point, QgsFeatureI if ( !L->hasGeometryType() ) return false; - QgsGeometry geometry; - if ( !cache()->geometry( atFeatureId, geometry ) ) - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) - return false; // geometry not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) + return false; // geometry not found - geometry = f.geometry(); - } + QgsGeometry geometry = f.geometry(); geometry.insertVertex( point, beforeVertex ); @@ -89,16 +78,11 @@ bool QgsVectorLayerEditUtils::moveVertex( const QgsPointV2 &p, QgsFeatureId atFe if ( !L->hasGeometryType() ) return false; - QgsGeometry geometry; - if ( !cache()->geometry( atFeatureId, geometry ) ) - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) - return false; // geometry not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( atFeatureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) + return false; // geometry not found - geometry = f.geometry(); - } + QgsGeometry geometry = f.geometry(); geometry.moveVertex( p, atVertex ); @@ -112,16 +96,11 @@ QgsVectorLayer::EditResult QgsVectorLayerEditUtils::deleteVertex( QgsFeatureId f if ( !L->hasGeometryType() ) return QgsVectorLayer::InvalidLayer; - QgsGeometry geometry; - if ( !cache()->geometry( featureId, geometry ) ) - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) - return QgsVectorLayer::FetchFeatureFailed; // geometry not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) + return QgsVectorLayer::FetchFeatureFailed; // geometry not found - geometry = f.geometry(); - } + QgsGeometry geometry = f.geometry(); if ( !geometry.deleteVertex( vertex ) ) return QgsVectorLayer::EditFailed; @@ -208,22 +187,18 @@ int QgsVectorLayerEditUtils::addPart( const QgsPointSequence &points, QgsFeature QgsGeometry geometry; bool firstPart = false; - if ( !cache()->geometry( featureId, geometry ) ) // maybe it's in cache - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) ) - return 6; //not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) ) + return 6; //not found - if ( !f.hasGeometry() ) - { - //no existing geometry, so adding first part to null geometry - firstPart = true; - } - else - { - geometry = f.geometry(); - } + if ( !f.hasGeometry() ) + { + //no existing geometry, so adding first part to null geometry + firstPart = true; + } + else + { + geometry = f.geometry(); } int errorCode = geometry.addPart( points, L->geometryType() ) ; @@ -247,22 +222,18 @@ int QgsVectorLayerEditUtils::addPart( QgsCurve *ring, QgsFeatureId featureId ) QgsGeometry geometry; bool firstPart = false; - if ( !cache()->geometry( featureId, geometry ) ) // maybe it's in cache - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) ) - return 6; //not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) ) + return 6; //not found - if ( !f.hasGeometry() ) - { - //no existing geometry, so adding first part to null geometry - firstPart = true; - } - else - { - geometry = f.geometry(); - } + if ( !f.hasGeometry() ) + { + //no existing geometry, so adding first part to null geometry + firstPart = true; + } + else + { + geometry = f.geometry(); } int errorCode = geometry.addPart( ring, L->geometryType() ) ; @@ -285,16 +256,11 @@ int QgsVectorLayerEditUtils::translateFeature( QgsFeatureId featureId, double dx if ( !L->hasGeometryType() ) return 1; - QgsGeometry geometry; - if ( !cache()->geometry( featureId, geometry ) ) // maybe it's in cache - { - // it's not in cache: let's fetch it from layer - QgsFeature f; - if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) - return 1; //geometry not found + QgsFeature f; + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.hasGeometry() ) + return 1; //geometry not found - geometry = f.geometry(); - } + QgsGeometry geometry = f.geometry(); int errorCode = geometry.translate( dx, dy ); if ( errorCode == 0 ) diff --git a/src/core/qgsvectorlayereditutils.h b/src/core/qgsvectorlayereditutils.h index c5906f56d83..5e4c55437a4 100644 --- a/src/core/qgsvectorlayereditutils.h +++ b/src/core/qgsvectorlayereditutils.h @@ -23,7 +23,6 @@ #include "qgsvectorlayer.h" #include "qgsgeometry.h" -class QgsGeometryCache; class QgsCurve; /** \ingroup core @@ -34,9 +33,6 @@ class CORE_EXPORT QgsVectorLayerEditUtils public: QgsVectorLayerEditUtils( QgsVectorLayer *layer ); - inline QgsGeometryCache *cache() { return L->cache(); } - - /** Insert a new vertex before the given vertex number, * in the given ring, item (first number is index 0), and feature * Not meaningful for Point geometries diff --git a/src/core/qgsvectorlayerrenderer.cpp b/src/core/qgsvectorlayerrenderer.cpp index 48604d8c399..ddf1b43f326 100644 --- a/src/core/qgsvectorlayerrenderer.cpp +++ b/src/core/qgsvectorlayerrenderer.cpp @@ -18,7 +18,6 @@ #include "diagram/qgsdiagram.h" #include "qgsdiagramrenderer.h" -#include "qgsgeometrycache.h" #include "qgsmessagelog.h" #include "qgspallabeling.h" #include "qgsrenderer.h" @@ -39,9 +38,6 @@ #include -// TODO: -// - passing of cache to QgsVectorLayer - QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRenderContext &context ) : QgsMapLayerRenderer( layer->id() ) @@ -50,7 +46,6 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRender , mLayer( layer ) , mFields( layer->fields() ) , mRenderer( nullptr ) - , mCache( nullptr ) , mLabeling( false ) , mDiagrams( false ) , mLabelProvider( nullptr ) @@ -265,18 +260,6 @@ bool QgsVectorLayerRenderer::render() return true; } -void QgsVectorLayerRenderer::setGeometryCachePointer( QgsGeometryCache *cache ) -{ - mCache = cache; - - if ( mCache ) - { - // Destroy all cached geometries and clear the references to them - mCache->setCachedGeometriesRect( mContext.extent() ); - } -} - - void QgsVectorLayerRenderer::drawRenderer( QgsFeatureIterator &fit ) { @@ -302,12 +285,6 @@ void QgsVectorLayerRenderer::drawRenderer( QgsFeatureIterator &fit ) bool sel = mContext.showSelection() && mSelectedFeatureIds.contains( fet.id() ); bool drawMarker = ( mDrawVertexMarkers && mContext.drawEditingInformation() && ( !mVertexMarkerOnlyForSelection || sel ) ); - if ( mCache ) - { - // Cache this for the use of (e.g.) modifying the feature's uncommitted geometry. - mCache->cacheGeometry( fet.id(), fet.geometry() ); - } - // render feature bool rendered = mRenderer->renderFeature( fet, mContext, -1, sel, drawMarker ); @@ -398,12 +375,6 @@ void QgsVectorLayerRenderer::drawRendererLevels( QgsFeatureIterator &fit ) } features[sym].append( fet ); - if ( mCache ) - { - // Cache this for the use of (e.g.) modifying the feature's uncommitted geometry. - mCache->cacheGeometry( fet.id(), fet.geometry() ); - } - // new labeling engine if ( mContext.labelingEngine() ) { diff --git a/src/core/qgsvectorlayerrenderer.h b/src/core/qgsvectorlayerrenderer.h index c9aeb8015f4..4613568d972 100644 --- a/src/core/qgsvectorlayerrenderer.h +++ b/src/core/qgsvectorlayerrenderer.h @@ -24,7 +24,6 @@ class QgsVectorLayerFeatureSource; class QgsDiagramRenderer; class QgsDiagramLayerSettings; -class QgsGeometryCache; class QgsFeatureIterator; class QgsSingleSymbolRenderer; @@ -72,10 +71,6 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer virtual bool render() override; - //! where to save the cached geometries - //! \note The way how geometries are cached is really suboptimal - this method may be removed in future releases - void setGeometryCachePointer( QgsGeometryCache *cache ); - private: /** Registers label and diagram layer @@ -114,8 +109,6 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer QgsFeatureRenderer *mRenderer = nullptr; - QgsGeometryCache *mCache = nullptr; - bool mDrawVertexMarkers; bool mVertexMarkerOnlyForSelection; int mVertexMarkerStyle, mVertexMarkerSize; diff --git a/src/core/qgsvectorlayerundocommand.cpp b/src/core/qgsvectorlayerundocommand.cpp index 903d6da55ef..d8d4add510e 100644 --- a/src/core/qgsvectorlayerundocommand.cpp +++ b/src/core/qgsvectorlayerundocommand.cpp @@ -19,7 +19,6 @@ #include "qgsgeometry.h" #include "qgsfeature.h" #include "qgsvectorlayer.h" -#include "qgsgeometrycache.h" #include "qgsvectorlayereditbuffer.h" #include "qgslogger.h" @@ -51,9 +50,6 @@ void QgsVectorLayerUndoCommandAddFeature::undo() #endif mBuffer->mAddedFeatures.remove( mFeature.id() ); - if ( mFeature.hasGeometry() ) - cache()->removeGeometry( mFeature.id() ); - emit mBuffer->featureDeleted( mFeature.id() ); } @@ -61,9 +57,6 @@ void QgsVectorLayerUndoCommandAddFeature::redo() { mBuffer->mAddedFeatures.insert( mFeature.id(), mFeature ); - if ( mFeature.hasGeometry() ) - cache()->cacheGeometry( mFeature.id(), mFeature.geometry() ); - emit mBuffer->featureAdded( mFeature.id() ); } @@ -127,8 +120,7 @@ QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry { bool changedAlready = mBuffer->mChangedGeometries.contains( mFid ); QgsGeometry geom; - bool cachedGeom = cache()->geometry( mFid, geom ); - mOldGeom = ( changedAlready && cachedGeom ) ? geom : QgsGeometry(); + mOldGeom = changedAlready ? geom : QgsGeometry(); } } @@ -164,7 +156,6 @@ void QgsVectorLayerUndoCommandChangeGeometry::undo() Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); it.value().setGeometry( mOldGeom ); - cache()->cacheGeometry( mFid, mOldGeom ); emit mBuffer->geometryChanged( mFid, mOldGeom ); } else @@ -178,14 +169,12 @@ void QgsVectorLayerUndoCommandChangeGeometry::undo() QgsFeature f; if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.hasGeometry() ) { - cache()->cacheGeometry( mFid, f.geometry() ); emit mBuffer->geometryChanged( mFid, f.geometry() ); } } else { mBuffer->mChangedGeometries[mFid] = mOldGeom; - cache()->cacheGeometry( mFid, mOldGeom ); emit mBuffer->geometryChanged( mFid, mOldGeom ); } } @@ -205,7 +194,6 @@ void QgsVectorLayerUndoCommandChangeGeometry::redo() { mBuffer->mChangedGeometries[ mFid ] = mNewGeom; } - cache()->cacheGeometry( mFid, mNewGeom ); emit mBuffer->geometryChanged( mFid, mNewGeom ); } diff --git a/src/core/qgsvectorlayerundocommand.h b/src/core/qgsvectorlayerundocommand.h index fb4f1de20d6..07b350aafe7 100644 --- a/src/core/qgsvectorlayerundocommand.h +++ b/src/core/qgsvectorlayerundocommand.h @@ -28,7 +28,6 @@ #include "qgsfeature.h" class QgsGeometry; -class QgsGeometryCache; #include "qgsvectorlayer.h" #include "qgsvectorlayereditbuffer.h" @@ -52,7 +51,6 @@ class CORE_EXPORT QgsVectorLayerUndoCommand : public QUndoCommand //! Returns the layer associated with the undo command inline QgsVectorLayer *layer() { return mBuffer->L; } - inline QgsGeometryCache *cache() { return mBuffer->L->cache(); } virtual int id() const override { return -1; } virtual bool mergeWith( const QUndoCommand * ) override { return false; } diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 79aa1ba01bc..95763de7502 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -526,17 +526,6 @@ void QgsMapCanvas::refreshMap() connect( mJob, &QgsMapRendererJob::finished, this, &QgsMapCanvas::rendererJobFinished ); mJob->setCache( mCache ); - QStringList layersForGeometryCache; - Q_FOREACH ( QgsMapLayer *layer, mSettings.layers() ) - { - if ( QgsVectorLayer *vl = qobject_cast( layer ) ) - { - if ( vl->isEditable() ) - layersForGeometryCache << vl->id(); - } - } - mJob->setRequestedGeometryCacheForLayers( layersForGeometryCache ); - mJob->start(); // from now on we can accept refresh requests again