Quantum GIS API Documentation
1.8
|
00001 /*************************************************************************** 00002 qgssymbologyv2conversion.cpp 00003 --------------------- 00004 begin : December 2009 00005 copyright : (C) 2009 by Martin Dobias 00006 email : wonder.sk at gmail.com 00007 *************************************************************************** 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 ***************************************************************************/ 00015 #include "qgssymbologyv2conversion.h" 00016 00017 #include "qgssinglesymbolrenderer.h" 00018 #include "qgsgraduatedsymbolrenderer.h" 00019 #include "qgsuniquevaluerenderer.h" 00020 #include "qgssymbol.h" 00021 #include "qgsvectorlayer.h" 00022 00023 #include "qgslogger.h" 00024 00025 #include "qgsmarkersymbollayerv2.h" 00026 #include "qgslinesymbollayerv2.h" 00027 #include "qgsfillsymbollayerv2.h" 00028 #include "qgssinglesymbolrendererv2.h" 00029 #include "qgsgraduatedsymbolrendererv2.h" 00030 #include "qgscategorizedsymbolrendererv2.h" 00031 00032 00033 QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s ) 00034 { 00035 switch ( s->type() ) 00036 { 00037 case QGis::Point: 00038 { 00039 QgsMarkerSymbolLayerV2* sl = NULL; 00040 double size = s->pointSize(); 00041 double angle = 0; // rotation only from classification field 00042 QString symbolName = s->pointSymbolName(); 00043 if ( symbolName.startsWith( "hard:" ) ) 00044 { 00045 // simple symbol marker 00046 QColor color = s->fillColor(); 00047 QColor borderColor = s->color(); 00048 QString name = symbolName.mid( 5 ); 00049 sl = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle ); 00050 } 00051 else 00052 { 00053 // svg symbol marker 00054 QString name = symbolName.mid( 4 ); 00055 sl = new QgsSvgMarkerSymbolLayerV2( name, size, angle ); 00056 } 00057 QgsSymbolLayerV2List layers; 00058 layers.append( sl ); 00059 return new QgsMarkerSymbolV2( layers ); 00060 } 00061 00062 case QGis::Line: 00063 { 00064 QColor color = s->color(); 00065 double width = s->lineWidth(); 00066 Qt::PenStyle penStyle = s->pen().style(); 00067 QgsLineSymbolLayerV2* sl = new QgsSimpleLineSymbolLayerV2( color, width, penStyle ); 00068 00069 QgsSymbolLayerV2List layers; 00070 layers.append( sl ); 00071 return new QgsLineSymbolV2( layers ); 00072 } 00073 00074 case QGis::Polygon: 00075 { 00076 QColor color = s->fillColor(); 00077 QColor borderColor = s->color(); 00078 Qt::BrushStyle brushStyle = s->brush().style(); 00079 Qt::PenStyle borderStyle = s->pen().style(); 00080 double borderWidth = s->lineWidth(); 00081 QgsFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( color, brushStyle, borderColor, borderStyle, borderWidth ); 00082 00083 QgsSymbolLayerV2List layers; 00084 layers.append( sl ); 00085 return new QgsFillSymbolV2( layers ); 00086 } 00087 00088 default: 00089 return NULL; 00090 } 00091 } 00092 00093 QgsSymbol* QgsSymbologyV2Conversion::symbolV2toV1( QgsSymbolV2* s ) 00094 { 00095 if ( s == NULL || s->symbolLayerCount() == 0 ) 00096 return NULL; 00097 00098 // we will use only the first symbol layer 00099 QgsSymbolLayerV2* sl = s->symbolLayer( 0 ); 00100 00101 switch ( sl->type() ) 00102 { 00103 case QgsSymbolV2::Marker: 00104 { 00105 QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl ); 00106 QgsSymbol* sOld = new QgsSymbol( QGis::Point ); 00107 sOld->setFillColor( sl->color() ); 00108 sOld->setFillStyle( Qt::SolidPattern ); 00109 sOld->setPointSize( msl->size() ); 00110 if ( sl->layerType() == "SimpleMarker" ) 00111 { 00112 QgsSimpleMarkerSymbolLayerV2* smsl = static_cast<QgsSimpleMarkerSymbolLayerV2*>( sl ); 00113 sOld->setColor( smsl->borderColor() ); 00114 sOld->setNamedPointSymbol( "hard:" + smsl->name() ); 00115 } 00116 else if ( sl->layerType() == "SvgMarker" ) 00117 { 00118 QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl ); 00119 sOld->setNamedPointSymbol( "svg:" + smsl->path() ); 00120 } 00121 return sOld; 00122 } 00123 break; 00124 00125 case QgsSymbolV2::Line: 00126 { 00127 QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl ); 00128 QgsSymbol* sOld = new QgsSymbol( QGis::Line ); 00129 sOld->setColor( sl->color() ); 00130 sOld->setLineWidth( lsl->width() ); 00131 if ( sl->layerType() == "SimpleLine" ) 00132 { 00133 // add specific settings 00134 QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl ); 00135 sOld->setLineStyle( slsl->penStyle() ); 00136 } 00137 return sOld; 00138 } 00139 00140 case QgsSymbolV2::Fill: 00141 { 00142 QgsSymbol* sOld = new QgsSymbol( QGis::Polygon ); 00143 sOld->setFillColor( sl->color() ); 00144 if ( sl->layerType() == "SimpleFill" ) 00145 { 00146 // add specifc settings 00147 QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl ); 00148 sOld->setColor( sfsl->borderColor() ); 00149 sOld->setLineWidth( sfsl->borderWidth() ); 00150 sOld->setLineStyle( sfsl->borderStyle() ); 00151 sOld->setFillStyle( sfsl->brushStyle() ); 00152 } 00153 return sOld; 00154 } 00155 } 00156 00157 return NULL; // should never get here 00158 } 00159 00160 void QgsSymbologyV2Conversion::rendererV1toV2( QgsVectorLayer* layer ) 00161 { 00162 if ( layer->isUsingRendererV2() ) 00163 return; 00164 00165 const QgsRenderer* r = layer->renderer(); 00166 if ( r == NULL ) 00167 return; 00168 00169 QgsFeatureRendererV2* r2final = NULL; 00170 00171 QString rtype = r->name(); 00172 if ( rtype == "Single Symbol" ) 00173 { 00174 const QgsSingleSymbolRenderer* ssr = dynamic_cast<const QgsSingleSymbolRenderer*>( r ); 00175 if ( ssr == NULL ) 00176 return; 00177 QgsSymbolV2* symbol = symbolV1toV2( ssr->symbol() ); 00178 QgsSingleSymbolRendererV2* r2 = new QgsSingleSymbolRendererV2( symbol ); 00179 r2final = r2; 00180 } 00181 else if ( rtype == "Graduated Symbol" ) 00182 { 00183 const QgsGraduatedSymbolRenderer* gsr = dynamic_cast<const QgsGraduatedSymbolRenderer*>( r ); 00184 if ( gsr == NULL ) 00185 return; 00186 00187 QString attrName; 00188 if ( layer->pendingFields().contains( gsr->classificationField() ) ) 00189 { 00190 attrName = layer->pendingFields()[ gsr->classificationField()].name(); 00191 } 00192 00193 QgsRangeList ranges; 00194 foreach( const QgsSymbol* sym, gsr->symbols() ) 00195 { 00196 double lowerValue = sym->lowerValue().toDouble(); 00197 double upperValue = sym->upperValue().toDouble(); 00198 QString label = sym->label(); 00199 if ( label.isEmpty() ) 00200 label = QString( "%1 - %2" ).arg( lowerValue, -1, 'f', 3 ).arg( upperValue, -1, 'f', 3 ); 00201 QgsSymbolV2* symbolv2 = symbolV1toV2( sym ); 00202 ranges.append( QgsRendererRangeV2( lowerValue, upperValue, symbolv2, label ) ); 00203 } 00204 00205 QgsGraduatedSymbolRendererV2* r2 = new QgsGraduatedSymbolRendererV2( attrName, ranges ); 00206 00207 // find out mode 00208 QgsGraduatedSymbolRendererV2::Mode m = QgsGraduatedSymbolRendererV2::Custom; 00209 switch ( gsr->mode() ) 00210 { 00211 case QgsGraduatedSymbolRenderer::EqualInterval: m = QgsGraduatedSymbolRendererV2::EqualInterval; break; 00212 case QgsGraduatedSymbolRenderer::Quantile: m = QgsGraduatedSymbolRendererV2::Quantile; break; 00213 case QgsGraduatedSymbolRenderer::Empty: m = QgsGraduatedSymbolRendererV2::Custom; break; 00214 } 00215 r2->setMode( m ); 00216 // source symbol, color ramp not set (unknown) 00217 r2final = r2; 00218 } 00219 else if ( rtype == "Continuous Color" ) 00220 { 00221 // TODO 00222 } 00223 else if ( rtype == "Unique Value" ) 00224 { 00225 const QgsUniqueValueRenderer* uvr = dynamic_cast<const QgsUniqueValueRenderer*>( r ); 00226 if ( uvr == NULL ) 00227 return; 00228 00229 QString attrName; 00230 if ( layer->pendingFields().contains( uvr->classificationField() ) ) 00231 { 00232 attrName = layer->pendingFields()[ uvr->classificationField()].name(); 00233 } 00234 00235 QgsCategoryList cats; 00236 foreach( QgsSymbol* sym, uvr->symbols() ) 00237 { 00238 QVariant value = QVariant( sym->lowerValue() ); 00239 QString label = sym->label(); 00240 if ( label.isEmpty() ) 00241 label = value.toString(); 00242 QgsSymbolV2* symbolv2 = symbolV1toV2( sym ); 00243 cats.append( QgsRendererCategoryV2( value, symbolv2, label ) ); 00244 } 00245 00246 QgsCategorizedSymbolRendererV2* r2 = new QgsCategorizedSymbolRendererV2( attrName, cats ); 00247 // source symbol and color ramp are not set (unknown) 00248 r2final = r2; 00249 } 00250 00251 if ( r2final == NULL ) 00252 { 00253 r2final = QgsFeatureRendererV2::defaultRenderer( layer->geometryType() ); 00254 } 00255 00256 // change of renderers 00257 layer->setUsingRendererV2( true ); 00258 layer->setRendererV2( r2final ); 00259 layer->setRenderer( NULL ); 00260 } 00261 00262 void QgsSymbologyV2Conversion::rendererV2toV1( QgsVectorLayer* layer ) 00263 { 00264 if ( !layer->isUsingRendererV2() ) 00265 return; 00266 00267 QgsFeatureRendererV2* r2 = layer->rendererV2(); 00268 if ( r2 == NULL ) 00269 return; 00270 00271 QgsRenderer* rfinal = NULL; 00272 00273 QString r2type = r2->type(); 00274 if ( r2type == "singleSymbol" ) 00275 { 00276 QgsSingleSymbolRendererV2* ssr2 = static_cast<QgsSingleSymbolRendererV2*>( r2 ); 00277 00278 QgsSingleSymbolRenderer* r = new QgsSingleSymbolRenderer( layer->geometryType() ); 00279 r->addSymbol( symbolV2toV1( ssr2->symbol() ) ); 00280 rfinal = r; 00281 } 00282 else if ( r2type == "graduatedSymbol" ) 00283 { 00284 QgsGraduatedSymbolRendererV2* gsr2 = static_cast<QgsGraduatedSymbolRendererV2*>( r2 ); 00285 00286 QgsGraduatedSymbolRenderer::Mode m; 00287 switch ( gsr2->mode() ) 00288 { 00289 case QgsGraduatedSymbolRendererV2::EqualInterval: m = QgsGraduatedSymbolRenderer::EqualInterval; break; 00290 case QgsGraduatedSymbolRendererV2::Quantile: m = QgsGraduatedSymbolRenderer::Quantile; break; 00291 default: m = QgsGraduatedSymbolRenderer::Empty; break; 00292 } 00293 00294 QgsGraduatedSymbolRenderer* r = new QgsGraduatedSymbolRenderer( layer->geometryType(), m ); 00295 00296 r->setClassificationField( layer->fieldNameIndex( gsr2->classAttribute() ) ); 00297 00298 foreach( QgsRendererRangeV2 range, gsr2->ranges() ) 00299 { 00300 QgsSymbol* s = symbolV2toV1( range.symbol() ); 00301 s->setLowerValue( QString::number( range.lowerValue(), 'f', 5 ) ); 00302 s->setUpperValue( QString::number( range.upperValue(), 'f', 5 ) ); 00303 s->setLabel( range.label() ); 00304 r->addSymbol( s ); 00305 } 00306 00307 rfinal = r; 00308 } 00309 else if ( r2type == "categorizedSymbol" ) 00310 { 00311 QgsCategorizedSymbolRendererV2* csr2 = static_cast<QgsCategorizedSymbolRendererV2*>( r2 ); 00312 00313 QgsUniqueValueRenderer* r = new QgsUniqueValueRenderer( layer->geometryType() ); 00314 00315 r->setClassificationField( layer->fieldNameIndex( csr2->classAttribute() ) ); 00316 00317 foreach( QgsRendererCategoryV2 cat, csr2->categories() ) 00318 { 00319 QgsSymbol* s = symbolV2toV1( cat.symbol() ); 00320 QString val = cat.value().toString(); 00321 s->setLowerValue( val ); 00322 s->setUpperValue( val ); 00323 r->insertValue( val, s ); 00324 } 00325 00326 rfinal = r; 00327 } 00328 00329 00330 if ( rfinal == NULL ) 00331 { 00332 rfinal = new QgsSingleSymbolRenderer( layer->geometryType() ); 00333 } 00334 00335 layer->setUsingRendererV2( false ); 00336 layer->setRendererV2( NULL ); 00337 layer->setRenderer( rfinal ); 00338 }