static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp ) { // sort the categories first //TODO: make the order configurable? QgsSymbolLayerV2Utils::sortVariantList( values, Qt::AscendingOrder ); int num = values.count(); bool hasNull = false; for ( int i = 0; i < num; i++ ) { QVariant value = values[i]; if ( value.toString().isNull() ) { hasNull = true; } double x = i / ( double ) num; QgsSymbolV2* newSymbol = symbol->clone(); newSymbol->setColor( ramp->color( x ) ); cats.append( QgsRendererCategoryV2( value, newSymbol, value.toString() ) ); } // add null (default) value if not exists if ( !hasNull ) { QgsSymbolV2* newSymbol = symbol->clone(); newSymbol->setColor( ramp->color( 1 ) ); cats.append( QgsRendererCategoryV2( QVariant( "" ), newSymbol, QString() ) ); } }
static QgsFeatureRenderer* readOldUniqueValueRenderer( const QDomNode& rnode, QgsWkbTypes::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() ) { QgsSymbol* symbol = readOldSymbol( symbolnode, geomType ); if ( symbol ) { QgsOldSymbolMeta meta = readSymbolMeta( symbolnode ); QVariant value = QVariant( meta.lowerValue ); QString label = meta.label; if ( label.isEmpty() ) label = value.toString(); cats.append( QgsRendererCategory( value, symbol, label, true ) ); } symbolnode = symbolnode.nextSibling(); } QgsCategorizedSymbolRenderer* r = new QgsCategorizedSymbolRenderer( classificationField, cats ); // source symbol and color ramp are not set (unknown) return r; }
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element ) { QDomElement symbolsElem = element.firstChildElement( "symbols" ); if ( symbolsElem.isNull() ) return NULL; QDomElement catsElem = element.firstChildElement( "categories" ); if ( catsElem.isNull() ) return NULL; QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem ); QgsCategoryList cats; QDomElement catElem = catsElem.firstChildElement(); while ( !catElem.isNull() ) { if ( catElem.tagName() == "category" ) { QVariant value = QVariant( catElem.attribute( "value" ) ); QString symbolName = catElem.attribute( "symbol" ); QString label = catElem.attribute( "label" ); if ( symbolMap.contains( symbolName ) ) { QgsSymbolV2* symbol = symbolMap.take( symbolName ); cats.append( QgsRendererCategoryV2( value, symbol, label ) ); } } catElem = catElem.nextSiblingElement(); } QString attrName = element.attribute( "attr" ); QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( attrName, cats ); // delete symbols if there are any more QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap ); // try to load source symbol (optional) QDomElement sourceSymbolElem = element.firstChildElement( "source-symbol" ); if ( !sourceSymbolElem.isNull() ) { QgsSymbolV2Map sourceSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( sourceSymbolElem ); if ( sourceSymbolMap.contains( "0" ) ) { r->setSourceSymbol( sourceSymbolMap.take( "0" ) ); } QgsSymbolLayerV2Utils::clearSymbolMap( sourceSymbolMap ); } // try to load color ramp (optional) QDomElement sourceColorRampElem = element.firstChildElement( "colorramp" ); if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" ) { r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) ); QDomElement invertedColorRampElem = element.firstChildElement( "invertedcolorramp" ); if ( !invertedColorRampElem.isNull() ) r->setInvertedColorRamp( invertedColorRampElem.attribute( "value" ) == "1" ); } QDomElement rotationElem = element.firstChildElement( "rotation" ); if ( !rotationElem.isNull() ) r->setRotationField( rotationElem.attribute( "field" ) ); QDomElement sizeScaleElem = element.firstChildElement( "sizescale" ); if ( !sizeScaleElem.isNull() ) { r->setSizeScaleField( sizeScaleElem.attribute( "field" ) ); r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) ); } // TODO: symbol levels return r; }
void QgsCategorizedSymbolRendererV2Widget::addCategories() { QString attrName = cboCategorizedColumn->currentText(); int idx = mLayer->fieldNameIndex( attrName ); QList<QVariant> unique_vals; mLayer->uniqueValues( idx, unique_vals ); //DlgAddCategories dlg(mStyle, createDefaultSymbol(), unique_vals, this); //if (!dlg.exec()) // return; QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp(); if ( ramp == NULL ) { if ( cboCategorizedColorRamp->count() == 0 ) QMessageBox::critical( this, tr( "Error" ), tr( "There are no available color ramps. You can add them in Style Manager." ) ); else QMessageBox::critical( this, tr( "Error" ), tr( "The selected color ramp is not available." ) ); return; } QgsCategoryList cats; _createCategories( cats, unique_vals, mCategorizedSymbol, ramp ); bool deleteExisting = false; if ( !mOldClassificationAttribute.isEmpty() && attrName != mOldClassificationAttribute && mRenderer->categories().count() > 0 ) { int res = QMessageBox::question( this, tr( "Confirm Delete" ), tr( "The classification field was changed from '%1' to '%2'.\n" "Should the existing classes be deleted before classification?" ) .arg( mOldClassificationAttribute ).arg( attrName ), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel ); if ( res == QMessageBox::Cancel ) { return; } deleteExisting = ( res == QMessageBox::Yes ); } if ( !deleteExisting ) { QgsCategoryList prevCats = mRenderer->categories(); for ( int i = 0; i < cats.size(); ++i ) { bool contains = false; QVariant value = cats.at( i ).value(); for ( int j = 0; j < prevCats.size() && !contains; ++j ) { if ( prevCats.at( j ).value() == value ) { contains = true; break; } } if ( !contains ) prevCats.append( cats.at( i ) ); } cats = prevCats; } mOldClassificationAttribute = attrName; // TODO: if not all categories are desired, delete some! /* if (not dlg.readAllCats.isChecked()) { cats2 = {} for item in dlg.listCategories.selectedItems(): for k,c in cats.iteritems(): if item.text() == k.toString(): break cats2[k] = c cats = cats2 } */ // recreate renderer delete mRenderer; mRenderer = new QgsCategorizedSymbolRendererV2( attrName, cats ); mRenderer->setSourceSymbol( mCategorizedSymbol->clone() ); mRenderer->setSourceColorRamp( ramp->clone() ); populateCategories(); }
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element ) { QDomElement symbolsElem = element.firstChildElement( "symbols" ); if ( symbolsElem.isNull() ) return NULL; QDomElement catsElem = element.firstChildElement( "categories" ); if ( catsElem.isNull() ) return NULL; QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem ); QgsCategoryList cats; QDomElement catElem = catsElem.firstChildElement(); while ( !catElem.isNull() ) { if ( catElem.tagName() == "category" ) { QVariant value = QVariant( catElem.attribute( "value" ) ); QString symbolName = catElem.attribute( "symbol" ); QString label = catElem.attribute( "label" ); bool render = catElem.attribute( "render" ) != "false"; if ( symbolMap.contains( symbolName ) ) { QgsSymbolV2* symbol = symbolMap.take( symbolName ); cats.append( QgsRendererCategoryV2( value, symbol, label, render ) ); } } catElem = catElem.nextSiblingElement(); } QString attrName = element.attribute( "attr" ); QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( attrName, cats ); // delete symbols if there are any more QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap ); // try to load source symbol (optional) QDomElement sourceSymbolElem = element.firstChildElement( "source-symbol" ); if ( !sourceSymbolElem.isNull() ) { QgsSymbolV2Map sourceSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( sourceSymbolElem ); if ( sourceSymbolMap.contains( "0" ) ) { r->setSourceSymbol( sourceSymbolMap.take( "0" ) ); } QgsSymbolLayerV2Utils::clearSymbolMap( sourceSymbolMap ); } // try to load color ramp (optional) QDomElement sourceColorRampElem = element.firstChildElement( "colorramp" ); if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" ) { r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) ); QDomElement invertedColorRampElem = element.firstChildElement( "invertedcolorramp" ); if ( !invertedColorRampElem.isNull() ) r->setInvertedColorRamp( invertedColorRampElem.attribute( "value" ) == "1" ); } QDomElement rotationElem = element.firstChildElement( "rotation" ); if ( !rotationElem.isNull() && !rotationElem.attribute( "field" ).isEmpty() ) { QgsCategoryList::iterator it = r->mCategories.begin(); for ( ; it != r->mCategories.end(); ++it ) { convertSymbolRotation( it->symbol(), rotationElem.attribute( "field" ) ); } if ( r->mSourceSymbol.data() ) { convertSymbolRotation( r->mSourceSymbol.data(), rotationElem.attribute( "field" ) ); } } QDomElement sizeScaleElem = element.firstChildElement( "sizescale" ); if ( !sizeScaleElem.isNull() && !sizeScaleElem.attribute( "field" ).isEmpty() ) { QgsCategoryList::iterator it = r->mCategories.begin(); for ( ; it != r->mCategories.end(); ++it ) { convertSymbolSizeScale( it->symbol(), QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ), sizeScaleElem.attribute( "field" ) ); } if ( r->mSourceSymbol.data() && r->mSourceSymbol->type() == QgsSymbolV2::Marker ) { convertSymbolSizeScale( r->mSourceSymbol.data(), QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ), sizeScaleElem.attribute( "field" ) ); } } // TODO: symbol levels return r; }