Skip to content

Commit

Permalink
added reading of graduated marker symbology from .qgs files and moved…
Browse files Browse the repository at this point in the history
… the code for reading symbology XML from qgsprojectio to the individual renderers

git-svn-id: http://svn.osgeo.org/qgis/trunk@1215 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Apr 19, 2004
1 parent 0672341 commit d718a76
Show file tree
Hide file tree
Showing 14 changed files with 499 additions and 453 deletions.
5 changes: 3 additions & 2 deletions qgis.dtd
Expand Up @@ -22,7 +22,7 @@
-- General Map Layer Properties
-- (apply to both vector and raster)
-->
<!ELEMENT maplayer (layername, datasource, zorder, (singlesymbol|graduatedsymbol|continuoussymbol|rasterproperties) >
<!ELEMENT maplayer (layername, datasource, zorder, (singlesymbol|singlemarker|graduatedsymbol|continuoussymbol|graduatedmarker|rasterproperties) >
<!ELEMENT layername (#PCDATA) >
<!ELEMENT datasource (#PCDATA) >
<!ELEMENT zorder (#PCDATA) >
Expand Down Expand Up @@ -71,7 +71,7 @@ markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolo
<!ELEMENT value (#PCDATA) >
<!ELEMENT label (#PCDATA) >

<!ELEMENT rangerenderitem (lowervalue,uppervalue,symbol,label) >
<!ELEMENT rangerenderitem (lowervalue,uppervalue,(symbol | markersymbol),label) >
<!ELEMENT lowervalue (#PCDATA) >
<!ELEMENT uppervalue (#PCDATA) >

Expand All @@ -83,6 +83,7 @@ markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolo
<!ELEMENT singlesymbol (renderitem) >
<!ELEMENT singlemarker (renderitem) >
<!ELEMENT graduatedsymbol (classificationfield,rangerenderitem+) >
<!ELEMENT graduatedmarker (classificationfield,rangerenderitem+) >
<!ELEMENT classificationfield (#PCDATA) >
<!ELEMENT continuoussymbol (classificationfield,lowestitem,highestitem) >
<!ELEMENT lowestitem (renderitem) >
Expand Down
97 changes: 97 additions & 0 deletions src/qgscontinuouscolrenderer.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgslegenditem.h"
#include "qgscontcoldialog.h"
#include "qgssymbologyutils.h"
#include <qdom.h>

QgsContinuousColRenderer::~QgsContinuousColRenderer()
{
Expand Down Expand Up @@ -215,6 +216,102 @@ void QgsContinuousColRenderer::renderFeature(QPainter * p, QgsFeature * f, QPict
}
}

void QgsContinuousColRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
{
QgsSymbol* lsy = new QgsSymbol();
QgsSymbol* usy = new QgsSymbol();
QPen lpen, upen;
QBrush lbrush, ubrush;

QDomNode classnode = rnode.namedItem("classificationfield");
int classificationfield = classnode.toElement().text().toInt();
this->setClassificationField(classificationfield);

//read the settings for the renderitem of the minimum value
QDomNode lowernode = rnode.namedItem("lowestitem");
QDomNode litemnode = lowernode.namedItem("renderitem");
QString lvalue = litemnode.namedItem("value").toElement().text();

QDomNode lsymbol = litemnode.namedItem("symbol");

QDomElement loulcelement = lsymbol.namedItem("outlinecolor").toElement();
int red = loulcelement.attribute("red").toInt();
int green = loulcelement.attribute("green").toInt();
int blue = loulcelement.attribute("blue").toInt();
lpen.setColor(QColor(red, green, blue));

QDomElement loustelement = lsymbol.namedItem("outlinestyle").toElement();
lpen.setStyle(QgsSymbologyUtils::qString2PenStyle(loustelement.text()));

QDomElement loulwelement = lsymbol.namedItem("outlinewidth").toElement();
lpen.setWidth(loulwelement.text().toInt());

QDomElement lfillcelement = lsymbol.namedItem("fillcolor").toElement();
red = lfillcelement.attribute("red").toInt();
green = lfillcelement.attribute("green").toInt();
blue = lfillcelement.attribute("blue").toInt();
lbrush.setColor(QColor(red, green, blue));

QDomElement lfillpelement = lsymbol.namedItem("fillpattern").toElement();
lbrush.setStyle(QgsSymbologyUtils::qString2BrushStyle(lfillpelement.text()));

QString llabel = litemnode.namedItem("label").toElement().text();

QDomNode uppernode = rnode.namedItem("highestitem");
QDomNode uitemnode = uppernode.namedItem("renderitem");
QString uvalue = uitemnode.namedItem("value").toElement().text();

QDomNode usymbol = uitemnode.namedItem("symbol");

QDomElement uoulcelement = usymbol.namedItem("outlinecolor").toElement();
red = uoulcelement.attribute("red").toInt();
green = uoulcelement.attribute("green").toInt();
blue = uoulcelement.attribute("blue").toInt();
upen.setColor(QColor(red, green, blue));

QDomElement uoustelement = usymbol.namedItem("outlinestyle").toElement();
upen.setStyle(QgsSymbologyUtils::qString2PenStyle(uoustelement.text()));

QDomElement uoulwelement = usymbol.namedItem("outlinewidth").toElement();
upen.setWidth(uoulwelement.text().toInt());

QDomElement ufillcelement = usymbol.namedItem("fillcolor").toElement();
red = ufillcelement.attribute("red").toInt();
qWarning("red: " + QString::number(red));
green = ufillcelement.attribute("green").toInt();
qWarning("green: " + QString::number(green));
blue = ufillcelement.attribute("blue").toInt();
qWarning("blue: " + QString::number(blue));
ubrush.setColor(QColor(red, green, blue));

QDomElement ufillpelement = usymbol.namedItem("fillpattern").toElement();
ubrush.setStyle(QgsSymbologyUtils::qString2BrushStyle(ufillpelement.text()));

QString ulabel = uitemnode.namedItem("label").toElement().text();

//add all together
lsy->setPen(lpen);
lsy->setBrush(lbrush);
usy->setPen(upen);
usy->setBrush(ubrush);

QgsRenderItem *litem = new QgsRenderItem(lsy, lvalue, llabel);
QgsRenderItem *uitem = new QgsRenderItem(usy, uvalue, ulabel);

this->setMinimumItem(litem);
this->setMaximumItem(uitem);

vl.setRenderer(this);
QgsContColDialog *cdialog = new QgsContColDialog(&vl);
vl.setRendererDialog(cdialog);

QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
vl.setLayerProperties(properties);
properties->setLegendType("Continuous Color");

cdialog->apply();
}

void QgsContinuousColRenderer::writeXML(std::ofstream& xml)
{
xml << "\t\t<continuoussymbol>\n";
Expand Down
4 changes: 4 additions & 0 deletions src/qgscontinuouscolrenderer.h
Expand Up @@ -52,6 +52,10 @@ class QgsContinuousColRenderer: public QgsRenderer
QgsRenderItem* minimumItem();
/**Returns the item for the maximum value*/
QgsRenderItem* maximumItem();
/**Reads the renderer configuration from an XML file
@param rnode the DOM node to read
@param vl the vector layer which will be associated with the renderer*/
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
/**Writes the contents of the renderer to a configuration file*/
virtual void writeXML(std::ofstream& xml);
/** Returns true*/
Expand Down
118 changes: 117 additions & 1 deletion src/qgsgraduatedmarenderer.cpp
Expand Up @@ -23,8 +23,10 @@
#include "qgsgramadialog.h"
#include "qgslegenditem.h"
#include "qgsmarkersymbol.h"
#include "qgssymbologyutils.h"
#include "qgsvectorlayer.h"
#include <iostream.h>
#include <qdom.h>
#include <qpainter.h>
#include <vector>

Expand Down Expand Up @@ -114,7 +116,121 @@ void QgsGraduatedMaRenderer::renderFeature(QPainter* p, QgsFeature* f,QPicture*
}
}

void QgsGraduatedMaRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
{
QDomNode classnode = rnode.namedItem("classificationfield");
int classificationfield = classnode.toElement().text().toInt();
this->setClassificationField(classificationfield);

QDomNode rangerendernode = rnode.namedItem("rangerenderitem");
while (!rangerendernode.isNull())
{
QDomNode lvnode = rangerendernode.namedItem("lowervalue");
QString lowervalue = lvnode.toElement().text();

QDomNode uvnode = rangerendernode.namedItem("uppervalue");
QString uppervalue = uvnode.toElement().text();

QgsMarkerSymbol* msy = new QgsMarkerSymbol();
QPen pen;
QBrush brush;
QString svgpath;
double scalefactor;
QString value, label;

QDomNode synode = rangerendernode.namedItem("markersymbol");

QDomNode svgnode = synode.namedItem("svgpath");
svgpath = svgnode.toElement().text();

QDomNode scalenode = synode.namedItem("scalefactor");
scalefactor = scalenode.toElement().text().toDouble();

QDomNode outlcnode = synode.namedItem("outlinecolor");
QDomElement oulcelement = outlcnode.toElement();
int red = oulcelement.attribute("red").toInt();
int green = oulcelement.attribute("green").toInt();
int blue = oulcelement.attribute("blue").toInt();
pen.setColor(QColor(red, green, blue));

QDomNode outlstnode = synode.namedItem("outlinestyle");
QDomElement outlstelement = outlstnode.toElement();
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(outlstelement.text()));

QDomNode outlwnode = synode.namedItem("outlinewidth");
QDomElement outlwelement = outlwnode.toElement();
pen.setWidth(outlwelement.text().toInt());

QDomNode fillcnode = synode.namedItem("fillcolor");
QDomElement fillcelement = fillcnode.toElement();
red = fillcelement.attribute("red").toInt();
green = fillcelement.attribute("green").toInt();
blue = fillcelement.attribute("blue").toInt();
brush.setColor(QColor(red, green, blue));

QDomNode fillpnode = synode.namedItem("fillpattern");
QDomElement fillpelement = fillpnode.toElement();
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));

QDomNode lnode = rnode.namedItem("label");
QDomElement lnodee = lnode.toElement();
label = lnodee.text();

//create a renderer and add it to the vector layer
msy->setBrush(brush);
msy->setPen(pen);
msy->setPicture(svgpath);
qWarning("the svgpath: "+svgpath);
msy->setScaleFactor(scalefactor);
qWarning("the scalefactor: "+QString::number(scalefactor,'f',2));

QgsRangeRenderItem* ri = new QgsRangeRenderItem(msy,lowervalue,uppervalue,label);
qWarning("lowervalue "+lowervalue);
qWarning("uppervalue "+uppervalue);
this->addItem(ri);

rangerendernode = rangerendernode.nextSibling();
}

vl.setRenderer(this);
QgsGraMaDialog *gdialog = new QgsGraMaDialog(&vl);
vl.setRendererDialog(gdialog);

QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
vl.setLayerProperties(properties);
properties->setLegendType("Graduated Marker");

gdialog->apply();
}

void QgsGraduatedMaRenderer::writeXML(std::ofstream& xml)
{
//soon
xml << "\t\t<graduatedmarker>\n";
xml << "\t\t\t<classificationfield>" + QString::number(this->classificationField()) +
"</classificationfield>\n";
for (std::list < QgsRangeRenderItem * >::iterator it = this->items().begin(); it != this->items().end();
++it)
{
xml << "\t\t\t<rangerenderitem>\n";
xml << "\t\t\t\t<lowervalue>" + (*it)->value() + "</lowervalue>\n";
xml << "\t\t\t\t<uppervalue>" + (*it)->upper_value() + "</uppervalue>\n";
QgsMarkerSymbol *markersymbol = dynamic_cast<QgsMarkerSymbol*>((*it)->getSymbol());
xml << "\t\t\t\t<markersymbol>\n";
xml << "\t\t\t\t\t<svgpath>" + markersymbol->picture() + "</svgpath>\n";
xml << "\t\t\t\t\t<scalefactor>" + QString::number(markersymbol->scaleFactor()) + "</scalefactor>\n";
xml << "\t\t\t\t\t<outlinecolor red=\"" + QString::number(markersymbol->pen().color().red()) + "\" green=\"" +
QString::number(markersymbol->pen().color().green()) + "\" blue=\"" + QString::number(markersymbol->pen().color().blue()) +
"\" />\n";
xml << "\t\t\t\t\t<outlinestyle>" + QgsSymbologyUtils::penStyle2QString(markersymbol->pen().style()) + "</outlinestyle>\n";
xml << "\t\t\t\t\t<outlinewidth>" + QString::number(markersymbol->pen().width()) + "</outlinewidth>\n";
xml << "\t\t\t\t\t<fillcolor red=\"" + QString::number(markersymbol->brush().color().red()) + "\" green=\"" +
QString::number(markersymbol->brush().color().green()) + "\" blue=\"" + QString::number(markersymbol->brush().color().blue()) +
"\" />\n";
xml << "\t\t\t\t\t<fillpattern>" + QgsSymbologyUtils::brushStyle2QString(markersymbol->brush().style()) +
"</fillpattern>\n";
xml << "\t\t\t\t</markersymbol>\n";
xml << "\t\t\t\t<label>" + (*it)->label() + "</label>\n";
xml << "\t\t\t</rangerenderitem>\n";
}
xml << "\t\t</graduatedmarker>\n";
}
4 changes: 4 additions & 0 deletions src/qgsgraduatedmarenderer.h
Expand Up @@ -42,6 +42,10 @@ class QgsGraduatedMaRenderer: public QgsRenderer
void setClassificationField(int field);
/**Returns the list with the render items*/
std::list<QgsRangeRenderItem*>& items();
/**Reads the renderer configuration from an XML file
@param rnode the DOM node to read
@param vl the vector layer which will be associated with the renderer*/
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
/**Writes the contents of the renderer to a configuration file*/
virtual void writeXML(std::ofstream& xml);
virtual bool needsAttributes();
Expand Down
67 changes: 67 additions & 0 deletions src/qgsgraduatedsymrenderer.cpp
Expand Up @@ -20,6 +20,7 @@
#include "qgsgrasydialog.h"
#include "qgslegenditem.h"
#include "qgssymbologyutils.h"
#include <qdom.h>

inline QgsGraduatedSymRenderer::~QgsGraduatedSymRenderer()
{
Expand Down Expand Up @@ -172,6 +173,72 @@ void QgsGraduatedSymRenderer::initializeSymbology(QgsVectorLayer * layer, QgsDlg
}
}

void QgsGraduatedSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
{
QDomNode classnode = rnode.namedItem("classificationfield");
int classificationfield = classnode.toElement().text().toInt();
this->setClassificationField(classificationfield);

QDomNode rangerendernode = rnode.namedItem("rangerenderitem");
while (!rangerendernode.isNull())
{
QgsSymbol* sy = new QgsSymbol();
QPen pen;
QBrush brush;

QDomNode lvnode = rangerendernode.namedItem("lowervalue");
QString lowervalue = lvnode.toElement().text();

QDomNode uvnode = rangerendernode.namedItem("uppervalue");
QString uppervalue = uvnode.toElement().text();

QDomNode synode = rangerendernode.namedItem("symbol");

QDomElement oulcelement = synode.namedItem("outlinecolor").toElement();
int red = oulcelement.attribute("red").toInt();
int green = oulcelement.attribute("green").toInt();
int blue = oulcelement.attribute("blue").toInt();
pen.setColor(QColor(red, green, blue));

QDomElement oustelement = synode.namedItem("outlinestyle").toElement();
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(oustelement.text()));

QDomElement oulwelement = synode.namedItem("outlinewidth").toElement();
pen.setWidth(oulwelement.text().toInt());

QDomElement fillcelement = synode.namedItem("fillcolor").toElement();
red = fillcelement.attribute("red").toInt();
green = fillcelement.attribute("green").toInt();
blue = fillcelement.attribute("blue").toInt();
brush.setColor(QColor(red, green, blue));

QDomElement fillpelement = synode.namedItem("fillpattern").toElement();
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));

QDomElement labelelement = rangerendernode.namedItem("label").toElement();
QString label = labelelement.text();

//create a renderitem and add it to the renderer
sy->setBrush(brush);
sy->setPen(pen);

QgsRangeRenderItem *ri = new QgsRangeRenderItem(sy, lowervalue, uppervalue, label);
this->addItem(ri);

rangerendernode = rangerendernode.nextSibling();
}

vl.setRenderer(this);
QgsGraSyDialog *gdialog = new QgsGraSyDialog(&vl);
vl.setRendererDialog(gdialog);

QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
vl.setLayerProperties(properties);
properties->setLegendType("Graduated Symbol");

gdialog->apply();
}

void QgsGraduatedSymRenderer::writeXML(std::ofstream& xml)
{
xml << "\t\t<graduatedsymbol>\n";
Expand Down
6 changes: 5 additions & 1 deletion src/qgsgraduatedsymrenderer.h
Expand Up @@ -56,7 +56,11 @@ class QgsGraduatedSymRenderer: public QgsRenderer
@param pr the property dialog. This is only needed if the renderer is created from the property dialog and not yet associated with the vector layer, otherwise 0*/
void initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr=0);
/**Returns the list with the render items*/
std::list<QgsRangeRenderItem*>& items();
std::list<QgsRangeRenderItem*>& items();
/**Reads the renderer configuration from an XML file
@param rnode the DOM node to read
@param vl the vector layer which will be associated with the renderer*/
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
/**Writes the contents of the renderer to a configuration file*/
virtual void writeXML(std::ofstream& xml);
/** Returns true*/
Expand Down

0 comments on commit d718a76

Please sign in to comment.