mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-18 00:03:05 -04:00
Integrate new labeling engine into the map rendering
Now used instead of QgsPalLabeling for labels/diagrams This code has been funded by Tuscany Region (Italy) - SITA (CIG: 63526840AE) and commissioned to Gis3W s.a.s.
This commit is contained in:
parent
f3fd96f4ee
commit
8100495df6
@ -122,7 +122,7 @@ class QgsMapRendererJob : QObject
|
|||||||
|
|
||||||
bool needTemporaryImage( QgsMapLayer* ml );
|
bool needTemporaryImage( QgsMapLayer* ml );
|
||||||
|
|
||||||
static void drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QPainter* painter );
|
// TODO static void drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QPainter* painter );
|
||||||
static void drawOldLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext );
|
static void drawOldLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext );
|
||||||
static void drawNewLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine );
|
static void drawNewLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine );
|
||||||
|
|
||||||
|
@ -33,9 +33,8 @@ static bool _palIsCancelled( void* ctx )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QgsLabelingEngineV2::QgsLabelingEngineV2( const QgsMapSettings& mapSettings, const QList<QgsAbstractLabelProvider*>& providers )
|
QgsLabelingEngineV2::QgsLabelingEngineV2( const QgsMapSettings& mapSettings )
|
||||||
: mMapSettings( mapSettings )
|
: mMapSettings( mapSettings )
|
||||||
, mProviders( providers )
|
|
||||||
, mFlags( RenderOutlineLabels | UsePartialCandidates )
|
, mFlags( RenderOutlineLabels | UsePartialCandidates )
|
||||||
, mSearchMethod( QgsPalLabeling::Chain )
|
, mSearchMethod( QgsPalLabeling::Chain )
|
||||||
, mCandPoint( 8 )
|
, mCandPoint( 8 )
|
||||||
@ -43,15 +42,19 @@ QgsLabelingEngineV2::QgsLabelingEngineV2( const QgsMapSettings& mapSettings, con
|
|||||||
, mCandPolygon( 8 )
|
, mCandPolygon( 8 )
|
||||||
, mResults( 0 )
|
, mResults( 0 )
|
||||||
{
|
{
|
||||||
foreach ( QgsAbstractLabelProvider* provider, mProviders )
|
|
||||||
provider->setEngine( this );
|
|
||||||
|
|
||||||
mResults = new QgsLabelingResults;
|
mResults = new QgsLabelingResults;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsLabelingEngineV2::~QgsLabelingEngineV2()
|
QgsLabelingEngineV2::~QgsLabelingEngineV2()
|
||||||
{
|
{
|
||||||
delete mResults;
|
delete mResults;
|
||||||
|
qDeleteAll( mProviders );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLabelingEngineV2::addProvider( QgsAbstractLabelProvider* provider )
|
||||||
|
{
|
||||||
|
provider->setEngine( this );
|
||||||
|
mProviders << provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLabelingEngineV2::run( QgsRenderContext& context )
|
void QgsLabelingEngineV2::run( QgsRenderContext& context )
|
||||||
|
@ -210,7 +210,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAbstractLabelProvider::Flags )
|
|||||||
class CORE_EXPORT QgsLabelingEngineV2
|
class CORE_EXPORT QgsLabelingEngineV2
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QgsLabelingEngineV2( const QgsMapSettings& mapSettings, const QList<QgsAbstractLabelProvider*>& providers );
|
QgsLabelingEngineV2( const QgsMapSettings& mapSettings );
|
||||||
~QgsLabelingEngineV2();
|
~QgsLabelingEngineV2();
|
||||||
|
|
||||||
enum Flag
|
enum Flag
|
||||||
@ -224,6 +224,9 @@ class CORE_EXPORT QgsLabelingEngineV2
|
|||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS( Flags, Flag )
|
Q_DECLARE_FLAGS( Flags, Flag )
|
||||||
|
|
||||||
|
//! Add provider of label features. Takes ownership of the provider
|
||||||
|
void addProvider( QgsAbstractLabelProvider* provider );
|
||||||
|
|
||||||
//! compute the labeling with given map settings and providers
|
//! compute the labeling with given map settings and providers
|
||||||
void run( QgsRenderContext& context );
|
void run( QgsRenderContext& context );
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "qgsmaprenderercustompainterjob.h"
|
#include "qgsmaprenderercustompainterjob.h"
|
||||||
|
|
||||||
|
#include "qgslabelingenginev2.h"
|
||||||
#include "qgslogger.h"
|
#include "qgslogger.h"
|
||||||
#include "qgsmaplayerregistry.h"
|
#include "qgsmaplayerregistry.h"
|
||||||
#include "qgsmaplayerrenderer.h"
|
#include "qgsmaplayerrenderer.h"
|
||||||
@ -22,10 +23,13 @@
|
|||||||
#include "qgsvectorlayer.h"
|
#include "qgsvectorlayer.h"
|
||||||
#include "qgsrendererv2.h"
|
#include "qgsrendererv2.h"
|
||||||
|
|
||||||
|
#define LABELING_V2
|
||||||
|
|
||||||
QgsMapRendererCustomPainterJob::QgsMapRendererCustomPainterJob( const QgsMapSettings& settings, QPainter* painter )
|
QgsMapRendererCustomPainterJob::QgsMapRendererCustomPainterJob( const QgsMapSettings& settings, QPainter* painter )
|
||||||
: QgsMapRendererJob( settings )
|
: QgsMapRendererJob( settings )
|
||||||
, mPainter( painter )
|
, mPainter( painter )
|
||||||
, mLabelingEngine( 0 )
|
, mLabelingEngine( 0 )
|
||||||
|
, mLabelingEngineV2( 0 )
|
||||||
, mActive( false )
|
, mActive( false )
|
||||||
, mRenderSynchronously( false )
|
, mRenderSynchronously( false )
|
||||||
{
|
{
|
||||||
@ -40,6 +44,9 @@ QgsMapRendererCustomPainterJob::~QgsMapRendererCustomPainterJob()
|
|||||||
|
|
||||||
delete mLabelingEngine;
|
delete mLabelingEngine;
|
||||||
mLabelingEngine = 0;
|
mLabelingEngine = 0;
|
||||||
|
|
||||||
|
delete mLabelingEngineV2;
|
||||||
|
mLabelingEngineV2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsMapRendererCustomPainterJob::start()
|
void QgsMapRendererCustomPainterJob::start()
|
||||||
@ -72,14 +79,21 @@ void QgsMapRendererCustomPainterJob::start()
|
|||||||
delete mLabelingEngine;
|
delete mLabelingEngine;
|
||||||
mLabelingEngine = 0;
|
mLabelingEngine = 0;
|
||||||
|
|
||||||
|
delete mLabelingEngineV2;
|
||||||
|
mLabelingEngineV2 = 0;
|
||||||
|
|
||||||
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
|
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
|
||||||
{
|
{
|
||||||
|
#ifdef LABELING_V2
|
||||||
|
mLabelingEngineV2 = new QgsLabelingEngineV2( mSettings );
|
||||||
|
#else
|
||||||
mLabelingEngine = new QgsPalLabeling;
|
mLabelingEngine = new QgsPalLabeling;
|
||||||
mLabelingEngine->loadEngineSettings();
|
mLabelingEngine->loadEngineSettings();
|
||||||
mLabelingEngine->init( mSettings );
|
mLabelingEngine->init( mSettings );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mLayerJobs = prepareJobs( mPainter, mLabelingEngine );
|
mLayerJobs = prepareJobs( mPainter, mLabelingEngine, mLabelingEngineV2 );
|
||||||
|
|
||||||
QgsDebugMsg( "Rendering prepared in (seconds): " + QString( "%1" ).arg( prepareTime.elapsed() / 1000.0 ) );
|
QgsDebugMsg( "Rendering prepared in (seconds): " + QString( "%1" ).arg( prepareTime.elapsed() / 1000.0 ) );
|
||||||
|
|
||||||
@ -240,13 +254,13 @@ void QgsMapRendererCustomPainterJob::doRender()
|
|||||||
QgsDebugMsg( "Done rendering map layers" );
|
QgsDebugMsg( "Done rendering map layers" );
|
||||||
|
|
||||||
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) && !mLabelingRenderContext.renderingStopped() )
|
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) && !mLabelingRenderContext.renderingStopped() )
|
||||||
drawLabeling( mSettings, mLabelingRenderContext, mLabelingEngine, mPainter );
|
drawLabeling( mSettings, mLabelingRenderContext, mLabelingEngine, mLabelingEngineV2, mPainter );
|
||||||
|
|
||||||
QgsDebugMsg( "Rendering completed in (seconds): " + QString( "%1" ).arg( renderTime.elapsed() / 1000.0 ) );
|
QgsDebugMsg( "Rendering completed in (seconds): " + QString( "%1" ).arg( renderTime.elapsed() / 1000.0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void QgsMapRendererJob::drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QPainter* painter )
|
void QgsMapRendererJob::drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QgsLabelingEngineV2* labelingEngine2, QPainter* painter )
|
||||||
{
|
{
|
||||||
QgsDebugMsg( "Draw labeling start" );
|
QgsDebugMsg( "Draw labeling start" );
|
||||||
|
|
||||||
@ -266,6 +280,15 @@ void QgsMapRendererJob::drawLabeling( const QgsMapSettings& settings, QgsRenderC
|
|||||||
|
|
||||||
drawNewLabeling( settings, renderContext, labelingEngine );
|
drawNewLabeling( settings, renderContext, labelingEngine );
|
||||||
|
|
||||||
|
if ( labelingEngine2 )
|
||||||
|
{
|
||||||
|
// set correct extent
|
||||||
|
renderContext.setExtent( settings.visibleExtent() );
|
||||||
|
renderContext.setCoordinateTransform( NULL );
|
||||||
|
|
||||||
|
labelingEngine2->run( renderContext );
|
||||||
|
}
|
||||||
|
|
||||||
QgsDebugMsg( QString( "Draw labeling took (seconds): %1" ).arg( t.elapsed() / 1000. ) );
|
QgsDebugMsg( QString( "Draw labeling took (seconds): %1" ).arg( t.elapsed() / 1000. ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ class CORE_EXPORT QgsMapRendererCustomPainterJob : public QgsMapRendererJob
|
|||||||
QFutureWatcher<void> mFutureWatcher;
|
QFutureWatcher<void> mFutureWatcher;
|
||||||
QgsRenderContext mLabelingRenderContext;
|
QgsRenderContext mLabelingRenderContext;
|
||||||
QgsPalLabeling* mLabelingEngine;
|
QgsPalLabeling* mLabelingEngine;
|
||||||
|
QgsLabelingEngineV2* mLabelingEngineV2;
|
||||||
|
|
||||||
bool mActive;
|
bool mActive;
|
||||||
LayerRenderJobs mLayerJobs;
|
LayerRenderJobs mLayerJobs;
|
||||||
|
@ -135,7 +135,7 @@ bool QgsMapRendererJob::reprojectToLayerExtent( const QgsCoordinateTransform* ct
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabeling* labelingEngine )
|
LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabeling* labelingEngine, QgsLabelingEngineV2* labelingEngine2 )
|
||||||
{
|
{
|
||||||
LayerRenderJobs layerJobs;
|
LayerRenderJobs layerJobs;
|
||||||
|
|
||||||
@ -217,6 +217,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
|
|||||||
job.context = QgsRenderContext::fromMapSettings( mSettings );
|
job.context = QgsRenderContext::fromMapSettings( mSettings );
|
||||||
job.context.setPainter( painter );
|
job.context.setPainter( painter );
|
||||||
job.context.setLabelingEngine( labelingEngine );
|
job.context.setLabelingEngine( labelingEngine );
|
||||||
|
job.context.setLabelingEngineV2( labelingEngine2 );
|
||||||
job.context.setCoordinateTransform( ct );
|
job.context.setCoordinateTransform( ct );
|
||||||
job.context.setExtent( r1 );
|
job.context.setExtent( r1 );
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include "qgsgeometrycache.h"
|
#include "qgsgeometrycache.h"
|
||||||
|
|
||||||
|
class QgsLabelingEngineV2;
|
||||||
class QgsLabelingResults;
|
class QgsLabelingResults;
|
||||||
class QgsMapLayerRenderer;
|
class QgsMapLayerRenderer;
|
||||||
class QgsMapRendererCache;
|
class QgsMapRendererCache;
|
||||||
@ -149,7 +150,7 @@ class CORE_EXPORT QgsMapRendererJob : public QObject
|
|||||||
static bool reprojectToLayerExtent( const QgsCoordinateTransform* ct, bool layerCrsGeographic, QgsRectangle& extent, QgsRectangle& r2 );
|
static bool reprojectToLayerExtent( const QgsCoordinateTransform* ct, bool layerCrsGeographic, QgsRectangle& extent, QgsRectangle& r2 );
|
||||||
|
|
||||||
//! @note not available in python bindings
|
//! @note not available in python bindings
|
||||||
LayerRenderJobs prepareJobs( QPainter* painter, QgsPalLabeling* labelingEngine );
|
LayerRenderJobs prepareJobs( QPainter* painter, QgsPalLabeling* labelingEngine, QgsLabelingEngineV2* labelingEngine2 );
|
||||||
|
|
||||||
//! @note not available in python bindings
|
//! @note not available in python bindings
|
||||||
void cleanupJobs( LayerRenderJobs& jobs );
|
void cleanupJobs( LayerRenderJobs& jobs );
|
||||||
@ -158,7 +159,7 @@ class CORE_EXPORT QgsMapRendererJob : public QObject
|
|||||||
|
|
||||||
bool needTemporaryImage( QgsMapLayer* ml );
|
bool needTemporaryImage( QgsMapLayer* ml );
|
||||||
|
|
||||||
static void drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QPainter* painter );
|
static void drawLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine, QgsLabelingEngineV2* labelingEngine2, QPainter* painter );
|
||||||
static void drawOldLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext );
|
static void drawOldLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext );
|
||||||
static void drawNewLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine );
|
static void drawNewLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine );
|
||||||
|
|
||||||
|
@ -15,17 +15,20 @@
|
|||||||
|
|
||||||
#include "qgsmaprendererparalleljob.h"
|
#include "qgsmaprendererparalleljob.h"
|
||||||
|
|
||||||
|
#include "qgslabelingenginev2.h"
|
||||||
#include "qgslogger.h"
|
#include "qgslogger.h"
|
||||||
#include "qgsmaplayerrenderer.h"
|
#include "qgsmaplayerrenderer.h"
|
||||||
#include "qgspallabeling.h"
|
#include "qgspallabeling.h"
|
||||||
|
|
||||||
#include <QtConcurrentMap>
|
#include <QtConcurrentMap>
|
||||||
|
|
||||||
|
#define LABELING_V2
|
||||||
|
|
||||||
QgsMapRendererParallelJob::QgsMapRendererParallelJob( const QgsMapSettings& settings )
|
QgsMapRendererParallelJob::QgsMapRendererParallelJob( const QgsMapSettings& settings )
|
||||||
: QgsMapRendererQImageJob( settings )
|
: QgsMapRendererQImageJob( settings )
|
||||||
, mStatus( Idle )
|
, mStatus( Idle )
|
||||||
, mLabelingEngine( 0 )
|
, mLabelingEngine( 0 )
|
||||||
|
, mLabelingEngineV2( 0 )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,6 +41,9 @@ QgsMapRendererParallelJob::~QgsMapRendererParallelJob()
|
|||||||
|
|
||||||
delete mLabelingEngine;
|
delete mLabelingEngine;
|
||||||
mLabelingEngine = 0;
|
mLabelingEngine = 0;
|
||||||
|
|
||||||
|
delete mLabelingEngineV2;
|
||||||
|
mLabelingEngineV2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsMapRendererParallelJob::start()
|
void QgsMapRendererParallelJob::start()
|
||||||
@ -52,15 +58,21 @@ void QgsMapRendererParallelJob::start()
|
|||||||
delete mLabelingEngine;
|
delete mLabelingEngine;
|
||||||
mLabelingEngine = 0;
|
mLabelingEngine = 0;
|
||||||
|
|
||||||
|
delete mLabelingEngineV2;
|
||||||
|
mLabelingEngineV2 = 0;
|
||||||
|
|
||||||
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
|
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
|
||||||
{
|
{
|
||||||
|
#ifdef LABELING_V2
|
||||||
|
mLabelingEngineV2 = new QgsLabelingEngineV2( mSettings );
|
||||||
|
#else
|
||||||
mLabelingEngine = new QgsPalLabeling;
|
mLabelingEngine = new QgsPalLabeling;
|
||||||
mLabelingEngine->loadEngineSettings();
|
mLabelingEngine->loadEngineSettings();
|
||||||
mLabelingEngine->init( mSettings );
|
mLabelingEngine->init( mSettings );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mLayerJobs = prepareJobs( 0, mLabelingEngine, mLabelingEngineV2 );
|
||||||
mLayerJobs = prepareJobs( 0, mLabelingEngine );
|
|
||||||
|
|
||||||
QgsDebugMsg( QString( "QThreadPool max thread count is %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) );
|
QgsDebugMsg( QString( "QThreadPool max thread count is %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) );
|
||||||
|
|
||||||
@ -239,7 +251,7 @@ void QgsMapRendererParallelJob::renderLabelsStatic( QgsMapRendererParallelJob* s
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
drawLabeling( self->mSettings, self->mLabelingRenderContext, self->mLabelingEngine, &painter );
|
drawLabeling( self->mSettings, self->mLabelingRenderContext, self->mLabelingEngine, self->mLabelingEngineV2, &painter );
|
||||||
}
|
}
|
||||||
catch ( QgsException & e )
|
catch ( QgsException & e )
|
||||||
{
|
{
|
||||||
|
@ -65,6 +65,7 @@ class CORE_EXPORT QgsMapRendererParallelJob : public QgsMapRendererQImageJob
|
|||||||
LayerRenderJobs mLayerJobs;
|
LayerRenderJobs mLayerJobs;
|
||||||
|
|
||||||
QgsPalLabeling* mLabelingEngine;
|
QgsPalLabeling* mLabelingEngine;
|
||||||
|
QgsLabelingEngineV2* mLabelingEngineV2;
|
||||||
QgsRenderContext mLabelingRenderContext;
|
QgsRenderContext mLabelingRenderContext;
|
||||||
QFuture<void> mLabelingFuture;
|
QFuture<void> mLabelingFuture;
|
||||||
QFutureWatcher<void> mLabelingFutureWatcher;
|
QFutureWatcher<void> mLabelingFutureWatcher;
|
||||||
|
@ -30,6 +30,7 @@ class QPainter;
|
|||||||
|
|
||||||
class QgsAbstractGeometryV2;
|
class QgsAbstractGeometryV2;
|
||||||
class QgsLabelingEngineInterface;
|
class QgsLabelingEngineInterface;
|
||||||
|
class QgsLabelingEngineV2;
|
||||||
class QgsMapSettings;
|
class QgsMapSettings;
|
||||||
|
|
||||||
/** \ingroup core
|
/** \ingroup core
|
||||||
@ -78,6 +79,9 @@ class CORE_EXPORT QgsRenderContext
|
|||||||
|
|
||||||
QgsLabelingEngineInterface* labelingEngine() const { return mLabelingEngine; }
|
QgsLabelingEngineInterface* labelingEngine() const { return mLabelingEngine; }
|
||||||
|
|
||||||
|
//! Get access to new labeling engine (may be NULL)
|
||||||
|
QgsLabelingEngineV2* labelingEngineV2() const { return mLabelingEngine2; }
|
||||||
|
|
||||||
QColor selectionColor() const { return mSelectionColor; }
|
QColor selectionColor() const { return mSelectionColor; }
|
||||||
|
|
||||||
/** Returns true if vector selections should be shown in the rendered map
|
/** Returns true if vector selections should be shown in the rendered map
|
||||||
@ -102,6 +106,8 @@ class CORE_EXPORT QgsRenderContext
|
|||||||
void setPainter( QPainter* p ) {mPainter = p;}
|
void setPainter( QPainter* p ) {mPainter = p;}
|
||||||
void setForceVectorOutput( bool force ) {mForceVectorOutput = force;}
|
void setForceVectorOutput( bool force ) {mForceVectorOutput = force;}
|
||||||
void setLabelingEngine( QgsLabelingEngineInterface* iface ) { mLabelingEngine = iface; }
|
void setLabelingEngine( QgsLabelingEngineInterface* iface ) { mLabelingEngine = iface; }
|
||||||
|
//! Assign new labeling engine
|
||||||
|
void setLabelingEngineV2( QgsLabelingEngineV2* engine2 ) { mLabelingEngine2 = engine2; }
|
||||||
void setSelectionColor( const QColor& color ) { mSelectionColor = color; }
|
void setSelectionColor( const QColor& color ) { mSelectionColor = color; }
|
||||||
|
|
||||||
/** Sets whether vector selections should be shown in the rendered map
|
/** Sets whether vector selections should be shown in the rendered map
|
||||||
@ -182,6 +188,9 @@ class CORE_EXPORT QgsRenderContext
|
|||||||
/** Labeling engine (can be NULL)*/
|
/** Labeling engine (can be NULL)*/
|
||||||
QgsLabelingEngineInterface* mLabelingEngine;
|
QgsLabelingEngineInterface* mLabelingEngine;
|
||||||
|
|
||||||
|
/** Newer labeling engine implementation (can be NULL) */
|
||||||
|
QgsLabelingEngineV2* mLabelingEngine2;
|
||||||
|
|
||||||
/** Whether selection should be shown*/
|
/** Whether selection should be shown*/
|
||||||
bool mShowSelection;
|
bool mShowSelection;
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@
|
|||||||
#include "labelposition.h"
|
#include "labelposition.h"
|
||||||
|
|
||||||
|
|
||||||
QgsVectorLayerDiagramProvider::QgsVectorLayerDiagramProvider( const QgsDiagramLayerSettings* diagSettings,
|
QgsVectorLayerDiagramProvider::QgsVectorLayerDiagramProvider(
|
||||||
|
const QgsDiagramLayerSettings* diagSettings,
|
||||||
const QgsDiagramRendererV2* diagRenderer,
|
const QgsDiagramRendererV2* diagRenderer,
|
||||||
const QString& layerId,
|
const QString& layerId,
|
||||||
const QgsFields& fields,
|
const QgsFields& fields,
|
||||||
@ -142,9 +143,12 @@ QList<QgsLabelFeature*> QgsVectorLayerDiagramProvider::labelFeatures( const QgsM
|
|||||||
if ( mSettings.yPosColumn != -1 )
|
if ( mSettings.yPosColumn != -1 )
|
||||||
attributeNames << mFields.at( mSettings.yPosColumn ).name();
|
attributeNames << mFields.at( mSettings.yPosColumn ).name();
|
||||||
|
|
||||||
|
QgsRectangle layerExtent = context.extent();
|
||||||
|
if ( mSettings.ct )
|
||||||
|
layerExtent = mSettings.ct->transformBoundingBox( context.extent(), QgsCoordinateTransform::ReverseTransform );
|
||||||
|
|
||||||
QgsFeatureRequest request;
|
QgsFeatureRequest request;
|
||||||
request.setFilterRect( context.extent() );
|
request.setFilterRect( layerExtent );
|
||||||
request.setSubsetOfAttributes( attributeNames, mFields );
|
request.setSubsetOfAttributes( attributeNames, mFields );
|
||||||
QgsFeatureIterator fit = mSource->getFeatures( request );
|
QgsFeatureIterator fit = mSource->getFeatures( request );
|
||||||
|
|
||||||
@ -213,7 +217,7 @@ QgsLabelFeature* QgsVectorLayerDiagramProvider::registerDiagram( QgsFeature& fea
|
|||||||
if ( dr )
|
if ( dr )
|
||||||
{
|
{
|
||||||
QList<QgsDiagramSettings> settingList = dr->diagramSettings();
|
QList<QgsDiagramSettings> settingList = dr->diagramSettings();
|
||||||
if ( settingList.size() > 0 )
|
if ( settingList.size() > 0 && settingList.at( 0 ).scaleBasedVisibility )
|
||||||
{
|
{
|
||||||
double minScale = settingList.at( 0 ).minScaleDenominator;
|
double minScale = settingList.at( 0 ).minScaleDenominator;
|
||||||
if ( minScale > 0 && context.rendererScale() < minScale )
|
if ( minScale > 0 && context.rendererScale() < minScale )
|
||||||
|
@ -53,19 +53,23 @@ QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( QgsVectorLayer* layer
|
|||||||
mSettings = QgsVectorLayerLabelSettings::fromLayer( layer );
|
mSettings = QgsVectorLayerLabelSettings::fromLayer( layer );
|
||||||
mLayerId = layer->id();
|
mLayerId = layer->id();
|
||||||
mFields = layer->fields();
|
mFields = layer->fields();
|
||||||
|
mCrs = layer->crs();
|
||||||
mSource = new QgsVectorLayerFeatureSource( layer );
|
mSource = new QgsVectorLayerFeatureSource( layer );
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( const QgsPalLayerSettings& settings,
|
QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider(
|
||||||
|
const QgsPalLayerSettings& settings,
|
||||||
const QString& layerId,
|
const QString& layerId,
|
||||||
const QgsFields& fields,
|
const QgsFields& fields,
|
||||||
|
const QgsCoordinateReferenceSystem& crs,
|
||||||
QgsAbstractFeatureSource* source,
|
QgsAbstractFeatureSource* source,
|
||||||
bool ownsSource )
|
bool ownsSource )
|
||||||
: mSettings( settings )
|
: mSettings( settings )
|
||||||
, mLayerId( layerId )
|
, mLayerId( layerId )
|
||||||
, mFields( fields )
|
, mFields( fields )
|
||||||
|
, mCrs( crs )
|
||||||
, mSource( source )
|
, mSource( source )
|
||||||
, mOwnsSource( ownsSource )
|
, mOwnsSource( ownsSource )
|
||||||
{
|
{
|
||||||
@ -201,8 +205,8 @@ QList<QgsLabelFeature*> QgsVectorLayerLabelProvider::labelFeatures( const QgsMap
|
|||||||
|
|
||||||
lyr.xform = &mapSettings.mapToPixel();
|
lyr.xform = &mapSettings.mapToPixel();
|
||||||
lyr.ct = 0;
|
lyr.ct = 0;
|
||||||
if ( mapSettings.hasCrsTransformEnabled() && ctx.coordinateTransform() )
|
if ( mapSettings.hasCrsTransformEnabled() )
|
||||||
lyr.ct = ctx.coordinateTransform()->clone();
|
lyr.ct = new QgsCoordinateTransform( mCrs, mapSettings.destinationCrs() );
|
||||||
lyr.ptZero = lyr.xform->toMapCoordinates( 0, 0 );
|
lyr.ptZero = lyr.xform->toMapCoordinates( 0, 0 );
|
||||||
lyr.ptOne = lyr.xform->toMapCoordinates( 1, 0 );
|
lyr.ptOne = lyr.xform->toMapCoordinates( 1, 0 );
|
||||||
|
|
||||||
@ -216,9 +220,12 @@ QList<QgsLabelFeature*> QgsVectorLayerLabelProvider::labelFeatures( const QgsMap
|
|||||||
|
|
||||||
lyr.mFeatsSendingToPal = 0;
|
lyr.mFeatsSendingToPal = 0;
|
||||||
|
|
||||||
|
QgsRectangle layerExtent = ctx.extent();
|
||||||
|
if ( lyr.ct )
|
||||||
|
layerExtent = lyr.ct->transformBoundingBox( ctx.extent(), QgsCoordinateTransform::ReverseTransform );
|
||||||
|
|
||||||
QgsFeatureRequest request;
|
QgsFeatureRequest request;
|
||||||
request.setFilterRect( ctx.extent() );
|
request.setFilterRect( layerExtent );
|
||||||
request.setSubsetOfAttributes( attrNames, mFields );
|
request.setSubsetOfAttributes( attrNames, mFields );
|
||||||
QgsFeatureIterator fit = mSource->getFeatures( request );
|
QgsFeatureIterator fit = mSource->getFeatures( request );
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ class CORE_EXPORT QgsVectorLayerLabelProvider : public QgsAbstractLabelProvider
|
|||||||
QgsVectorLayerLabelProvider( const QgsPalLayerSettings& settings,
|
QgsVectorLayerLabelProvider( const QgsPalLayerSettings& settings,
|
||||||
const QString& layerId,
|
const QString& layerId,
|
||||||
const QgsFields& fields,
|
const QgsFields& fields,
|
||||||
|
const QgsCoordinateReferenceSystem& crs,
|
||||||
QgsAbstractFeatureSource* source,
|
QgsAbstractFeatureSource* source,
|
||||||
bool ownsSource );
|
bool ownsSource );
|
||||||
|
|
||||||
@ -57,6 +58,7 @@ class CORE_EXPORT QgsVectorLayerLabelProvider : public QgsAbstractLabelProvider
|
|||||||
QgsPalLayerSettings mSettings;
|
QgsPalLayerSettings mSettings;
|
||||||
QString mLayerId;
|
QString mLayerId;
|
||||||
QgsFields mFields;
|
QgsFields mFields;
|
||||||
|
QgsCoordinateReferenceSystem mCrs;
|
||||||
QgsAbstractFeatureSource* mSource;
|
QgsAbstractFeatureSource* mSource;
|
||||||
bool mOwnsSource;
|
bool mOwnsSource;
|
||||||
};
|
};
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
#include "qgssymbollayerv2.h"
|
#include "qgssymbollayerv2.h"
|
||||||
#include "qgssymbolv2.h"
|
#include "qgssymbolv2.h"
|
||||||
#include "qgsvectorlayer.h"
|
#include "qgsvectorlayer.h"
|
||||||
|
#include "qgsvectorlayerdiagramprovider.h"
|
||||||
#include "qgsvectorlayerfeatureiterator.h"
|
#include "qgsvectorlayerfeatureiterator.h"
|
||||||
|
#include "qgsvectorlayerlabelprovider.h"
|
||||||
#include "qgspainteffect.h"
|
#include "qgspainteffect.h"
|
||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
@ -463,7 +465,16 @@ void QgsVectorLayerRenderer::stopRendererV2( QgsSingleSymbolRendererV2* selRende
|
|||||||
void QgsVectorLayerRenderer::prepareLabeling( QgsVectorLayer* layer, QStringList& attributeNames )
|
void QgsVectorLayerRenderer::prepareLabeling( QgsVectorLayer* layer, QStringList& attributeNames )
|
||||||
{
|
{
|
||||||
if ( !mContext.labelingEngine() )
|
if ( !mContext.labelingEngine() )
|
||||||
|
{
|
||||||
|
if ( QgsLabelingEngineV2* engine2 = mContext.labelingEngineV2() )
|
||||||
|
{
|
||||||
|
if ( layer->labelsEnabled() )
|
||||||
|
engine2->addProvider( new QgsVectorLayerLabelProvider( layer ) );
|
||||||
|
if ( layer->diagramsEnabled() )
|
||||||
|
engine2->addProvider( new QgsVectorLayerDiagramProvider( layer ) );
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( mContext.labelingEngine()->prepareLayer( layer, attributeNames, mContext ) )
|
if ( mContext.labelingEngine()->prepareLayer( layer, attributeNames, mContext ) )
|
||||||
{
|
{
|
||||||
|
@ -77,8 +77,8 @@ void TestQgsLabelingEngineV2::testBasic()
|
|||||||
vl->setCustomProperty( "labeling/enabled", true );
|
vl->setCustomProperty( "labeling/enabled", true );
|
||||||
vl->setCustomProperty( "labeling/fieldName", "Class" );
|
vl->setCustomProperty( "labeling/fieldName", "Class" );
|
||||||
|
|
||||||
QgsVectorLayerLabelProvider lp( vl );
|
QgsLabelingEngineV2 engine( mapSettings );
|
||||||
QgsLabelingEngineV2 engine( mapSettings, QList<QgsAbstractLabelProvider*>() << &lp );
|
engine.addProvider( new QgsVectorLayerLabelProvider( vl ) );
|
||||||
//engine.setFlags( QgsLabelingEngineV2::RenderOutlineLabels | QgsLabelingEngineV2::DrawLabelRectOnly );
|
//engine.setFlags( QgsLabelingEngineV2::RenderOutlineLabels | QgsLabelingEngineV2::DrawLabelRectOnly );
|
||||||
engine.run( context );
|
engine.run( context );
|
||||||
|
|
||||||
@ -112,8 +112,8 @@ void TestQgsLabelingEngineV2::testDiagrams()
|
|||||||
vl->loadNamedStyle( QString( TEST_DATA_DIR ) + "/points_diagrams.qml", res );
|
vl->loadNamedStyle( QString( TEST_DATA_DIR ) + "/points_diagrams.qml", res );
|
||||||
Q_ASSERT( res );
|
Q_ASSERT( res );
|
||||||
|
|
||||||
QgsVectorLayerDiagramProvider dp( vl );
|
QgsLabelingEngineV2 engine( mapSettings );
|
||||||
QgsLabelingEngineV2 engine( mapSettings, QList<QgsAbstractLabelProvider*>() << &dp );
|
engine.addProvider( new QgsVectorLayerDiagramProvider( vl ) );
|
||||||
engine.run( context );
|
engine.run( context );
|
||||||
|
|
||||||
p.end();
|
p.end();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user