|
QGIS API Documentation
master-59fd5e0
|
00001 /*************************************************************************** 00002 qgscategorizedsymbolrendererv2.cpp 00003 --------------------- 00004 begin : November 2009 00005 copyright : (C) 2009 by Martin Dobias 00006 email : wonder dot sk at gmail dot 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 <algorithm> 00016 00017 #include "qgscategorizedsymbolrendererv2.h" 00018 00019 #include "qgssymbolv2.h" 00020 #include "qgssymbollayerv2utils.h" 00021 #include "qgsvectorcolorrampv2.h" 00022 00023 #include "qgsfeature.h" 00024 #include "qgsvectorlayer.h" 00025 #include "qgslogger.h" 00026 00027 #include <QDomDocument> 00028 #include <QDomElement> 00029 #include <QSettings> // for legend 00030 00031 QgsRendererCategoryV2::QgsRendererCategoryV2() 00032 : mValue(), mSymbol( 0 ), mLabel() 00033 { 00034 } 00035 00036 QgsRendererCategoryV2::QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label ) 00037 : mValue( value ), mSymbol( symbol ), mLabel( label ) 00038 { 00039 } 00040 00041 QgsRendererCategoryV2::QgsRendererCategoryV2( const QgsRendererCategoryV2& cat ) 00042 : mValue( cat.mValue ), mSymbol( 0 ), mLabel( cat.mLabel ) 00043 { 00044 if ( cat.mSymbol ) 00045 { 00046 mSymbol = cat.mSymbol->clone(); 00047 } 00048 } 00049 00050 QgsRendererCategoryV2::~QgsRendererCategoryV2() 00051 { 00052 if ( mSymbol ) delete mSymbol; 00053 } 00054 00055 QgsRendererCategoryV2& QgsRendererCategoryV2::operator=( const QgsRendererCategoryV2 & cat ) 00056 { 00057 mValue = cat.mValue; 00058 mLabel = cat.mLabel; 00059 mSymbol = 0; 00060 if ( cat.mSymbol ) 00061 { 00062 mSymbol = cat.mSymbol->clone(); 00063 } 00064 return *this; 00065 } 00066 00067 QVariant QgsRendererCategoryV2::value() const 00068 { 00069 return mValue; 00070 } 00071 00072 QgsSymbolV2* QgsRendererCategoryV2::symbol() const 00073 { 00074 return mSymbol; 00075 } 00076 00077 QString QgsRendererCategoryV2::label() const 00078 { 00079 return mLabel; 00080 } 00081 00082 void QgsRendererCategoryV2::setValue( const QVariant &value ) 00083 { 00084 mValue = value; 00085 } 00086 00087 void QgsRendererCategoryV2::setSymbol( QgsSymbolV2* s ) 00088 { 00089 if ( mSymbol == s ) 00090 return; 00091 delete mSymbol; 00092 mSymbol = s; 00093 } 00094 00095 void QgsRendererCategoryV2::setLabel( const QString &label ) 00096 { 00097 mLabel = label; 00098 } 00099 00100 QString QgsRendererCategoryV2::dump() 00101 { 00102 return QString( "%1::%2::%3\n" ).arg( mValue.toString() ).arg( mLabel ).arg( mSymbol->dump() ); 00103 } 00104 00105 void QgsRendererCategoryV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const 00106 { 00107 if ( !mSymbol || props.value( "attribute", "" ).isEmpty() ) 00108 return; 00109 00110 QString attrName = props[ "attribute" ]; 00111 00112 QDomElement ruleElem = doc.createElement( "se:Rule" ); 00113 element.appendChild( ruleElem ); 00114 00115 QDomElement nameElem = doc.createElement( "se:Name" ); 00116 nameElem.appendChild( doc.createTextNode( mLabel ) ); 00117 ruleElem.appendChild( nameElem ); 00118 00119 QDomElement descrElem = doc.createElement( "se:Description" ); 00120 QDomElement titleElem = doc.createElement( "se:Title" ); 00121 QString descrStr = QString( "%1 is '%2'" ).arg( attrName ).arg( mValue.toString() ); 00122 titleElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) ); 00123 descrElem.appendChild( titleElem ); 00124 ruleElem.appendChild( descrElem ); 00125 00126 // create the ogc:Filter for the range 00127 QDomElement filterElem = doc.createElement( "ogc:Filter" ); 00128 QString filterFunc = QString( "%1 = '%2'" ) 00129 .arg( attrName.replace( "\"", "\"\"" ) ) 00130 .arg( mValue.toString().replace( "'", "''" ) ); 00131 QgsSymbolLayerV2Utils::createFunctionElement( doc, filterElem, filterFunc ); 00132 ruleElem.appendChild( filterElem ); 00133 00134 mSymbol->toSld( doc, ruleElem, props ); 00135 } 00136 00138 00139 QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2( QString attrName, QgsCategoryList categories ) 00140 : QgsFeatureRendererV2( "categorizedSymbol" ), 00141 mAttrName( attrName ), 00142 mCategories( categories ), 00143 mSourceSymbol( NULL ), 00144 mSourceColorRamp( NULL ), 00145 mScaleMethod( DEFAULT_SCALE_METHOD ), 00146 mRotationFieldIdx( -1 ), 00147 mSizeScaleFieldIdx( -1 ) 00148 { 00149 for ( int i = 0; i < mCategories.count(); ++i ) 00150 { 00151 QgsRendererCategoryV2& cat = mCategories[i]; 00152 if ( cat.symbol() == NULL ) 00153 { 00154 QgsDebugMsg( "invalid symbol in a category! ignoring..." ); 00155 mCategories.removeAt( i-- ); 00156 } 00157 //mCategories.insert(cat.value().toString(), cat); 00158 } 00159 } 00160 00161 QgsCategorizedSymbolRendererV2::~QgsCategorizedSymbolRendererV2() 00162 { 00163 mCategories.clear(); // this should also call destructors of symbols 00164 delete mSourceSymbol; 00165 delete mSourceColorRamp; 00166 } 00167 00168 void QgsCategorizedSymbolRendererV2::rebuildHash() 00169 { 00170 mSymbolHash.clear(); 00171 00172 for ( int i = 0; i < mCategories.count(); ++i ) 00173 { 00174 QgsRendererCategoryV2& cat = mCategories[i]; 00175 mSymbolHash.insert( cat.value().toString(), cat.symbol() ); 00176 } 00177 } 00178 00179 QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue( QVariant value ) 00180 { 00181 // TODO: special case for int, double 00182 QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find( value.toString() ); 00183 if ( it == mSymbolHash.end() ) 00184 { 00185 if ( mSymbolHash.count() == 0 ) 00186 { 00187 QgsDebugMsg( "there are no hashed symbols!!!" ); 00188 } 00189 else 00190 { 00191 QgsDebugMsg( "attribute value not found: " + value.toString() ); 00192 } 00193 return NULL; 00194 } 00195 00196 return *it; 00197 } 00198 00199 QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature ) 00200 { 00201 const QgsAttributes& attrs = feature.attributes(); 00202 if ( mAttrNum < 0 || mAttrNum >= attrs.count() ) 00203 { 00204 QgsDebugMsg( "attribute '" + mAttrName + "' (index " + QString::number( mAttrNum ) + ") required by renderer not found" ); 00205 return NULL; 00206 } 00207 00208 // find the right symbol for the category 00209 QgsSymbolV2* symbol = symbolForValue( attrs[mAttrNum] ); 00210 if ( symbol == NULL ) 00211 { 00212 // if no symbol found use default one 00213 return symbolForValue( QVariant( "" ) ); 00214 } 00215 00216 if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) 00217 return symbol; // no data-defined rotation/scaling - just return the symbol 00218 00219 // find out rotation, size scale 00220 double rotation = 0; 00221 double sizeScale = 1; 00222 if ( mRotationFieldIdx != -1 ) 00223 rotation = attrs[mRotationFieldIdx].toDouble(); 00224 if ( mSizeScaleFieldIdx != -1 ) 00225 sizeScale = attrs[mSizeScaleFieldIdx].toDouble(); 00226 00227 // take a temporary symbol (or create it if doesn't exist) 00228 QgsSymbolV2* tempSymbol = mTempSymbols[attrs[mAttrNum].toString()]; 00229 00230 // modify the temporary symbol and return it 00231 if ( tempSymbol->type() == QgsSymbolV2::Marker ) 00232 { 00233 QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol ); 00234 if ( mRotationFieldIdx != -1 ) 00235 markerSymbol->setAngle( rotation ); 00236 if ( mSizeScaleFieldIdx != -1 ) 00237 markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() ); 00238 markerSymbol->setScaleMethod( mScaleMethod ); 00239 } 00240 else if ( tempSymbol->type() == QgsSymbolV2::Line ) 00241 { 00242 QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol ); 00243 if ( mSizeScaleFieldIdx != -1 ) 00244 lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() ); 00245 } 00246 00247 return tempSymbol; 00248 } 00249 00250 int QgsCategorizedSymbolRendererV2::categoryIndexForValue( QVariant val ) 00251 { 00252 for ( int i = 0; i < mCategories.count(); i++ ) 00253 { 00254 if ( mCategories[i].value() == val ) 00255 return i; 00256 } 00257 return -1; 00258 } 00259 00260 bool QgsCategorizedSymbolRendererV2::updateCategoryValue( int catIndex, const QVariant &value ) 00261 { 00262 if ( catIndex < 0 || catIndex >= mCategories.size() ) 00263 return false; 00264 mCategories[catIndex].setValue( value ); 00265 return true; 00266 } 00267 00268 bool QgsCategorizedSymbolRendererV2::updateCategorySymbol( int catIndex, QgsSymbolV2* symbol ) 00269 { 00270 if ( catIndex < 0 || catIndex >= mCategories.size() ) 00271 return false; 00272 mCategories[catIndex].setSymbol( symbol ); 00273 return true; 00274 } 00275 00276 bool QgsCategorizedSymbolRendererV2::updateCategoryLabel( int catIndex, QString label ) 00277 { 00278 if ( catIndex < 0 || catIndex >= mCategories.size() ) 00279 return false; 00280 mCategories[catIndex].setLabel( label ); 00281 return true; 00282 } 00283 00284 void QgsCategorizedSymbolRendererV2::addCategory( const QgsRendererCategoryV2 &cat ) 00285 { 00286 if ( cat.symbol() == NULL ) 00287 { 00288 QgsDebugMsg( "invalid symbol in a category! ignoring..." ); 00289 } 00290 else 00291 { 00292 mCategories.append( cat ); 00293 } 00294 } 00295 00296 bool QgsCategorizedSymbolRendererV2::deleteCategory( int catIndex ) 00297 { 00298 if ( catIndex < 0 || catIndex >= mCategories.size() ) 00299 return false; 00300 00301 mCategories.removeAt( catIndex ); 00302 return true; 00303 } 00304 00305 void QgsCategorizedSymbolRendererV2::deleteAllCategories() 00306 { 00307 mCategories.clear(); 00308 } 00309 00310 void QgsCategorizedSymbolRendererV2::moveCategory( int from, int to ) 00311 { 00312 if ( from < 0 || from >= mCategories.size() || to < 0 || to >= mCategories.size() ) return; 00313 mCategories.move( from, to ); 00314 } 00315 00316 bool valueLessThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 ) 00317 { 00318 return qgsVariantLessThan( c1.value(), c2.value() ); 00319 } 00320 bool valueGreaterThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 ) 00321 { 00322 return qgsVariantGreaterThan( c1.value(), c2.value() ); 00323 } 00324 00325 void QgsCategorizedSymbolRendererV2::sortByValue( Qt::SortOrder order ) 00326 { 00327 if ( order == Qt::AscendingOrder ) 00328 { 00329 qSort( mCategories.begin(), mCategories.end(), valueLessThan ); 00330 } 00331 else 00332 { 00333 qSort( mCategories.begin(), mCategories.end(), valueGreaterThan ); 00334 } 00335 } 00336 00337 bool labelLessThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 ) 00338 { 00339 return QString::localeAwareCompare( c1.label(), c2.label() ) < 0; 00340 } 00341 00342 bool labelGreaterThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 ) 00343 { 00344 return !labelLessThan( c1, c2 ); 00345 } 00346 00347 void QgsCategorizedSymbolRendererV2::sortByLabel( Qt::SortOrder order ) 00348 { 00349 if ( order == Qt::AscendingOrder ) 00350 { 00351 qSort( mCategories.begin(), mCategories.end(), labelLessThan ); 00352 } 00353 else 00354 { 00355 qSort( mCategories.begin(), mCategories.end(), labelGreaterThan ); 00356 } 00357 } 00358 00359 void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) 00360 { 00361 // make sure that the hash table is up to date 00362 rebuildHash(); 00363 00364 // find out classification attribute index from name 00365 mAttrNum = vlayer ? vlayer->fieldNameIndex( mAttrName ) : -1; 00366 00367 mRotationFieldIdx = ( mRotationField.isEmpty() ? -1 : vlayer->fieldNameIndex( mRotationField ) ); 00368 mSizeScaleFieldIdx = ( mSizeScaleField.isEmpty() ? -1 : vlayer->fieldNameIndex( mSizeScaleField ) ); 00369 00370 QgsCategoryList::iterator it = mCategories.begin(); 00371 for ( ; it != mCategories.end(); ++it ) 00372 { 00373 it->symbol()->startRender( context, vlayer ); 00374 00375 if ( mRotationFieldIdx != -1 || mSizeScaleFieldIdx != -1 ) 00376 { 00377 QgsSymbolV2* tempSymbol = it->symbol()->clone(); 00378 tempSymbol->setRenderHints(( mRotationFieldIdx != -1 ? QgsSymbolV2::DataDefinedRotation : 0 ) | 00379 ( mSizeScaleFieldIdx != -1 ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); 00380 tempSymbol->startRender( context, vlayer ); 00381 mTempSymbols[ it->value().toString()] = tempSymbol; 00382 } 00383 } 00384 00385 } 00386 00387 void QgsCategorizedSymbolRendererV2::stopRender( QgsRenderContext& context ) 00388 { 00389 QgsCategoryList::iterator it = mCategories.begin(); 00390 for ( ; it != mCategories.end(); ++it ) 00391 it->symbol()->stopRender( context ); 00392 00393 // cleanup mTempSymbols 00394 QHash<QString, QgsSymbolV2*>::iterator it2 = mTempSymbols.begin(); 00395 for ( ; it2 != mTempSymbols.end(); ++it2 ) 00396 { 00397 it2.value()->stopRender( context ); 00398 delete it2.value(); 00399 } 00400 mTempSymbols.clear(); 00401 } 00402 00403 QList<QString> QgsCategorizedSymbolRendererV2::usedAttributes() 00404 { 00405 QSet<QString> attributes; 00406 attributes.insert( mAttrName ); 00407 if ( !mRotationField.isEmpty() ) 00408 { 00409 attributes.insert( mRotationField ); 00410 } 00411 if ( !mSizeScaleField.isEmpty() ) 00412 { 00413 attributes.insert( mSizeScaleField ); 00414 } 00415 00416 QgsCategoryList::const_iterator catIt = mCategories.constBegin(); 00417 for ( ; catIt != mCategories.constEnd(); ++catIt ) 00418 { 00419 QgsSymbolV2* catSymbol = catIt->symbol(); 00420 if ( catSymbol ) 00421 { 00422 attributes.unite( catSymbol->usedAttributes() ); 00423 } 00424 } 00425 return attributes.toList(); 00426 } 00427 00428 QString QgsCategorizedSymbolRendererV2::dump() 00429 { 00430 QString s = QString( "CATEGORIZED: idx %1\n" ).arg( mAttrName ); 00431 for ( int i = 0; i < mCategories.count(); i++ ) 00432 s += mCategories[i].dump(); 00433 return s; 00434 } 00435 00436 QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() 00437 { 00438 QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories ); 00439 if ( mSourceSymbol ) 00440 r->setSourceSymbol( mSourceSymbol->clone() ); 00441 if ( mSourceColorRamp ) 00442 r->setSourceColorRamp( mSourceColorRamp->clone() ); 00443 r->setUsingSymbolLevels( usingSymbolLevels() ); 00444 r->setRotationField( rotationField() ); 00445 r->setSizeScaleField( sizeScaleField() ); 00446 r->setScaleMethod( scaleMethod() ); 00447 return r; 00448 } 00449 00450 void QgsCategorizedSymbolRendererV2::toSld( QDomDocument &doc, QDomElement &element ) const 00451 { 00452 QgsStringMap props; 00453 props[ "attribute" ] = mAttrName; 00454 if ( !mRotationField.isEmpty() ) 00455 props[ "angle" ] = QString( mRotationField ).append( "\"" ).prepend( "\"" ); 00456 if ( !mSizeScaleField.isEmpty() ) 00457 props[ "scale" ] = QString( mSizeScaleField ).append( "\"" ).prepend( "\"" ); 00458 00459 // create a Rule for each range 00460 for ( QgsCategoryList::const_iterator it = mCategories.constBegin(); it != mCategories.constEnd(); it++ ) 00461 { 00462 QgsStringMap catProps( props ); 00463 it->toSld( doc, element, catProps ); 00464 } 00465 } 00466 00467 QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols() 00468 { 00469 QgsSymbolV2List lst; 00470 for ( int i = 0; i < mCategories.count(); i++ ) 00471 lst.append( mCategories[i].symbol() ); 00472 return lst; 00473 } 00474 00475 QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element ) 00476 { 00477 QDomElement symbolsElem = element.firstChildElement( "symbols" ); 00478 if ( symbolsElem.isNull() ) 00479 return NULL; 00480 00481 QDomElement catsElem = element.firstChildElement( "categories" ); 00482 if ( catsElem.isNull() ) 00483 return NULL; 00484 00485 QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem ); 00486 QgsCategoryList cats; 00487 00488 QDomElement catElem = catsElem.firstChildElement(); 00489 while ( !catElem.isNull() ) 00490 { 00491 if ( catElem.tagName() == "category" ) 00492 { 00493 QVariant value = QVariant( catElem.attribute( "value" ) ); 00494 QString symbolName = catElem.attribute( "symbol" ); 00495 QString label = catElem.attribute( "label" ); 00496 if ( symbolMap.contains( symbolName ) ) 00497 { 00498 QgsSymbolV2* symbol = symbolMap.take( symbolName ); 00499 cats.append( QgsRendererCategoryV2( value, symbol, label ) ); 00500 } 00501 } 00502 catElem = catElem.nextSiblingElement(); 00503 } 00504 00505 QString attrName = element.attribute( "attr" ); 00506 00507 QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( attrName, cats ); 00508 00509 // delete symbols if there are any more 00510 QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap ); 00511 00512 // try to load source symbol (optional) 00513 QDomElement sourceSymbolElem = element.firstChildElement( "source-symbol" ); 00514 if ( !sourceSymbolElem.isNull() ) 00515 { 00516 QgsSymbolV2Map sourceSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( sourceSymbolElem ); 00517 if ( sourceSymbolMap.contains( "0" ) ) 00518 { 00519 r->setSourceSymbol( sourceSymbolMap.take( "0" ) ); 00520 } 00521 QgsSymbolLayerV2Utils::clearSymbolMap( sourceSymbolMap ); 00522 } 00523 00524 // try to load color ramp (optional) 00525 QDomElement sourceColorRampElem = element.firstChildElement( "colorramp" ); 00526 if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" ) 00527 { 00528 r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) ); 00529 } 00530 00531 QDomElement rotationElem = element.firstChildElement( "rotation" ); 00532 if ( !rotationElem.isNull() ) 00533 r->setRotationField( rotationElem.attribute( "field" ) ); 00534 00535 QDomElement sizeScaleElem = element.firstChildElement( "sizescale" ); 00536 if ( !sizeScaleElem.isNull() ) 00537 { 00538 r->setSizeScaleField( sizeScaleElem.attribute( "field" ) ); 00539 r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) ); 00540 } 00541 00542 // TODO: symbol levels 00543 return r; 00544 } 00545 00546 QDomElement QgsCategorizedSymbolRendererV2::save( QDomDocument& doc ) 00547 { 00548 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME ); 00549 rendererElem.setAttribute( "type", "categorizedSymbol" ); 00550 rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) ); 00551 rendererElem.setAttribute( "attr", mAttrName ); 00552 00553 // categories 00554 int i = 0; 00555 QgsSymbolV2Map symbols; 00556 QDomElement catsElem = doc.createElement( "categories" ); 00557 QgsCategoryList::const_iterator it = mCategories.constBegin(); 00558 for ( ; it != mCategories.end(); it++ ) 00559 { 00560 const QgsRendererCategoryV2& cat = *it; 00561 QString symbolName = QString::number( i ); 00562 symbols.insert( symbolName, cat.symbol() ); 00563 00564 QDomElement catElem = doc.createElement( "category" ); 00565 catElem.setAttribute( "value", cat.value().toString() ); 00566 catElem.setAttribute( "symbol", symbolName ); 00567 catElem.setAttribute( "label", cat.label() ); 00568 catsElem.appendChild( catElem ); 00569 i++; 00570 } 00571 00572 rendererElem.appendChild( catsElem ); 00573 00574 // save symbols 00575 QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( symbols, "symbols", doc ); 00576 rendererElem.appendChild( symbolsElem ); 00577 00578 // save source symbol 00579 if ( mSourceSymbol ) 00580 { 00581 QgsSymbolV2Map sourceSymbols; 00582 sourceSymbols.insert( "0", mSourceSymbol ); 00583 QDomElement sourceSymbolElem = QgsSymbolLayerV2Utils::saveSymbols( sourceSymbols, "source-symbol", doc ); 00584 rendererElem.appendChild( sourceSymbolElem ); 00585 } 00586 00587 // save source color ramp 00588 if ( mSourceColorRamp ) 00589 { 00590 QDomElement colorRampElem = QgsSymbolLayerV2Utils::saveColorRamp( "[source]", mSourceColorRamp, doc ); 00591 rendererElem.appendChild( colorRampElem ); 00592 } 00593 00594 QDomElement rotationElem = doc.createElement( "rotation" ); 00595 rotationElem.setAttribute( "field", mRotationField ); 00596 rendererElem.appendChild( rotationElem ); 00597 00598 QDomElement sizeScaleElem = doc.createElement( "sizescale" ); 00599 sizeScaleElem.setAttribute( "field", mSizeScaleField ); 00600 sizeScaleElem.setAttribute( "scalemethod", QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ) ); 00601 rendererElem.appendChild( sizeScaleElem ); 00602 00603 return rendererElem; 00604 } 00605 00606 QgsLegendSymbologyList QgsCategorizedSymbolRendererV2::legendSymbologyItems( QSize iconSize ) 00607 { 00608 QSettings settings; 00609 bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool(); 00610 00611 QgsLegendSymbologyList lst; 00612 if ( showClassifiers ) 00613 { 00614 lst << qMakePair( classAttribute(), QPixmap() ); 00615 } 00616 00617 int count = categories().count(); 00618 for ( int i = 0; i < count; i++ ) 00619 { 00620 const QgsRendererCategoryV2& cat = categories()[i]; 00621 QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( cat.symbol(), iconSize ); 00622 lst << qMakePair( cat.label(), pix ); 00623 } 00624 return lst; 00625 } 00626 00627 QgsLegendSymbolList QgsCategorizedSymbolRendererV2::legendSymbolItems() 00628 { 00629 QSettings settings; 00630 bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool(); 00631 00632 QgsLegendSymbolList lst; 00633 if ( showClassifiers ) 00634 { 00635 lst << qMakePair( classAttribute(), ( QgsSymbolV2* )0 ); 00636 } 00637 00638 foreach ( const QgsRendererCategoryV2& cat, mCategories ) 00639 { 00640 lst << qMakePair( cat.label(), cat.symbol() ); 00641 } 00642 return lst; 00643 } 00644 00645 00646 QgsSymbolV2* QgsCategorizedSymbolRendererV2::sourceSymbol() 00647 { 00648 return mSourceSymbol; 00649 } 00650 void QgsCategorizedSymbolRendererV2::setSourceSymbol( QgsSymbolV2* sym ) 00651 { 00652 delete mSourceSymbol; 00653 mSourceSymbol = sym; 00654 } 00655 00656 QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2::sourceColorRamp() 00657 { 00658 return mSourceColorRamp; 00659 } 00660 void QgsCategorizedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ramp ) 00661 { 00662 delete mSourceColorRamp; 00663 mSourceColorRamp = ramp; 00664 } 00665 00666 void QgsCategorizedSymbolRendererV2::updateSymbols( QgsSymbolV2 * sym ) 00667 { 00668 int i = 0; 00669 foreach ( QgsRendererCategoryV2 cat, mCategories ) 00670 { 00671 QgsSymbolV2* symbol = sym->clone(); 00672 symbol->setColor( cat.symbol()->color() ); 00673 updateCategorySymbol( i, symbol ); 00674 ++i; 00675 } 00676 } 00677 00678 void QgsCategorizedSymbolRendererV2::setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) 00679 { 00680 mScaleMethod = scaleMethod; 00681 QgsCategoryList::const_iterator catIt = mCategories.constBegin(); 00682 for ( ; catIt != mCategories.constEnd(); ++catIt ) 00683 { 00684 setScaleMethodToSymbol( catIt->symbol(), scaleMethod ); 00685 } 00686 }