Skip to content

Commit 7218bd3

Browse files
author
Hugo Mercier
committedOct 5, 2012
Get rid of the unneeded vector of QgsExpression in atlas generation
1 parent 77761b0 commit 7218bd3

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed
 

‎src/core/composer/qgsatlascomposition.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ void QgsAtlasComposition::beginRender()
9090
// select all features with all attributes
9191
provider->select( provider->attributeIndexes() );
9292

93-
// features must be stored in a list, since modifying the layer's extent rewinds nextFeature()
94-
mFeatures.clear();
95-
QgsFeature feature;
96-
while ( provider->nextFeature( feature ) )
93+
// We cannot use nextFeature() directly since the feature pointer is rewinded by the rendering process
94+
// We thus store the feature ids for future extraction
95+
QgsFeature feat;
96+
while ( provider->nextFeature( feat ) )
9797
{
98-
mFeatures.push_back( feature );
98+
mFeatureIds.push_back( feat.id() );
9999
}
100100

101101
mOrigExtent = mComposerMap->extent();
@@ -115,7 +115,7 @@ void QgsAtlasComposition::beginRender()
115115

116116
// special columns for expressions
117117
QgsExpression::setSpecialColumn( "$numpages", QVariant( mComposition->numPages() ) );
118-
QgsExpression::setSpecialColumn( "$numfeatures", QVariant(( int )mFeatures.size() ) );
118+
QgsExpression::setSpecialColumn( "$numfeatures", QVariant(( int )provider->featureCount() ) );
119119
}
120120

121121
void QgsAtlasComposition::endRender()
@@ -147,7 +147,11 @@ void QgsAtlasComposition::endRender()
147147

148148
size_t QgsAtlasComposition::numFeatures() const
149149
{
150-
return mFeatures.size();
150+
if ( mCoverageLayer )
151+
{
152+
return mCoverageLayer->dataProvider()->featureCount();
153+
}
154+
return 0;
151155
}
152156

153157
void QgsAtlasComposition::prepareForFeature( size_t featureI )
@@ -157,12 +161,14 @@ void QgsAtlasComposition::prepareForFeature( size_t featureI )
157161
return;
158162
}
159163

160-
QgsFeature* fit = &mFeatures[featureI];
164+
QgsVectorDataProvider* provider = mCoverageLayer->dataProvider();
165+
// retrieve the next feature, based on its id
166+
provider->featureAtId( mFeatureIds[ featureI ], mCurrentFeature, /* fetchGeometry = */ true, provider->attributeIndexes() );
161167

162168
if ( mFilenamePattern.size() > 0 )
163169
{
164170
QgsExpression::setSpecialColumn( "$feature", QVariant(( int )featureI + 1 ) );
165-
QVariant filenameRes = mFilenameExpr->evaluate( &*fit );
171+
QVariant filenameRes = mFilenameExpr->evaluate( &mCurrentFeature );
166172
if ( mFilenameExpr->hasEvalError() )
167173
{
168174
throw std::runtime_error( "Filename eval error: " + mFilenameExpr->evalErrorString().toStdString() );
@@ -180,7 +186,7 @@ void QgsAtlasComposition::prepareForFeature( size_t featureI )
180186
// We have to transform the grometry to the destination CRS and ask for the bounding box
181187
// Note: we cannot directly take the transformation of the bounding box, since transformations are not linear
182188

183-
QgsGeometry tgeom( *fit->geometry() );
189+
QgsGeometry tgeom( *mCurrentFeature.geometry() );
184190
tgeom.transform( mTransform );
185191
QgsRectangle geom_rect = tgeom.boundingBox();
186192

@@ -243,7 +249,7 @@ void QgsAtlasComposition::prepareForFeature( size_t featureI )
243249

244250
for ( QList<QgsComposerLabel*>::iterator lit = labels.begin(); lit != labels.end(); ++lit )
245251
{
246-
( *lit )->setExpressionContext( fit, mCoverageLayer );
252+
( *lit )->setExpressionContext( &mCurrentFeature, mCoverageLayer );
247253
}
248254

249255
// set the new extent (and render)

‎src/core/composer/qgsatlascomposition.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
103103

104104
QgsCoordinateTransform mTransform;
105105
QString mCurrentFilename;
106-
std::vector<QgsFeature> mFeatures;
106+
std::vector<QgsFeatureId> mFeatureIds;
107+
QgsFeature mCurrentFeature;
107108
QgsRectangle mOrigExtent;
108109
bool mRestoreLayer;
109110
std::auto_ptr<QgsExpression> mFilenameExpr;

0 commit comments

Comments
 (0)
Please sign in to comment.