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
This commit is contained in:
Martin Dobias 2017-05-05 22:26:21 +08:00
parent 5e3c6e54be
commit 0a0c33dcf2
22 changed files with 47 additions and 344 deletions

View File

@ -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}

View File

@ -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

View File

@ -1,26 +0,0 @@
class QgsGeometryCache
{
%TypeHeaderCode
#include <qgsgeometrycache.h>
%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();
};

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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 * );

View File

@ -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

View File

@ -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();
}

View File

@ -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 <QMap>
/** \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

View File

@ -341,19 +341,6 @@ void QgsMapRendererJob::drawLabeling( const QgsMapSettings &settings, QgsRenderC
}
void QgsMapRendererJob::updateLayerGeometryCaches()
{
QMap<QString, QgsGeometryCache>::const_iterator it = mGeometryCaches.constBegin();
for ( ; it != mGeometryCaches.constEnd(); ++it )
{
const QgsGeometryCache &cache = it.value();
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayer( it.key() ) ) )
* vl->cache() = cache;
}
mGeometryCaches.clear();
}
bool QgsMapRendererJob::needTemporaryImage( QgsMapLayer *ml )
{
if ( ml->type() == QgsMapLayer::VectorLayer )

View File

@ -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<QgsVectorLayerRenderer *>( 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 )

View File

@ -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<QString, QgsGeometryCache> mGeometryCaches;
const QgsFeatureFilterProvider *mFeatureFilterProvider = nullptr;
};

View File

@ -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();

View File

@ -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;

View File

@ -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 )

View File

@ -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

View File

@ -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 <QPicture>
// 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() )
{

View File

@ -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;

View File

@ -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 );
}

View File

@ -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; }

View File

@ -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<QgsVectorLayer *>( layer ) )
{
if ( vl->isEditable() )
layersForGeometryCache << vl->id();
}
}
mJob->setRequestedGeometryCacheForLayers( layersForGeometryCache );
mJob->start();
// from now on we can accept refresh requests again