Quantum GIS API Documentation  1.8
src/core/symbology-ng/qgssymbologyv2conversion.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines