mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
dxf export: support rule based labeling (fixes #13757)
This commit is contained in:
parent
b7a4e20627
commit
f19a35c34e
@ -35,7 +35,7 @@ class QgsLabelingEngineInterface
|
|||||||
|
|
||||||
//! called when we're going to start with rendering
|
//! called when we're going to start with rendering
|
||||||
//! @deprecated since 2.4 - use override with QgsMapSettings
|
//! @deprecated since 2.4 - use override with QgsMapSettings
|
||||||
virtual void init( QgsMapRenderer* mp ) = 0 /Deprecated/;
|
virtual void init( QgsMapRenderer *mp ) = 0 /Deprecated/;
|
||||||
//! called when we're going to start with rendering
|
//! called when we're going to start with rendering
|
||||||
virtual void init( const QgsMapSettings& mapSettings ) = 0;
|
virtual void init( const QgsMapSettings& mapSettings ) = 0;
|
||||||
//! called to find out whether the layer is used for labeling
|
//! called to find out whether the layer is used for labeling
|
||||||
@ -48,17 +48,17 @@ class QgsLabelingEngineInterface
|
|||||||
virtual int prepareLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx ) = 0;
|
virtual int prepareLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx ) = 0;
|
||||||
//! returns PAL layer settings for a registered layer
|
//! returns PAL layer settings for a registered layer
|
||||||
//! @deprecated since 2.12 - if direct access to QgsPalLayerSettings is necessary, use QgsPalLayerSettings::fromLayer()
|
//! @deprecated since 2.12 - if direct access to QgsPalLayerSettings is necessary, use QgsPalLayerSettings::fromLayer()
|
||||||
virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0 /Deprecated/;
|
virtual QgsPalLayerSettings &layer( const QString &layerName ) = 0 /Deprecated/;
|
||||||
//! adds a diagram layer to the labeling engine
|
//! adds a diagram layer to the labeling engine
|
||||||
//! @note added in QGIS 2.12
|
//! @note added in QGIS 2.12
|
||||||
virtual int prepareDiagramLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx );
|
virtual int prepareDiagramLayer( QgsVectorLayer *layer, QStringList &attrNames, QgsRenderContext &ctx );
|
||||||
//! adds a diagram layer to the labeling engine
|
//! adds a diagram layer to the labeling engine
|
||||||
//! @deprecated since 2.12 - use prepareDiagramLayer()
|
//! @deprecated since 2.12 - use prepareDiagramLayer()
|
||||||
virtual int addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLayerSettings* s ) /Deprecated/;
|
virtual int addDiagramLayer( QgsVectorLayer *layer, const QgsDiagramLayerSettings *s ) /Deprecated/;
|
||||||
//! called for every feature
|
//! called for every feature
|
||||||
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context, const QString& dxfLayer = QString::null ) = 0;
|
virtual void registerFeature( const QString &layerID, QgsFeature &feat, QgsRenderContext &context ) = 0;
|
||||||
//! called for every diagram feature
|
//! called for every diagram feature
|
||||||
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context );
|
virtual void registerDiagramFeature( const QString &layerID, QgsFeature &feat, QgsRenderContext &context );
|
||||||
//! called when the map is drawn and labels should be placed
|
//! called when the map is drawn and labels should be placed
|
||||||
virtual void drawLabeling( QgsRenderContext& context ) = 0;
|
virtual void drawLabeling( QgsRenderContext& context ) = 0;
|
||||||
//! called when we're done with rendering
|
//! called when we're done with rendering
|
||||||
@ -268,7 +268,7 @@ class QgsMapRenderer : QObject
|
|||||||
//! Accessor for render context
|
//! Accessor for render context
|
||||||
QgsRenderContext* rendererContext();
|
QgsRenderContext* rendererContext();
|
||||||
|
|
||||||
//! Labeling engine (NULL if there's no custom engine)
|
//! Labeling engine (nullptr if there's no custom engine)
|
||||||
QgsLabelingEngineInterface* labelingEngine();
|
QgsLabelingEngineInterface* labelingEngine();
|
||||||
|
|
||||||
//! Set labeling engine. Previous engine (if any) is deleted.
|
//! Set labeling engine. Previous engine (if any) is deleted.
|
||||||
|
@ -551,7 +551,6 @@ class QgsPalLayerSettings
|
|||||||
* @param f feature to label
|
* @param f feature to label
|
||||||
* @param context render context. The QgsExpressionContext contained within the render context
|
* @param context render context. The QgsExpressionContext contained within the render context
|
||||||
* must have already had the feature and fields sets prior to calling this method.
|
* must have already had the feature and fields sets prior to calling this method.
|
||||||
* @param dxfLayer dxfLayer name
|
|
||||||
* @param labelFeature if using QgsLabelingEngineV2, this will receive the label feature. Not available
|
* @param labelFeature if using QgsLabelingEngineV2, this will receive the label feature. Not available
|
||||||
* in Python bindings.
|
* in Python bindings.
|
||||||
* @param obstacleGeometry optional obstacle geometry, if a different geometry to the feature's geometry
|
* @param obstacleGeometry optional obstacle geometry, if a different geometry to the feature's geometry
|
||||||
@ -560,7 +559,7 @@ class QgsPalLayerSettings
|
|||||||
* the feature's original geometry will be used as an obstacle for labels. Not available
|
* the feature's original geometry will be used as an obstacle for labels. Not available
|
||||||
* in Python bindings.
|
* in Python bindings.
|
||||||
*/
|
*/
|
||||||
void registerFeature( QgsFeature& f, QgsRenderContext& context, const QString& dxfLayer );
|
void registerFeature( QgsFeature& f, QgsRenderContext& context );
|
||||||
|
|
||||||
void readFromLayer( QgsVectorLayer* layer );
|
void readFromLayer( QgsVectorLayer* layer );
|
||||||
void writeToLayer( QgsVectorLayer* layer );
|
void writeToLayer( QgsVectorLayer* layer );
|
||||||
@ -867,9 +866,8 @@ class QgsPalLabeling : QgsLabelingEngineInterface
|
|||||||
* @param feat feature to label
|
* @param feat feature to label
|
||||||
* @param context render context. The QgsExpressionContext contained within the render context
|
* @param context render context. The QgsExpressionContext contained within the render context
|
||||||
* must have already had the feature and fields sets prior to calling this method.
|
* must have already had the feature and fields sets prior to calling this method.
|
||||||
* @param dxfLayer dxfLayer name
|
|
||||||
*/
|
*/
|
||||||
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context, const QString& dxfLayer = QString::null );
|
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context );
|
||||||
|
|
||||||
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context );
|
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context );
|
||||||
//! called when the map is drawn and labels should be placed
|
//! called when the map is drawn and labels should be placed
|
||||||
|
@ -37,6 +37,11 @@
|
|||||||
#include "qgsvectorlayer.h"
|
#include "qgsvectorlayer.h"
|
||||||
#include "qgsmaplayerregistry.h"
|
#include "qgsmaplayerregistry.h"
|
||||||
#include "qgsunittypes.h"
|
#include "qgsunittypes.h"
|
||||||
|
#include "qgstextlabelfeature.h"
|
||||||
|
|
||||||
|
#include "pal/feature.h"
|
||||||
|
#include "pal/pointset.h"
|
||||||
|
#include "pal/labelposition.h"
|
||||||
|
|
||||||
#include <QIODevice>
|
#include <QIODevice>
|
||||||
|
|
||||||
@ -942,12 +947,32 @@ void QgsDxfExport::writeEntities()
|
|||||||
attributes << layerAttr;
|
attributes << layerAttr;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsDxfLabelProvider* lp = new QgsDxfLabelProvider( vl, this );
|
const QgsAbstractVectorLayerLabeling *labeling = vl->labeling();
|
||||||
engine.addProvider( lp );
|
QgsDxfLabelProvider *lp = nullptr;
|
||||||
if ( !lp->prepare( ctx, attributes ) )
|
QgsDxfRuleBasedLabelProvider *rblp = nullptr;
|
||||||
|
if ( dynamic_cast<const QgsRuleBasedLabeling*>( labeling ) )
|
||||||
{
|
{
|
||||||
engine.removeProvider( lp );
|
const QgsRuleBasedLabeling *rbl = dynamic_cast<const QgsRuleBasedLabeling*>( labeling );
|
||||||
lp = nullptr;
|
rblp = new QgsDxfRuleBasedLabelProvider( *rbl, vl, this );
|
||||||
|
rblp->reinit( vl );
|
||||||
|
engine.addProvider( rblp );
|
||||||
|
|
||||||
|
if ( !rblp->prepare( ctx, attributes ) )
|
||||||
|
{
|
||||||
|
engine.removeProvider( rblp );
|
||||||
|
rblp = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lp = new QgsDxfLabelProvider( vl, this, nullptr );
|
||||||
|
engine.addProvider( lp );
|
||||||
|
|
||||||
|
if ( !lp->prepare( ctx, attributes ) )
|
||||||
|
{
|
||||||
|
engine.removeProvider( lp );
|
||||||
|
lp = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology &&
|
if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology &&
|
||||||
@ -1012,6 +1037,10 @@ void QgsDxfExport::writeEntities()
|
|||||||
{
|
{
|
||||||
lp->registerDxfFeature( fet, ctx, lName );
|
lp->registerDxfFeature( fet, ctx, lName );
|
||||||
}
|
}
|
||||||
|
else if ( rblp )
|
||||||
|
{
|
||||||
|
rblp->registerDxfFeature( fet, ctx, lName );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4169,3 +4198,112 @@ QString QgsDxfExport::layerName( QgsVectorLayer *vl ) const
|
|||||||
Q_ASSERT( vl );
|
Q_ASSERT( vl );
|
||||||
return mLayerTitleAsName && !vl->title().isEmpty() ? vl->title() : vl->name();
|
return mLayerTitleAsName && !vl->title().isEmpty() ? vl->title() : vl->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsDxfExport::drawLabel( QString layerId, QgsRenderContext& context, pal::LabelPosition* label, const QgsPalLayerSettings &settings )
|
||||||
|
{
|
||||||
|
Q_UNUSED( context );
|
||||||
|
QgsTextLabelFeature* lf = dynamic_cast<QgsTextLabelFeature*>( label->getFeaturePart()->feature() );
|
||||||
|
if ( !lf )
|
||||||
|
return;
|
||||||
|
|
||||||
|
//label text
|
||||||
|
QString txt = lf->text( label->getPartId() );
|
||||||
|
|
||||||
|
//angle
|
||||||
|
double angle = label->getAlpha() * 180 / M_PI;
|
||||||
|
|
||||||
|
QgsFeatureId fid = label->getFeaturePart()->featureId();
|
||||||
|
QString dxfLayer = mDxfLayerNames[layerId][fid];
|
||||||
|
|
||||||
|
//debug: show label rectangle
|
||||||
|
#if 0
|
||||||
|
QgsPolyline line;
|
||||||
|
for ( int i = 0; i < 4; ++i )
|
||||||
|
{
|
||||||
|
line.append( QgsPoint( label->getX( i ), label->getY( i ) ) );
|
||||||
|
}
|
||||||
|
writePolyline( line, dxfLayer, "CONTINUOUS", 1, 0.01, true );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QString wrapchr = settings.wrapChar.isEmpty() ? "\n" : settings.wrapChar;
|
||||||
|
|
||||||
|
//add the direction symbol if needed
|
||||||
|
if ( !txt.isEmpty() && settings.placement == QgsPalLayerSettings::Line && settings.addDirectionSymbol )
|
||||||
|
{
|
||||||
|
bool prependSymb = false;
|
||||||
|
QString symb = settings.rightDirectionSymbol;
|
||||||
|
|
||||||
|
if ( label->getReversed() )
|
||||||
|
{
|
||||||
|
prependSymb = true;
|
||||||
|
symb = settings.leftDirectionSymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( settings.reverseDirectionSymbol )
|
||||||
|
{
|
||||||
|
if ( symb == settings.rightDirectionSymbol )
|
||||||
|
{
|
||||||
|
prependSymb = true;
|
||||||
|
symb = settings.leftDirectionSymbol;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prependSymb = false;
|
||||||
|
symb = settings.rightDirectionSymbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( settings.placeDirectionSymbol == QgsPalLayerSettings::SymbolAbove )
|
||||||
|
{
|
||||||
|
prependSymb = true;
|
||||||
|
symb = symb + wrapchr;
|
||||||
|
}
|
||||||
|
else if ( settings.placeDirectionSymbol == QgsPalLayerSettings::SymbolBelow )
|
||||||
|
{
|
||||||
|
prependSymb = false;
|
||||||
|
symb = wrapchr + symb;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( prependSymb )
|
||||||
|
{
|
||||||
|
txt.prepend( symb );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txt.append( symb );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txt = txt.replace( wrapchr, "\\P" );
|
||||||
|
|
||||||
|
if ( settings.textFont.underline() )
|
||||||
|
{
|
||||||
|
txt.prepend( "\\L" ).append( "\\l" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( settings.textFont.overline() )
|
||||||
|
{
|
||||||
|
txt.prepend( "\\O" ).append( "\\o" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( settings.textFont.strikeOut() )
|
||||||
|
{
|
||||||
|
txt.prepend( "\\K" ).append( "\\k" );
|
||||||
|
}
|
||||||
|
|
||||||
|
txt.prepend( QString( "\\f%1|i%2|b%3;\\H%4;\\W0.75;" )
|
||||||
|
.arg( settings.textFont.family() )
|
||||||
|
.arg( settings.textFont.italic() ? 1 : 0 )
|
||||||
|
.arg( settings.textFont.bold() ? 1 : 0 )
|
||||||
|
.arg( label->getHeight() / ( 1 + txt.count( "\\P" ) ) * 0.75 ) );
|
||||||
|
|
||||||
|
writeMText( dxfLayer, txt, QgsPoint( label->getX(), label->getY() ), label->getWidth() * 1.1, angle, settings.textColor );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsDxfExport::registerDxfLayer( QString layerId, QgsFeatureId fid, QString layerName )
|
||||||
|
{
|
||||||
|
if ( !mDxfLayerNames.contains( layerId ) )
|
||||||
|
mDxfLayerNames[ layerId ] = QMap<QgsFeatureId, QString>();
|
||||||
|
|
||||||
|
mDxfLayerNames[layerId][fid] = layerName;
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "qgsgeometry.h"
|
#include "qgsgeometry.h"
|
||||||
#include "qgssymbolv2.h"
|
#include "qgssymbolv2.h"
|
||||||
|
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
@ -28,6 +29,12 @@ class QgsMapLayer;
|
|||||||
class QgsPoint;
|
class QgsPoint;
|
||||||
class QgsSymbolLayerV2;
|
class QgsSymbolLayerV2;
|
||||||
class QIODevice;
|
class QIODevice;
|
||||||
|
class QgsPalLayerSettings;
|
||||||
|
|
||||||
|
namespace pal
|
||||||
|
{
|
||||||
|
class LabelPosition;
|
||||||
|
};
|
||||||
|
|
||||||
class CORE_EXPORT QgsDxfExport
|
class CORE_EXPORT QgsDxfExport
|
||||||
{
|
{
|
||||||
@ -283,6 +290,9 @@ class CORE_EXPORT QgsDxfExport
|
|||||||
//! return list of available DXF encodings
|
//! return list of available DXF encodings
|
||||||
static QStringList encodings();
|
static QStringList encodings();
|
||||||
|
|
||||||
|
void drawLabel( QString layerId, QgsRenderContext& context, pal::LabelPosition* label, const QgsPalLayerSettings &settings );
|
||||||
|
void registerDxfLayer( QString layerId, QgsFeatureId fid, QString layer );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList< QPair<QgsVectorLayer*, int> > mLayers;
|
QList< QPair<QgsVectorLayer*, int> > mLayers;
|
||||||
|
|
||||||
@ -350,6 +360,9 @@ class CORE_EXPORT QgsDxfExport
|
|||||||
|
|
||||||
QHash<QString, int> mBlockHandles;
|
QHash<QString, int> mBlockHandles;
|
||||||
QString mBlockHandle;
|
QString mBlockHandle;
|
||||||
|
|
||||||
|
//! DXF layer name for each label feature
|
||||||
|
QMap< QString, QMap<QgsFeatureId, QString> > mDxfLayerNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGSDXFEXPORT_H
|
#endif // QGSDXFEXPORT_H
|
||||||
|
@ -17,131 +17,57 @@
|
|||||||
|
|
||||||
#include "qgsdxfpallabeling.h"
|
#include "qgsdxfpallabeling.h"
|
||||||
#include "qgsdxfexport.h"
|
#include "qgsdxfexport.h"
|
||||||
#include "qgstextlabelfeature.h"
|
|
||||||
#include "qgspallabeling.h"
|
#include "qgspallabeling.h"
|
||||||
#include "qgsmapsettings.h"
|
#include "qgsmapsettings.h"
|
||||||
|
#include "qgslogger.h"
|
||||||
#include "pal/feature.h"
|
|
||||||
#include "pal/pointset.h"
|
|
||||||
#include "pal/labelposition.h"
|
|
||||||
|
|
||||||
|
|
||||||
QgsDxfLabelProvider::QgsDxfLabelProvider( QgsVectorLayer* layer , QgsDxfExport* dxf )
|
QgsDxfLabelProvider::QgsDxfLabelProvider( QgsVectorLayer* layer, QgsDxfExport* dxf, const QgsPalLayerSettings *settings )
|
||||||
: QgsVectorLayerLabelProvider( layer, false )
|
: QgsVectorLayerLabelProvider( layer, false, settings )
|
||||||
, mDxfExport( dxf )
|
, mDxfExport( dxf )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsDxfLabelProvider::drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const
|
void QgsDxfLabelProvider::drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const
|
||||||
{
|
{
|
||||||
Q_UNUSED( context );
|
Q_ASSERT( mDxfExport );
|
||||||
|
mDxfExport->drawLabel( layerId(), context, label, mSettings );
|
||||||
//debug: print label infos
|
|
||||||
if ( mDxfExport )
|
|
||||||
{
|
|
||||||
QgsTextLabelFeature* lf = dynamic_cast<QgsTextLabelFeature*>( label->getFeaturePart()->feature() );
|
|
||||||
if ( !lf )
|
|
||||||
return;
|
|
||||||
|
|
||||||
const QgsPalLayerSettings& tmpLyr = mSettings;
|
|
||||||
|
|
||||||
//label text
|
|
||||||
QString txt = lf->text( label->getPartId() );
|
|
||||||
|
|
||||||
//angle
|
|
||||||
double angle = label->getAlpha() * 180 / M_PI;
|
|
||||||
|
|
||||||
QgsFeatureId fid = label->getFeaturePart()->featureId();
|
|
||||||
QString dxfLayer = mDxfLayerNames[fid];
|
|
||||||
|
|
||||||
//debug: show label rectangle
|
|
||||||
#if 0
|
|
||||||
QgsPolyline line;
|
|
||||||
for ( int i = 0; i < 4; ++i )
|
|
||||||
{
|
|
||||||
line.append( QgsPoint( label->getX( i ), label->getY( i ) ) );
|
|
||||||
}
|
|
||||||
mDxfExport->writePolyline( line, dxfLayer, "CONTINUOUS", 1, 0.01, true );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QString wrapchr = tmpLyr.wrapChar.isEmpty() ? "\n" : tmpLyr.wrapChar;
|
|
||||||
|
|
||||||
//add the direction symbol if needed
|
|
||||||
if ( !txt.isEmpty() && tmpLyr.placement == QgsPalLayerSettings::Line && tmpLyr.addDirectionSymbol )
|
|
||||||
{
|
|
||||||
bool prependSymb = false;
|
|
||||||
QString symb = tmpLyr.rightDirectionSymbol;
|
|
||||||
|
|
||||||
if ( label->getReversed() )
|
|
||||||
{
|
|
||||||
prependSymb = true;
|
|
||||||
symb = tmpLyr.leftDirectionSymbol;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( tmpLyr.reverseDirectionSymbol )
|
|
||||||
{
|
|
||||||
if ( symb == tmpLyr.rightDirectionSymbol )
|
|
||||||
{
|
|
||||||
prependSymb = true;
|
|
||||||
symb = tmpLyr.leftDirectionSymbol;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
prependSymb = false;
|
|
||||||
symb = tmpLyr.rightDirectionSymbol;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolAbove )
|
|
||||||
{
|
|
||||||
prependSymb = true;
|
|
||||||
symb = symb + wrapchr;
|
|
||||||
}
|
|
||||||
else if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolBelow )
|
|
||||||
{
|
|
||||||
prependSymb = false;
|
|
||||||
symb = wrapchr + symb;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( prependSymb )
|
|
||||||
{
|
|
||||||
txt.prepend( symb );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
txt.append( symb );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
txt = txt.replace( wrapchr, "\\P" );
|
|
||||||
|
|
||||||
if ( tmpLyr.textFont.underline() )
|
|
||||||
{
|
|
||||||
txt.prepend( "\\L" ).append( "\\l" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( tmpLyr.textFont.overline() )
|
|
||||||
{
|
|
||||||
txt.prepend( "\\O" ).append( "\\o" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( tmpLyr.textFont.strikeOut() )
|
|
||||||
{
|
|
||||||
txt.prepend( "\\K" ).append( "\\k" );
|
|
||||||
}
|
|
||||||
|
|
||||||
txt.prepend( QString( "\\f%1|i%2|b%3;\\H%4;\\W0.75;" )
|
|
||||||
.arg( tmpLyr.textFont.family() )
|
|
||||||
.arg( tmpLyr.textFont.italic() ? 1 : 0 )
|
|
||||||
.arg( tmpLyr.textFont.bold() ? 1 : 0 )
|
|
||||||
.arg( label->getHeight() / ( 1 + txt.count( "\\P" ) ) * 0.75 ) );
|
|
||||||
|
|
||||||
mDxfExport->writeMText( dxfLayer, txt, QgsPoint( label->getX(), label->getY() ), label->getWidth() * 1.1, angle, tmpLyr.textColor );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsDxfLabelProvider::registerDxfFeature( QgsFeature& feature, QgsRenderContext& context, const QString& dxfLayerName )
|
void QgsDxfLabelProvider::registerDxfFeature( QgsFeature& feature, QgsRenderContext& context, const QString& dxfLayerName )
|
||||||
{
|
{
|
||||||
registerFeature( feature, context );
|
registerFeature( feature, context );
|
||||||
mDxfLayerNames[feature.id()] = dxfLayerName;
|
mDxfExport->registerDxfLayer( layerId(), feature.id(), dxfLayerName );
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsDxfRuleBasedLabelProvider::QgsDxfRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer* layer, QgsDxfExport* dxf )
|
||||||
|
: QgsRuleBasedLabelProvider( rules, layer, false )
|
||||||
|
, mDxfExport( dxf )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsDxfRuleBasedLabelProvider::reinit( QgsVectorLayer* layer )
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Entering." );
|
||||||
|
mRules.rootRule()->createSubProviders( layer, mSubProviders, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsVectorLayerLabelProvider *QgsDxfRuleBasedLabelProvider::createProvider( QgsVectorLayer *layer, bool withFeatureLoop, const QgsPalLayerSettings *settings )
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Entering." );
|
||||||
|
Q_UNUSED( withFeatureLoop );
|
||||||
|
return new QgsDxfLabelProvider( layer, mDxfExport, settings );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsDxfRuleBasedLabelProvider::drawLabel( QgsRenderContext &context, pal::LabelPosition *label ) const
|
||||||
|
{
|
||||||
|
QgsDebugMsg( "Entering." );
|
||||||
|
Q_ASSERT( mDxfExport );
|
||||||
|
mDxfExport->drawLabel( layerId(), context, label, mSettings );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsDxfRuleBasedLabelProvider::registerDxfFeature( QgsFeature &feature, QgsRenderContext &context, const QString &dxfLayerName )
|
||||||
|
{
|
||||||
|
registerFeature( feature, context );
|
||||||
|
mDxfExport->registerDxfLayer( layerId(), feature.id(), dxfLayerName );
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,11 @@
|
|||||||
#include "qgsmaprenderer.h"
|
#include "qgsmaprenderer.h"
|
||||||
#include "qgsrendercontext.h"
|
#include "qgsrendercontext.h"
|
||||||
#include "qgsvectorlayerlabelprovider.h"
|
#include "qgsvectorlayerlabelprovider.h"
|
||||||
|
#include "qgsrulebasedlabeling.h"
|
||||||
|
|
||||||
class QgsDxfExport;
|
class QgsDxfExport;
|
||||||
|
class QgsPalLayerSettings;
|
||||||
|
class QgsRuleBasedLabeling;
|
||||||
|
|
||||||
|
|
||||||
/** Implements a derived label provider internally used for DXF export
|
/** Implements a derived label provider internally used for DXF export
|
||||||
@ -34,10 +37,10 @@ class QgsDxfLabelProvider : public QgsVectorLayerLabelProvider
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! construct the provider
|
//! construct the provider
|
||||||
explicit QgsDxfLabelProvider( QgsVectorLayer* layer, QgsDxfExport* dxf );
|
explicit QgsDxfLabelProvider( QgsVectorLayer* layer, QgsDxfExport* dxf, const QgsPalLayerSettings *settings );
|
||||||
|
|
||||||
//! re-implementation that writes to DXF file instead of drawing with QPainter
|
//! re-implementation that writes to DXF file instead of drawing with QPainter
|
||||||
virtual void drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const override;
|
void drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const override;
|
||||||
|
|
||||||
//! registration method that keeps track of DXF layer names of individual features
|
//! registration method that keeps track of DXF layer names of individual features
|
||||||
void registerDxfFeature( QgsFeature& feature, QgsRenderContext &context, const QString& dxfLayerName );
|
void registerDxfFeature( QgsFeature& feature, QgsRenderContext &context, const QString& dxfLayerName );
|
||||||
@ -45,8 +48,29 @@ class QgsDxfLabelProvider : public QgsVectorLayerLabelProvider
|
|||||||
protected:
|
protected:
|
||||||
//! pointer to parent DXF export where this instance is used
|
//! pointer to parent DXF export where this instance is used
|
||||||
QgsDxfExport* mDxfExport;
|
QgsDxfExport* mDxfExport;
|
||||||
//! DXF layer name for each label feature
|
|
||||||
QMap<QgsFeatureId, QString> mDxfLayerNames;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QgsDxfRuleBasedLabelProvider : public QgsRuleBasedLabelProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! construct the provider
|
||||||
|
explicit QgsDxfRuleBasedLabelProvider( const QgsRuleBasedLabeling &rules, QgsVectorLayer* layer, QgsDxfExport* dxf );
|
||||||
|
|
||||||
|
void reinit( QgsVectorLayer* layer );
|
||||||
|
|
||||||
|
//! re-implementation that writes to DXF file instead of drawing with QPainter
|
||||||
|
void drawLabel( QgsRenderContext &context, pal::LabelPosition *label ) const override;
|
||||||
|
|
||||||
|
//! registration method that keeps track of DXF layer names of individual features
|
||||||
|
void registerDxfFeature( QgsFeature& feature, QgsRenderContext &context, const QString& dxfLayerName );
|
||||||
|
|
||||||
|
virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, bool withFeatureLoop, const QgsPalLayerSettings *settings ) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! pointer to parent DXF export where this instance is used
|
||||||
|
QgsDxfExport* mDxfExport;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // QGSDXFPALLABELING_H
|
#endif // QGSDXFPALLABELING_H
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include "qgslabelfeature.h"
|
#include "qgslabelfeature.h"
|
||||||
|
|
||||||
#include "feature.h"
|
#include "feature.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,9 +46,10 @@ class QgsDiagramLayerSettings;
|
|||||||
class CORE_EXPORT QgsLabelPosition
|
class CORE_EXPORT QgsLabelPosition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QgsLabelPosition( int id, double r, const QVector< QgsPoint >& corners, const QgsRectangle& rect, double w, double h, const QString& layer, const QString& labeltext, const QFont& labelfont, bool upside_down, bool diagram = false, bool pinned = false ):
|
QgsLabelPosition( int id, double r, const QVector< QgsPoint >& corners, const QgsRectangle& rect, double w, double h, const QString& layer, const QString& labeltext, const QFont& labelfont, bool upside_down, bool diagram = false, bool pinned = false )
|
||||||
featureId( id ), rotation( r ), cornerPoints( corners ), labelRect( rect ), width( w ), height( h ), layerID( layer ), labelText( labeltext ), labelFont( labelfont ), upsideDown( upside_down ), isDiagram( diagram ), isPinned( pinned ) {}
|
: featureId( id ), rotation( r ), cornerPoints( corners ), labelRect( rect ), width( w ), height( h ), layerID( layer ), labelText( labeltext ), labelFont( labelfont ), upsideDown( upside_down ), isDiagram( diagram ), isPinned( pinned ) {}
|
||||||
QgsLabelPosition(): featureId( -1 ), rotation( 0 ), labelRect( QgsRectangle() ), width( 0 ), height( 0 ), layerID( "" ), labelText( "" ), labelFont( QFont() ), upsideDown( false ), isDiagram( false ), isPinned( false ) {}
|
QgsLabelPosition()
|
||||||
|
: featureId( -1 ), rotation( 0 ), labelRect( QgsRectangle() ), width( 0 ), height( 0 ), layerID( "" ), labelText( "" ), labelFont( QFont() ), upsideDown( false ), isDiagram( false ), isPinned( false ) {}
|
||||||
int featureId;
|
int featureId;
|
||||||
double rotation;
|
double rotation;
|
||||||
QVector< QgsPoint > cornerPoints;
|
QVector< QgsPoint > cornerPoints;
|
||||||
@ -72,7 +73,7 @@ class CORE_EXPORT QgsLabelingEngineInterface
|
|||||||
|
|
||||||
//! called when we're going to start with rendering
|
//! called when we're going to start with rendering
|
||||||
//! @deprecated since 2.4 - use override with QgsMapSettings
|
//! @deprecated since 2.4 - use override with QgsMapSettings
|
||||||
Q_DECL_DEPRECATED virtual void init( QgsMapRenderer* mp ) = 0;
|
Q_DECL_DEPRECATED virtual void init( QgsMapRenderer *mp ) = 0;
|
||||||
//! called when we're going to start with rendering
|
//! called when we're going to start with rendering
|
||||||
virtual void init( const QgsMapSettings& mapSettings ) = 0;
|
virtual void init( const QgsMapSettings& mapSettings ) = 0;
|
||||||
//! called to find out whether the layer is used for labeling
|
//! called to find out whether the layer is used for labeling
|
||||||
@ -85,19 +86,19 @@ class CORE_EXPORT QgsLabelingEngineInterface
|
|||||||
virtual int prepareLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx ) = 0;
|
virtual int prepareLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx ) = 0;
|
||||||
//! returns PAL layer settings for a registered layer
|
//! returns PAL layer settings for a registered layer
|
||||||
//! @deprecated since 2.12 - if direct access to QgsPalLayerSettings is necessary, use QgsPalLayerSettings::fromLayer()
|
//! @deprecated since 2.12 - if direct access to QgsPalLayerSettings is necessary, use QgsPalLayerSettings::fromLayer()
|
||||||
Q_DECL_DEPRECATED virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0;
|
Q_DECL_DEPRECATED virtual QgsPalLayerSettings &layer( const QString &layerName ) = 0;
|
||||||
//! adds a diagram layer to the labeling engine
|
//! adds a diagram layer to the labeling engine
|
||||||
//! @note added in QGIS 2.12
|
//! @note added in QGIS 2.12
|
||||||
virtual int prepareDiagramLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx )
|
virtual int prepareDiagramLayer( QgsVectorLayer *layer, QStringList &attrNames, QgsRenderContext &ctx )
|
||||||
{ Q_UNUSED( layer ); Q_UNUSED( attrNames ); Q_UNUSED( ctx ); return 0; }
|
{ Q_UNUSED( layer ); Q_UNUSED( attrNames ); Q_UNUSED( ctx ); return 0; }
|
||||||
//! adds a diagram layer to the labeling engine
|
//! adds a diagram layer to the labeling engine
|
||||||
//! @deprecated since 2.12 - use prepareDiagramLayer()
|
//! @deprecated since 2.12 - use prepareDiagramLayer()
|
||||||
Q_DECL_DEPRECATED virtual int addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLayerSettings* s )
|
Q_DECL_DEPRECATED virtual int addDiagramLayer( QgsVectorLayer *layer, const QgsDiagramLayerSettings *s )
|
||||||
{ Q_UNUSED( layer ); Q_UNUSED( s ); return 0; }
|
{ Q_UNUSED( layer ); Q_UNUSED( s ); return 0; }
|
||||||
//! called for every feature
|
//! called for every feature
|
||||||
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context, const QString& dxfLayer = QString::null ) = 0;
|
virtual void registerFeature( const QString &layerID, QgsFeature &feat, QgsRenderContext &context ) = 0;
|
||||||
//! called for every diagram feature
|
//! called for every diagram feature
|
||||||
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context )
|
virtual void registerDiagramFeature( const QString &layerID, QgsFeature &feat, QgsRenderContext &context )
|
||||||
{ Q_UNUSED( layerID ); Q_UNUSED( feat ); Q_UNUSED( context ); }
|
{ Q_UNUSED( layerID ); Q_UNUSED( feat ); Q_UNUSED( context ); }
|
||||||
//! called when the map is drawn and labels should be placed
|
//! called when the map is drawn and labels should be placed
|
||||||
virtual void drawLabeling( QgsRenderContext& context ) = 0;
|
virtual void drawLabeling( QgsRenderContext& context ) = 0;
|
||||||
|
@ -1939,13 +1939,11 @@ void QgsPalLayerSettings::calculateLabelSize( const QFontMetricsF* fm, QString t
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** labelFeature , QgsGeometry* obstacleGeometry )
|
void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &context, QgsLabelFeature** labelFeature , QgsGeometry* obstacleGeometry )
|
||||||
{
|
{
|
||||||
// either used in QgsPalLabeling (palLayer is set) or in QgsLabelingEngineV2 (labelFeature is set)
|
// either used in QgsPalLabeling (palLayer is set) or in QgsLabelingEngineV2 (labelFeature is set)
|
||||||
Q_ASSERT( labelFeature );
|
Q_ASSERT( labelFeature );
|
||||||
|
|
||||||
Q_UNUSED( dxfLayer ); // now handled in QgsDxfLabelProvider
|
|
||||||
|
|
||||||
QVariant exprVal; // value() is repeatedly nulled on data defined evaluation and replaced when successful
|
QVariant exprVal; // value() is repeatedly nulled on data defined evaluation and replaced when successful
|
||||||
mCurFeat = &f;
|
mCurFeat = &f;
|
||||||
|
|
||||||
@ -1960,7 +1958,7 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
|
|||||||
{
|
{
|
||||||
if ( isObstacle )
|
if ( isObstacle )
|
||||||
{
|
{
|
||||||
registerObstacleFeature( f, context, QString(), labelFeature, obstacleGeometry );
|
registerObstacleFeature( f, context, labelFeature, obstacleGeometry );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2812,10 +2810,8 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
|
|||||||
lf->setDataDefinedValues( dataDefinedValues );
|
lf->setDataDefinedValues( dataDefinedValues );
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsPalLayerSettings::registerObstacleFeature( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry )
|
void QgsPalLayerSettings::registerObstacleFeature( QgsFeature& f, QgsRenderContext &context, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry )
|
||||||
{
|
{
|
||||||
Q_UNUSED( dxfLayer ); // now handled in QgsDxfLabelProvider
|
|
||||||
|
|
||||||
mCurFeat = &f;
|
mCurFeat = &f;
|
||||||
|
|
||||||
const QgsGeometry* geom = nullptr;
|
const QgsGeometry* geom = nullptr;
|
||||||
@ -3809,9 +3805,8 @@ int QgsPalLabeling::addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLaye
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsPalLabeling::registerFeature( const QString& layerID, QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer )
|
void QgsPalLabeling::registerFeature( const QString& layerID, QgsFeature& f, QgsRenderContext &context )
|
||||||
{
|
{
|
||||||
Q_UNUSED( dxfLayer ); // now handled by QgsDxfLabelProvider
|
|
||||||
if ( QgsVectorLayerLabelProvider* provider = mLabelProviders.value( layerID, nullptr ) )
|
if ( QgsVectorLayerLabelProvider* provider = mLabelProviders.value( layerID, nullptr ) )
|
||||||
provider->registerFeature( f, context );
|
provider->registerFeature( f, context );
|
||||||
}
|
}
|
||||||
|
@ -533,7 +533,6 @@ class CORE_EXPORT QgsPalLayerSettings
|
|||||||
* @param f feature to label
|
* @param f feature to label
|
||||||
* @param context render context. The QgsExpressionContext contained within the render context
|
* @param context render context. The QgsExpressionContext contained within the render context
|
||||||
* must have already had the feature and fields sets prior to calling this method.
|
* must have already had the feature and fields sets prior to calling this method.
|
||||||
* @param dxfLayer dxfLayer name
|
|
||||||
* @param labelFeature if using QgsLabelingEngineV2, this will receive the label feature. Not available
|
* @param labelFeature if using QgsLabelingEngineV2, this will receive the label feature. Not available
|
||||||
* in Python bindings.
|
* in Python bindings.
|
||||||
* @param obstacleGeometry optional obstacle geometry, if a different geometry to the feature's geometry
|
* @param obstacleGeometry optional obstacle geometry, if a different geometry to the feature's geometry
|
||||||
@ -542,7 +541,7 @@ class CORE_EXPORT QgsPalLayerSettings
|
|||||||
* the feature's original geometry will be used as an obstacle for labels. Not available
|
* the feature's original geometry will be used as an obstacle for labels. Not available
|
||||||
* in Python bindings.
|
* in Python bindings.
|
||||||
*/
|
*/
|
||||||
void registerFeature( QgsFeature& f, QgsRenderContext& context, const QString& dxfLayer, QgsLabelFeature** labelFeature = nullptr, QgsGeometry* obstacleGeometry = nullptr );
|
void registerFeature( QgsFeature& f, QgsRenderContext& context, QgsLabelFeature** labelFeature = nullptr, QgsGeometry* obstacleGeometry = nullptr );
|
||||||
|
|
||||||
void readFromLayer( QgsVectorLayer* layer );
|
void readFromLayer( QgsVectorLayer* layer );
|
||||||
void writeToLayer( QgsVectorLayer* layer );
|
void writeToLayer( QgsVectorLayer* layer );
|
||||||
@ -712,7 +711,7 @@ class CORE_EXPORT QgsPalLayerSettings
|
|||||||
|
|
||||||
/** Registers a feature as an obstacle only (no label rendered)
|
/** Registers a feature as an obstacle only (no label rendered)
|
||||||
*/
|
*/
|
||||||
void registerObstacleFeature( QgsFeature &f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry = nullptr );
|
void registerObstacleFeature( QgsFeature &f, QgsRenderContext &context, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry = nullptr );
|
||||||
|
|
||||||
QMap<DataDefinedProperties, QVariant> dataDefinedValues;
|
QMap<DataDefinedProperties, QVariant> dataDefinedValues;
|
||||||
QgsExpression* expression;
|
QgsExpression* expression;
|
||||||
@ -949,9 +948,8 @@ class CORE_EXPORT QgsPalLabeling : public QgsLabelingEngineInterface
|
|||||||
* @param feat feature to label
|
* @param feat feature to label
|
||||||
* @param context render context. The QgsExpressionContext contained within the render context
|
* @param context render context. The QgsExpressionContext contained within the render context
|
||||||
* must have already had the feature and fields sets prior to calling this method.
|
* must have already had the feature and fields sets prior to calling this method.
|
||||||
* @param dxfLayer dxfLayer name
|
|
||||||
*/
|
*/
|
||||||
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context, const QString& dxfLayer = QString::null ) override;
|
virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context ) override;
|
||||||
|
|
||||||
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context ) override;
|
virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context ) override;
|
||||||
//! called when the map is drawn and labels should be placed
|
//! called when the map is drawn and labels should be placed
|
||||||
|
@ -15,12 +15,11 @@
|
|||||||
#include "qgsrulebasedlabeling.h"
|
#include "qgsrulebasedlabeling.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
QgsRuleBasedLabelProvider::QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling& rules, QgsVectorLayer* layer, bool withFeatureLoop )
|
QgsRuleBasedLabelProvider::QgsRuleBasedLabelProvider( const QgsRuleBasedLabeling& rules, QgsVectorLayer* layer, bool withFeatureLoop )
|
||||||
: QgsVectorLayerLabelProvider( layer, withFeatureLoop )
|
: QgsVectorLayerLabelProvider( layer, withFeatureLoop )
|
||||||
, mRules( rules )
|
, mRules( rules )
|
||||||
{
|
{
|
||||||
mRules.rootRule()->createSubProviders( layer, mSubProviders );
|
mRules.rootRule()->createSubProviders( layer, mSubProviders, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsRuleBasedLabelProvider::~QgsRuleBasedLabelProvider()
|
QgsRuleBasedLabelProvider::~QgsRuleBasedLabelProvider()
|
||||||
@ -28,6 +27,10 @@ QgsRuleBasedLabelProvider::~QgsRuleBasedLabelProvider()
|
|||||||
// sub-providers owned by labeling engine
|
// sub-providers owned by labeling engine
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QgsVectorLayerLabelProvider *QgsRuleBasedLabelProvider::createProvider( QgsVectorLayer *layer, bool withFeatureLoop, const QgsPalLayerSettings *settings )
|
||||||
|
{
|
||||||
|
return new QgsVectorLayerLabelProvider( layer, withFeatureLoop, settings );
|
||||||
|
}
|
||||||
|
|
||||||
bool QgsRuleBasedLabelProvider::prepare( const QgsRenderContext& context, QStringList& attributeNames )
|
bool QgsRuleBasedLabelProvider::prepare( const QgsRenderContext& context, QStringList& attributeNames )
|
||||||
{
|
{
|
||||||
@ -213,19 +216,20 @@ QDomElement QgsRuleBasedLabeling::Rule::save( QDomDocument& doc ) const
|
|||||||
return ruleElem;
|
return ruleElem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsRuleBasedLabeling::Rule::createSubProviders( QgsVectorLayer* layer, QgsRuleBasedLabeling::RuleToProviderMap& subProviders )
|
void QgsRuleBasedLabeling::Rule::createSubProviders( QgsVectorLayer* layer, QgsRuleBasedLabeling::RuleToProviderMap& subProviders, QgsRuleBasedLabelProvider *provider )
|
||||||
{
|
{
|
||||||
if ( mSettings )
|
if ( mSettings )
|
||||||
{
|
{
|
||||||
// add provider!
|
// add provider!
|
||||||
QgsVectorLayerLabelProvider* p = new QgsVectorLayerLabelProvider( layer, false, mSettings );
|
QgsVectorLayerLabelProvider *p = provider->createProvider( layer, false, mSettings );
|
||||||
|
delete subProviders.value( this, nullptr );
|
||||||
subProviders[this] = p;
|
subProviders[this] = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
// call recursively
|
// call recursively
|
||||||
Q_FOREACH ( Rule* rule, mChildren )
|
Q_FOREACH ( Rule* rule, mChildren )
|
||||||
{
|
{
|
||||||
rule->createSubProviders( layer, subProviders );
|
rule->createSubProviders( layer, subProviders, provider );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,6 +266,8 @@ QgsRuleBasedLabeling::Rule::RegisterResult QgsRuleBasedLabeling::Rule::registerF
|
|||||||
|
|
||||||
bool registered = false;
|
bool registered = false;
|
||||||
|
|
||||||
|
Q_ASSERT( !mSettings == subProviders.contains( this ) );
|
||||||
|
|
||||||
// do we have active subprovider for the rule?
|
// do we have active subprovider for the rule?
|
||||||
if ( subProviders.contains( this ) && mIsActive )
|
if ( subProviders.contains( this ) && mIsActive )
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
#include "qgsvectorlayerlabeling.h"
|
#include "qgsvectorlayerlabeling.h"
|
||||||
|
#include "qgsvectorlayerlabelprovider.h"
|
||||||
|
|
||||||
class QDomDocument;
|
class QDomDocument;
|
||||||
class QDomElement;
|
class QDomElement;
|
||||||
@ -28,6 +29,7 @@ class QgsFeature;
|
|||||||
class QgsPalLayerSettings;
|
class QgsPalLayerSettings;
|
||||||
class QgsRenderContext;
|
class QgsRenderContext;
|
||||||
class QgsGeometry;
|
class QgsGeometry;
|
||||||
|
class QgsRuleBasedLabelProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class QgsRuleBasedLabeling
|
* @class QgsRuleBasedLabeling
|
||||||
@ -42,7 +44,6 @@ class CORE_EXPORT QgsRuleBasedLabeling : public QgsAbstractVectorLayerLabeling
|
|||||||
typedef QList<Rule*> RuleList;
|
typedef QList<Rule*> RuleList;
|
||||||
typedef QMap<Rule*, QgsVectorLayerLabelProvider*> RuleToProviderMap;
|
typedef QMap<Rule*, QgsVectorLayerLabelProvider*> RuleToProviderMap;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class QgsRuleBasedLabeling::Rule
|
* @class QgsRuleBasedLabeling::Rule
|
||||||
* @note not available in Python bindings
|
* @note not available in Python bindings
|
||||||
@ -214,7 +215,7 @@ class CORE_EXPORT QgsRuleBasedLabeling : public QgsAbstractVectorLayerLabeling
|
|||||||
// evaluation
|
// evaluation
|
||||||
|
|
||||||
//! add providers
|
//! add providers
|
||||||
void createSubProviders( QgsVectorLayer* layer, RuleToProviderMap& subProviders );
|
void createSubProviders( QgsVectorLayer* layer, RuleToProviderMap& subProviders, QgsRuleBasedLabelProvider *provider );
|
||||||
|
|
||||||
//! call prepare() on sub-providers and populate attributeNames
|
//! call prepare() on sub-providers and populate attributeNames
|
||||||
void prepare( const QgsRenderContext& context, QStringList& attributeNames, RuleToProviderMap& subProviders );
|
void prepare( const QgsRenderContext& context, QStringList& attributeNames, RuleToProviderMap& subProviders );
|
||||||
@ -285,15 +286,13 @@ class CORE_EXPORT QgsRuleBasedLabeling : public QgsAbstractVectorLayerLabeling
|
|||||||
|
|
||||||
virtual QString type() const override;
|
virtual QString type() const override;
|
||||||
virtual QDomElement save( QDomDocument& doc ) const override;
|
virtual QDomElement save( QDomDocument& doc ) const override;
|
||||||
virtual QgsVectorLayerLabelProvider* provider( QgsVectorLayer* layer ) const override;
|
virtual QgsVectorLayerLabelProvider *provider( QgsVectorLayer* layer ) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Rule* mRootRule;
|
Rule* mRootRule;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#include "qgsvectorlayerlabelprovider.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class QgsRuleBasedLabelProvider
|
* @class QgsRuleBasedLabelProvider
|
||||||
* @note not available in Python bindings
|
* @note not available in Python bindings
|
||||||
@ -312,6 +311,7 @@ class CORE_EXPORT QgsRuleBasedLabelProvider : public QgsVectorLayerLabelProvider
|
|||||||
virtual void registerFeature( QgsFeature& feature, QgsRenderContext& context, QgsGeometry* obstacleGeometry = nullptr ) override;
|
virtual void registerFeature( QgsFeature& feature, QgsRenderContext& context, QgsGeometry* obstacleGeometry = nullptr ) override;
|
||||||
|
|
||||||
// new methods
|
// new methods
|
||||||
|
virtual QgsVectorLayerLabelProvider *createProvider( QgsVectorLayer *layer, bool withFeatureLoop, const QgsPalLayerSettings *settings );
|
||||||
|
|
||||||
virtual QList<QgsAbstractLabelProvider*> subProviders() override;
|
virtual QList<QgsAbstractLabelProvider*> subProviders() override;
|
||||||
|
|
||||||
|
@ -316,7 +316,7 @@ QList<QgsLabelFeature*> QgsVectorLayerLabelProvider::labelFeatures( QgsRenderCon
|
|||||||
void QgsVectorLayerLabelProvider::registerFeature( QgsFeature& feature, QgsRenderContext& context, QgsGeometry* obstacleGeometry )
|
void QgsVectorLayerLabelProvider::registerFeature( QgsFeature& feature, QgsRenderContext& context, QgsGeometry* obstacleGeometry )
|
||||||
{
|
{
|
||||||
QgsLabelFeature* label = nullptr;
|
QgsLabelFeature* label = nullptr;
|
||||||
mSettings.registerFeature( feature, context, QString(), &label, obstacleGeometry );
|
mSettings.registerFeature( feature, context, &label, obstacleGeometry );
|
||||||
if ( label )
|
if ( label )
|
||||||
mLabels << label;
|
mLabels << label;
|
||||||
}
|
}
|
||||||
|
@ -116,5 +116,4 @@ class CORE_EXPORT QgsVectorLayerLabelProvider : public QgsAbstractLabelProvider
|
|||||||
QList<QgsLabelFeature*> mLabels;
|
QList<QgsLabelFeature*> mLabels;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // QGSVECTORLAYERLABELPROVIDER_H
|
#endif // QGSVECTORLAYERLABELPROVIDER_H
|
||||||
|
@ -259,7 +259,7 @@ void TestQgsLabelingEngineV2::testRuleBased()
|
|||||||
|
|
||||||
delete rl2;
|
delete rl2;
|
||||||
|
|
||||||
/*
|
#if 0
|
||||||
QPainter p( &img );
|
QPainter p( &img );
|
||||||
QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings );
|
QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings );
|
||||||
context.setPainter( &p );
|
context.setPainter( &p );
|
||||||
@ -267,7 +267,8 @@ void TestQgsLabelingEngineV2::testRuleBased()
|
|||||||
QgsLabelingEngineV2 engine;
|
QgsLabelingEngineV2 engine;
|
||||||
engine.setMapSettings( mapSettings );
|
engine.setMapSettings( mapSettings );
|
||||||
engine.addProvider( new QgsRuleBasedLabelProvider( , vl ) );
|
engine.addProvider( new QgsRuleBasedLabelProvider( , vl ) );
|
||||||
engine.run( context );*/
|
engine.run( context );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestQgsLabelingEngineV2::zOrder()
|
void TestQgsLabelingEngineV2::zOrder()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user