mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-16 00:03:12 -04:00
[API] Removed old renderer support from QgsVectorLayer
This commit is contained in:
parent
37da713c7e
commit
c2f00caedf
@ -171,7 +171,6 @@
|
||||
|
||||
%Include symbology-ng/qgsstylev2.sip
|
||||
%Include symbology-ng/qgssvgcache.sip
|
||||
%Include symbology-ng/qgssymbologyv2conversion.sip
|
||||
%Include symbology-ng/qgssymbolv2.sip
|
||||
%Include symbology-ng/qgscolorbrewerpalette.sip
|
||||
%Include symbology-ng/qgscptcityarchive.sip
|
||||
|
@ -242,12 +242,6 @@ class QgsVectorLayer : QgsMapLayer
|
||||
/** Returns the bounding box of the selected features. If there is no selection, QgsRectangle(0,0,0,0) is returned */
|
||||
QgsRectangle boundingBoxOfSelected();
|
||||
|
||||
/** Returns a pointer to the renderer */
|
||||
const QgsRenderer* renderer() const;
|
||||
|
||||
/** Sets the renderer. If a renderer is already present, it is deleted */
|
||||
void setRenderer( QgsRenderer * r /Transfer/ );
|
||||
|
||||
/** Sets diagram rendering object (takes ownership) */
|
||||
void setDiagramRenderer( QgsDiagramRendererV2* r /Transfer/ );
|
||||
const QgsDiagramRendererV2* diagramRenderer() const;
|
||||
@ -262,14 +256,6 @@ class QgsVectorLayer : QgsMapLayer
|
||||
* @note added in 1.4
|
||||
*/
|
||||
void setRendererV2( QgsFeatureRendererV2* r /Transfer/ );
|
||||
/** Return whether using renderer V2.
|
||||
* @note added in 1.4
|
||||
*/
|
||||
bool isUsingRendererV2();
|
||||
/** set whether to use renderer V2 for drawing.
|
||||
* @note added in 1.4
|
||||
*/
|
||||
void setUsingRendererV2( bool usingRendererV2 );
|
||||
|
||||
/** Draw layer with renderer V2.
|
||||
* @note added in 1.4
|
||||
|
@ -1,24 +0,0 @@
|
||||
class QgsSymbologyV2Conversion
|
||||
{
|
||||
%TypeHeaderCode
|
||||
#include <qgssymbologyv2conversion.h>
|
||||
%End
|
||||
|
||||
public:
|
||||
//! return a symbol in new symbology as close as possible to old symbol
|
||||
//! @note not all properties will be preserved
|
||||
static QgsSymbolV2* symbolV1toV2( const QgsSymbol* s ) /Factory/;
|
||||
|
||||
//! return a symbol in old symbology as close as possible to new symbol
|
||||
//! @note not all properties will be preserved
|
||||
static QgsSymbol* symbolV2toV1( QgsSymbolV2* s ) /Factory/;
|
||||
|
||||
//! convert layer from old symbology to new symbology
|
||||
//! @note not all properties will be preserved
|
||||
static void rendererV1toV2( QgsVectorLayer* layer );
|
||||
|
||||
//! convert layer from new symbology to old symbology
|
||||
//! @note not all properties will be preserved
|
||||
static void rendererV2toV1( QgsVectorLayer* layer );
|
||||
|
||||
};
|
@ -137,10 +137,7 @@ void QgsLegendLayer::refreshSymbology( const QString& key, double widthScale )
|
||||
if ( theMapLayer->type() == QgsMapLayer::VectorLayer ) // VECTOR
|
||||
{
|
||||
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( theMapLayer );
|
||||
if ( vlayer->isUsingRendererV2() )
|
||||
vectorLayerSymbologyV2( vlayer );
|
||||
else
|
||||
vectorLayerSymbology( vlayer, widthScale ); // get and change symbology
|
||||
vectorLayerSymbologyV2( vlayer );
|
||||
}
|
||||
else if ( theMapLayer->type() == QgsMapLayer::RasterLayer ) // RASTER
|
||||
{
|
||||
@ -187,106 +184,6 @@ void QgsLegendLayer::changeSymbologySettings( const QgsMapLayer* theMapLayer,
|
||||
|
||||
|
||||
|
||||
void QgsLegendLayer::vectorLayerSymbology( QgsVectorLayer* layer, double widthScale )
|
||||
{
|
||||
if ( !layer )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SymbologyList itemList;
|
||||
if ( layer->hasGeometryType() )
|
||||
{
|
||||
//add the new items
|
||||
QString lw, uv, label;
|
||||
const QgsRenderer* renderer = layer->renderer();
|
||||
const QList<QgsSymbol*> sym = renderer->symbols();
|
||||
|
||||
//create an item for each classification field (only one for most renderers)
|
||||
QSettings settings;
|
||||
if ( settings.value( "/qgis/showLegendClassifiers", false ).toBool() )
|
||||
{
|
||||
if ( renderer->needsAttributes() )
|
||||
{
|
||||
QgsAttributeList classfieldlist = renderer->classificationAttributes();
|
||||
const QgsFields& fields = layer->pendingFields();
|
||||
for ( QgsAttributeList::iterator it = classfieldlist.begin(); it != classfieldlist.end(); ++it )
|
||||
{
|
||||
int idx = *it;
|
||||
if ( idx < 0 || idx >= fields.count() )
|
||||
continue;
|
||||
QString classfieldname = layer->attributeAlias( idx );
|
||||
if ( classfieldname.isEmpty() )
|
||||
{
|
||||
classfieldname = fields[idx].name();
|
||||
}
|
||||
itemList.append( qMakePair( classfieldname, QPixmap() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QMap< QgsSymbol*, int > featureCountMap;
|
||||
if ( mShowFeatureCount )
|
||||
{
|
||||
updateItemListCount( layer, sym, featureCountMap );
|
||||
}
|
||||
|
||||
for ( QList<QgsSymbol*>::const_iterator it = sym.begin(); it != sym.end(); ++it )
|
||||
{
|
||||
QImage img;
|
||||
if (( *it )->type() == QGis::Point )
|
||||
{
|
||||
img = ( *it )->getPointSymbolAsImage( widthScale );
|
||||
}
|
||||
else if (( *it )->type() == QGis::Line )
|
||||
{
|
||||
img = ( *it )->getLineSymbolAsImage();
|
||||
}
|
||||
else if (( *it )->type() == QGis::Polygon )
|
||||
{
|
||||
img = ( *it )->getPolygonSymbolAsImage();
|
||||
}
|
||||
else
|
||||
{
|
||||
// must be a layer without geometry then
|
||||
}
|
||||
|
||||
QString values;
|
||||
lw = ( *it )->lowerValue();
|
||||
if ( !lw.isEmpty() )
|
||||
{
|
||||
values += lw;
|
||||
}
|
||||
uv = ( *it )->upperValue();
|
||||
if ( !uv.isEmpty() && lw != uv )
|
||||
{
|
||||
values += " - ";
|
||||
values += uv;
|
||||
}
|
||||
label = ( *it )->label();
|
||||
if ( !label.isEmpty() )
|
||||
{
|
||||
values += " ";
|
||||
values += label;
|
||||
}
|
||||
|
||||
if ( mShowFeatureCount )
|
||||
{
|
||||
int fCount = featureCountMap[*it];
|
||||
if ( fCount >= 0 )
|
||||
{
|
||||
values += ( " [" + QString::number( fCount ) + "]" );
|
||||
}
|
||||
}
|
||||
|
||||
QPixmap pix = QPixmap::fromImage( img ); // convert to pixmap
|
||||
itemList.append( qMakePair( values, pix ) );
|
||||
}
|
||||
}
|
||||
changeSymbologySettings( layer, itemList );
|
||||
}
|
||||
|
||||
|
||||
void QgsLegendLayer::vectorLayerSymbologyV2( QgsVectorLayer* layer )
|
||||
{
|
||||
QSize iconSize( 16, 16 );
|
||||
@ -666,60 +563,6 @@ void QgsLegendLayer::updateItemListCountV2( SymbologyList& itemList, QgsVectorLa
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLegendLayer::updateItemListCount( QgsVectorLayer* layer, const QList<QgsSymbol*>& sym, QMap< QgsSymbol*, int >& featureCountMap )
|
||||
{
|
||||
featureCountMap.clear();
|
||||
QList<QgsSymbol*>::const_iterator symbolIt = sym.constBegin();
|
||||
for ( ; symbolIt != sym.constEnd(); ++symbolIt )
|
||||
{
|
||||
featureCountMap.insert( *symbolIt, 0 );
|
||||
}
|
||||
|
||||
QgsRenderer* renderer = const_cast<QgsRenderer*>( layer->renderer() );
|
||||
if ( !renderer )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//go through all features and count the number of occurrences
|
||||
int nFeatures = layer->pendingFeatureCount();
|
||||
QProgressDialog p( tr( "Updating feature count for layer %1" ).arg( layer->name() ), tr( "Abort" ), 0, nFeatures );
|
||||
p.setWindowModality( Qt::WindowModal );
|
||||
int featuresCounted = 0;
|
||||
|
||||
QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) );
|
||||
QgsFeature f;
|
||||
QgsSymbol* currentSymbol = 0;
|
||||
|
||||
while ( fit.nextFeature( f ) )
|
||||
{
|
||||
currentSymbol = renderer->symbolForFeature( &f );
|
||||
if ( currentSymbol )
|
||||
{
|
||||
featureCountMap[currentSymbol] += 1;
|
||||
}
|
||||
++featuresCounted;
|
||||
|
||||
if ( featuresCounted % 50 == 0 )
|
||||
{
|
||||
if ( featuresCounted > nFeatures ) //sometimes the feature count is not correct
|
||||
{
|
||||
p.setMaximum( 0 );
|
||||
}
|
||||
p.setValue( featuresCounted );
|
||||
if ( p.wasCanceled() ) //set all entries to -1 (= invalid)
|
||||
{
|
||||
QMap< QgsSymbol*, int >::iterator cIt = featureCountMap.begin();
|
||||
for ( ; cIt != featureCountMap.end(); ++cIt )
|
||||
{
|
||||
cIt.value() = -1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
p.setValue( nFeatures );
|
||||
}
|
||||
|
||||
void QgsLegendLayer::setShowFeatureCount( bool show, bool update )
|
||||
{
|
||||
|
@ -110,8 +110,6 @@ class QgsLegendLayer : public QgsLegendItem
|
||||
protected:
|
||||
|
||||
/** Prepare and change symbology for vector layer */
|
||||
void vectorLayerSymbology( QgsVectorLayer* mapLayer, double widthScale = 1.0 );
|
||||
|
||||
void vectorLayerSymbologyV2( QgsVectorLayer* vlayer );
|
||||
|
||||
/** Prepare and change symbology for raster layer */
|
||||
@ -122,8 +120,6 @@ class QgsLegendLayer : public QgsLegendItem
|
||||
|
||||
/**Adds feature counts to the symbology items (for symbology v2)*/
|
||||
void updateItemListCountV2( SymbologyList& itemList, QgsVectorLayer* layer );
|
||||
/**Calculates feature count for the individual symbols (old symbology)*/
|
||||
void updateItemListCount( QgsVectorLayer* layer, const QList<QgsSymbol*>& sym, QMap< QgsSymbol*, int >& featureCountMap );
|
||||
|
||||
QPixmap getOriginalPixmap();
|
||||
|
||||
|
@ -238,26 +238,6 @@ int QgsMapToolRotatePointSymbols::layerRotationAttributes( QgsVectorLayer* vl, Q
|
||||
return 1;
|
||||
}
|
||||
|
||||
//old symbology
|
||||
const QgsRenderer* layerRenderer = vl->renderer();
|
||||
if ( layerRenderer )
|
||||
{
|
||||
//get renderer symbols
|
||||
const QList<QgsSymbol*> rendererSymbols = layerRenderer->symbols();
|
||||
int currentRotationAttribute;
|
||||
|
||||
QList<QgsSymbol*>::const_iterator symbolIt = rendererSymbols.constBegin();
|
||||
for ( ; symbolIt != rendererSymbols.constEnd(); ++symbolIt )
|
||||
{
|
||||
currentRotationAttribute = ( *symbolIt )->rotationClassificationField();
|
||||
if ( currentRotationAttribute >= 0 )
|
||||
{
|
||||
attList.push_back( currentRotationAttribute );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//new symbology
|
||||
const QgsFeatureRendererV2* symbologyNgRenderer = vl->rendererV2();
|
||||
if ( symbologyNgRenderer )
|
||||
@ -306,27 +286,10 @@ void QgsMapToolRotatePointSymbols::createPixmapItem( QgsFeature& f )
|
||||
|
||||
//get the image that is used for that symbol, but without point rotation
|
||||
QImage pointImage;
|
||||
QgsRenderer* r = 0;
|
||||
QgsFeatureRendererV2* rv2 = 0;
|
||||
|
||||
if ( mActiveLayer && mActiveLayer->renderer() ) //old symbology
|
||||
if ( mActiveLayer && mActiveLayer->rendererV2() ) //symbology-ng
|
||||
{
|
||||
//copy renderer
|
||||
QgsRenderer* r = mActiveLayer->renderer()->clone();
|
||||
|
||||
//set all symbol fields of the cloned renderer to -1. Very ugly but necessary
|
||||
QList<QgsSymbol*> symbolList( r->symbols() );
|
||||
QList<QgsSymbol*>::iterator it = symbolList.begin();
|
||||
for ( ; it != symbolList.end(); ++it )
|
||||
{
|
||||
( *it )->setRotationClassificationField( -1 );
|
||||
}
|
||||
|
||||
r->renderFeature( *renderContext, f, &pointImage, false );
|
||||
}
|
||||
else if ( mActiveLayer && mActiveLayer->rendererV2() ) //symbology-ng
|
||||
{
|
||||
rv2 = mActiveLayer->rendererV2()->clone();
|
||||
QgsFeatureRendererV2* rv2 = mActiveLayer->rendererV2()->clone();
|
||||
rv2->setRotationField( "" );
|
||||
rv2->startRender( *renderContext, mActiveLayer );
|
||||
|
||||
@ -336,12 +299,11 @@ void QgsMapToolRotatePointSymbols::createPixmapItem( QgsFeature& f )
|
||||
pointImage = symbolV2->bigSymbolPreviewImage();
|
||||
}
|
||||
rv2->stopRender( *renderContext );
|
||||
delete rv2;
|
||||
}
|
||||
|
||||
mRotationItem = new QgsPointRotationItem( mCanvas );
|
||||
mRotationItem->setSymbol( pointImage );
|
||||
delete r;
|
||||
delete rv2;
|
||||
}
|
||||
|
||||
void QgsMapToolRotatePointSymbols::setPixmapItemRotation( double rotation )
|
||||
|
@ -500,15 +500,6 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
|
||||
chkAntiAliasing->setChecked( settings.value( "/qgis/enable_anti_aliasing", true ).toBool() );
|
||||
chkUseRenderCaching->setChecked( settings.value( "/qgis/enable_render_caching", false ).toBool() );
|
||||
|
||||
//Changed to default to true as of QGIS 1.7
|
||||
//TODO: remove hack when http://hub.qgis.org/issues/5170 is fixed
|
||||
#ifdef ANDROID
|
||||
bool use_symbology_ng_default = false;
|
||||
#else
|
||||
bool use_symbology_ng_default = true;
|
||||
#endif
|
||||
chkUseSymbologyNG->setChecked( settings.value( "/qgis/use_symbology_ng", use_symbology_ng_default ).toBool() );
|
||||
|
||||
// Slightly awkard here at the settings value is true to use QImage,
|
||||
// but the checkbox is true to use QPixmap
|
||||
chkUseQPixmap->setChecked( !( settings.value( "/qgis/use_qimage_to_render", true ).toBool() ) );
|
||||
@ -1031,7 +1022,6 @@ void QgsOptions::saveOptions()
|
||||
settings.setValue( "/qgis/enable_anti_aliasing", chkAntiAliasing->isChecked() );
|
||||
settings.setValue( "/qgis/enable_render_caching", chkUseRenderCaching->isChecked() );
|
||||
settings.setValue( "/qgis/use_qimage_to_render", !( chkUseQPixmap->isChecked() ) );
|
||||
settings.setValue( "/qgis/use_symbology_ng", chkUseSymbologyNG->isChecked() );
|
||||
settings.setValue( "/qgis/legendDoubleClickAction", cmbLegendDoubleClickAction->currentIndex() );
|
||||
bool legendLayersCapitalise = settings.value( "/qgis/capitaliseLayerName", false ).toBool();
|
||||
settings.setValue( "/qgis/capitaliseLayerName", capitaliseCheckBox->isChecked() );
|
||||
|
@ -413,12 +413,8 @@ void QgsVectorLayerProperties::apply()
|
||||
// Apply fields settings
|
||||
mFieldsPropertiesDialog->apply();
|
||||
|
||||
if ( layer->isUsingRendererV2() )
|
||||
{
|
||||
QgsRendererV2PropertiesDialog* dlg =
|
||||
static_cast<QgsRendererV2PropertiesDialog*>( widgetStackRenderers->currentWidget() );
|
||||
dlg->apply();
|
||||
}
|
||||
QgsRendererV2PropertiesDialog* dlg = static_cast<QgsRendererV2PropertiesDialog*>( widgetStackRenderers->currentWidget() );
|
||||
dlg->apply();
|
||||
|
||||
//apply diagram settings
|
||||
diagramPropertiesDialog->apply();
|
||||
@ -778,19 +774,12 @@ void QgsVectorLayerProperties::updateSymbologyPage()
|
||||
delete mRendererDialog;
|
||||
mRendererDialog = 0;
|
||||
|
||||
if ( layer->isUsingRendererV2() )
|
||||
{
|
||||
mRendererDialog = new QgsRendererV2PropertiesDialog( layer, QgsStyleV2::defaultStyle(), true );
|
||||
mRendererDialog = new QgsRendererV2PropertiesDialog( layer, QgsStyleV2::defaultStyle(), true );
|
||||
|
||||
// display the menu to choose the output format (fix #5136)
|
||||
pbnSaveStyleAs->setText( tr( "Save Style" ) );
|
||||
pbnSaveStyleAs->setMenu( mSaveAsMenu );
|
||||
QObject::disconnect( pbnSaveStyleAs, SIGNAL( clicked() ), this, SLOT( on_pbnSaveStyleAs_clicked() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
tabWidget->setTabEnabled( 0, false ); // hide symbology item
|
||||
}
|
||||
// display the menu to choose the output format (fix #5136)
|
||||
pbnSaveStyleAs->setText( tr( "Save Style" ) );
|
||||
pbnSaveStyleAs->setMenu( mSaveAsMenu );
|
||||
QObject::disconnect( pbnSaveStyleAs, SIGNAL( clicked() ), this, SLOT( on_pbnSaveStyleAs_clicked() ) );
|
||||
|
||||
if ( mRendererDialog )
|
||||
{
|
||||
|
@ -190,64 +190,7 @@ int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLa
|
||||
return 0;
|
||||
}
|
||||
|
||||
int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer )
|
||||
{
|
||||
if ( !layerItem || !vlayer )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int opacity = vlayer->getTransparency();
|
||||
|
||||
const QgsRenderer* vectorRenderer = vlayer->renderer();
|
||||
if ( !vectorRenderer )
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
//text field that describes classification attribute?
|
||||
QSettings settings;
|
||||
if ( settings.value( "/qgis/showLegendClassifiers", false ).toBool() )
|
||||
{
|
||||
const QgsFields& layerFields = vlayer->pendingFields();
|
||||
QgsAttributeList attributes = vectorRenderer->classificationAttributes();
|
||||
QgsAttributeList::const_iterator att_it = attributes.constBegin();
|
||||
for ( ; att_it != attributes.constEnd(); ++att_it )
|
||||
{
|
||||
int idx = *att_it;
|
||||
if ( idx >= 0 && idx < layerFields.count() )
|
||||
{
|
||||
QString attributeName = vlayer->attributeDisplayName( idx );
|
||||
QStandardItem* attributeItem = new QStandardItem( attributeName );
|
||||
attributeItem->setData( QgsLegendModel::ClassificationItem, Qt::UserRole + 1 ); //first user data stores the item type
|
||||
attributeItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
|
||||
layerItem->setChild( layerItem->rowCount(), 0, attributeItem );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const QList<QgsSymbol*> vectorSymbols = vectorRenderer->symbols();
|
||||
QList<QgsSymbol*>::const_iterator symbolIt = vectorSymbols.constBegin();
|
||||
|
||||
for ( ; symbolIt != vectorSymbols.constEnd(); ++symbolIt )
|
||||
{
|
||||
if ( !( *symbolIt ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
QStandardItem* currentSymbolItem = itemFromSymbol( *symbolIt, opacity, vlayer->id() );
|
||||
if ( !currentSymbolItem )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
layerItem->setChild( layerItem->rowCount(), 0, currentSymbolItem );
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int QgsLegendModel::addRasterLayerItems( QStandardItem* layerItem, QgsMapLayer* rlayer )
|
||||
{
|
||||
@ -331,14 +274,7 @@ void QgsLegendModel::updateLayer( QStandardItem* layerItem )
|
||||
|
||||
if ( vLayer )
|
||||
{
|
||||
if ( vLayer->isUsingRendererV2() )
|
||||
{
|
||||
addVectorLayerItemsV2( lItem, vLayer );
|
||||
}
|
||||
else
|
||||
{
|
||||
addVectorLayerItems( lItem, vLayer );
|
||||
}
|
||||
addVectorLayerItemsV2( lItem, vLayer );
|
||||
}
|
||||
|
||||
QgsRasterLayer* rLayer = qobject_cast<QgsRasterLayer*>( mapLayer );
|
||||
@ -393,14 +329,7 @@ void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer )
|
||||
QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( theMapLayer );
|
||||
if ( vl )
|
||||
{
|
||||
if ( vl->isUsingRendererV2() )
|
||||
{
|
||||
addVectorLayerItemsV2( layerItem, vl );
|
||||
}
|
||||
else
|
||||
{
|
||||
addVectorLayerItems( layerItem, vl );
|
||||
}
|
||||
addVectorLayerItemsV2( layerItem, vl );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -102,10 +102,6 @@ class CORE_EXPORT QgsLegendModel: public QStandardItemModel
|
||||
void layersChanged();
|
||||
|
||||
private:
|
||||
/**Adds classification items of vector layers
|
||||
@return 0 in case of success*/
|
||||
int addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer );
|
||||
|
||||
/**Adds classification items of vector layers using new symbology*/
|
||||
int addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer );
|
||||
|
||||
|
@ -702,17 +702,11 @@ QPair< bool, QList<QDomNode> > QgsProject::_getMapLayers( QDomDocument const &do
|
||||
|
||||
//Update field map of layers with joins and create join caches if necessary
|
||||
//Needs to be done here once all dependent layers are loaded
|
||||
QString errorMessage;
|
||||
QList< QPair< QgsVectorLayer*, QDomElement > >::iterator vIt = vLayerList.begin();
|
||||
for ( ; vIt != vLayerList.end(); ++vIt )
|
||||
{
|
||||
vIt->first->createJoinCaches();
|
||||
vIt->first->updateFields();
|
||||
//for old symbology, it is necessary to read the symbology again after having the complete field map
|
||||
if ( !vIt->first->isUsingRendererV2() )
|
||||
{
|
||||
vIt->first->readSymbology( vIt->second, errorMessage );
|
||||
}
|
||||
}
|
||||
|
||||
return qMakePair( returnStatus, brokenNodes );
|
||||
|
@ -770,7 +770,7 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer,
|
||||
//writer->createSymbolLayerTable( layer, writer->mDS );
|
||||
}
|
||||
|
||||
if ( writer->symbologyExport() == SymbolLayerSymbology && layer->isUsingRendererV2() )
|
||||
if ( writer->symbologyExport() == SymbolLayerSymbology )
|
||||
{
|
||||
QgsFeatureRendererV2* r = layer->rendererV2();
|
||||
if ( r->capabilities() & QgsFeatureRendererV2::SymbolLevels
|
||||
@ -1198,11 +1198,6 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, const Qgs
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !vl->isUsingRendererV2() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QgsFeatureRendererV2* renderer = vl->rendererV2();
|
||||
if ( !renderer )
|
||||
{
|
||||
@ -1246,7 +1241,7 @@ void QgsVectorFileWriter::createSymbolLayerTable( QgsVectorLayer* vl, const Qgs
|
||||
QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels( QgsVectorLayer* layer, QgsFeatureIterator& fit,
|
||||
const QgsCoordinateTransform* ct, QString* errorMessage )
|
||||
{
|
||||
if ( !layer || !layer->isUsingRendererV2() )
|
||||
if ( !layer )
|
||||
{
|
||||
//return error
|
||||
}
|
||||
@ -1454,7 +1449,7 @@ QgsFeatureRendererV2* QgsVectorFileWriter::symbologyRenderer( QgsVectorLayer* vl
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !vl || !vl->isUsingRendererV2() )
|
||||
if ( !vl )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -315,12 +315,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
|
||||
/** Returns the bounding box of the selected features. If there is no selection, QgsRectangle(0,0,0,0) is returned */
|
||||
QgsRectangle boundingBoxOfSelected();
|
||||
|
||||
/** Returns a pointer to the renderer */
|
||||
const QgsRenderer* renderer() const;
|
||||
|
||||
/** Sets the renderer. If a renderer is already present, it is deleted */
|
||||
void setRenderer( QgsRenderer * r );
|
||||
|
||||
/** Sets diagram rendering object (takes ownership) */
|
||||
void setDiagramRenderer( QgsDiagramRendererV2* r );
|
||||
const QgsDiagramRendererV2* diagramRenderer() const { return mDiagramRenderer; }
|
||||
@ -335,14 +329,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
|
||||
* @note added in 1.4
|
||||
*/
|
||||
void setRendererV2( QgsFeatureRendererV2* r );
|
||||
/** Return whether using renderer V2.
|
||||
* @note added in 1.4
|
||||
*/
|
||||
bool isUsingRendererV2();
|
||||
/** set whether to use renderer V2 for drawing.
|
||||
* @note added in 1.4
|
||||
*/
|
||||
void setUsingRendererV2( bool usingRendererV2 );
|
||||
|
||||
/** Draw layer with renderer V2.
|
||||
* @note added in 1.4
|
||||
@ -931,28 +917,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
|
||||
*/
|
||||
bool setDataProvider( QString const & provider );
|
||||
|
||||
/** Draws features. May cause projections exceptions to be generated
|
||||
* (i.e., code that calls this function needs to catch them) */
|
||||
void drawFeature( QgsRenderContext &renderContext,
|
||||
QgsFeature& fet,
|
||||
QImage* marker );
|
||||
|
||||
/** Convenience function to transform the given point */
|
||||
void transformPoint( double& x, double& y,
|
||||
const QgsMapToPixel* mtp, const QgsCoordinateTransform* ct );
|
||||
|
||||
void transformPoints( QVector<double>& x, QVector<double>& y, QVector<double>& z, QgsRenderContext &renderContext );
|
||||
|
||||
/** Draw the linestring as given in the WKB format. Returns a pointer
|
||||
* to the byte after the end of the line string binary data stream (WKB).
|
||||
*/
|
||||
unsigned char *drawLineString( unsigned char *WKBlinestring, QgsRenderContext &renderContext );
|
||||
|
||||
/** Draw the polygon as given in the WKB format. Returns a pointer to
|
||||
* the byte after the end of the polygon binary data stream (WKB).
|
||||
*/
|
||||
unsigned char *drawPolygon( unsigned char *WKBpolygon, QgsRenderContext &renderContext );
|
||||
|
||||
/** Goes through all features and finds a free id (e.g. to give it temporarily to a not-commited feature) */
|
||||
QgsFeatureId findFreeId();
|
||||
|
||||
@ -1046,14 +1010,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
|
||||
int mWkbType;
|
||||
|
||||
/** Renderer object which holds the information about how to display the features */
|
||||
QgsRenderer *mRenderer;
|
||||
|
||||
/** Renderer V2 */
|
||||
QgsFeatureRendererV2 *mRendererV2;
|
||||
|
||||
/** whether to use V1 or V2 renderer */
|
||||
bool mUsingRendererV2;
|
||||
|
||||
/** Label */
|
||||
QgsLabel *mLabel;
|
||||
|
||||
|
@ -237,7 +237,6 @@ int QgsContinuousColorRenderer::readXML( const QDomNode& rnode, QgsVectorLayer&
|
||||
usy->readXML( usymbolnode, &vl );
|
||||
setMaximumSymbol( usy );
|
||||
}
|
||||
vl.setRenderer( this );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -282,7 +282,6 @@ int QgsGraduatedSymbolRenderer::readXML( const QDomNode& rnode, QgsVectorLayer&
|
||||
symbolnode = symbolnode.nextSibling();
|
||||
}
|
||||
updateSymbolAttributes();
|
||||
vl.setRenderer( this );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -215,7 +215,6 @@ int QgsSingleSymbolRenderer::readXML( const QDomNode& rnode, QgsVectorLayer& vl
|
||||
|
||||
//create a renderer and add it to the vector layer
|
||||
addSymbol( sy );
|
||||
vl.setRenderer( this );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -236,7 +236,6 @@ int QgsUniqueValueRenderer::readXML( const QDomNode& rnode, QgsVectorLayer& vl )
|
||||
symbolnode = symbolnode.nextSibling();
|
||||
}
|
||||
updateSymbolAttributes();
|
||||
vl.setRenderer( this );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -14,13 +14,8 @@
|
||||
***************************************************************************/
|
||||
#include "qgssymbologyv2conversion.h"
|
||||
|
||||
#include "qgssinglesymbolrenderer.h"
|
||||
#include "qgsgraduatedsymbolrenderer.h"
|
||||
#include "qgsuniquevaluerenderer.h"
|
||||
#include "qgssymbol.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
|
||||
#include "qgslogger.h"
|
||||
#include "qgssymbologyutils.h"
|
||||
|
||||
#include "qgsmarkersymbollayerv2.h"
|
||||
#include "qgslinesymbollayerv2.h"
|
||||
@ -30,21 +25,122 @@
|
||||
#include "qgscategorizedsymbolrendererv2.h"
|
||||
|
||||
|
||||
QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s )
|
||||
|
||||
struct QgsOldSymbolMeta
|
||||
{
|
||||
switch ( s->type() )
|
||||
QString lowerValue;
|
||||
QString upperValue;
|
||||
QString label;
|
||||
};
|
||||
|
||||
|
||||
static QgsOldSymbolMeta readSymbolMeta( const QDomNode& synode )
|
||||
{
|
||||
QgsOldSymbolMeta meta;
|
||||
|
||||
QDomNode lvalnode = synode.namedItem( "lowervalue" );
|
||||
if ( ! lvalnode.isNull() )
|
||||
{
|
||||
QDomElement lvalelement = lvalnode.toElement();
|
||||
if ( lvalelement.attribute( "null" ).toInt() == 1 )
|
||||
{
|
||||
meta.lowerValue = QString::null;
|
||||
}
|
||||
else
|
||||
{
|
||||
meta.lowerValue = lvalelement.text();
|
||||
}
|
||||
}
|
||||
|
||||
QDomNode uvalnode = synode.namedItem( "uppervalue" );
|
||||
if ( ! uvalnode.isNull() )
|
||||
{
|
||||
QDomElement uvalelement = uvalnode.toElement();
|
||||
meta.upperValue = uvalelement.text();
|
||||
}
|
||||
|
||||
QDomNode labelnode = synode.namedItem( "label" );
|
||||
if ( ! labelnode.isNull() )
|
||||
{
|
||||
QDomElement labelelement = labelnode.toElement();
|
||||
meta.label = labelelement.text();
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
|
||||
static QColor readSymbolColor( const QDomNode& synode, bool fillColor )
|
||||
{
|
||||
QDomNode cnode = synode.namedItem( fillColor ? "fillcolor" : "outlinecolor" );
|
||||
QDomElement celement = cnode.toElement();
|
||||
int red = celement.attribute( "red" ).toInt();
|
||||
int green = celement.attribute( "green" ).toInt();
|
||||
int blue = celement.attribute( "blue" ).toInt();
|
||||
return QColor( red, green, blue );
|
||||
}
|
||||
|
||||
static double readOutlineWidth( const QDomNode& synode )
|
||||
{
|
||||
QDomNode outlwnode = synode.namedItem( "outlinewidth" );
|
||||
QDomElement outlwelement = outlwnode.toElement();
|
||||
return outlwelement.text().toDouble();
|
||||
}
|
||||
|
||||
|
||||
static Qt::PenStyle readOutlineStyle( const QDomNode& synode )
|
||||
{
|
||||
QDomNode outlstnode = synode.namedItem( "outlinestyle" );
|
||||
QDomElement outlstelement = outlstnode.toElement();
|
||||
return QgsSymbologyUtils::qString2PenStyle( outlstelement.text() );
|
||||
}
|
||||
|
||||
static Qt::BrushStyle readBrushStyle( const QDomNode& synode )
|
||||
{
|
||||
QDomNode fillpnode = synode.namedItem( "fillpattern" );
|
||||
QDomElement fillpelement = fillpnode.toElement();
|
||||
return QgsSymbologyUtils::qString2BrushStyle( fillpelement.text() );
|
||||
}
|
||||
|
||||
static QString readMarkerSymbolName( const QDomNode& synode )
|
||||
{
|
||||
QDomNode psymbnode = synode.namedItem( "pointsymbol" );
|
||||
if ( ! psymbnode.isNull() )
|
||||
{
|
||||
QDomElement psymbelement = psymbnode.toElement();
|
||||
return psymbelement.text();
|
||||
}
|
||||
return QString("hard:circle");
|
||||
}
|
||||
|
||||
static float readMarkerSymbolSize( const QDomNode& synode )
|
||||
{
|
||||
QDomNode psizenode = synode.namedItem( "pointsize" );
|
||||
if ( ! psizenode.isNull() )
|
||||
{
|
||||
QDomElement psizeelement = psizenode.toElement();
|
||||
return psizeelement.text().toFloat();
|
||||
}
|
||||
return DEFAULT_POINT_SIZE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static QgsSymbolV2* readOldSymbol( const QDomNode& synode, QGis::GeometryType geomType )
|
||||
{
|
||||
switch ( geomType )
|
||||
{
|
||||
case QGis::Point:
|
||||
{
|
||||
QgsMarkerSymbolLayerV2* sl = NULL;
|
||||
double size = s->pointSize();
|
||||
double size = readMarkerSymbolSize( synode );
|
||||
double angle = 0; // rotation only from classification field
|
||||
QString symbolName = s->pointSymbolName();
|
||||
QString symbolName = readMarkerSymbolName( synode );
|
||||
if ( symbolName.startsWith( "hard:" ) )
|
||||
{
|
||||
// simple symbol marker
|
||||
QColor color = s->fillColor();
|
||||
QColor borderColor = s->color();
|
||||
QColor color = readSymbolColor( synode, true );
|
||||
QColor borderColor = readSymbolColor( synode, false );
|
||||
QString name = symbolName.mid( 5 );
|
||||
sl = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle );
|
||||
}
|
||||
@ -61,9 +157,9 @@ QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s )
|
||||
|
||||
case QGis::Line:
|
||||
{
|
||||
QColor color = s->color();
|
||||
double width = s->lineWidth();
|
||||
Qt::PenStyle penStyle = s->pen().style();
|
||||
QColor color = readSymbolColor( synode, false );
|
||||
double width = readOutlineWidth( synode );
|
||||
Qt::PenStyle penStyle = readOutlineStyle( synode );
|
||||
QgsLineSymbolLayerV2* sl = new QgsSimpleLineSymbolLayerV2( color, width, penStyle );
|
||||
|
||||
QgsSymbolLayerV2List layers;
|
||||
@ -73,11 +169,11 @@ QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s )
|
||||
|
||||
case QGis::Polygon:
|
||||
{
|
||||
QColor color = s->fillColor();
|
||||
QColor borderColor = s->color();
|
||||
Qt::BrushStyle brushStyle = s->brush().style();
|
||||
Qt::PenStyle borderStyle = s->pen().style();
|
||||
double borderWidth = s->lineWidth();
|
||||
QColor color = readSymbolColor( synode, true );
|
||||
QColor borderColor = readSymbolColor( synode, false );
|
||||
Qt::BrushStyle brushStyle = readBrushStyle( synode );
|
||||
Qt::PenStyle borderStyle = readOutlineStyle( synode );
|
||||
double borderWidth = readOutlineWidth( synode );
|
||||
QgsFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( color, brushStyle, borderColor, borderStyle, borderWidth );
|
||||
|
||||
QgsSymbolLayerV2List layers;
|
||||
@ -90,253 +186,163 @@ QgsSymbolV2* QgsSymbologyV2Conversion::symbolV1toV2( const QgsSymbol* s )
|
||||
}
|
||||
}
|
||||
|
||||
QgsSymbol* QgsSymbologyV2Conversion::symbolV2toV1( QgsSymbolV2* s )
|
||||
|
||||
|
||||
static QgsFeatureRendererV2* readOldSingleSymbolRenderer( const QDomNode& rnode, QGis::GeometryType geomType )
|
||||
{
|
||||
if ( s == NULL || s->symbolLayerCount() == 0 )
|
||||
return NULL;
|
||||
QDomNode synode = rnode.namedItem( "symbol" );
|
||||
if ( synode.isNull() )
|
||||
return 0;
|
||||
|
||||
// we will use only the first symbol layer
|
||||
QgsSymbolLayerV2* sl = s->symbolLayer( 0 );
|
||||
|
||||
switch ( sl->type() )
|
||||
{
|
||||
case QgsSymbolV2::Marker:
|
||||
{
|
||||
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( sl );
|
||||
QgsSymbol* sOld = new QgsSymbol( QGis::Point );
|
||||
sOld->setFillColor( sl->color() );
|
||||
sOld->setFillStyle( Qt::SolidPattern );
|
||||
sOld->setPointSize( msl->size() );
|
||||
if ( sl->layerType() == "SimpleMarker" )
|
||||
{
|
||||
QgsSimpleMarkerSymbolLayerV2* smsl = static_cast<QgsSimpleMarkerSymbolLayerV2*>( sl );
|
||||
sOld->setColor( smsl->borderColor() );
|
||||
sOld->setNamedPointSymbol( "hard:" + smsl->name() );
|
||||
}
|
||||
else if ( sl->layerType() == "SvgMarker" )
|
||||
{
|
||||
QgsSvgMarkerSymbolLayerV2* smsl = static_cast<QgsSvgMarkerSymbolLayerV2*>( sl );
|
||||
sOld->setNamedPointSymbol( "svg:" + smsl->path() );
|
||||
}
|
||||
return sOld;
|
||||
}
|
||||
break;
|
||||
|
||||
case QgsSymbolV2::Line:
|
||||
{
|
||||
QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( sl );
|
||||
QgsSymbol* sOld = new QgsSymbol( QGis::Line );
|
||||
sOld->setColor( sl->color() );
|
||||
sOld->setLineWidth( lsl->width() );
|
||||
if ( sl->layerType() == "SimpleLine" )
|
||||
{
|
||||
// add specific settings
|
||||
QgsSimpleLineSymbolLayerV2* slsl = static_cast<QgsSimpleLineSymbolLayerV2*>( sl );
|
||||
sOld->setLineStyle( slsl->penStyle() );
|
||||
}
|
||||
return sOld;
|
||||
}
|
||||
|
||||
case QgsSymbolV2::Fill:
|
||||
{
|
||||
QgsSymbol* sOld = new QgsSymbol( QGis::Polygon );
|
||||
sOld->setFillColor( sl->color() );
|
||||
if ( sl->layerType() == "SimpleFill" )
|
||||
{
|
||||
// add specifc settings
|
||||
QgsSimpleFillSymbolLayerV2* sfsl = static_cast<QgsSimpleFillSymbolLayerV2*>( sl );
|
||||
sOld->setColor( sfsl->borderColor() );
|
||||
sOld->setLineWidth( sfsl->borderWidth() );
|
||||
sOld->setLineStyle( sfsl->borderStyle() );
|
||||
sOld->setFillStyle( sfsl->brushStyle() );
|
||||
}
|
||||
return sOld;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL; // should never get here
|
||||
QgsSymbolV2* sy2 = readOldSymbol( synode, geomType );
|
||||
QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( sy2 );
|
||||
return r;
|
||||
}
|
||||
|
||||
void QgsSymbologyV2Conversion::rendererV1toV2( QgsVectorLayer* layer )
|
||||
|
||||
static QgsFeatureRendererV2* readOldGraduatedSymbolRenderer( const QDomNode& rnode, QGis::GeometryType geomType )
|
||||
{
|
||||
if ( layer->isUsingRendererV2() )
|
||||
return;
|
||||
QDomNode modeNode = rnode.namedItem( "mode" );
|
||||
QString modeValue = modeNode.toElement().text();
|
||||
QDomNode classnode = rnode.namedItem( "classificationfield" );
|
||||
QString classificationField = classnode.toElement().text();
|
||||
|
||||
const QgsRenderer* r = layer->renderer();
|
||||
if ( r == NULL )
|
||||
return;
|
||||
|
||||
QgsFeatureRendererV2* r2final = NULL;
|
||||
|
||||
QString rtype = r->name();
|
||||
if ( rtype == "Single Symbol" )
|
||||
QgsGraduatedSymbolRendererV2::Mode m = QgsGraduatedSymbolRendererV2::Custom;
|
||||
if ( modeValue == "Empty" )
|
||||
{
|
||||
const QgsSingleSymbolRenderer* ssr = dynamic_cast<const QgsSingleSymbolRenderer*>( r );
|
||||
if ( ssr == NULL )
|
||||
return;
|
||||
QgsSymbolV2* symbol = symbolV1toV2( ssr->symbol() );
|
||||
QgsSingleSymbolRendererV2* r2 = new QgsSingleSymbolRendererV2( symbol );
|
||||
r2final = r2;
|
||||
m = QgsGraduatedSymbolRendererV2::Custom;
|
||||
}
|
||||
else if ( rtype == "Graduated Symbol" )
|
||||
else if ( modeValue == "Quantile" )
|
||||
{
|
||||
const QgsGraduatedSymbolRenderer* gsr = dynamic_cast<const QgsGraduatedSymbolRenderer*>( r );
|
||||
if ( gsr == NULL )
|
||||
return;
|
||||
m = QgsGraduatedSymbolRendererV2::Quantile;
|
||||
}
|
||||
else //default
|
||||
{
|
||||
m = QgsGraduatedSymbolRendererV2::EqualInterval;
|
||||
}
|
||||
|
||||
QString attrName;
|
||||
const QgsFields& fields = layer->pendingFields();
|
||||
int fldIdx = gsr->classificationField();
|
||||
if ( fldIdx >= 0 && fldIdx < fields.count() )
|
||||
// load ranges and symbols
|
||||
QgsRangeList ranges;
|
||||
QDomNode symbolnode = rnode.namedItem( "symbol" );
|
||||
while ( !symbolnode.isNull() )
|
||||
{
|
||||
QgsSymbolV2* symbolv2 = readOldSymbol( symbolnode, geomType );
|
||||
if ( symbolv2 )
|
||||
{
|
||||
attrName = fields[fldIdx].name();
|
||||
}
|
||||
|
||||
QgsRangeList ranges;
|
||||
foreach ( const QgsSymbol* sym, gsr->symbols() )
|
||||
{
|
||||
double lowerValue = sym->lowerValue().toDouble();
|
||||
double upperValue = sym->upperValue().toDouble();
|
||||
QString label = sym->label();
|
||||
QgsOldSymbolMeta meta = readSymbolMeta( symbolnode );
|
||||
double lowerValue = meta.lowerValue.toDouble();
|
||||
double upperValue = meta.upperValue.toDouble();
|
||||
QString label = meta.label;
|
||||
if ( label.isEmpty() )
|
||||
label = QString( "%1 - %2" ).arg( lowerValue, -1, 'f', 3 ).arg( upperValue, -1, 'f', 3 );
|
||||
QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
|
||||
ranges.append( QgsRendererRangeV2( lowerValue, upperValue, symbolv2, label ) );
|
||||
}
|
||||
|
||||
QgsGraduatedSymbolRendererV2* r2 = new QgsGraduatedSymbolRendererV2( attrName, ranges );
|
||||
|
||||
// find out mode
|
||||
QgsGraduatedSymbolRendererV2::Mode m = QgsGraduatedSymbolRendererV2::Custom;
|
||||
switch ( gsr->mode() )
|
||||
{
|
||||
case QgsGraduatedSymbolRenderer::EqualInterval: m = QgsGraduatedSymbolRendererV2::EqualInterval; break;
|
||||
case QgsGraduatedSymbolRenderer::Quantile: m = QgsGraduatedSymbolRendererV2::Quantile; break;
|
||||
case QgsGraduatedSymbolRenderer::Empty: m = QgsGraduatedSymbolRendererV2::Custom; break;
|
||||
}
|
||||
r2->setMode( m );
|
||||
// source symbol, color ramp not set (unknown)
|
||||
r2final = r2;
|
||||
symbolnode = symbolnode.nextSibling();
|
||||
}
|
||||
else if ( rtype == "Continuous Color" )
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
else if ( rtype == "Unique Value" )
|
||||
{
|
||||
const QgsUniqueValueRenderer* uvr = dynamic_cast<const QgsUniqueValueRenderer*>( r );
|
||||
if ( uvr == NULL )
|
||||
return;
|
||||
|
||||
QString attrName;
|
||||
const QgsFields& fields = layer->pendingFields();
|
||||
int fldIdx = uvr->classificationField();
|
||||
if ( fldIdx >= 0 && fldIdx < fields.count() )
|
||||
{
|
||||
attrName = fields[fldIdx].name();
|
||||
}
|
||||
// create renderer
|
||||
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( classificationField, ranges );
|
||||
r->setMode( m );
|
||||
return r;
|
||||
}
|
||||
|
||||
QgsCategoryList cats;
|
||||
foreach ( QgsSymbol* sym, uvr->symbols() )
|
||||
|
||||
|
||||
static QgsFeatureRendererV2* readOldUniqueValueRenderer( const QDomNode& rnode, QGis::GeometryType geomType )
|
||||
{
|
||||
QDomNode classnode = rnode.namedItem( "classificationfield" );
|
||||
QString classificationField = classnode.toElement().text();
|
||||
|
||||
// read categories and symbols
|
||||
QgsCategoryList cats;
|
||||
QDomNode symbolnode = rnode.namedItem( "symbol" );
|
||||
while ( !symbolnode.isNull() )
|
||||
{
|
||||
QgsSymbolV2* symbolv2 = readOldSymbol( symbolnode, geomType );
|
||||
if ( symbolv2 )
|
||||
{
|
||||
QVariant value = QVariant( sym->lowerValue() );
|
||||
QString label = sym->label();
|
||||
QgsOldSymbolMeta meta = readSymbolMeta( symbolnode );
|
||||
QVariant value = QVariant( meta.lowerValue );
|
||||
QString label = meta.label;
|
||||
if ( label.isEmpty() )
|
||||
label = value.toString();
|
||||
QgsSymbolV2* symbolv2 = symbolV1toV2( sym );
|
||||
cats.append( QgsRendererCategoryV2( value, symbolv2, label ) );
|
||||
}
|
||||
|
||||
QgsCategorizedSymbolRendererV2* r2 = new QgsCategorizedSymbolRendererV2( attrName, cats );
|
||||
// source symbol and color ramp are not set (unknown)
|
||||
r2final = r2;
|
||||
symbolnode = symbolnode.nextSibling();
|
||||
}
|
||||
|
||||
if ( r2final == NULL )
|
||||
{
|
||||
r2final = QgsFeatureRendererV2::defaultRenderer( layer->geometryType() );
|
||||
}
|
||||
|
||||
// change of renderers
|
||||
layer->setUsingRendererV2( true );
|
||||
layer->setRendererV2( r2final );
|
||||
layer->setRenderer( NULL );
|
||||
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( classificationField, cats );
|
||||
// source symbol and color ramp are not set (unknown)
|
||||
return r;
|
||||
}
|
||||
|
||||
void QgsSymbologyV2Conversion::rendererV2toV1( QgsVectorLayer* layer )
|
||||
|
||||
|
||||
|
||||
QgsFeatureRendererV2* QgsSymbologyV2Conversion::readOldRenderer( const QDomNode& layerNode, QGis::GeometryType geomType )
|
||||
{
|
||||
if ( !layer->isUsingRendererV2() )
|
||||
return;
|
||||
QDomNode singlenode = layerNode.namedItem( "singlesymbol" );
|
||||
QDomNode graduatednode = layerNode.namedItem( "graduatedsymbol" );
|
||||
QDomNode continuousnode = layerNode.namedItem( "continuoussymbol" );
|
||||
QDomNode uniquevaluenode = layerNode.namedItem( "uniquevalue" );
|
||||
|
||||
QgsFeatureRendererV2* r2 = layer->rendererV2();
|
||||
if ( r2 == NULL )
|
||||
return;
|
||||
|
||||
QgsRenderer* rfinal = NULL;
|
||||
|
||||
QString r2type = r2->type();
|
||||
if ( r2type == "singleSymbol" )
|
||||
if ( !singlenode.isNull() )
|
||||
{
|
||||
QgsSingleSymbolRendererV2* ssr2 = static_cast<QgsSingleSymbolRendererV2*>( r2 );
|
||||
|
||||
QgsSingleSymbolRenderer* r = new QgsSingleSymbolRenderer( layer->geometryType() );
|
||||
r->addSymbol( symbolV2toV1( ssr2->symbol() ) );
|
||||
rfinal = r;
|
||||
return readOldSingleSymbolRenderer( singlenode, geomType );
|
||||
}
|
||||
else if ( r2type == "graduatedSymbol" )
|
||||
else if ( !graduatednode.isNull() )
|
||||
{
|
||||
QgsGraduatedSymbolRendererV2* gsr2 = static_cast<QgsGraduatedSymbolRendererV2*>( r2 );
|
||||
|
||||
QgsGraduatedSymbolRenderer::Mode m;
|
||||
switch ( gsr2->mode() )
|
||||
{
|
||||
case QgsGraduatedSymbolRendererV2::EqualInterval: m = QgsGraduatedSymbolRenderer::EqualInterval; break;
|
||||
case QgsGraduatedSymbolRendererV2::Quantile: m = QgsGraduatedSymbolRenderer::Quantile; break;
|
||||
default: m = QgsGraduatedSymbolRenderer::Empty; break;
|
||||
}
|
||||
|
||||
QgsGraduatedSymbolRenderer* r = new QgsGraduatedSymbolRenderer( layer->geometryType(), m );
|
||||
|
||||
r->setClassificationField( layer->fieldNameIndex( gsr2->classAttribute() ) );
|
||||
|
||||
foreach ( QgsRendererRangeV2 range, gsr2->ranges() )
|
||||
{
|
||||
QgsSymbol* s = symbolV2toV1( range.symbol() );
|
||||
s->setLowerValue( QString::number( range.lowerValue(), 'f', 5 ) );
|
||||
s->setUpperValue( QString::number( range.upperValue(), 'f', 5 ) );
|
||||
s->setLabel( range.label() );
|
||||
r->addSymbol( s );
|
||||
}
|
||||
|
||||
rfinal = r;
|
||||
return readOldGraduatedSymbolRenderer( graduatednode, geomType );
|
||||
}
|
||||
else if ( r2type == "categorizedSymbol" )
|
||||
else if ( !continuousnode.isNull() )
|
||||
{
|
||||
QgsCategorizedSymbolRendererV2* csr2 = static_cast<QgsCategorizedSymbolRendererV2*>( r2 );
|
||||
|
||||
QgsUniqueValueRenderer* r = new QgsUniqueValueRenderer( layer->geometryType() );
|
||||
|
||||
r->setClassificationField( layer->fieldNameIndex( csr2->classAttribute() ) );
|
||||
|
||||
foreach ( QgsRendererCategoryV2 cat, csr2->categories() )
|
||||
{
|
||||
QgsSymbol* s = symbolV2toV1( cat.symbol() );
|
||||
QString val = cat.value().toString();
|
||||
s->setLowerValue( val );
|
||||
s->setUpperValue( val );
|
||||
r->insertValue( val, s );
|
||||
}
|
||||
|
||||
rfinal = r;
|
||||
return 0;
|
||||
}
|
||||
else if ( !uniquevaluenode.isNull() )
|
||||
{
|
||||
return readOldUniqueValueRenderer( uniquevaluenode, geomType );
|
||||
}
|
||||
|
||||
|
||||
if ( rfinal == NULL )
|
||||
{
|
||||
rfinal = new QgsSingleSymbolRenderer( layer->geometryType() );
|
||||
}
|
||||
|
||||
layer->setUsingRendererV2( false );
|
||||
layer->setRendererV2( NULL );
|
||||
layer->setRenderer( rfinal );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
UNSUPPORTED RENDERER: continuous color
|
||||
|
||||
QDomNode classnode = rnode.namedItem( "classificationfield" );
|
||||
QDomNode polyoutlinenode = rnode.namedItem( "polygonoutline" );
|
||||
QString polyoutline = polyoutlinenode.toElement().text();
|
||||
if ( polyoutline == "0" )
|
||||
drawPolygonOutline = false;
|
||||
else if ( polyoutline == "1" )
|
||||
drawPolygonOutline = true;
|
||||
QDomNode lowernode = rnode.namedItem( "lowestsymbol" );
|
||||
lowSymbol = readOldSymbol( lowernode.namedItem( "symbol" ), geomType );
|
||||
QDomNode uppernode = rnode.namedItem( "highestsymbol" );
|
||||
highSymbol = readOldSymbol( uppernode.namedItem( "symbol" ), geomType );
|
||||
|
||||
UNSUPPORTED SYMBOL PROPERTY: point size units
|
||||
|
||||
QDomNode psizeunitnodes = synode.namedItem( "pointsizeunits" );
|
||||
if ( ! psizeunitnodes.isNull() )
|
||||
{
|
||||
QDomElement psizeunitelement = psizeunitnodes.toElement();
|
||||
QgsDebugMsg( QString( "psizeunitelement:%1" ).arg( psizeunitelement.text() ) );
|
||||
setPointSizeUnits( psizeunitelement.text().compare( "mapunits", Qt::CaseInsensitive ) == 0 );
|
||||
}
|
||||
|
||||
UNSUPPORTED SYMBOL PROPERTY: data-defined rotation / scale / symbol name
|
||||
|
||||
rotationClassificationFieldName = synode.namedItem( "rotationclassificationfieldname" ).toElement().text();
|
||||
scaleClassificationFieldName = synode.namedItem( "scaleclassificationfield" ).toElement().text();
|
||||
symbolFieldName = synode.namedItem( "symbolfieldname" ).toElement().text();
|
||||
|
||||
UNSUPPORTED SYMBOL PROPERTY: texture
|
||||
|
||||
QDomNode texturepathnode = synode.namedItem( "texturepath" );
|
||||
QDomElement texturepathelement = texturepathnode.toElement();
|
||||
setCustomTexture( QgsProject::instance()->readPath( texturepathelement.text() ) );
|
||||
*/
|
||||
|
@ -15,30 +15,19 @@
|
||||
#ifndef QGSSYMBOLOGYV2CONVERSION_H
|
||||
#define QGSSYMBOLOGYV2CONVERSION_H
|
||||
|
||||
class QgsSymbol;
|
||||
class QgsSymbolV2;
|
||||
class QgsVectorLayer;
|
||||
class QDomNode;
|
||||
|
||||
class QgsFeatureRendererV2;
|
||||
|
||||
#include "qgis.h"
|
||||
|
||||
/** This class is not a part of public API, it is intended only for compatibility with older versions of QGIS (1.x) */
|
||||
class CORE_EXPORT QgsSymbologyV2Conversion
|
||||
{
|
||||
public:
|
||||
|
||||
//! return a symbol in new symbology as close as possible to old symbol
|
||||
//! @note not all properties will be preserved
|
||||
static QgsSymbolV2* symbolV1toV2( const QgsSymbol* s );
|
||||
|
||||
//! return a symbol in old symbology as close as possible to new symbol
|
||||
//! @note not all properties will be preserved
|
||||
static QgsSymbol* symbolV2toV1( QgsSymbolV2* s );
|
||||
|
||||
//! convert layer from old symbology to new symbology
|
||||
//! @note not all properties will be preserved
|
||||
static void rendererV1toV2( QgsVectorLayer* layer );
|
||||
|
||||
//! convert layer from new symbology to old symbology
|
||||
//! @note not all properties will be preserved
|
||||
static void rendererV2toV1( QgsVectorLayer* layer );
|
||||
|
||||
/** Read old renderer definition from XML and create matching new renderer */
|
||||
static QgsFeatureRendererV2* readOldRenderer( const QDomNode& layerNode, QGis::GeometryType geomType );
|
||||
};
|
||||
|
||||
#endif // QGSSYMBOLOGYV2CONVERSION_H
|
||||
|
@ -432,23 +432,6 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
|
||||
{
|
||||
QMap<QString, QString> classes;
|
||||
|
||||
const QgsUniqueValueRenderer *uvr = dynamic_cast<const QgsUniqueValueRenderer *>( vl->renderer() );
|
||||
if ( uvr )
|
||||
{
|
||||
const QList<QgsSymbol *> symbols = uvr->symbols();
|
||||
|
||||
for ( int i = 0; i < symbols.size(); i++ )
|
||||
{
|
||||
QString label = symbols[i]->label();
|
||||
QString name = symbols[i]->lowerValue();
|
||||
|
||||
if ( label == "" )
|
||||
label = name;
|
||||
|
||||
classes.insert( name, label );
|
||||
}
|
||||
}
|
||||
|
||||
const QgsCategorizedSymbolRendererV2 *csr = dynamic_cast<const QgsCategorizedSymbolRendererV2 *>( vl->rendererV2() );
|
||||
if ( csr )
|
||||
{
|
||||
|
@ -100,13 +100,6 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la
|
||||
|
||||
cboRenderers->setCurrentIndex( -1 ); // set no current renderer
|
||||
|
||||
// if the layer doesn't use renderer V2, let's start using it!
|
||||
if ( !mLayer->isUsingRendererV2() )
|
||||
{
|
||||
mLayer->setRendererV2( QgsFeatureRendererV2::defaultRenderer( mLayer->geometryType() ) );
|
||||
mLayer->setUsingRendererV2( true );
|
||||
}
|
||||
|
||||
// setup slot rendererChanged()
|
||||
connect( cboRenderers, SIGNAL( currentIndexChanged( int ) ), this, SLOT( rendererChanged() ) );
|
||||
|
||||
|
@ -277,7 +277,6 @@ QList<QgsMapLayer*> QgsSLDParser::mapLayerFromStyle( const QString& layerName, c
|
||||
{
|
||||
QgsFeatureRendererV2* r = rendererFromUserStyle( userStyleElement, v );
|
||||
v->setRendererV2( r );
|
||||
v->setUsingRendererV2( true );
|
||||
labelSettingsFromUserStyle( userStyleElement, v );
|
||||
#ifdef DIAGRAMSERVER
|
||||
overlaysFromUserStyle( userStyleElement, v );
|
||||
@ -394,7 +393,6 @@ QList<QgsMapLayer*> QgsSLDParser::mapLayerFromStyle( const QString& layerName, c
|
||||
return resultList;
|
||||
}
|
||||
theVectorLayer->setRendererV2( theRenderer );
|
||||
theVectorLayer->setUsingRendererV2( true );
|
||||
QgsDebugMsg( "Returning the vectorlayer" );
|
||||
setOpacityForLayer( userLayerElement, theVectorLayer );
|
||||
resultList.push_back( theVectorLayer );
|
||||
@ -1389,7 +1387,6 @@ QgsVectorLayer* QgsSLDParser::contourLayerFromRaster( const QDomElement& userSty
|
||||
//create renderer
|
||||
QgsFeatureRendererV2* theRenderer = rendererFromUserStyle( userStyleElem, contourLayer );
|
||||
contourLayer->setRendererV2( theRenderer );
|
||||
contourLayer->setUsingRendererV2( true );
|
||||
|
||||
//add labelling if requested
|
||||
labelSettingsFromUserStyle( userStyleElem, contourLayer );
|
||||
|
@ -1291,30 +1291,19 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
|
||||
break;
|
||||
}
|
||||
|
||||
//check if feature is rendered at all
|
||||
if ( layer->isUsingRendererV2() )
|
||||
QgsFeatureRendererV2* r2 = layer->rendererV2();
|
||||
if ( !r2 )
|
||||
{
|
||||
QgsFeatureRendererV2* r2 = layer->rendererV2();
|
||||
if ( !r2 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
r2->startRender( renderContext, layer );
|
||||
bool renderV2 = r2->willRenderFeature( feature );
|
||||
r2->stopRender( renderContext );
|
||||
if ( !renderV2 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
|
||||
//check if feature is rendered at all
|
||||
r2->startRender( renderContext, layer );
|
||||
bool renderV2 = r2->willRenderFeature( feature );
|
||||
r2->stopRender( renderContext );
|
||||
if ( !renderV2 )
|
||||
{
|
||||
QgsRenderer* r = const_cast<QgsRenderer*>( layer->renderer() ); //bad, 'willRenderFeature' should be const
|
||||
if ( !r || !r->willRenderFeature( &feature ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
QDomElement featureElement = infoDocument.createElement( "Feature" );
|
||||
@ -2114,23 +2103,16 @@ void QgsWMSServer::applyOpacities( const QStringList& layerList, QList< QPair< Q
|
||||
if ( ml->type() == QgsMapLayer::VectorLayer )
|
||||
{
|
||||
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( ml );
|
||||
if ( vl && vl->isUsingRendererV2() )
|
||||
|
||||
QgsFeatureRendererV2* rendererV2 = vl->rendererV2();
|
||||
//backup old renderer
|
||||
vectorRenderers.push_back( qMakePair( vl, rendererV2->clone() ) );
|
||||
//modify symbols of current renderer
|
||||
QgsSymbolV2List symbolList = rendererV2->symbols();
|
||||
QgsSymbolV2List::iterator symbolIt = symbolList.begin();
|
||||
for ( ; symbolIt != symbolList.end(); ++symbolIt )
|
||||
{
|
||||
QgsFeatureRendererV2* rendererV2 = vl->rendererV2();
|
||||
//backup old renderer
|
||||
vectorRenderers.push_back( qMakePair( vl, rendererV2->clone() ) );
|
||||
//modify symbols of current renderer
|
||||
QgsSymbolV2List symbolList = rendererV2->symbols();
|
||||
QgsSymbolV2List::iterator symbolIt = symbolList.begin();
|
||||
for ( ; symbolIt != symbolList.end(); ++symbolIt )
|
||||
{
|
||||
( *symbolIt )->setAlpha(( *symbolIt )->alpha() * opacityRatio );
|
||||
}
|
||||
}
|
||||
else //old symbology
|
||||
{
|
||||
vectorOld.push_back( qMakePair( vl, vl->getTransparency() ) );
|
||||
vl->setTransparency( opacity );
|
||||
( *symbolIt )->setAlpha(( *symbolIt )->alpha() * opacityRatio );
|
||||
}
|
||||
|
||||
//labeling
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>850</width>
|
||||
<height>580</height>
|
||||
<width>848</width>
|
||||
<height>578</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
@ -266,8 +266,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>654</width>
|
||||
<height>642</height>
|
||||
<width>663</width>
|
||||
<height>564</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_28">
|
||||
@ -912,8 +912,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>611</width>
|
||||
<height>808</height>
|
||||
<width>663</width>
|
||||
<height>757</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_22">
|
||||
@ -1248,8 +1248,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>559</width>
|
||||
<height>417</height>
|
||||
<width>680</width>
|
||||
<height>511</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_27">
|
||||
@ -1567,8 +1567,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>615</width>
|
||||
<height>781</height>
|
||||
<width>663</width>
|
||||
<height>635</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||
@ -1668,22 +1668,6 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Compatibility</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="chkUseSymbologyNG">
|
||||
<property name="text">
|
||||
<string>Use new generation symbology for rendering</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_14">
|
||||
<property name="title">
|
||||
@ -2098,8 +2082,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>474</width>
|
||||
<height>390</height>
|
||||
<width>452</width>
|
||||
<height>357</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_25">
|
||||
@ -2433,8 +2417,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>556</width>
|
||||
<height>712</height>
|
||||
<width>491</width>
|
||||
<height>636</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_30">
|
||||
@ -2825,8 +2809,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>517</width>
|
||||
<height>642</height>
|
||||
<width>442</width>
|
||||
<height>574</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_31">
|
||||
@ -3326,8 +3310,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>537</width>
|
||||
<height>361</height>
|
||||
<width>426</width>
|
||||
<height>336</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
@ -3466,8 +3450,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>614</width>
|
||||
<height>393</height>
|
||||
<width>582</width>
|
||||
<height>352</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_15">
|
||||
@ -3647,8 +3631,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>300</width>
|
||||
<height>248</height>
|
||||
<width>268</width>
|
||||
<height>207</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_32">
|
||||
@ -3747,8 +3731,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>521</width>
|
||||
<height>650</height>
|
||||
<width>663</width>
|
||||
<height>553</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_33">
|
||||
|
Loading…
x
Reference in New Issue
Block a user