Skip to content

Commit c7b394d

Browse files
committedSep 21, 2015
Port DXF labeling to new labeling engine
This code has been funded by Tuscany Region (Italy) - SITA (CIG: 63526840AE) and commissioned to Gis3W s.a.s.
1 parent f0bc2e9 commit c7b394d

File tree

6 files changed

+80
-80
lines changed

6 files changed

+80
-80
lines changed
 

‎src/core/dxf/qgsdxfexport.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -876,16 +876,42 @@ void QgsDxfExport::writeBlocks()
876876
endSection();
877877
}
878878

879+
879880
void QgsDxfExport::writeEntities()
880881
{
881882
startSection();
882883
writeGroup( 2, "ENTITIES" );
883884

884885
mBlockHandle = QString( "%1" ).arg( mBlockHandles[ "*Model_Space" ], 0, 16 );
885886

887+
QgsRectangle bbox = mExtent.isEmpty() ? dxfExtent() : mExtent;
888+
889+
QgsMapSettings mapSettings;
890+
mapSettings.setMapUnits( mMapUnits );
891+
mapSettings.setExtent( bbox );
892+
893+
int dpi = 96;
894+
double factor = 1000 * dpi / mSymbologyScaleDenominator / 25.4 * QGis::fromUnitToUnitFactor( mMapUnits, QGis::Meters );
895+
mapSettings.setOutputSize( QSize( bbox.width() * factor, bbox.height() * factor ) );
896+
mapSettings.setOutputDpi( dpi );
897+
mapSettings.setCrsTransformEnabled( false );
898+
899+
QImage image( 10, 10, QImage::Format_ARGB32_Premultiplied );
900+
image.setDotsPerMeterX( 96 / 25.4 * 1000 );
901+
image.setDotsPerMeterY( 96 / 25.4 * 1000 );
902+
QPainter painter( &image );
903+
QgsRenderContext ctx;
904+
ctx.setPainter( &painter );
905+
ctx.setRendererScale( mSymbologyScaleDenominator );
906+
ctx.setExtent( bbox );
907+
ctx.setScaleFactor( 96.0 / 25.4 );
908+
Q_NOWARN_DEPRECATED_PUSH
909+
ctx.setMapToPixel( QgsMapToPixel( 1.0 / factor, bbox.xMinimum(), bbox.yMinimum(), bbox.height() * factor ) );
910+
Q_NOWARN_DEPRECATED_POP
911+
886912
// label engine
887-
QgsDxfPalLabeling labelEngine( this, mExtent.isEmpty() ? dxfExtent() : mExtent, mSymbologyScaleDenominator, mMapUnits );
888-
QgsRenderContext& ctx = labelEngine.renderContext();
913+
QgsLabelingEngineV2 engine;
914+
engine.setMapSettings( mapSettings );
889915

890916
// iterate through the maplayers
891917
QList< QPair< QgsVectorLayer*, int > >::iterator layerIt = mLayers.begin();
@@ -913,7 +939,13 @@ void QgsDxfExport::writeEntities()
913939
attributes << layerAttr;
914940
}
915941

916-
bool labelLayer = labelEngine.prepareLayer( vl, attributes, ctx ) != 0;
942+
QgsDxfLabelProvider* lp = new QgsDxfLabelProvider( vl, this );
943+
engine.addProvider( lp );
944+
if ( !lp->prepare( ctx, attributes ) )
945+
{
946+
engine.removeProvider( lp );
947+
lp = 0;
948+
}
917949

918950
if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology &&
919951
( renderer->capabilities() & QgsFeatureRendererV2::SymbolLevels ) &&
@@ -973,17 +1005,18 @@ void QgsDxfExport::writeEntities()
9731005
addFeature( sctx, layerName, s->symbolLayer( 0 ), s );
9741006
}
9751007

976-
if ( labelLayer )
1008+
if ( lp )
9771009
{
978-
labelEngine.registerFeature( vl->id(), fet, ctx, layerName );
1010+
lp->registerDxfFeature( fet, ctx, layerName );
9791011
}
9801012
}
9811013
}
9821014

9831015
renderer->stopRender( ctx );
9841016
}
9851017

