23
23
#include " qgslogger.h"
24
24
#include " qgsvectorlayer.h"
25
25
#include " qgsexception.h"
26
+ #include " qgsrenderer.h"
26
27
27
28
#include < queue>
28
29
#include < vector>
@@ -458,7 +459,8 @@ QgsTracer::QgsTracer() = default;
458
459
bool QgsTracer::initGraph ()
459
460
{
460
461
if ( mGraph )
461
- return true ; // already initialized
462
+ return true ;
463
+ // already initialized
462
464
463
465
mHasTopologyProblem = false ;
464
466
@@ -476,7 +478,28 @@ bool QgsTracer::initGraph()
476
478
for ( QgsVectorLayer *vl : qgis::as_const ( mLayers ) )
477
479
{
478
480
QgsFeatureRequest request;
479
- request.setSubsetOfAttributes ( QgsAttributeList () );
481
+
482
+ bool filter = false ;
483
+ std::unique_ptr< QgsFeatureRenderer > renderer ( vl->renderer () ? vl->renderer ()->clone () : nullptr );
484
+ QgsRenderContext *ctx = nullptr ;
485
+ if ( mRenderContext )
486
+ {
487
+ mRenderContext ->expressionContext () << QgsExpressionContextUtils::layerScope ( vl );
488
+ ctx = mRenderContext .get ();
489
+ if ( renderer )
490
+ {
491
+ // setup scale for scale dependent visibility (rule based)
492
+ renderer->startRender ( *ctx, vl->fields () );
493
+ filter = renderer->capabilities () & QgsFeatureRenderer::Filter;
494
+ request.setSubsetOfAttributes ( renderer->usedAttributes ( *ctx ), vl->fields () );
495
+ }
496
+ }
497
+ else
498
+ {
499
+ request.setSubsetOfAttributes ( QgsAttributeList () );
500
+
501
+ }
502
+
480
503
request.setDestinationCrs ( mCRS , mTransformContext );
481
504
if ( !mExtent .isEmpty () )
482
505
request.setFilterRect ( mExtent );
@@ -487,12 +510,26 @@ bool QgsTracer::initGraph()
487
510
if ( !f.hasGeometry () )
488
511
continue ;
489
512
513
+ if ( filter && ctx && renderer )
514
+ {
515
+ ctx->expressionContext ().setFeature ( f );
516
+ if ( !renderer->willRenderFeature ( f, *ctx ) )
517
+ {
518
+ continue ;
519
+ }
520
+ }
521
+
490
522
extractLinework ( f.geometry (), mpl );
491
523
492
524
++featuresCounted;
493
525
if ( mMaxFeatureCount != 0 && featuresCounted >= mMaxFeatureCount )
494
526
return false ;
495
527
}
528
+
529
+ if ( ctx && renderer )
530
+ {
531
+ renderer->stopRender ( *ctx );
532
+ }
496
533
}
497
534
int timeExtract = t1.elapsed ();
498
535
@@ -544,6 +581,7 @@ bool QgsTracer::initGraph()
544
581
Q_UNUSED ( timeMake );
545
582
QgsDebugMsg ( QString ( " tracer extract %1 ms, noding %2 ms (call %3 ms), make %4 ms" )
546
583
.arg ( timeExtract ).arg ( timeNoding ).arg ( timeNodingCall ).arg ( timeMake ) );
584
+
547
585
return true ;
548
586
}
549
587
@@ -562,6 +600,8 @@ void QgsTracer::setLayers( const QList<QgsVectorLayer *> &layers )
562
600
disconnect ( layer, &QgsVectorLayer::featureAdded, this , &QgsTracer::onFeatureAdded );
563
601
disconnect ( layer, &QgsVectorLayer::featureDeleted, this , &QgsTracer::onFeatureDeleted );
564
602
disconnect ( layer, &QgsVectorLayer::geometryChanged, this , &QgsTracer::onGeometryChanged );
603
+ disconnect ( layer, &QgsVectorLayer::attributeValueChanged, this , &QgsTracer::onAttributeValueChanged );
604
+ disconnect ( layer, &QgsVectorLayer::dataChanged, this , &QgsTracer::onDataChanged );
565
605
disconnect ( layer, &QObject::destroyed, this , &QgsTracer::onLayerDestroyed );
566
606
}
567
607
@@ -572,16 +612,24 @@ void QgsTracer::setLayers( const QList<QgsVectorLayer *> &layers )
572
612
connect ( layer, &QgsVectorLayer::featureAdded, this , &QgsTracer::onFeatureAdded );
573
613
connect ( layer, &QgsVectorLayer::featureDeleted, this , &QgsTracer::onFeatureDeleted );
574
614
connect ( layer, &QgsVectorLayer::geometryChanged, this , &QgsTracer::onGeometryChanged );
615
+ connect ( layer, &QgsVectorLayer::attributeValueChanged, this , &QgsTracer::onAttributeValueChanged );
616
+ connect ( layer, &QgsVectorLayer::dataChanged, this , &QgsTracer::onDataChanged );
575
617
connect ( layer, &QObject::destroyed, this , &QgsTracer::onLayerDestroyed );
576
618
}
577
619
578
620
invalidateGraph ();
579
621
}
580
622
581
- void QgsTracer::setDestinationCrs ( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context )
623
+ void QgsTracer::setDestinationCrs ( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &transform )
582
624
{
583
625
mCRS = crs;
584
- mTransformContext = context;
626
+ mTransformContext = transform;
627
+ invalidateGraph ();
628
+ }
629
+
630
+ void QgsTracer::setRenderContext ( const QgsRenderContext *render )
631
+ {
632
+ mRenderContext = std::unique_ptr<QgsRenderContext>( new QgsRenderContext ( *render ) );
585
633
invalidateGraph ();
586
634
}
587
635
@@ -649,6 +697,19 @@ void QgsTracer::onGeometryChanged( QgsFeatureId fid, const QgsGeometry &geom )
649
697
invalidateGraph ();
650
698
}
651
699
700
+ void QgsTracer::onAttributeValueChanged ( QgsFeatureId fid, int idx, const QVariant &value )
701
+ {
702
+ Q_UNUSED ( fid );
703
+ Q_UNUSED ( idx );
704
+ Q_UNUSED ( value );
705
+ invalidateGraph ();
706
+ }
707
+
708
+ void QgsTracer::onDataChanged ( )
709
+ {
710
+ invalidateGraph ();
711
+ }
712
+
652
713
void QgsTracer::onLayerDestroyed ( QObject *obj )
653
714
{
654
715
// remove the layer before it is completely invalid (static_cast should be the safest cast)
0 commit comments