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