986-
labelEngine.drawLabeling( ctx );
1018+
engine.run( ctx );
1019+
9871020
endSection();
9881021
}
9891022

‎src/core/dxf/qgsdxfpallabeling.cpp

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,60 +18,22 @@
1818
#include "qgsdxfpallabeling.h"
1919
#include "qgsdxfexport.h"
2020
#include "qgspalgeometry.h"
21+
#include "qgspallabeling.h"
2122
#include "qgsmapsettings.h"
2223

2324
#include "pal/pointset.h"
2425
#include "pal/labelposition.h"
2526

26-
using namespace pal;
2727

28-
QgsDxfPalLabeling::QgsDxfPalLabeling( QgsDxfExport* dxf, const QgsRectangle& bbox, double scale, QGis::UnitType mapUnits )
29-
: QgsPalLabeling()
28+
QgsDxfLabelProvider::QgsDxfLabelProvider( QgsVectorLayer* layer , QgsDxfExport* dxf )
29+
: QgsVectorLayerLabelProvider( layer, false )
3030
, mDxfExport( dxf )
31-
, mImage( 0 )
32-
, mPainter( 0 )
3331
{
34-
mSettings = new QgsMapSettings;
35-
mSettings->setMapUnits( mapUnits );
36-
mSettings->setExtent( bbox );
37-
38-
int dpi = 96;
39-
double factor = 1000 * dpi / scale / 25.4 * QGis::fromUnitToUnitFactor( mapUnits, QGis::Meters );
40-
mSettings->setOutputSize( QSize( bbox.width() * factor, bbox.height() * factor ) );
41-
mSettings->setOutputDpi( dpi );
42-
mSettings->setCrsTransformEnabled( false );
43-
init( *mSettings );
44-
45-
mImage = new QImage( 10, 10, QImage::Format_ARGB32_Premultiplied );
46-
mImage->setDotsPerMeterX( 96 / 25.4 * 1000 );
47-
mImage->setDotsPerMeterY( 96 / 25.4 * 1000 );
48-
mPainter = new QPainter( mImage );
49-
mRenderContext.setPainter( mPainter );
50-
mRenderContext.setRendererScale( scale );
51-
mRenderContext.setExtent( bbox );
52-
mRenderContext.setScaleFactor( 96.0 / 25.4 );
53-
Q_NOWARN_DEPRECATED_PUSH
54-
mRenderContext.setMapToPixel( QgsMapToPixel( 1.0 / factor, bbox.xMinimum(), bbox.yMinimum(), bbox.height() * factor ) );
55-
Q_NOWARN_DEPRECATED_POP
5632
}
5733

58-
QgsDxfPalLabeling::~QgsDxfPalLabeling()
59-
{
60-
delete mPainter;
61-
delete mImage;
62-
delete mSettings;
63-
}
64-
65-
void QgsDxfPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& context, QgsPalLayerSettings& tmpLyr, DrawLabelType drawType, double dpiRatio )
34+
void QgsDxfLabelProvider::drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const
6635
{
6736
Q_UNUSED( context );
68-
Q_UNUSED( drawType );
69-
Q_UNUSED( dpiRatio );
70-
71-
if ( drawType == QgsPalLabeling::LabelBuffer )
72-
{
73-
return;
74-
}
7537

7638
//debug: print label infos
7739
if ( mDxfExport )
@@ -80,20 +42,25 @@ void QgsDxfPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext&
8042
if ( !g )
8143
return;
8244

45+
const QgsPalLayerSettings& tmpLyr = mSettings;
46+
8347
//label text
8448
QString txt = g->text( label->getPartId() );
8549

8650
//angle
8751
double angle = label->getAlpha() * 180 / M_PI;
8852

53+
QgsFeatureId fid = STRING_TO_FID( label->getFeaturePart()->getUID() );
54+
QString dxfLayer = mDxfLayerNames[fid];
55+
8956
//debug: show label rectangle
9057
#if 0
9158
QgsPolyline line;
9259
for ( int i = 0; i < 4; ++i )
9360
{
9461
line.append( QgsPoint( label->getX( i ), label->getY( i ) ) );
9562
}
96-
mDxfExport->writePolyline( line, g->dxfLayer(), "CONTINUOUS", 1, 0.01, true );
63+
mDxfExport->writePolyline( line, dxfLayer, "CONTINUOUS", 1, 0.01, true );
9764
#endif
9865

9966
QString wrapchr = tmpLyr.wrapChar.isEmpty() ? "\n" : tmpLyr.wrapChar;
@@ -168,6 +135,12 @@ void QgsDxfPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext&
168135
.arg( tmpLyr.textFont.bold() ? 1 : 0 )
169136
.arg( label->getHeight() / ( 1 + txt.count( "\\P" ) ) * 0.75 ) );
170137

