Skip to content

Commit

Permalink
added possibility to save and load markers
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.osgeo.org/qgis/trunk@1052 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Mar 21, 2004
1 parent e6a76d9 commit 24f611d
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 24 deletions.
11 changes: 9 additions & 2 deletions qgis.dtd
Expand Up @@ -50,18 +50,24 @@
blue CDATA #REQUIRED
>

<!ATTLIST outlinecolor
<!ATTLIST fillcolor
red CDATA #REQUIRED
green CDATA #REQUIRED
blue CDATA #REQUIRED
>

<!ELEMENT
markersymbol(svgpath,scalefactor,outlinecolor,outlinestyle,outlinewidth,fillcolor,fillpattern)
>
<!ELEMENT svgpath (#PCDATA) >
<!ELEMENT scalefactor (#PCDATA) >

<!--
-- renderitem and rangerenderitem
--
-->

<!ELEMENT renderitem (value,symbol,label) >
<!ELEMENT renderitem (value,(symbol | markersymbol),label) >
<!ELEMENT value (#PCDATA) >
<!ELEMENT label (#PCDATA) >

Expand All @@ -75,6 +81,7 @@
-->

<!ELEMENT singlesymbol (renderitem) >
<!ELEMENT singlemarker (renderitem) >
<!ELEMENT graduatedsymbol (classificationfield,rangerenderitem+) >
<!ELEMENT classificationfield (#PCDATA) >
<!ELEMENT continuoussymbol (classificationfield,lowestitem,highestitem) >
Expand Down
135 changes: 120 additions & 15 deletions src/qgsprojectio.cpp
Expand Up @@ -12,7 +12,7 @@
* (at your option) any later version. *
* *
***************************************************************************/
/* qgsprojectio.cpp,v 1.31 2004/03/18 14:06:00 mhugent Exp */
/* qgsprojectio.cpp,v 1.32 2004/03/21 15:35:37 mhugent Exp */
#include <iostream>
#include <fstream>
#include <qfiledialog.h>
Expand All @@ -28,14 +28,17 @@
#include "qgsrect.h"
#include "qgsprojectio.h"
#include "qgssinglesymrenderer.h"
#include "qgssimarenderer.h"
#include "qgsgraduatedsymrenderer.h"
#include "qgscontinuouscolrenderer.h"
#include "qgssymbologyutils.h"
#include "qgssisydialog.h"
#include "qgssimadialog.h"
#include "qgsgrasydialog.h"
#include "qgscontcoldialog.h"
#include "qgsdlgvectorlayerproperties.h"
#include "qgisapp.h"
#include "qgsmarkersymbol.h"

QgsProjectIo::QgsProjectIo(QgsMapCanvas * _map, int _action, QgisApp * qgis):map(_map), action(_action), qgisApp(qgis)
{
Expand Down Expand Up @@ -206,6 +209,7 @@ bool QgsProjectIo::read(QString path)
QDomNode singlenode = node.namedItem("singlesymbol");
QDomNode graduatednode = node.namedItem("graduatedsymbol");
QDomNode continuousnode = node.namedItem("continuoussymbol");
QDomNode singlemarkernode = node.namedItem("singlemarker");

if (!singlenode.isNull()) //read configuration for single symbol
{
Expand Down Expand Up @@ -434,7 +438,85 @@ bool QgsProjectIo::read(QString path)

cdialog->apply();

}
}else if(!singlemarkernode.isNull())
{
QgsMarkerSymbol* msy = new QgsMarkerSymbol();
QPen pen;
QBrush brush;
QString svgpath;
double scalefactor;
QString value, label;

QDomNode rinode = singlemarkernode.namedItem("renderitem");

QDomNode vnode = rinode.namedItem("value");
QDomElement velement = vnode.toElement();
value = velement.text();

QDomNode synode = rinode.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 = rinode.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));

QgsRenderItem* ri = new QgsRenderItem();
ri->setSymbol(msy);
ri->setLabel(label);
ri->setValue(value);

QgsSiMaRenderer *smrenderer = new QgsSiMaRenderer();
smrenderer->addItem(ri);
dbl->setRenderer(smrenderer);
QgsSiMaDialog *smdialog = new QgsSiMaDialog(dbl);
dbl->setRendererDialog(smdialog);

QgsDlgVectorLayerProperties *properties = new QgsDlgVectorLayerProperties(dbl);
dbl->setLayerProperties(properties);
properties->setLegendType("Single Marker");

smdialog->apply();
}

dbl->setVisible(visible == "1");
qWarning("adde den Layer");
Expand Down Expand Up @@ -597,9 +679,12 @@ void QgsProjectIo::writeXML()
{
qWarning("Warning, cast failed in QgsProjectIo, line 309");
}

QgsSingleSymRenderer *srenderer = dynamic_cast < QgsSingleSymRenderer * >(layer->renderer());
QgsGraduatedSymRenderer *grenderer = dynamic_cast < QgsGraduatedSymRenderer * >(layer->renderer());
QgsContinuousColRenderer *crenderer = dynamic_cast < QgsContinuousColRenderer * >(layer->renderer());
QgsSiMaRenderer *smrenderer = dynamic_cast < QgsSiMaRenderer * >(layer->renderer());

if (srenderer)
{
xml << "\t\t<singlesymbol>\n";
Expand Down Expand Up @@ -701,19 +786,39 @@ void QgsProjectIo::writeXML()
xml << "\t\t\t\t</renderitem>\n";
xml << "\t\t\t</highestitem>\n";
xml << "\t\t</continuoussymbol>\n";
}

/*xml << "\t\t<symbol>\n";
QgsSymbol *sym = lyr->symbol();
xml << "\t\t\t<linewidth>" << sym->lineWidth() << "</linewidth>\n";
QColor outlineColor = sym->color();
xml << "\t\t\t<outlinecolor red=\"" << outlineColor.red() << "\" green=\""
<< outlineColor.green() << "\" blue=\"" << outlineColor.blue() << "\" />\n";
QColor fillColor = sym->fillColor();
xml << "\t\t\t<fillcolor red=\"" << fillColor.red() << "\" green=\""
<< fillColor.green() << "\" blue=\"" << fillColor.blue() << "\" />\n";
xml << "\t\t</symbol>\n"; */
}else if(smrenderer)
{
xml << "\t\t<singlemarker>\n";
xml << "\t\t\t<renderitem>\n";
xml << "\t\t\t\t<value>" + smrenderer->item()->value() + "</value>\n";

QgsMarkerSymbol *markersymbol = dynamic_cast<QgsMarkerSymbol*>(smrenderer->item()->getSymbol());
if(markersymbol)
{
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>" + smrenderer->item()->label() + "</label>\n";
xml << "\t\t\t</renderitem>\n";
xml << "\t\t</singlemarker>\n";
}else
{
qWarning("warning, type cast failed in qgsprojectio.cpp line 715");
}
}


} else //raster layer properties
{
//cast the maplayer to rasterlayer
Expand Down
5 changes: 5 additions & 0 deletions src/qgsrenderitem.cpp
Expand Up @@ -53,3 +53,8 @@ void QgsRenderItem::setSymbol(QgsSymbol* s)
delete mSymbol;
mSymbol=s;
}

void QgsRenderItem::setValue(QString value)
{
mValue=value;
}
1 change: 1 addition & 0 deletions src/qgsrenderitem.h
Expand Up @@ -58,6 +58,7 @@ class QgsRenderItem {
void setSymbol(QgsSymbol s);
/** Sets a symbol object, which is allocated on the heap. QgsRenderItem automatically deletes it*/
void setSymbol(QgsSymbol* s);
void setValue(QString value);
/**Returns the label*/
const QString& label() const;
/**Returns the value of the field*/
Expand Down
55 changes: 48 additions & 7 deletions src/qgssimadialog.cpp
Expand Up @@ -32,10 +32,52 @@

QgsSiMaDialog::QgsSiMaDialog(QgsVectorLayer* vectorlayer): QgsSiMaDialogBase(), mVectorLayer(vectorlayer), mMarkerSizeDirty(false)
{
QObject::connect(mImageButton,SIGNAL(clicked()),this,SLOT(selectMarker()));
QObject::connect(mScaleEdit,SIGNAL(returnPressed()),this,SLOT(updateMarkerSize()));
QObject::connect(mScaleEdit,SIGNAL(textChanged(const QString&)),this,SLOT(setMarkerSizeDirty()));
mScaleEdit->setText("1.0");
if(mVectorLayer)
{
QgsSiMaRenderer *renderer;

//initial settings, use the buffer of the propertiesDialog if possible. If this is not possible, use the renderer of the vectorlayer directly
if (mVectorLayer->propertiesDialog())
{
renderer = dynamic_cast < QgsSiMaRenderer * >(mVectorLayer->propertiesDialog()->getBufferRenderer());
}
else
{
renderer = dynamic_cast < QgsSiMaRenderer * >(mVectorLayer->renderer());
}

if(renderer)
{
QgsMarkerSymbol* sy=dynamic_cast < QgsMarkerSymbol* >(renderer->item()->getSymbol());
if(sy)
{
QPicture pic;
double scalefactor=sy->scaleFactor();
mScaleEdit->setText(QString::number(scalefactor,'f',2));
QString svgfile=sy->picture();
mImageButton->setName(svgfile);
pic.load(svgfile,"svg");
QPixmap pixmap(pic.boundingRect().width()*scalefactor,pic.boundingRect().height()*scalefactor);
pixmap.fill();
QPainter p(&pixmap);
p.scale(scalefactor,scalefactor);
p.drawPicture(0,0,pic);
mImageButton->setPixmap(pixmap);

}else
{
qWarning("Warning, typecast failed in qgssimadialog.cpp on line 51");
}
}else
{
qWarning("Warning, typecast failed in qgssimadialog.cpp on line 42 or 46");
}


QObject::connect(mImageButton,SIGNAL(clicked()),this,SLOT(selectMarker()));
QObject::connect(mScaleEdit,SIGNAL(returnPressed()),this,SLOT(updateMarkerSize()));
QObject::connect(mScaleEdit,SIGNAL(textChanged(const QString&)),this,SLOT(setMarkerSizeDirty()));
}
}

QgsSiMaDialog::QgsSiMaDialog(): QgsSiMaDialogBase(), mVectorLayer(0), mMarkerSizeDirty(false)
Expand All @@ -52,9 +94,7 @@ QgsSiMaDialog::~QgsSiMaDialog()
}

void QgsSiMaDialog::apply()
{
updateMarkerSize();

{
qWarning("in QgsSiMaDialog::apply()");
QgsMarkerSymbol* ms= new QgsMarkerSymbol();
QString string(mImageButton->name());
Expand Down Expand Up @@ -115,6 +155,7 @@ void QgsSiMaDialog::apply()
if (mVectorLayer->legendItem())
{
mVectorLayer->legendItem()->setPixmap(0, (*pix));
updateMarkerSize();
}


Expand Down
6 changes: 6 additions & 0 deletions src/qgssimarenderer.h
Expand Up @@ -33,6 +33,7 @@ class QgsSiMaRenderer: public QgsRenderer
void initializeSymbology(QgsVectorLayer* layer, QgsDlgVectorLayerProperties* pr=0);
void renderFeature(QPainter* p, QgsFeature* f, QPicture* pic, double* scalefactor);
bool needsAttributes();
QgsRenderItem* item();
protected:
QgsRenderItem* mItem;
};
Expand All @@ -58,4 +59,9 @@ inline void QgsSiMaRenderer::addItem(QgsRenderItem* ri)
mItem=ri;
}

inline QgsRenderItem* QgsSiMaRenderer::item()
{
return mItem;
}

#endif

0 comments on commit 24f611d

Please sign in to comment.