Skip to content

Commit d718a76

Browse files
author
mhugent
committedApr 19, 2004
added reading of graduated marker symbology from .qgs files and moved 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
1 parent 0672341 commit d718a76

14 files changed

+499
-453
lines changed
 

‎qgis.dtd

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
-- General Map Layer Properties
2323
-- (apply to both vector and raster)
2424
-->
25-
<!ELEMENT maplayer (layername, datasource, zorder, (singlesymbol|graduatedsymbol|continuoussymbol|rasterproperties) >
25+
<!ELEMENT maplayer (layername, datasource, zorder, (singlesymbol|singlemarker|graduatedsymbol|continuoussymbol|graduatedmarker|rasterproperties) >
2626
<!ELEMENT layername (#PCDATA) >
2727
<!ELEMENT datasource (#PCDATA) >
2828
<!ELEMENT zorder (#PCDATA) >
@@ -71,7 +71,7 @@ markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolo
7171
<!ELEMENT value (#PCDATA) >
7272
<!ELEMENT label (#PCDATA) >
7373

74-
<!ELEMENT rangerenderitem (lowervalue,uppervalue,symbol,label) >
74+
<!ELEMENT rangerenderitem (lowervalue,uppervalue,(symbol | markersymbol),label) >
7575
<!ELEMENT lowervalue (#PCDATA) >
7676
<!ELEMENT uppervalue (#PCDATA) >
7777

@@ -83,6 +83,7 @@ markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolo
8383
<!ELEMENT singlesymbol (renderitem) >
8484
<!ELEMENT singlemarker (renderitem) >
8585
<!ELEMENT graduatedsymbol (classificationfield,rangerenderitem+) >
86+
<!ELEMENT graduatedmarker (classificationfield,rangerenderitem+) >
8687
<!ELEMENT classificationfield (#PCDATA) >
8788
<!ELEMENT continuoussymbol (classificationfield,lowestitem,highestitem) >
8889
<!ELEMENT lowestitem (renderitem) >

‎src/qgscontinuouscolrenderer.cpp

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgslegenditem.h"
2323
#include "qgscontcoldialog.h"
2424
#include "qgssymbologyutils.h"
25+
#include <qdom.h>
2526

2627
QgsContinuousColRenderer::~QgsContinuousColRenderer()
2728
{
@@ -215,6 +216,102 @@ void QgsContinuousColRenderer::renderFeature(QPainter * p, QgsFeature * f, QPict
215216
}
216217
}
217218

219+
void QgsContinuousColRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
220+
{
221+
QgsSymbol* lsy = new QgsSymbol();
222+
QgsSymbol* usy = new QgsSymbol();
223+
QPen lpen, upen;
224+
QBrush lbrush, ubrush;
225+
226+
QDomNode classnode = rnode.namedItem("classificationfield");
227+
int classificationfield = classnode.toElement().text().toInt();
228+
this->setClassificationField(classificationfield);
229+
230+
//read the settings for the renderitem of the minimum value
231+
QDomNode lowernode = rnode.namedItem("lowestitem");
232+
QDomNode litemnode = lowernode.namedItem("renderitem");
233+
QString lvalue = litemnode.namedItem("value").toElement().text();
234+
235+
QDomNode lsymbol = litemnode.namedItem("symbol");
236+
237+
QDomElement loulcelement = lsymbol.namedItem("outlinecolor").toElement();
238+
int red = loulcelement.attribute("red").toInt();
239+
int green = loulcelement.attribute("green").toInt();
240+
int blue = loulcelement.attribute("blue").toInt();
241+
lpen.setColor(QColor(red, green, blue));
242+
243+
QDomElement loustelement = lsymbol.namedItem("outlinestyle").toElement();
244+
lpen.setStyle(QgsSymbologyUtils::qString2PenStyle(loustelement.text()));
245+
246+
QDomElement loulwelement = lsymbol.namedItem("outlinewidth").toElement();
247+
lpen.setWidth(loulwelement.text().toInt());
248+
249+
QDomElement lfillcelement = lsymbol.namedItem("fillcolor").toElement();
250+
red = lfillcelement.attribute("red").toInt();
251+
green = lfillcelement.attribute("green").toInt();
252+
blue = lfillcelement.attribute("blue").toInt();
253+
lbrush.setColor(QColor(red, green, blue));
254+
255+
QDomElement lfillpelement = lsymbol.namedItem("fillpattern").toElement();
256+
lbrush.setStyle(QgsSymbologyUtils::qString2BrushStyle(lfillpelement.text()));
257+
258+
QString llabel = litemnode.namedItem("label").toElement().text();
259+
260+
QDomNode uppernode = rnode.namedItem("highestitem");
261+
QDomNode uitemnode = uppernode.namedItem("renderitem");
262+
QString uvalue = uitemnode.namedItem("value").toElement().text();
263+
264+
QDomNode usymbol = uitemnode.namedItem("symbol");
265+
266+
QDomElement uoulcelement = usymbol.namedItem("outlinecolor").toElement();
267+
red = uoulcelement.attribute("red").toInt();
268+
green = uoulcelement.attribute("green").toInt();
269+
blue = uoulcelement.attribute("blue").toInt();
270+
upen.setColor(QColor(red, green, blue));
271+
272+
QDomElement uoustelement = usymbol.namedItem("outlinestyle").toElement();
273+
upen.setStyle(QgsSymbologyUtils::qString2PenStyle(uoustelement.text()));
274+
275+
QDomElement uoulwelement = usymbol.namedItem("outlinewidth").toElement();
276+
upen.setWidth(uoulwelement.text().toInt());
277+
278+
QDomElement ufillcelement = usymbol.namedItem("fillcolor").toElement();
279+
red = ufillcelement.attribute("red").toInt();
280+
qWarning("red: " + QString::number(red));
281+
green = ufillcelement.attribute("green").toInt();
282+
qWarning("green: " + QString::number(green));
283+
blue = ufillcelement.attribute("blue").toInt();
284+
qWarning("blue: " + QString::number(blue));
285+
ubrush.setColor(QColor(red, green, blue));
286+
287+
QDomElement ufillpelement = usymbol.namedItem("fillpattern").toElement();
288+
ubrush.setStyle(QgsSymbologyUtils::qString2BrushStyle(ufillpelement.text()));
289+
290+
QString ulabel = uitemnode.namedItem("label").toElement().text();
291+
292+
//add all together
293+
lsy->setPen(lpen);
294+
lsy->setBrush(lbrush);
295+
usy->setPen(upen);
296+
usy->setBrush(ubrush);
297+
298+
QgsRenderItem *litem = new QgsRenderItem(lsy, lvalue, llabel);
299+
QgsRenderItem *uitem = new QgsRenderItem(usy, uvalue, ulabel);
300+
301+
this->setMinimumItem(litem);
302+
this->setMaximumItem(uitem);
303+
304+
vl.setRenderer(this);
305+
QgsContColDialog *cdialog = new QgsContColDialog(&vl);
306+
vl.setRendererDialog(cdialog);
307+
308+
QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
309+
vl.setLayerProperties(properties);
310+
properties->setLegendType("Continuous Color");
311+
312+
cdialog->apply();
313+
}
314+
218315
void QgsContinuousColRenderer::writeXML(std::ofstream& xml)
219316
{
220317
xml << "\t\t<continuoussymbol>\n";

‎src/qgscontinuouscolrenderer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ class QgsContinuousColRenderer: public QgsRenderer
5252
QgsRenderItem* minimumItem();
5353
/**Returns the item for the maximum value*/
5454
QgsRenderItem* maximumItem();
55+
/**Reads the renderer configuration from an XML file
56+
@param rnode the DOM node to read
57+
@param vl the vector layer which will be associated with the renderer*/
58+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
5559
/**Writes the contents of the renderer to a configuration file*/
5660
virtual void writeXML(std::ofstream& xml);
5761
/** Returns true*/

‎src/qgsgraduatedmarenderer.cpp

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
#include "qgsgramadialog.h"
2424
#include "qgslegenditem.h"
2525
#include "qgsmarkersymbol.h"
26+
#include "qgssymbologyutils.h"
2627
#include "qgsvectorlayer.h"
2728
#include <iostream.h>
29+
#include <qdom.h>
2830
#include <qpainter.h>
2931
#include <vector>
3032

@@ -114,7 +116,121 @@ void QgsGraduatedMaRenderer::renderFeature(QPainter* p, QgsFeature* f,QPicture*
114116
}
115117
}
116118

119+
void QgsGraduatedMaRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
120+
{
121+
QDomNode classnode = rnode.namedItem("classificationfield");
122+
int classificationfield = classnode.toElement().text().toInt();
123+
this->setClassificationField(classificationfield);
124+
125+
QDomNode rangerendernode = rnode.namedItem("rangerenderitem");
126+
while (!rangerendernode.isNull())
127+
{
128+
QDomNode lvnode = rangerendernode.namedItem("lowervalue");
129+
QString lowervalue = lvnode.toElement().text();
130+
131+
QDomNode uvnode = rangerendernode.namedItem("uppervalue");
132+
QString uppervalue = uvnode.toElement().text();
133+
134+
QgsMarkerSymbol* msy = new QgsMarkerSymbol();
135+
QPen pen;
136+
QBrush brush;
137+
QString svgpath;
138+
double scalefactor;
139+
QString value, label;
140+
141+
QDomNode synode = rangerendernode.namedItem("markersymbol");
142+
143+
QDomNode svgnode = synode.namedItem("svgpath");
144+
svgpath = svgnode.toElement().text();
145+
146+
QDomNode scalenode = synode.namedItem("scalefactor");
147+
scalefactor = scalenode.toElement().text().toDouble();
148+
149+
QDomNode outlcnode = synode.namedItem("outlinecolor");
150+
QDomElement oulcelement = outlcnode.toElement();
151+
int red = oulcelement.attribute("red").toInt();
152+
int green = oulcelement.attribute("green").toInt();
153+
int blue = oulcelement.attribute("blue").toInt();
154+
pen.setColor(QColor(red, green, blue));
155+
156+
QDomNode outlstnode = synode.namedItem("outlinestyle");
157+
QDomElement outlstelement = outlstnode.toElement();
158+
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(outlstelement.text()));
159+
160+
QDomNode outlwnode = synode.namedItem("outlinewidth");
161+
QDomElement outlwelement = outlwnode.toElement();
162+
pen.setWidth(outlwelement.text().toInt());
163+
164+
QDomNode fillcnode = synode.namedItem("fillcolor");
165+
QDomElement fillcelement = fillcnode.toElement();
166+
red = fillcelement.attribute("red").toInt();
167+
green = fillcelement.attribute("green").toInt();
168+
blue = fillcelement.attribute("blue").toInt();
169+
brush.setColor(QColor(red, green, blue));
170+
171+
QDomNode fillpnode = synode.namedItem("fillpattern");
172+
QDomElement fillpelement = fillpnode.toElement();
173+
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
174+
175+
QDomNode lnode = rnode.namedItem("label");
176+
QDomElement lnodee = lnode.toElement();
177+
label = lnodee.text();
178+
179+
//create a renderer and add it to the vector layer
180+
msy->setBrush(brush);
181+
msy->setPen(pen);
182+
msy->setPicture(svgpath);
183+
qWarning("the svgpath: "+svgpath);
184+
msy->setScaleFactor(scalefactor);
185+
qWarning("the scalefactor: "+QString::number(scalefactor,'f',2));
186+
187+
QgsRangeRenderItem* ri = new QgsRangeRenderItem(msy,lowervalue,uppervalue,label);
188+
qWarning("lowervalue "+lowervalue);
189+
qWarning("uppervalue "+uppervalue);
190+
this->addItem(ri);
191+
192+
rangerendernode = rangerendernode.nextSibling();
193+
}
194+
195+
vl.setRenderer(this);
196+
QgsGraMaDialog *gdialog = new QgsGraMaDialog(&vl);
197+
vl.setRendererDialog(gdialog);
198+
199+
QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
200+
vl.setLayerProperties(properties);
201+
properties->setLegendType("Graduated Marker");
202+
203+
gdialog->apply();
204+
}
205+
117206
void QgsGraduatedMaRenderer::writeXML(std::ofstream& xml)
118207
{
119-
//soon
208+
xml << "\t\t<graduatedmarker>\n";
209+
xml << "\t\t\t<classificationfield>" + QString::number(this->classificationField()) +
210+
"</classificationfield>\n";
211+
for (std::list < QgsRangeRenderItem * >::iterator it = this->items().begin(); it != this->items().end();
212+
++it)
213+
{
214+
xml << "\t\t\t<rangerenderitem>\n";
215+
xml << "\t\t\t\t<lowervalue>" + (*it)->value() + "</lowervalue>\n";
216+
xml << "\t\t\t\t<uppervalue>" + (*it)->upper_value() + "</uppervalue>\n";
217+
QgsMarkerSymbol *markersymbol = dynamic_cast<QgsMarkerSymbol*>((*it)->getSymbol());
218+
xml << "\t\t\t\t<markersymbol>\n";
219+
xml << "\t\t\t\t\t<svgpath>" + markersymbol->picture() + "</svgpath>\n";
220+
xml << "\t\t\t\t\t<scalefactor>" + QString::number(markersymbol->scaleFactor()) + "</scalefactor>\n";
221+
xml << "\t\t\t\t\t<outlinecolor red=\"" + QString::number(markersymbol->pen().color().red()) + "\" green=\"" +
222+
QString::number(markersymbol->pen().color().green()) + "\" blue=\"" + QString::number(markersymbol->pen().color().blue()) +
223+
"\" />\n";
224+
xml << "\t\t\t\t\t<outlinestyle>" + QgsSymbologyUtils::penStyle2QString(markersymbol->pen().style()) + "</outlinestyle>\n";
225+
xml << "\t\t\t\t\t<outlinewidth>" + QString::number(markersymbol->pen().width()) + "</outlinewidth>\n";
226+
xml << "\t\t\t\t\t<fillcolor red=\"" + QString::number(markersymbol->brush().color().red()) + "\" green=\"" +
227+
QString::number(markersymbol->brush().color().green()) + "\" blue=\"" + QString::number(markersymbol->brush().color().blue()) +
228+
"\" />\n";
229+
xml << "\t\t\t\t\t<fillpattern>" + QgsSymbologyUtils::brushStyle2QString(markersymbol->brush().style()) +
230+
"</fillpattern>\n";
231+
xml << "\t\t\t\t</markersymbol>\n";
232+
xml << "\t\t\t\t<label>" + (*it)->label() + "</label>\n";
233+
xml << "\t\t\t</rangerenderitem>\n";
234+
}
235+
xml << "\t\t</graduatedmarker>\n";
120236
}

‎src/qgsgraduatedmarenderer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class QgsGraduatedMaRenderer: public QgsRenderer
4242
void setClassificationField(int field);
4343
/**Returns the list with the render items*/
4444
std::list<QgsRangeRenderItem*>& items();
45+
/**Reads the renderer configuration from an XML file
46+
@param rnode the DOM node to read
47+
@param vl the vector layer which will be associated with the renderer*/
48+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
4549
/**Writes the contents of the renderer to a configuration file*/
4650
virtual void writeXML(std::ofstream& xml);
4751
virtual bool needsAttributes();

‎src/qgsgraduatedsymrenderer.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsgrasydialog.h"
2121
#include "qgslegenditem.h"
2222
#include "qgssymbologyutils.h"
23+
#include <qdom.h>
2324

2425
inline QgsGraduatedSymRenderer::~QgsGraduatedSymRenderer()
2526
{
@@ -172,6 +173,72 @@ void QgsGraduatedSymRenderer::initializeSymbology(QgsVectorLayer * layer, QgsDlg
172173
}
173174
}
174175

176+
void QgsGraduatedSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
177+
{
178+
QDomNode classnode = rnode.namedItem("classificationfield");
179+
int classificationfield = classnode.toElement().text().toInt();
180+
this->setClassificationField(classificationfield);
181+
182+
QDomNode rangerendernode = rnode.namedItem("rangerenderitem");
183+
while (!rangerendernode.isNull())
184+
{
185+
QgsSymbol* sy = new QgsSymbol();
186+
QPen pen;
187+
QBrush brush;
188+
189+
QDomNode lvnode = rangerendernode.namedItem("lowervalue");
190+
QString lowervalue = lvnode.toElement().text();
191+
192+
QDomNode uvnode = rangerendernode.namedItem("uppervalue");
193+
QString uppervalue = uvnode.toElement().text();
194+
195+
QDomNode synode = rangerendernode.namedItem("symbol");
196+
197+
QDomElement oulcelement = synode.namedItem("outlinecolor").toElement();
198+
int red = oulcelement.attribute("red").toInt();
199+
int green = oulcelement.attribute("green").toInt();
200+
int blue = oulcelement.attribute("blue").toInt();
201+
pen.setColor(QColor(red, green, blue));
202+
203+
QDomElement oustelement = synode.namedItem("outlinestyle").toElement();
204+
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(oustelement.text()));
205+
206+
QDomElement oulwelement = synode.namedItem("outlinewidth").toElement();
207+
pen.setWidth(oulwelement.text().toInt());
208+
209+
QDomElement fillcelement = synode.namedItem("fillcolor").toElement();
210+
red = fillcelement.attribute("red").toInt();
211+
green = fillcelement.attribute("green").toInt();
212+
blue = fillcelement.attribute("blue").toInt();
213+
brush.setColor(QColor(red, green, blue));
214+
215+
QDomElement fillpelement = synode.namedItem("fillpattern").toElement();
216+
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
217+
218+
QDomElement labelelement = rangerendernode.namedItem("label").toElement();
219+
QString label = labelelement.text();
220+
221+
//create a renderitem and add it to the renderer
222+
sy->setBrush(brush);
223+
sy->setPen(pen);
224+
225+
QgsRangeRenderItem *ri = new QgsRangeRenderItem(sy, lowervalue, uppervalue, label);
226+
this->addItem(ri);
227+
228+
rangerendernode = rangerendernode.nextSibling();
229+
}
230+
231+
vl.setRenderer(this);
232+
QgsGraSyDialog *gdialog = new QgsGraSyDialog(&vl);
233+
vl.setRendererDialog(gdialog);
234+
235+
QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
236+
vl.setLayerProperties(properties);
237+
properties->setLegendType("Graduated Symbol");
238+
239+
gdialog->apply();
240+
}
241+
175242
void QgsGraduatedSymRenderer::writeXML(std::ofstream& xml)
176243
{
177244
xml << "\t\t<graduatedsymbol>\n";

‎src/qgsgraduatedsymrenderer.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ class QgsGraduatedSymRenderer: public QgsRenderer
5656
@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*/
5757
void initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr=0);
5858
/**Returns the list with the render items*/
59-
std::list<QgsRangeRenderItem*>& items();
59+
std::list<QgsRangeRenderItem*>& items();
60+
/**Reads the renderer configuration from an XML file
61+
@param rnode the DOM node to read
62+
@param vl the vector layer which will be associated with the renderer*/
63+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
6064
/**Writes the contents of the renderer to a configuration file*/
6165
virtual void writeXML(std::ofstream& xml);
6266
/** Returns true*/

‎src/qgsgramadialog.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,30 @@ QgsGraMaDialog::QgsGraMaDialog(QgsVectorLayer* layer): QgsGraMaDialogBase(), ext
8282
renderer = dynamic_cast < QgsGraduatedMaRenderer * >(layer->renderer());
8383
}
8484

85+
std::list < QgsRangeRenderItem * >list;
86+
8587
if (renderer)
8688
{
87-
std::list < QgsRangeRenderItem * >list = renderer->items();
89+
list = renderer->items();
8890
ext = new QgsGraMaExtensionWidget(this, renderer->classificationField(), QgsGraSyDialog::EMPTY, list.size(), mVectorLayer);
8991
}
9092

91-
//numberofclassesspinbox->setValue(list.size());
93+
mClassificationComboBox->setCurrentItem(renderer->classificationField());
94+
95+
//set the right colors and texts to the widgets
96+
int number = 0;
97+
for (std::list < QgsRangeRenderItem * >::iterator it = list.begin(); it != list.end(); ++it)
98+
{
99+
((QLineEdit *) (ext->getWidget(0, number)))->setText((*it)->value());
100+
((QLineEdit *) ext->getWidget(1, number))->setText((*it)->upper_value());
101+
((QLineEdit *) ext->getWidget(2, number))->setText((*it)->label());
102+
((QPushButton *) ext->getWidget(3, number))->setName(((QgsMarkerSymbol*)((*it)->getSymbol()))->picture());
103+
((QLineEdit *) ext->getWidget(4, number))->setText(QString::number(((QgsMarkerSymbol*)((*it)->getSymbol()))->scaleFactor(),'f',2));
104+
number++;
105+
}
106+
107+
108+
mNumberOfClassesSpinbox->setValue(list.size());
92109
QgsGraMaDialogBaseLayout->addMultiCellWidget(ext, 5, 5, 0, 3);
93110
ext->show();
94111

‎src/qgsprojectio.cpp

Lines changed: 29 additions & 447 deletions
Large diffs are not rendered by default.

‎src/qgsrenderer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class QgsVectorLayer;
2424
class QPainter;
2525
class QgsDlgVectorLayerProperties;
2626
class QPicture;
27+
class QDomNode;
2728

2829
#include <fstream>
2930

@@ -42,6 +43,10 @@ class QgsRenderer
4243
@param pic pointer to a marker from SVG (is only used by marker renderers
4344
@param scalefactor pointer to the scale factor for the marker image*/
4445
virtual void renderFeature(QPainter* p, QgsFeature* f,QPicture* pic, double* scalefactor)=0;
46+
/**Reads the renderer configuration from an XML file
47+
@param rnode the DOM node to read
48+
@param vl the vector layer which will be associated with the renderer*/
49+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl)=0;
4550
/**Writes the contents of the renderer to a configuration file*/
4651
virtual void writeXML(std::ofstream& xml)=0;
4752
/** Returns true, if attribute values are used by the renderer and false otherwise*/

‎src/qgssimarenderer.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsmarkersymbol.h"
2525
#include "qgssymbologyutils.h"
2626
#include <qpainter.h>
27+
#include <qdom.h>
2728

2829
void QgsSiMaRenderer::initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr)
2930
{
@@ -72,6 +73,85 @@ void QgsSiMaRenderer::renderFeature(QPainter* p, QgsFeature* f, QPicture* pic, d
7273
}
7374
}
7475

76+
void QgsSiMaRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
77+
{
78+
QgsMarkerSymbol* msy = new QgsMarkerSymbol();
79+
QPen pen;
80+
QBrush brush;
81+
QString svgpath;
82+
double scalefactor;
83+
QString value, label;
84+
85+
QDomNode rinode = rnode.namedItem("renderitem");
86+
87+
QDomNode vnode = rinode.namedItem("value");
88+
QDomElement velement = vnode.toElement();
89+
value = velement.text();
90+
91+
QDomNode synode = rinode.namedItem("markersymbol");
92+
93+
94+
QDomNode svgnode = synode.namedItem("svgpath");
95+
svgpath = svgnode.toElement().text();
96+
97+
QDomNode scalenode = synode.namedItem("scalefactor");
98+
scalefactor = scalenode.toElement().text().toDouble();
99+
100+
QDomNode outlcnode = synode.namedItem("outlinecolor");
101+
QDomElement oulcelement = outlcnode.toElement();
102+
int red = oulcelement.attribute("red").toInt();
103+
int green = oulcelement.attribute("green").toInt();
104+
int blue = oulcelement.attribute("blue").toInt();
105+
pen.setColor(QColor(red, green, blue));
106+
107+
QDomNode outlstnode = synode.namedItem("outlinestyle");
108+
QDomElement outlstelement = outlstnode.toElement();
109+
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(outlstelement.text()));
110+
111+
QDomNode outlwnode = synode.namedItem("outlinewidth");
112+
QDomElement outlwelement = outlwnode.toElement();
113+
pen.setWidth(outlwelement.text().toInt());
114+
115+
QDomNode fillcnode = synode.namedItem("fillcolor");
116+
QDomElement fillcelement = fillcnode.toElement();
117+
red = fillcelement.attribute("red").toInt();
118+
green = fillcelement.attribute("green").toInt();
119+
blue = fillcelement.attribute("blue").toInt();
120+
brush.setColor(QColor(red, green, blue));
121+
122+
QDomNode fillpnode = synode.namedItem("fillpattern");
123+
QDomElement fillpelement = fillpnode.toElement();
124+
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
125+
126+
QDomNode lnode = rinode.namedItem("label");
127+
QDomElement lnodee = lnode.toElement();
128+
label = lnodee.text();
129+
130+
//create a renderer and add it to the vector layer
131+
msy->setBrush(brush);
132+
msy->setPen(pen);
133+
msy->setPicture(svgpath);
134+
qWarning("the svgpath: "+svgpath);
135+
msy->setScaleFactor(scalefactor);
136+
qWarning("the scalefactor: "+QString::number(scalefactor,'f',2));
137+
138+
QgsRenderItem* ri = new QgsRenderItem();
139+
ri->setSymbol(msy);
140+
ri->setLabel(label);
141+
ri->setValue(value);
142+
143+
this->addItem(ri);
144+
vl.setRenderer(this);
145+
QgsSiMaDialog *smdialog = new QgsSiMaDialog(&vl);
146+
vl.setRendererDialog(smdialog);
147+
148+
QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
149+
vl.setLayerProperties(properties);
150+
properties->setLegendType("Single Marker");
151+
152+
smdialog->apply();
153+
}
154+
75155
void QgsSiMaRenderer::writeXML(std::ofstream& xml)
76156
{
77157
xml << "\t\t<singlemarker>\n";

‎src/qgssimarenderer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class QgsSiMaRenderer: public QgsRenderer
3333
void addItem(QgsRenderItem* ri);
3434
void initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr=0);
3535
void renderFeature(QPainter* p, QgsFeature* f, QPicture* pic, double* scalefactor);
36+
/**Reads the renderer configuration from an XML file
37+
@param rnode the DOM node to read
38+
@param vl the vector layer which will be associated with the renderer*/
39+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
3640
/**Writes the contents of the renderer to a configuration file*/
3741
virtual void writeXML(std::ofstream& xml);
3842
bool needsAttributes();

‎src/qgssinglesymrenderer.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgssisydialog.h"
2424
#include "qgslegenditem.h"
2525
#include "qgssymbologyutils.h"
26+
#include <qdom.h>
2627

2728
QgsSingleSymRenderer::QgsSingleSymRenderer(): mItem(new QgsRenderItem())
2829
{
@@ -140,6 +141,66 @@ void QgsSingleSymRenderer::initializeSymbology(QgsVectorLayer * layer, QgsDlgVec
140141
}
141142
}
142143

144+
void QgsSingleSymRenderer::readXML(const QDomNode& rnode, QgsVectorLayer& vl)
145+
{
146+
QgsSymbol* sy = new QgsSymbol();
147+
QPen pen;
148+
QBrush brush;
149+
150+
QDomNode rinode = rnode.namedItem("renderitem");
151+
152+
QDomNode vnode = rinode.namedItem("value");
153+
QDomElement velement = vnode.toElement();
154+
QString value = velement.text();
155+
156+
QDomNode synode = rinode.namedItem("symbol");
157+
158+
QDomNode outlcnode = synode.namedItem("outlinecolor");
159+
QDomElement oulcelement = outlcnode.toElement();
160+
int red = oulcelement.attribute("red").toInt();
161+
int green = oulcelement.attribute("green").toInt();
162+
int blue = oulcelement.attribute("blue").toInt();
163+
pen.setColor(QColor(red, green, blue));
164+
165+
QDomNode outlstnode = synode.namedItem("outlinestyle");
166+
QDomElement outlstelement = outlstnode.toElement();
167+
pen.setStyle(QgsSymbologyUtils::qString2PenStyle(outlstelement.text()));
168+
169+
QDomNode outlwnode = synode.namedItem("outlinewidth");
170+
QDomElement outlwelement = outlwnode.toElement();
171+
pen.setWidth(outlwelement.text().toInt());
172+
173+
QDomNode fillcnode = synode.namedItem("fillcolor");
174+
QDomElement fillcelement = fillcnode.toElement();
175+
red = fillcelement.attribute("red").toInt();
176+
green = fillcelement.attribute("green").toInt();
177+
blue = fillcelement.attribute("blue").toInt();
178+
brush.setColor(QColor(red, green, blue));
179+
180+
QDomNode fillpnode = synode.namedItem("fillpattern");
181+
QDomElement fillpelement = fillpnode.toElement();
182+
brush.setStyle(QgsSymbologyUtils::qString2BrushStyle(fillpelement.text()));
183+
184+
QDomNode lnode = rinode.namedItem("label");
185+
QDomElement lnodee = lnode.toElement();
186+
QString label = lnodee.text();
187+
188+
//create a renderer and add it to the vector layer
189+
sy->setBrush(brush);
190+
sy->setPen(pen);
191+
QgsRenderItem* ri = new QgsRenderItem(sy, value, label);
192+
this->addItem(ri);
193+
vl.setRenderer(this);
194+
QgsSiSyDialog *sdialog = new QgsSiSyDialog(&vl);
195+
vl.setRendererDialog(sdialog);
196+
197+
QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(&vl);
198+
vl.setLayerProperties(properties);
199+
properties->setLegendType("Single Symbol");
200+
201+
sdialog->apply();
202+
}
203+
143204
void QgsSingleSymRenderer::writeXML(std::ofstream& xml)
144205
{
145206
xml << "\t\t<singlesymbol>\n";

‎src/qgssinglesymrenderer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class QgsSingleSymRenderer: public QgsRenderer
4343
@param layer the vector layer associated with the renderer
4444
@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*/
4545
virtual void initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr=0);
46+
/**Reads the renderer configuration from an XML file
47+
@param rnode the DOM node to read
48+
@param vl the vector layer which will be associated with the renderer*/
49+
virtual void readXML(const QDomNode& rnode, QgsVectorLayer& vl);
4650
/**Writes the contents of the renderer to a configuration file*/
4751
virtual void writeXML(std::ofstream& xml);
4852
/**Returns false, no attributes neede for single symbol*/

0 commit comments

Comments
 (0)
Please sign in to comment.