171-
mDxfExport->writeMText( g->dxfLayer(), txt, QgsPoint( label->getX(), label->getY() ), label->getWidth() * 1.1, angle, tmpLyr.textColor );
138+
mDxfExport->writeMText( dxfLayer, txt, QgsPoint( label->getX(), label->getY() ), label->getWidth() * 1.1, angle, tmpLyr.textColor );
172139
}
173140
}
141+
142+
void QgsDxfLabelProvider::registerDxfFeature( QgsFeature& feature, const QgsRenderContext& context, const QString& dxfLayerName )
143+
{
144+
registerFeature( feature, context );
145+
mDxfLayerNames[feature.id()] = dxfLayerName;
146+
}

‎src/core/dxf/qgsdxfpallabeling.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,34 @@
1818
#ifndef QGSDXFPALLABELING_H
1919
#define QGSDXFPALLABELING_H
2020

21-
#include "qgspallabeling.h"
2221
#include "qgsmaprenderer.h"
2322
#include "qgsrendercontext.h"
23+
#include "qgsvectorlayerlabelprovider.h"
2424

2525
class QgsDxfExport;
2626

27-
class CORE_EXPORT QgsDxfPalLabeling : public QgsPalLabeling
27+
28+
/** Implements a derived label provider internally used for DXF export
29+
*
30+
* Internal class, not in public API. Added in QGIS 2.12
31+
*/
32+
class QgsDxfLabelProvider : public QgsVectorLayerLabelProvider
2833
{
2934
public:
30-
QgsDxfPalLabeling( QgsDxfExport* dxf, const QgsRectangle& bbox, double scale, QGis::UnitType mapUnits );
31-
~QgsDxfPalLabeling();
35+
//! construct the provider
36+
explicit QgsDxfLabelProvider( QgsVectorLayer* layer, QgsDxfExport* dxf );
3237

33-
QgsRenderContext& renderContext() { return mRenderContext; }
34-
void drawLabel( pal::LabelPosition* label, QgsRenderContext& context, QgsPalLayerSettings& tmpLyr, DrawLabelType drawType, double dpiRatio = 1.0 ) override;
38+
//! re-implementation that writes to DXF file instead of drawing with QPainter
39+
virtual void drawLabel( QgsRenderContext& context, pal::LabelPosition* label ) const override;
3540

36-
private:
37-
QgsDxfExport* mDxfExport;
38-
QgsRenderContext mRenderContext;
41+
//! registration method that keeps track of DXF layer names of individual features
42+
void registerDxfFeature( QgsFeature& feature, const QgsRenderContext& context, const QString& dxfLayerName );
3943

40-
//only used for render context
41-
QImage* mImage;
42-
QPainter* mPainter;
43-
QgsMapSettings* mSettings;
44+
protected:
45+
//! pointer to parent DXF export where this instance is used
46+
QgsDxfExport* mDxfExport;
47+
//! DXF layer name for each label feature
48+
QMap<QgsFeatureId, QString> mDxfLayerNames;
4449
};
4550

4651
#endif // QGSDXFPALLABELING_H

‎src/core/qgspalgeometry.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,6 @@ class QgsPalGeometry : public PalGeometry
153153
feature.setValid( true );
154154
}
155155

156-
void setDxfLayer( QString dxfLayer ) { mDxfLayer = dxfLayer; }
157-
QString dxfLayer() const { return mDxfLayer; }
158-
159156
protected:
160157
GEOSGeometry* mG;
161158
QString mText;
@@ -175,8 +172,6 @@ class QgsPalGeometry : public PalGeometry
175172

