@@ -18,50 +18,55 @@ bool QgsVectorLayerFeatureCounter::run()
18
18
mSymbolFeatureCountMap .insert ( symbolIt->first , 0 );
19
19
}
20
20
21
- int featuresCounted = 0 ;
21
+ // If there are no features to be counted, we can spare us the trouble
22
+ if ( mFeatureCount > 0 )
23
+ {
24
+ int featuresCounted = 0 ;
22
25
23
- // Renderer (rule based) may depend on context scale, with scale is ignored if 0
24
- QgsRenderContext renderContext;
25
- renderContext.setRendererScale ( 0 );
26
- renderContext.expressionContext ().appendScopes ( mExpressionContextScopes );
26
+ // Renderer (rule based) may depend on context scale, with scale is ignored if 0
27
+ QgsRenderContext renderContext;
28
+ renderContext.setRendererScale ( 0 );
29
+ renderContext.expressionContext ().appendScopes ( mExpressionContextScopes );
27
30
28
- QgsFeatureRequest request;
29
- if ( !mRenderer ->filterNeedsGeometry () )
30
- request.setFlags ( QgsFeatureRequest::NoGeometry );
31
- request.setSubsetOfAttributes ( mRenderer ->usedAttributes ( renderContext ), mSource ->fields () );
32
- QgsFeatureIterator fit = mSource ->getFeatures ( request );
31
+ QgsFeatureRequest request;
32
+ if ( !mRenderer ->filterNeedsGeometry () )
33
+ request.setFlags ( QgsFeatureRequest::NoGeometry );
34
+ request.setSubsetOfAttributes ( mRenderer ->usedAttributes ( renderContext ), mSource ->fields () );
35
+ QgsFeatureIterator fit = mSource ->getFeatures ( request );
33
36
34
- // TODO: replace QgsInterruptionChecker with QgsFeedback
35
- // fit.setInterruptionChecker( mFeedback );
37
+ // TODO: replace QgsInterruptionChecker with QgsFeedback
38
+ // fit.setInterruptionChecker( mFeedback );
36
39
37
- mRenderer ->startRender ( renderContext, mSource ->fields () );
40
+ mRenderer ->startRender ( renderContext, mSource ->fields () );
38
41
39
- double progress = 0 ;
40
- QgsFeature f;
41
- while ( fit.nextFeature ( f ) )
42
- {
43
- renderContext.expressionContext ().setFeature ( f );
44
- QSet<QString> featureKeyList = mRenderer ->legendKeysForFeature ( f, renderContext );
45
- Q_FOREACH ( const QString &key, featureKeyList )
42
+ double progress = 0 ;
43
+ QgsFeature f;
44
+ while ( fit.nextFeature ( f ) )
46
45
{
47
- mSymbolFeatureCountMap [key] += 1 ;
48
- }
49
- ++featuresCounted;
46
+ renderContext.expressionContext ().setFeature ( f );
47
+ QSet<QString> featureKeyList = mRenderer ->legendKeysForFeature ( f, renderContext );
48
+ Q_FOREACH ( const QString &key, featureKeyList )
49
+ {
50
+ mSymbolFeatureCountMap [key] += 1 ;
51
+ }
52
+ ++featuresCounted;
50
53
51
- double p = ( featuresCounted / mFeatureCount ) * 100 ;
52
- if ( p - progress > 1 )
53
- {
54
- progress = p;
55
- setProgress ( progress );
56
- }
54
+ double p = ( featuresCounted / mFeatureCount ) * 100 ;
55
+ if ( p - progress > 1 )
56
+ {
57
+ progress = p;
58
+ setProgress ( progress );
59
+ }
57
60
58
- if ( isCanceled () )
59
- {
60
- mRenderer ->stopRender ( renderContext );
61
- return false ;
61
+ if ( isCanceled () )
62
+ {
63
+ mRenderer ->stopRender ( renderContext );
64
+ return false ;
65
+ }
62
66
}
67
+ mRenderer ->stopRender ( renderContext );
63
68
}
64
- mRenderer -> stopRender ( renderContext );
69
+
65
70
setProgress ( 100 );
66
71
67
72
emit symbolsCounted ();
@@ -70,5 +75,5 @@ bool QgsVectorLayerFeatureCounter::run()
70
75
71
76
QHash<QString, long > QgsVectorLayerFeatureCounter::symbolFeatureCountMap () const
72
77
{
73
- return mSymbolFeatureCountMap ;
78
+ return mSymbolFeatureCountMap ;
74
79
}
0 commit comments