|
1 | 1 | #include "qgsrendererv2.h" |
2 | 2 | #include "qgssymbolv2.h" |
| 3 | +#include "qgssymbollayerv2utils.h" |
3 | 4 |
|
4 | 5 | #include "qgsrendercontext.h" |
5 | 6 | #include "qgsgeometry.h" |
6 | 7 | #include "qgsfeature.h" |
7 | 8 | #include "qgslogger.h" |
8 | 9 |
|
| 10 | +#include <QDomElement> |
| 11 | +#include <QDomDocument> |
9 | 12 | #include <QPolygonF> |
10 | 13 |
|
11 | 14 |
|
| 15 | + |
12 | 16 | static unsigned char* _getPoint(QPointF& pt, const QgsMapToPixel& mapToPixel, unsigned char* wkb) |
13 | 17 | { |
14 | 18 | wkb++; // jump over endian info |
@@ -247,6 +251,40 @@ QString QgsFeatureRendererV2::dump() |
247 | 251 | } |
248 | 252 |
|
249 | 253 |
|
| 254 | +QgsFeatureRendererV2* QgsFeatureRendererV2::load(QDomElement& element) |
| 255 | +{ |
| 256 | + // <renderer-v2 type=""> ... </renderer-v2> |
| 257 | + |
| 258 | + if (element.isNull()) |
| 259 | + return NULL; |
| 260 | + |
| 261 | + // load renderer |
| 262 | + QString rendererType = element.attribute("type"); |
| 263 | + |
| 264 | + // TODO: use renderer registry |
| 265 | + if (rendererType == "singleSymbol") |
| 266 | + { |
| 267 | + return QgsSingleSymbolRendererV2::create(element); |
| 268 | + } |
| 269 | + else if (rendererType == "categorizedSymbol") |
| 270 | + { |
| 271 | + return QgsCategorizedSymbolRendererV2::create(element); |
| 272 | + } |
| 273 | + else if (rendererType == "graduatedSymbol") |
| 274 | + { |
| 275 | + return QgsGraduatedSymbolRendererV2::create(element); |
| 276 | + } |
| 277 | + |
| 278 | + // unknown renderer type |
| 279 | + return NULL; |
| 280 | +} |
| 281 | + |
| 282 | +QDomElement QgsFeatureRendererV2::save(QDomDocument& doc) |
| 283 | +{ |
| 284 | + // create empty renderer element |
| 285 | + return doc.createElement(RENDERER_TAG_NAME); |
| 286 | +} |
| 287 | + |
250 | 288 | /////////////////// |
251 | 289 |
|
252 | 290 | QgsSingleSymbolRendererV2::QgsSingleSymbolRendererV2(QgsSymbolV2* symbol) |
@@ -310,6 +348,39 @@ QgsSymbolV2List QgsSingleSymbolRendererV2::symbols() |
310 | 348 | return lst; |
311 | 349 | } |
312 | 350 |
|
| 351 | +QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create(QDomElement& element) |
| 352 | +{ |
| 353 | + QDomElement symbolsElem = element.firstChildElement("symbols"); |
| 354 | + if (symbolsElem.isNull()) |
| 355 | + return NULL; |
| 356 | + |
| 357 | + QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem); |
| 358 | + |
| 359 | + if (!symbolMap.contains("0")) |
| 360 | + return NULL; |
| 361 | + |
| 362 | + QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( symbolMap.take("0") ); |
| 363 | + |
| 364 | + // delete symbols if there are any more |
| 365 | + QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap); |
| 366 | + |
| 367 | + // TODO: symbol levels |
| 368 | + return r; |
| 369 | +} |
| 370 | + |
| 371 | +QDomElement QgsSingleSymbolRendererV2::save(QDomDocument& doc) |
| 372 | +{ |
| 373 | + QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME); |
| 374 | + rendererElem.setAttribute("type", "singleSymbol"); |
| 375 | + |
| 376 | + QgsSymbolV2Map symbols; |
| 377 | + symbols["0"] = mSymbol; |
| 378 | + QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc); |
| 379 | + rendererElem.appendChild(symbolsElem); |
| 380 | + |
| 381 | + return rendererElem; |
| 382 | +} |
| 383 | + |
313 | 384 | /////////////////// |
314 | 385 |
|
315 | 386 | QgsRendererCategoryV2::QgsRendererCategoryV2(QVariant value, QgsSymbolV2* symbol, QString label) |
@@ -513,6 +584,81 @@ QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols() |
513 | 584 | return lst; |
514 | 585 | } |
515 | 586 |
|
| 587 | +QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create(QDomElement& element) |
| 588 | +{ |
| 589 | + QDomElement symbolsElem = element.firstChildElement("symbols"); |
| 590 | + if (symbolsElem.isNull()) |
| 591 | + return NULL; |
| 592 | + |
| 593 | + QDomElement catsElem = element.firstChildElement("categories"); |
| 594 | + if (catsElem.isNull()) |
| 595 | + return NULL; |
| 596 | + |
| 597 | + QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem); |
| 598 | + QgsCategoryList cats; |
| 599 | + |
| 600 | + QDomElement catElem = catsElem.firstChildElement(); |
| 601 | + while (!catElem.isNull()) |
| 602 | + { |
| 603 | + if (catElem.tagName() == "category") |
| 604 | + { |
| 605 | + QVariant value = QVariant(catElem.attribute("value")); |
| 606 | + QString symbolName = catElem.attribute("symbol"); |
| 607 | + QString label = catElem.attribute("label"); |
| 608 | + if (symbolMap.contains(symbolName)) |
| 609 | + { |
| 610 | + QgsSymbolV2* symbol = symbolMap.take(symbolName); |
| 611 | + cats.append( QgsRendererCategoryV2(value, symbol, label) ); |
| 612 | + } |
| 613 | + } |
| 614 | + catElem = catElem.nextSiblingElement(); |
| 615 | + } |
| 616 | + |
| 617 | + int attrNum = element.attribute("attr").toInt(); |
| 618 | + |
| 619 | + QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2(attrNum, cats); |
| 620 | + |
| 621 | + // delete symbols if there are any more |
| 622 | + QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap); |
| 623 | + |
| 624 | + // TODO: symbol levels |
| 625 | + return r; |
| 626 | +} |
| 627 | + |
| 628 | +QDomElement QgsCategorizedSymbolRendererV2::save(QDomDocument& doc) |
| 629 | +{ |
| 630 | + QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME); |
| 631 | + rendererElem.setAttribute("type", "categorizedSymbol"); |
| 632 | + rendererElem.setAttribute("attr", mAttrNum); |
| 633 | + |
| 634 | + // categories |
| 635 | + int i = 0; |
| 636 | + QgsSymbolV2Map symbols; |
| 637 | + QDomElement catsElem = doc.createElement("categories"); |
| 638 | + QgsCategoryList::const_iterator it = mCategories.constBegin(); |
| 639 | + for ( ; it != mCategories.end(); it++) |
| 640 | + { |
| 641 | + const QgsRendererCategoryV2& cat = *it; |
| 642 | + QString symbolName = QString::number(i); |
| 643 | + symbols.insert(symbolName, cat.symbol()); |
| 644 | + |
| 645 | + QDomElement catElem = doc.createElement("category"); |
| 646 | + catElem.setAttribute("value", cat.value().toString()); |
| 647 | + catElem.setAttribute("symbol", symbolName); |
| 648 | + catElem.setAttribute("label", cat.label()); |
| 649 | + catsElem.appendChild(catElem); |
| 650 | + i++; |
| 651 | + } |
| 652 | + |
| 653 | + rendererElem.appendChild(catsElem); |
| 654 | + |
| 655 | + // save symbols |
| 656 | + QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc); |
| 657 | + rendererElem.appendChild(symbolsElem); |
| 658 | + |
| 659 | + return rendererElem; |
| 660 | +} |
| 661 | + |
516 | 662 | ///////////////////////// |
517 | 663 | // graduated |
518 | 664 |
|
@@ -778,3 +924,82 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( |
778 | 924 |
|
779 | 925 | return new QgsGraduatedSymbolRendererV2( attrNum, ranges ); |
780 | 926 | } |
| 927 | + |
| 928 | + |
| 929 | + |
| 930 | +QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create(QDomElement& element) |
| 931 | +{ |
| 932 | + QDomElement symbolsElem = element.firstChildElement("symbols"); |
| 933 | + if (symbolsElem.isNull()) |
| 934 | + return NULL; |
| 935 | + |
| 936 | + QDomElement rangesElem = element.firstChildElement("ranges"); |
| 937 | + if (rangesElem.isNull()) |
| 938 | + return NULL; |
| 939 | + |
| 940 | + QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem); |
| 941 | + QgsRangeList ranges; |
| 942 | + |
| 943 | + QDomElement rangeElem = rangesElem.firstChildElement(); |
| 944 | + while (!rangeElem.isNull()) |
| 945 | + { |
| 946 | + if (rangeElem.tagName() == "range") |
| 947 | + { |
| 948 | + double lowerValue = rangeElem.attribute("lower").toDouble(); |
| 949 | + double upperValue = rangeElem.attribute("upper").toDouble(); |
| 950 | + QString symbolName = rangeElem.attribute("symbol"); |
| 951 | + QString label = rangeElem.attribute("label"); |
| 952 | + if (symbolMap.contains(symbolName)) |
| 953 | + { |
| 954 | + QgsSymbolV2* symbol = symbolMap.take(symbolName); |
| 955 | + ranges.append( QgsRendererRangeV2(lowerValue, upperValue, symbol, label) ); |
| 956 | + } |
| 957 | + } |
| 958 | + rangeElem = rangeElem.nextSiblingElement(); |
| 959 | + } |
| 960 | + |
| 961 | + int attrNum = element.attribute("attr").toInt(); |
| 962 | + |
| 963 | + QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2(attrNum, ranges); |
| 964 | + |
| 965 | + // delete symbols if there are any more |
| 966 | + QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap); |
| 967 | + |
| 968 | + // TODO: symbol levels |
| 969 | + return r; |
| 970 | +} |
| 971 | + |
| 972 | +QDomElement QgsGraduatedSymbolRendererV2::save(QDomDocument& doc) |
| 973 | +{ |
| 974 | + QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME); |
| 975 | + rendererElem.setAttribute("type", "graduatedSymbol"); |
| 976 | + rendererElem.setAttribute("attr", mAttrNum); |
| 977 | + |
| 978 | + // ranges |
| 979 | + int i = 0; |
| 980 | + QgsSymbolV2Map symbols; |
| 981 | + QDomElement rangesElem = doc.createElement("ranges"); |
| 982 | + QgsRangeList::const_iterator it = mRanges.constBegin(); |
| 983 | + for ( ; it != mRanges.end(); it++) |
| 984 | + { |
| 985 | + const QgsRendererRangeV2& range = *it; |
| 986 | + QString symbolName = QString::number(i); |
| 987 | + symbols.insert(symbolName, range.symbol()); |
| 988 | + |
| 989 | + QDomElement rangeElem = doc.createElement("range"); |
| 990 | + rangeElem.setAttribute("lower", range.lowerValue()); |
| 991 | + rangeElem.setAttribute("upper", range.upperValue()); |
| 992 | + rangeElem.setAttribute("symbol", symbolName); |
| 993 | + rangeElem.setAttribute("label", range.label()); |
| 994 | + rangesElem.appendChild(rangeElem); |
| 995 | + i++; |
| 996 | + } |
| 997 | + |
| 998 | + rendererElem.appendChild(rangesElem); |
| 999 | + |
| 1000 | + // save symbols |
| 1001 | + QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc); |
| 1002 | + rendererElem.appendChild(symbolsElem); |
| 1003 | + |
| 1004 | + return rendererElem; |
| 1005 | +} |
0 commit comments