@@ -91,6 +91,7 @@ QgsPalLayerSettings::QgsPalLayerSettings()
91
91
, expression( 0 )
92
92
{
93
93
enabled = false ;
94
+ drawLabels = true ;
94
95
isExpression = false ;
95
96
fieldIndex = 0 ;
96
97
@@ -333,6 +334,7 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
333
334
// copy only permanent stuff
334
335
335
336
enabled = s.enabled ;
337
+ drawLabels = s.drawLabels ;
336
338
337
339
// text style
338
340
fieldName = s.fieldName ;
@@ -717,6 +719,7 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer )
717
719
// NOTE: set defaults for newly added properties, for backwards compatibility
718
720
719
721
enabled = layer->labelsEnabled ();
722
+ drawLabels = layer->customProperty ( " labeling/drawLabels" , true ).toBool ();
720
723
721
724
// text style
722
725
fieldName = layer->customProperty ( " labeling/fieldName" ).toString ();
@@ -927,6 +930,7 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
927
930
layer->setCustomProperty ( " labeling" , " pal" );
928
931
929
932
layer->setCustomProperty ( " labeling/enabled" , enabled );
933
+ layer->setCustomProperty ( " labeling/drawLabels" , drawLabels );
930
934
931
935
// text style
932
936
layer->setCustomProperty ( " labeling/fieldName" , fieldName );
@@ -1410,6 +1414,15 @@ void QgsPalLayerSettings::calculateLabelSize( const QFontMetricsF* fm, QString t
1410
1414
1411
1415
void QgsPalLayerSettings::registerFeature ( QgsFeature& f, const QgsRenderContext& context, QString dxfLayer )
1412
1416
{
1417
+ if ( !drawLabels )
1418
+ {
1419
+ if ( obstacle )
1420
+ {
1421
+ registerObstacleFeature ( f, context, dxfLayer );
1422
+ }
1423
+ return ;
1424
+ }
1425
+
1413
1426
QVariant exprVal; // value() is repeatedly nulled on data defined evaluation and replaced when successful
1414
1427
mCurFeat = &f;
1415
1428
// mCurFields = &layer->pendingFields();
@@ -2199,6 +2212,58 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
2199
2212
lbl->setIsPinned ( labelIsPinned );
2200
2213
}
2201
2214
2215
+ void QgsPalLayerSettings::registerObstacleFeature ( QgsFeature& f, const QgsRenderContext& context, QString dxfLayer )
2216
+ {
2217
+ mCurFeat = &f;
2218
+
2219
+ const QgsGeometry* geom = f.constGeometry ();
2220
+ if ( !geom )
2221
+ {
2222
+ return ;
2223
+ }
2224
+
2225
+ const GEOSGeometry* geos_geom = 0 ;
2226
+ QScopedPointer<QgsGeometry> scopedPreparedGeom;
2227
+
2228
+ if ( QgsPalLabeling::geometryRequiresPreparation ( geom, context, ct, extentGeom ) )
2229
+ {
2230
+ scopedPreparedGeom.reset ( QgsPalLabeling::prepareGeometry ( geom, context, ct, extentGeom ) );
2231
+ if ( !scopedPreparedGeom.data () )
2232
+ return ;
2233
+ geos_geom = scopedPreparedGeom.data ()->asGeos ();
2234
+ }
2235
+ else
2236
+ {
2237
+ geos_geom = geom->asGeos ();
2238
+ }
2239
+
2240
+ if ( geos_geom == NULL )
2241
+ return ; // invalid geometry
2242
+
2243
+ GEOSGeometry* geos_geom_clone;
2244
+ geos_geom_clone = GEOSGeom_clone_r ( QgsGeometry::getGEOSHandler (), geos_geom );
2245
+
2246
+ QgsPalGeometry* lbl = new QgsPalGeometry ( f.id (), QString (), geos_geom_clone );
2247
+
2248
+ lbl->setDxfLayer ( dxfLayer );
2249
+
2250
+ // record the created geometry - it will be deleted at the end.
2251
+ geometries.append ( lbl );
2252
+
2253
+ // feature to the layer
2254
+ try
2255
+ {
2256
+ if ( !palLayer->registerFeature ( lbl->strId (), lbl, 0 , 0 ) )
2257
+ return ;
2258
+ }
2259
+ catch ( std::exception &e )
2260
+ {
2261
+ Q_UNUSED ( e );
2262
+ QgsDebugMsgLevel ( QString ( " Ignoring feature %1 due PAL exception:" ).arg ( f.id () ) + QString::fromLatin1 ( e.what () ), 4 );
2263
+ return ;
2264
+ }
2265
+ }
2266
+
2202
2267
bool QgsPalLayerSettings::dataDefinedValEval ( const QString& valType,
2203
2268
QgsPalLayerSettings::DataDefinedProperties p,
2204
2269
QVariant& exprVal )
@@ -3136,26 +3201,29 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QStringList& attrNames,
3136
3201
QgsPalLayerSettings lyrTmp;
3137
3202
lyrTmp.readFromLayer ( layer );
3138
3203
3139
- if ( lyrTmp.fieldName .isEmpty () )
3140
- {
3141
- return 0 ;
3142
- }
3143
-
3144
- if ( lyrTmp.isExpression )
3204
+ if ( lyrTmp.drawLabels )
3145
3205
{
3146
- QgsExpression exp ( lyrTmp.fieldName );
3147
- if ( exp.hasEvalError () )
3206
+ if ( lyrTmp.fieldName .isEmpty () )
3148
3207
{
3149
- QgsDebugMsgLevel ( " Prepare error:" + exp.evalErrorString (), 4 );
3150
3208
return 0 ;
3151
3209
}
3152
- }
3153
- else
3154
- {
3155
- // If we aren't an expression, we check to see if we can find the column.
3156
- if ( layer->fieldNameIndex ( lyrTmp.fieldName ) == -1 )
3210
+
3211
+ if ( lyrTmp.isExpression )
3157
3212
{
3158
- return 0 ;
3213
+ QgsExpression exp ( lyrTmp.fieldName );
3214
+ if ( exp.hasEvalError () )
3215
+ {
3216
+ QgsDebugMsgLevel ( " Prepare error:" + exp.evalErrorString (), 4 );
3217
+ return 0 ;
3218
+ }
3219
+ }
3220
+ else
3221
+ {
3222
+ // If we aren't an expression, we check to see if we can find the column.
3223
+ if ( layer->fieldNameIndex ( lyrTmp.fieldName ) == -1 )
3224
+ {
3225
+ return 0 ;
3226
+ }
3159
3227
}
3160
3228
}
3161
3229
@@ -3166,52 +3234,55 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QStringList& attrNames,
3166
3234
3167
3235
lyr.mCurFields = &( layer->pendingFields () );
3168
3236
3169
- // add field indices for label's text, from expression or field
3170
- if ( lyr.isExpression )
3237
+ if ( lyrTmp.drawLabels )
3171
3238
{
3172
- // prepare expression for use in QgsPalLayerSettings::registerFeature()
3173
- QgsExpression* exp = lyr.getLabelExpression ();
3174
- exp->prepare ( layer->pendingFields () );
3175
- if ( exp->hasEvalError () )
3239
+ // add field indices for label's text, from expression or field
3240
+ if ( lyr.isExpression )
3176
3241
{
3177
- QgsDebugMsgLevel ( " Prepare error:" + exp->evalErrorString (), 4 );
3242
+ // prepare expression for use in QgsPalLayerSettings::registerFeature()
3243
+ QgsExpression* exp = lyr.getLabelExpression ();
3244
+ exp->prepare ( layer->pendingFields () );
3245
+ if ( exp->hasEvalError () )
3246
+ {
3247
+ QgsDebugMsgLevel ( " Prepare error:" + exp->evalErrorString (), 4 );
3248
+ }
3249
+ foreach ( QString name, exp->referencedColumns () )
3250
+ {
3251
+ QgsDebugMsgLevel ( " REFERENCED COLUMN = " + name, 4 );
3252
+ attrNames.append ( name );
3253
+ }
3178
3254
}
3179
- foreach ( QString name, exp-> referencedColumns () )
3255
+ else
3180
3256
{
3181
- QgsDebugMsgLevel ( " REFERENCED COLUMN = " + name, 4 );
3182
- attrNames.append ( name );
3257
+ attrNames.append ( lyr.fieldName );
3183
3258
}
3184
- }
3185
- else
3186
- {
3187
- attrNames.append ( lyr.fieldName );
3188
- }
3189
3259
3190
- // add field indices of data defined expression or field
3191
- QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator dIt = lyr.dataDefinedProperties .constBegin ();
3192
- for ( ; dIt != lyr.dataDefinedProperties .constEnd (); ++dIt )
3193
- {
3194
- QgsDataDefined* dd = dIt.value ();
3195
- if ( !dd->isActive () )
3260
+ // add field indices of data defined expression or field
3261
+ QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator dIt = lyr.dataDefinedProperties .constBegin ();
3262
+ for ( ; dIt != lyr.dataDefinedProperties .constEnd (); ++dIt )
3196
3263
{
3197
- continue ;
3198
- }
3264
+ QgsDataDefined* dd = dIt.value ();
3265
+ if ( !dd->isActive () )
3266
+ {
3267
+ continue ;
3268
+ }
3199
3269
3200
- // NOTE: the following also prepares any expressions for later use
3270
+ // NOTE: the following also prepares any expressions for later use
3201
3271
3202
- // store parameters for data defined expressions
3203
- QMap<QString, QVariant> exprParams;
3204
- exprParams.insert ( " scale" , ctx.rendererScale () );
3272
+ // store parameters for data defined expressions
3273
+ QMap<QString, QVariant> exprParams;
3274
+ exprParams.insert ( " scale" , ctx.rendererScale () );
3205
3275
3206
- dd->setExpressionParams ( exprParams );
3276
+ dd->setExpressionParams ( exprParams );
3207
3277
3208
- // this will return columns for expressions or field name, depending upon what is set to be used
3209
- QStringList cols = dd->referencedColumns ( layer ); // <-- prepares any expressions, too
3278
+ // this will return columns for expressions or field name, depending upon what is set to be used
3279
+ QStringList cols = dd->referencedColumns ( layer ); // <-- prepares any expressions, too
3210
3280
3211
- // QgsDebugMsgLevel( QString( "Data defined referenced columns:" ) + cols.join( "," ), 4 );
3212
- foreach ( QString name, cols )
3213
- {
3214
- attrNames.append ( name );
3281
+ // QgsDebugMsgLevel( QString( "Data defined referenced columns:" ) + cols.join( "," ), 4 );
3282
+ foreach ( QString name, cols )
3283
+ {
3284
+ attrNames.append ( name );
3285
+ }
3215
3286
}
3216
3287
}
3217
3288
@@ -3233,7 +3304,7 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QStringList& attrNames,
3233
3304
3234
3305
Layer* l = mPal ->addLayer ( layer->id ().toUtf8 ().data (),
3235
3306
arrangement,
3236
- priority, lyr.obstacle , true , true ,
3307
+ priority, lyr.obstacle , true , lyr. drawLabels ,
3237
3308
lyr.displayAll );
3238
3309
3239
3310
if ( lyr.placementFlags )
@@ -4187,6 +4258,8 @@ void QgsPalLabeling::drawLabeling( QgsRenderContext& context )
4187
4258
}
4188
4259
4189
4260
const QgsPalLayerSettings& lyr = layer ( layerName );
4261
+ if ( !lyr.drawLabels )
4262
+ continue ;
4190
4263
4191
4264
// Copy to temp, editable layer settings
4192
4265
// these settings will be changed by any data defined values, then used for rendering label components
0 commit comments