Quantum GIS API Documentation  1.7.5-Wroclaw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
qgssymbologyv2conversion.cpp
Go to the documentation of this file.
2 
6 #include "qgssymbol.h"
7 #include "qgsvectorlayer.h"
8 
9 #include "qgslogger.h"
10 
11 #include "qgsmarkersymbollayerv2.h"
12 #include "qgslinesymbollayerv2.h"
13 #include "qgsfillsymbollayerv2.h"
17 
18 
20 {
21  switch ( s->type() )
22  {
23  case QGis::Point:
24  {
25  QgsMarkerSymbolLayerV2* sl = NULL;
26  double size = s->pointSize();
27  double angle = 0; // rotation only from classification field
28  QString symbolName = s->pointSymbolName();
29  if ( symbolName.startsWith( "hard:" ) )
30  {
31  // simple symbol marker
32  QColor color = s->fillColor();
33  QColor borderColor = s->color();
34  QString name = symbolName.mid( 5 );
35  sl = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle );
36  }
37  else
38  {
39  // svg symbol marker
40  QString name = symbolName.mid( 4 );
41  sl = new QgsSvgMarkerSymbolLayerV2( name, size, angle );
42  }
43  QgsSymbolLayerV2List layers;
44  layers.append( sl );
45  return new QgsMarkerSymbolV2( layers );
46  }
47 
48  case QGis::Line:
49  {
50  QColor color = s->color();
51  double width = s->lineWidth();
52  Qt::PenStyle penStyle = s->pen().style();
53  QgsLineSymbolLayerV2* sl = new QgsSimpleLineSymbolLayerV2( color, width, penStyle );
54 
55  QgsSymbolLayerV2List layers;
56  layers.append( sl );
57  return new QgsLineSymbolV2( layers );
58  }
59 
60  case QGis::Polygon:
61  {
62  QColor color = s->fillColor();
63  QColor borderColor = s->color();
64  Qt::BrushStyle brushStyle = s->brush().style();
65  Qt::PenStyle borderStyle = s->pen().style();
66  double borderWidth = s->lineWidth();
67  QgsFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( color, brushStyle, borderColor, borderStyle, borderWidth );
68 
69  QgsSymbolLayerV2List layers;
70  layers.append( sl );
71  return new QgsFillSymbolV2( layers );
72  }
73 
74  default:
75  return NULL;
76  }
77 }
78 
80 {
81  if ( s == NULL || s->symbolLayerCount() == 0 )
82  return NULL;
83 
84  // we will use only the first symbol layer
85  QgsSymbolLayerV2* sl = s->symbolLayer( 0 );
86 
87  switch ( sl->type() )
88  {
90  {
91  QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl );
92  QgsSymbol* sOld = new QgsSymbol( QGis::Point );
93  sOld->setFillColor( sl->color() );
94  sOld->setFillStyle( Qt::SolidPattern );
95  sOld->setPointSize( msl->size() );
96  if ( sl->layerType() == "SimpleMarker" )
97  {
99  sOld->setColor( smsl->borderColor() );
100  sOld->setNamedPointSymbol( "hard:" + smsl->name() );
101  }
102  else if ( sl->layerType() == "SvgMarker" )
103  {
104  QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl );
105  sOld->setNamedPointSymbol( "svg:" + smsl->path() );
106  }
107  return sOld;
108  }
109  break;
110 
111  case QgsSymbolV2::Line:
112  {
113  QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl );
114  QgsSymbol* sOld = new QgsSymbol( QGis::Line );
115  sOld->setColor( sl->color() );
116  sOld->setLineWidth( lsl->width() );
117  if ( sl->layerType() == "SimpleLine" )
118  {
119  // add specific settings
120  QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl );
121  sOld->setLineStyle( slsl->penStyle() );
122  }
123  return sOld;
124  }
125 
126  case QgsSymbolV2::Fill:
127  {
128  QgsSymbol* sOld = new QgsSymbol( QGis::Polygon );
129  sOld->setFillColor( sl->color() );
130  if ( sl->layerType() == "SimpleFill" )
131  {
132  // add specifc settings
133  QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl );
134  sOld->setColor( sfsl->borderColor() );
135  sOld->setLineWidth( sfsl->borderWidth() );
136  sOld->setLineStyle( sfsl->borderStyle() );
137  sOld->setFillStyle( sfsl->brushStyle() );
138  }
139  return sOld;
140  }
141  }
142 
143  return NULL; // should never get here
144 }
145 
147 {
148  if ( layer->isUsingRendererV2() )
149  return;
150 
151  const QgsRenderer* r = layer->renderer();
152  if ( r == NULL )
153  return;
154 
155  QgsFeatureRendererV2* r2final = NULL;
156 
157  QString rtype = r->name();
158  if ( rtype == "Single Symbol" )
159  {
160  const QgsSingleSymbolRenderer* ssr = dynamic_cast<const QgsSingleSymbolRenderer*>( r );
161  if ( ssr == NULL )
162  return;
163  QgsSymbolV2* symbol = symbolV1toV2( ssr->symbol() );
165  r2final = r2;
166  }
167  else if ( rtype == "Graduated Symbol" )
168  {
169  const QgsGraduatedSymbolRenderer* gsr = dynamic_cast<const QgsGraduatedSymbolRenderer*>( r );
170  if ( gsr == NULL )
171  return;
172 
173  QString attrName;
174  if ( layer->pendingFields().contains( gsr->classificationField() ) )
175  {
176  attrName = layer->pendingFields()[ gsr->classificationField()].name();
177  }
178 
179  QgsRangeList ranges;
180  foreach( const QgsSymbol* sym, gsr->symbols() )
181  {
182  double lowerValue = sym->lowerValue().toDouble();
183  double upperValue = sym->upperValue().toDouble();
184  QString label = sym->label();
185  if ( label.isEmpty() )
186  label = QString( "%1 - %2" ).arg( lowerValue, -1, 'f', 3 ).arg( upperValue, -1, 'f', 3 );
187  QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
188  ranges.append( QgsRendererRangeV2( lowerValue, upperValue, symbolv2, label ) );
189  }
190 
191  QgsGraduatedSymbolRendererV2* r2 = new QgsGraduatedSymbolRendererV2( attrName, ranges );
192 
193  // find out mode
195  switch ( gsr->mode() )
196  {
200  }
201  r2->setMode( m );
202  // source symbol, color ramp not set (unknown)
203  r2final = r2;
204  }
205  else if ( rtype == "Continuous Color" )
206  {
207  // TODO
208  }
209  else if ( rtype == "Unique Value" )
210  {
211  const QgsUniqueValueRenderer* uvr = dynamic_cast<const QgsUniqueValueRenderer*>( r );
212  if ( uvr == NULL )
213  return;
214 
215  QString attrName;
216  if ( layer->pendingFields().contains( uvr->classificationField() ) )
217  {
218  attrName = layer->pendingFields()[ uvr->classificationField()].name();
219  }
220 
221  QgsCategoryList cats;
222  foreach( QgsSymbol* sym, uvr->symbols() )
223  {
224  QVariant value = QVariant( sym->lowerValue() );
225  QString label = sym->label();
226  if ( label.isEmpty() )
227  label = value.toString();
228  QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
229  cats.append( QgsRendererCategoryV2( value, symbolv2, label ) );
230  }
231 
233  // source symbol and color ramp are not set (unknown)
234  r2final = r2;
235  }
236 
237  if ( r2final == NULL )
238  {
240  }
241 
242  // change of renderers
243  layer->setUsingRendererV2( true );
244  layer->setRendererV2( r2final );
245  layer->setRenderer( NULL );
246 }
247 
249 {
250  if ( !layer->isUsingRendererV2() )
251  return;
252 
253  QgsFeatureRendererV2* r2 = layer->rendererV2();
254  if ( r2 == NULL )
255  return;
256 
257  QgsRenderer* rfinal = NULL;
258 
259  QString r2type = r2->type();
260  if ( r2type == "singleSymbol" )
261  {
262  QgsSingleSymbolRendererV2* ssr2 = static_cast<QgsSingleSymbolRendererV2*>( r2 );
263 
265  r->addSymbol( symbolV2toV1( ssr2->symbol() ) );
266  rfinal = r;
267  }
268  else if ( r2type == "graduatedSymbol" )
269  {
271 
273  switch ( gsr2->mode() )
274  {
277  default: m = QgsGraduatedSymbolRenderer::Empty; break;
278  }
279 
281 
282  r->setClassificationField( layer->fieldNameIndex( gsr2->classAttribute() ) );
283 
284  foreach( QgsRendererRangeV2 range, gsr2->ranges() )
285  {
286  QgsSymbol* s = symbolV2toV1( range.symbol() );
287  s->setLowerValue( QString::number( range.lowerValue(), 'f', 5 ) );
288  s->setUpperValue( QString::number( range.upperValue(), 'f', 5 ) );
289  s->setLabel( range.label() );
290  r->addSymbol( s );
291  }
292 
293  rfinal = r;
294  }
295  else if ( r2type == "categorizedSymbol" )
296  {
298 
300 
301  r->setClassificationField( layer->fieldNameIndex( csr2->classAttribute() ) );
302 
303  foreach( QgsRendererCategoryV2 cat, csr2->categories() )
304  {
305  QgsSymbol* s = symbolV2toV1( cat.symbol() );
306  QString val = cat.value().toString();
307  s->setLowerValue( val );
308  s->setUpperValue( val );
309  r->insertValue( val, s );
310  }
311 
312  rfinal = r;
313  }
314 
315 
316  if ( rfinal == NULL )
317  {
318  rfinal = new QgsSingleSymbolRenderer( layer->geometryType() );
319  }
320 
321  layer->setUsingRendererV2( false );
322  layer->setRendererV2( NULL );
323  layer->setRenderer( rfinal );
324 }