176173
/** Stores attribute values for diagram rendering*/
177174
QgsAttributes mDiagramAttributes;
178-
179-
QString mDxfLayer;
180175
};
181176

182177
#endif //QGSPALGEOMETRY_H

‎src/core/qgspallabeling.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,11 +1471,13 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
14711471
// either used in QgsPalLabeling (palLayer is set) or in QgsLabelingEngineV2 (labelFeature is set)
14721472
Q_ASSERT( labelFeature );
14731473

1474+
Q_UNUSED( dxfLayer ); // now handled in QgsDxfLabelProvider
1475+
14741476
if ( !drawLabels )
14751477
{
14761478
if ( obstacle )
14771479
{
1478-
registerObstacleFeature( f, context, dxfLayer, labelFeature );
1480+
registerObstacleFeature( f, context, QString(), labelFeature );
14791481
}
14801482
return;
14811483
}
@@ -2140,8 +2142,6 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
21402142
labelFont.wordSpacing(),
21412143
placement == QgsPalLayerSettings::Curved );
21422144

2143-
lbl->setDxfLayer( dxfLayer );
2144-
21452145
// record the created geometry - it will be deleted at the end.
21462146
geometries.append( lbl );
21472147

@@ -2296,6 +2296,8 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
22962296

22972297
void QgsPalLayerSettings::registerObstacleFeature( QgsFeature& f, const QgsRenderContext& context, QString dxfLayer , QgsLabelFeature** obstacleFeature )
22982298
{
2299+
Q_UNUSED( dxfLayer ); // now handled in QgsDxfLabelProvider
2300+
22992301
mCurFeat = &f;
23002302

23012303
const QgsGeometry* geom = f.constGeometry();
@@ -2327,8 +2329,6 @@ void QgsPalLayerSettings::registerObstacleFeature( QgsFeature& f, const QgsRende
23272329

23282330
QgsPalGeometry* lbl = new QgsPalGeometry( f.id(), QString(), geos_geom_clone );
23292331

2330-
lbl->setDxfLayer( dxfLayer );
2331-
23322332
// record the created geometry - it will be deleted at the end.
23332333
geometries.append( lbl );
23342334

@@ -3278,6 +3278,7 @@ int QgsPalLabeling::addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLaye
32783278

32793279
void QgsPalLabeling::registerFeature( const QString& layerID, QgsFeature& f, const QgsRenderContext& context, QString dxfLayer )
32803280
{
3281+
Q_UNUSED( dxfLayer ); // now handled by QgsDxfLabelProvider
32813282
if ( QgsVectorLayerLabelProvider* provider = mLabelProviders.value( layerID, 0 ) )
32823283
provider->registerFeature( f, context );
32833284
}
@@ -3967,9 +3968,6 @@ void QgsPalLabeling::drawLabelCandidateRect( pal::LabelPosition* lp, QPainter* p
39673968
drawLabelCandidateRect( lp->getNextPart(), painter, xform, candidates );
39683969
}
39693970

3970-
void QgsPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& context, QgsPalLayerSettings& tmpLyr, DrawLabelType drawType, double dpiRatio )
3971-
{
3972-
}
39733971

39743972
void QgsPalLabeling::drawLabelBuffer( QgsRenderContext& context,
39753973
const QgsLabelComponent& component,

‎src/core/qgspallabeling.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -886,10 +886,6 @@ class CORE_EXPORT QgsPalLabeling : public QgsLabelingEngineInterface
886886
//! @note not available in python bindings
887887
static void drawLabelCandidateRect( pal::LabelPosition* lp, QPainter* painter, const QgsMapToPixel* xform, QList<QgsLabelCandidate>* candidates = 0 );
888888

889-
//!drawLabel
890-
//! @note not available in python bindings
891-
virtual void drawLabel( pal::LabelPosition* label, QgsRenderContext& context, QgsPalLayerSettings& tmpLyr, DrawLabelType drawType, double dpiRatio = 1.0 );
892-
893889
static void drawLabelBuffer( QgsRenderContext& context,
894890
const QgsLabelComponent &component,
895891
const QgsPalLayerSettings& tmpLyr );

0 commit comments

Comments
 (0)
Please sign in to comment.