1
#include "qgssymbologyv2conversion.h"
3
#include "qgssinglesymbolrenderer.h"
4
#include "qgsgraduatedsymbolrenderer.h"
5
#include "qgsuniquevaluerenderer.h"
7
#include "qgsvectorlayer.h"
11
#include "qgsmarkersymbollayerv2.h"
12
#include "qgslinesymbollayerv2.h"
13
#include "qgsfillsymbollayerv2.h"
14
#include "qgssinglesymbolrendererv2.h"
15
#include "qgsgraduatedsymbolrendererv2.h"
16
#include "qgscategorizedsymbolrendererv2.h"
18
// some ad-hoc conversions
19
#define MM2PIXELS(x) ((x)/0.26)
20
#define PIXELS2MM(x) ((x)*0.26)
23
QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s )
29
QgsMarkerSymbolLayerV2* sl = NULL;
30
double size = MM2PIXELS( s->pointSize() );
31
double angle = 0; // rotation only from classification field
32
QString symbolName = s->pointSymbolName();
33
if ( symbolName.startsWith( "hard:" ) )
35
// simple symbol marker
36
QColor color = s->fillColor();
37
QColor borderColor = s->color();
38
QString name = symbolName.mid( 5 );
39
sl = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle );
44
QString name = symbolName.mid( 4 );
45
sl = new QgsSvgMarkerSymbolLayerV2( name, size, angle );
47
QgsSymbolLayerV2List layers;
49
return new QgsMarkerSymbolV2( layers );
54
QColor color = s->color();
55
double width = MM2PIXELS( s->lineWidth() );
56
Qt::PenStyle penStyle = s->pen().style();
57
QgsLineSymbolLayerV2* sl = new QgsSimpleLineSymbolLayerV2( color, width, penStyle );
59
QgsSymbolLayerV2List layers;
61
return new QgsLineSymbolV2( layers );
66
QColor color = s->fillColor();
67
QColor borderColor = s->color();
68
Qt::BrushStyle brushStyle = s->brush().style();
69
Qt::PenStyle borderStyle = s->pen().style();
70
double borderWidth = MM2PIXELS( s->lineWidth() );
71
QgsFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( color, brushStyle, borderColor, borderStyle, borderWidth );
73
QgsSymbolLayerV2List layers;
75
return new QgsFillSymbolV2( layers );
83
QgsSymbol* QgsSymbologyV2Conversion::symbolV2toV1( QgsSymbolV2* s )
85
if ( s == NULL || s->symbolLayerCount() == 0 )
88
// we will use only the first symbol layer
89
QgsSymbolLayerV2* sl = s->symbolLayer( 0 );
93
case QgsSymbolV2::Marker:
95
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl );
96
QgsSymbol* sOld = new QgsSymbol( QGis::Point );
97
sOld->setFillColor( sl->color() );
98
sOld->setFillStyle( Qt::SolidPattern );
99
sOld->setPointSize( PIXELS2MM( msl->size() ) );
100
if ( sl->layerType() == "SimpleMarker" )
102
QgsSimpleMarkerSymbolLayerV2* smsl = static_cast<QgsSimpleMarkerSymbolLayerV2*>( sl );
103
sOld->setColor( smsl->borderColor() );
104
sOld->setNamedPointSymbol( "hard:" + smsl->name() );
106
else if ( sl->layerType() == "SvgMarker" )
108
QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl );
109
sOld->setNamedPointSymbol( "svg:" + smsl->path() );
115
case QgsSymbolV2::Line:
117
QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl );
118
QgsSymbol* sOld = new QgsSymbol( QGis::Line );
119
sOld->setColor( sl->color() );
120
sOld->setLineWidth( PIXELS2MM( lsl->width() ) );
121
if ( sl->layerType() == "SimpleLine" )
123
// add specific settings
124
QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl );
125
sOld->setLineStyle( slsl->penStyle() );
130
case QgsSymbolV2::Fill:
132
QgsSymbol* sOld = new QgsSymbol( QGis::Polygon );
133
sOld->setFillColor( sl->color() );
134
if ( sl->layerType() == "SimpleFill" )
136
// add specifc settings
137
QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl );
138
sOld->setColor( sfsl->borderColor() );
139
sOld->setLineWidth( PIXELS2MM( sfsl->borderWidth() ) );
140
sOld->setLineStyle( sfsl->borderStyle() );
141
sOld->setFillStyle( sfsl->brushStyle() );
147
return NULL; // should never get here
150
void QgsSymbologyV2Conversion::rendererV1toV2( QgsVectorLayer* layer )
152
if ( layer->isUsingRendererV2() )
155
const QgsRenderer* r = layer->renderer();
159
QgsFeatureRendererV2* r2final = NULL;
161
QString rtype = r->name();
162
if ( rtype == "Single Symbol" )
164
const QgsSingleSymbolRenderer* ssr = dynamic_cast<const QgsSingleSymbolRenderer*>( r );
167
QgsSymbolV2* symbol = symbolV1toV2( ssr->symbol() );
168
QgsSingleSymbolRendererV2* r2 = new QgsSingleSymbolRendererV2( symbol );
171
else if ( rtype == "Graduated Symbol" )
173
const QgsGraduatedSymbolRenderer* gsr = dynamic_cast<const QgsGraduatedSymbolRenderer*>( r );
178
if ( layer->pendingFields().contains( gsr->classificationField() ) )
180
attrName = layer->pendingFields()[ gsr->classificationField()].name();
184
foreach( const QgsSymbol* sym, gsr->symbols() )
186
double lowerValue = sym->lowerValue().toDouble();
187
double upperValue = sym->upperValue().toDouble();
188
QString label = sym->label();
189
if ( label.isEmpty() )
190
label = QString( "%1 - %2" ).arg( lowerValue, -1, 'f', 3 ).arg( upperValue, -1, 'f', 3 );
191
QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
192
ranges.append( QgsRendererRangeV2( lowerValue, upperValue, symbolv2, label ) );
195
QgsGraduatedSymbolRendererV2* r2 = new QgsGraduatedSymbolRendererV2( attrName, ranges );
198
QgsGraduatedSymbolRendererV2::Mode m = QgsGraduatedSymbolRendererV2::Custom;
199
switch ( gsr->mode() )
201
case QgsGraduatedSymbolRenderer::EqualInterval: m = QgsGraduatedSymbolRendererV2::EqualInterval; break;
202
case QgsGraduatedSymbolRenderer::Quantile: m = QgsGraduatedSymbolRendererV2::Quantile; break;
203
case QgsGraduatedSymbolRenderer::Empty: m = QgsGraduatedSymbolRendererV2::Custom; break;
206
// source symbol, color ramp not set (unknown)
209
else if ( rtype == "Continuous Color" )
213
else if ( rtype == "Unique Value" )
215
const QgsUniqueValueRenderer* uvr = dynamic_cast<const QgsUniqueValueRenderer*>( r );
220
if ( layer->pendingFields().contains( uvr->classificationField() ) )
222
attrName = layer->pendingFields()[ uvr->classificationField()].name();
225
QgsCategoryList cats;
226
foreach( QgsSymbol* sym, uvr->symbols() )
228
QVariant value = QVariant( sym->lowerValue() );
229
QString label = sym->label();
230
if ( label.isEmpty() )
231
label = value.toString();
232
QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
233
cats.append( QgsRendererCategoryV2( value, symbolv2, label ) );
236
QgsCategorizedSymbolRendererV2* r2 = new QgsCategorizedSymbolRendererV2( attrName, cats );
237
// source symbol and color ramp are not set (unknown)
241
if ( r2final == NULL )
243
r2final = QgsFeatureRendererV2::defaultRenderer( layer->geometryType() );
246
// change of renderers
247
layer->setUsingRendererV2( true );
248
layer->setRendererV2( r2final );
249
layer->setRenderer( NULL );
252
void QgsSymbologyV2Conversion::rendererV2toV1( QgsVectorLayer* layer )
254
if ( !layer->isUsingRendererV2() )
257
QgsFeatureRendererV2* r2 = layer->rendererV2();
261
QgsRenderer* rfinal = NULL;
263
QString r2type = r2->type();
264
if ( r2type == "singleSymbol" )
266
QgsSingleSymbolRendererV2* ssr2 = static_cast<QgsSingleSymbolRendererV2*>( r2 );
268
QgsSingleSymbolRenderer* r = new QgsSingleSymbolRenderer( layer->geometryType() );
269
r->addSymbol( symbolV2toV1( ssr2->symbol() ) );
272
else if ( r2type == "graduatedSymbol" )
274
QgsGraduatedSymbolRendererV2* gsr2 = static_cast<QgsGraduatedSymbolRendererV2*>( r2 );
276
QgsGraduatedSymbolRenderer::Mode m;
277
switch ( gsr2->mode() )
279
case QgsGraduatedSymbolRendererV2::EqualInterval: m = QgsGraduatedSymbolRenderer::EqualInterval; break;
280
case QgsGraduatedSymbolRendererV2::Quantile: m = QgsGraduatedSymbolRenderer::Quantile; break;
281
default: m = QgsGraduatedSymbolRenderer::Empty; break;
284
QgsGraduatedSymbolRenderer* r = new QgsGraduatedSymbolRenderer( layer->geometryType(), m );
286
r->setClassificationField( layer->fieldNameIndex( gsr2->classAttribute() ) );
288
foreach( QgsRendererRangeV2 range, gsr2->ranges() )
290
QgsSymbol* s = symbolV2toV1( range.symbol() );
291
s->setLowerValue( QString::number( range.lowerValue(), 'f', 5 ) );
292
s->setUpperValue( QString::number( range.upperValue(), 'f', 5 ) );
293
s->setLabel( range.label() );
299
else if ( r2type == "categorizedSymbol" )
301
QgsCategorizedSymbolRendererV2* csr2 = static_cast<QgsCategorizedSymbolRendererV2*>( r2 );
303
QgsUniqueValueRenderer* r = new QgsUniqueValueRenderer( layer->geometryType() );
305
r->setClassificationField( layer->fieldNameIndex( csr2->classAttribute() ) );
307
foreach( QgsRendererCategoryV2 cat, csr2->categories() )
309
QgsSymbol* s = symbolV2toV1( cat.symbol() );
310
QString val = cat.value().toString();
311
s->setLowerValue( val );
312
s->setUpperValue( val );
313
r->insertValue( val, s );
320
if ( rfinal == NULL )
322
rfinal = new QgsSingleSymbolRenderer( layer->geometryType() );
325
layer->setUsingRendererV2( false );
326
layer->setRendererV2( NULL );
327
layer->setRenderer( rfinal );