26 #include <QDomDocument>
27 #include <QDomElement>
30 : mSymbolName(
"circle" )
35 , mFillColor( Qt::white )
36 , mOutlineColor( Qt::black )
37 , mOutlineStyle( Qt::SolidLine )
59 if ( properties.
contains(
"symbol_name" ) )
63 if ( properties.
contains(
"symbol_width" ) )
67 if ( properties.
contains(
"symbol_width_unit" ) )
71 if ( properties.
contains(
"symbol_width_map_unit_scale" ) )
75 if ( properties.
contains(
"symbol_height" ) )
79 if ( properties.
contains(
"symbol_height_unit" ) )
83 if ( properties.
contains(
"symbol_height_map_unit_scale" ) )
87 if ( properties.
contains(
"angle" ) )
89 layer->
setAngle( properties[
"angle"].toDouble() );
91 if ( properties.
contains(
"outline_style" ) )
95 else if ( properties.
contains(
"line_style" ) )
99 if ( properties.
contains(
"outline_width" ) )
103 else if ( properties.
contains(
"line_width" ) )
107 if ( properties.
contains(
"outline_width_unit" ) )
111 else if ( properties.
contains(
"line_width_unit" ) )
115 if ( properties.
contains(
"outline_width_map_unit_scale" ) )
119 if ( properties.
contains(
"fill_color" ) )
124 else if ( properties.
contains(
"color" ) )
128 if ( properties.
contains(
"outline_color" ) )
132 else if ( properties.
contains(
"line_color" ) )
136 if ( properties.
contains(
"size" ) )
138 layer->
setSize( properties[
"size"].toDouble() );
140 if ( properties.
contains(
"size_unit" ) )
144 if ( properties.
contains(
"size_map_unit_scale" ) )
148 if ( properties.
contains(
"offset" ) )
152 if ( properties.
contains(
"offset_unit" ) )
156 if ( properties.
contains(
"offset_map_unit_scale" ) )
160 if ( properties.
contains(
"horizontal_anchor_point" ) )
164 if ( properties.
contains(
"vertical_anchor_point" ) )
173 if ( !properties[
"width_field"].isEmpty() )
177 if ( !properties[
"height_field"].isEmpty() )
181 if ( !properties[
"rotation_field"].isEmpty() )
185 if ( !properties[
"outline_width_field"].isEmpty() )
189 if ( !properties[
"fill_color_field"].isEmpty() )
193 if ( !properties[
"outline_color_field"].isEmpty() )
197 if ( !properties[
"symbol_name_field"].isEmpty() )
235 double scaledWidth = mSymbolWidth;
236 double scaledHeight = mSymbolHeight;
244 preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.
feature() );
250 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
251 QPointF off( offsetX, offsetY );
260 double rotation = 0.0;
273 transform.
translate( point.
x() + off.
x(), point.
y() + off.
y() );
276 transform.
rotate( rotation );
286 return "EllipseMarker";
294 preparePath( mSymbolName, context );
315 if ( !props.
value(
"uom",
"" ).isEmpty() )
334 double widthHeightFactor = mSymbolWidth / mSymbolHeight;
344 if ( ddRotation && ddRotation->
isActive() )
351 else if ( ddRotation && ddRotation->
isActive() )
381 if ( graphicElem.
isNull() )
386 double borderWidth,
size;
387 double widthHeightFactor = 1.0;
388 Qt::PenStyle borderStyle;
393 if ( it.key() ==
"widthHeightFactor" )
396 double v = it.value().toDouble( &ok );
398 widthHeightFactor = v;
410 double d = angleFunc.
toDouble( &ok );
430 map[
"symbol_name"] = mSymbolName;
473 width = mSymbolWidth;
477 *scaledWidth = width;
492 height = mSymbolHeight;
496 *scaledHeight = height;
500 if ( symbolName ==
"circle" )
502 mPainterPath.
addEllipse(
QRectF( -width / 2.0, -height / 2.0, width, height ) );
504 else if ( symbolName ==
"rectangle" )
506 mPainterPath.
addRect(
QRectF( -width / 2.0, -height / 2.0, width, height ) );
508 else if ( symbolName ==
"cross" )
510 mPainterPath.
moveTo( 0, -height / 2.0 );
511 mPainterPath.
lineTo( 0, height / 2.0 );
512 mPainterPath.
moveTo( -width / 2.0, 0 );
513 mPainterPath.
lineTo( width / 2.0, 0 );
515 else if ( symbolName ==
"triangle" )
517 mPainterPath.
moveTo( 0, -height / 2.0 );
518 mPainterPath.
lineTo( -width / 2.0, height / 2.0 );
519 mPainterPath.
lineTo( width / 2.0, height / 2.0 );
520 mPainterPath.
lineTo( 0, -height / 2.0 );
527 mSymbolWidthUnit = unit;
528 mSymbolHeightUnit = unit;
529 mOutlineWidthUnit = unit;
535 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit )
545 mSymbolWidthMapUnitScale = scale;
546 mSymbolHeightMapUnitScale = scale;
547 mOutlineWidthMapUnitScale = scale;
553 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
554 mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale )
556 return mSymbolWidthMapUnitScale;
576 symbolWidth *= mmMapUnitScaleFactor;
587 symbolHeight =
mSize;
591 symbolHeight *= mmMapUnitScaleFactor;
613 fc =
QColor( colorString );
617 QColor oc = mOutlineColor;
622 oc =
QColor( colorString );
626 QString symbolName = mSymbolName;
636 QPointF off( offsetX, offsetY );
639 double rotation = 0.0;
648 rotation = -rotation;
653 t.
translate( shift.
x() + offsetX, shift.
y() + offsetY );
658 double halfWidth = symbolWidth / 2.0;
659 double halfHeight = symbolHeight / 2.0;
661 if ( symbolName ==
"circle" )
671 double stepsize = 2 *
M_PI / 40;
672 for (
int i = 0; i < 39; ++i )
674 double angle = stepsize * i;
675 double x = halfWidth * cos( angle );
676 double y = halfHeight * sin( angle );
682 if ( mBrush.
style() != Qt::NoBrush )
684 if ( mPen.
style() != Qt::NoPen )
685 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
688 else if ( symbolName ==
"rectangle" )
692 p[0][0] = t.
map(
QPointF( -halfWidth, -halfHeight ) );
693 p[0][1] = t.
map(
QPointF( halfWidth, -halfHeight ) );
694 p[0][2] = t.
map(
QPointF( halfWidth, halfHeight ) );
695 p[0][3] = t.
map(
QPointF( -halfWidth, halfHeight ) );
697 if ( mBrush.
style() != Qt::NoBrush )
699 if ( mPen.
style() != Qt::NoPen )
700 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
703 else if ( symbolName ==
"cross" && mPen.
style() != Qt::NoPen )
708 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
712 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
716 else if ( symbolName ==
"triangle" )
724 if ( mBrush.
style() != Qt::NoBrush )
726 if ( mPen.
style() != Qt::NoPen )
727 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
void addEllipse(const QRectF &boundingRectangle)
static QString encodeOutputUnit(QgsSymbolV2::OutputUnit unit)
void renderPoint(const QPointF &point, QgsSymbolV2RenderContext &context) override
~QgsEllipseSymbolLayerV2()
static const QString EXPR_OUTLINE_COLOR
void toSld(QDomDocument &doc, QDomElement &element, QgsStringMap props) const override
void setSymbolHeight(double h)
Qt::PenStyle style() const
void setSymbolWidthUnit(QgsSymbolV2::OutputUnit unit)
QColor fillColor() const override
Get fill color.
QgsSymbolV2::OutputUnit outputUnit() const override
void setStyle(Qt::PenStyle style)
QgsMapUnitScale mSizeMapUnitScale
A container class for data source field mapping or expression.
bool contains(const Key &key) const
static Q_DECL_DEPRECATED bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &borderColor, double &borderWidth, double &size)
QgsSymbolLayerV2 * clone() const override
void startRender(QgsSymbolV2RenderContext &context) override
void setSymbolWidth(double w)
QDomNode appendChild(const QDomNode &newChild)
double outlineWidth() const
Qt::BrushStyle style() const
void writePolygon(const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, QColor color)
Draw dxf polygon (HATCH)
static void createRotationElement(QDomDocument &doc, QDomElement &element, QString rotationFunc)
double rendererScale() const
static const QString EXPR_WIDTH
static QgsStringMap getVendorOptionList(QDomElement &element)
void setOffset(QPointF offset)
void setOutlineWidthUnit(QgsSymbolV2::OutputUnit unit)
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, const QgsSymbolV2RenderContext *context, const QgsFeature *f, const QPointF &shift=QPointF(0.0, 0.0)) const override
static QPointF decodePoint(QString str)
void setVerticalAnchorPoint(VerticalAnchorPoint v)
void setJoinStyle(Qt::PenJoinStyle style)
void moveTo(const QPointF &point)
static QDomElement createVendorOptionElement(QDomDocument &doc, QString name, QString value)
static QColor decodeColor(QString str)
QString expressionString() const
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
virtual bool hasDataDefinedProperty(const QString &property) const
Checks whether the layer has a matching data defined property and if that property is currently activ...
QgsSymbolV2::OutputUnit outputUnit() const override
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
double toDouble(bool *ok) const
void setStyle(Qt::BrushStyle style)
A symbol layer for rendering objects with major and minor axis (e.g.
QgsStringMap properties() const override
double symbolWidth() const
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
void setMapUnitScale(const QgsMapUnitScale &scale) override
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
static QString encodeColor(QColor color)
void setMapUnitScale(const QgsMapUnitScale &scale) override
static QString encodePenStyle(Qt::PenStyle style)
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
QString number(int n, int base)
static const QString EXPR_FILL_COLOR
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
const QgsFeature * feature() const
Current feature being rendered - may be null.
static QString encodePoint(QPointF point)
static Qt::PenStyle decodePenStyle(QString str)
void setPen(const QColor &color)
void lineTo(const QPointF &endPoint)
void setAttribute(const QString &name, const QString &value)
QMatrix & translate(qreal dx, qreal dy)
void addRect(const QRectF &rectangle)
void setSizeUnit(QgsSymbolV2::OutputUnit unit)
void setWidthF(qreal width)
void setBrush(const QBrush &brush)
HorizontalAnchorPoint mHorizontalAnchorPoint
void setOutlineStyle(Qt::PenStyle outlineStyle)
void setColor(const QColor &color)
void setSymbolName(const QString &name)
virtual void prepareExpressions(const QgsFields *fields, double scale=-1.0)
Prepares all data defined property expressions for evaluation.
virtual bool hasDataDefinedProperties() const
Checks whether the layer has any associated data defined properties.
static const QString EXPR_OUTLINE_STYLE
static QgsSymbolLayerV2 * create(const QgsStringMap &properties=QgsStringMap())
bool useExpression() const
void startRender(QgsSymbolV2RenderContext &context) override
static const QString EXPR_OUTLINE_WIDTH
const T & at(int i) const
QMatrix & rotate(qreal degrees)
static void createGeometryElement(QDomDocument &doc, QDomElement &element, QString geomFunc)
Contains information about the context of a rendering operation.
void drawPath(const QPainterPath &path)
static QgsSymbolLayerV2 * createFromSld(QDomElement &element)
static double lineWidthScaleFactor(const QgsRenderContext &c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale &scale=QgsMapUnitScale())
Returns the line width scale factor depending on the unit and the paint device.
virtual QVariant evaluateDataDefinedProperty(const QString &property, const QgsFeature *feature, const QVariant &defaultVal=QVariant(), bool *ok=0) const
Evaluates the matching data defined property and returns the calculated value.
QgsMapUnitScale mapUnitScale() const override
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
QgsRenderContext & renderContext()
virtual QgsDataDefined * getDataDefinedProperty(const QString &property) const
Returns the data defined property corresponding to the specified property key.
QDomElement firstChildElement(const QString &tagName) const
void setOutlineColor(const QColor &c) override
Set outline color.
void writeFilledCircle(const QString &layer, QColor color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
static const QString EXPR_ROTATION
static Q_DECL_DEPRECATED void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, QString name, QColor color, QColor borderColor=QColor(), double borderWidth=-1, double size=-1)
const QgsFields * fields() const
Fields of the layer.
void push_back(const T &value)
QgsSymbolV2::OutputUnit mOffsetUnit
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
double toDouble(bool *ok) const
VerticalAnchorPoint mVerticalAnchorPoint
void stopRender(QgsSymbolV2RenderContext &context) override
QgsEllipseSymbolLayerV2()
QgsSymbolV2::OutputUnit mSizeUnit
QgsMapUnitScale mOffsetMapUnitScale
void markerOffset(const QgsSymbolV2RenderContext &context, double &offsetX, double &offsetY) const
void restoreDataDefinedProperties(const QgsStringMap &stringMap)
Restores all data defined properties from string map.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
QString layerType() const override
void writeSldMarker(QDomDocument &doc, QDomElement &element, QgsStringMap props) const override
QDomElement createElement(const QString &tagName)
static const QString EXPR_SYMBOL_NAME
QString symbolName() const
QgsMapUnitScale mapUnitScale() const override
void setSize(double size)
void map(int x, int y, int *tx, int *ty) const
void writePolyline(const QgsPolyline &line, const QString &layer, const QString &lineStyleName, QColor color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
void setAngle(double angle)
void setColor(const QColor &color)
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
double symbolHeight() const
void saveDataDefinedProperties(QgsStringMap &stringMap) const
Saves all data defined properties to a string map.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
void setFillColor(const QColor &c) override
Set fill color.
void setSymbolHeightUnit(QgsSymbolV2::OutputUnit unit)
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
void setOutlineWidthMapUnitScale(const QgsMapUnitScale &scale)
static QgsSymbolV2::OutputUnit decodeOutputUnit(QString str)
void setOutlineWidth(double w)
static const QString EXPR_HEIGHT
const T value(const Key &key) const
virtual Q_DECL_DEPRECATED void setDataDefinedProperty(const QString &property, const QString &expressionString)
Sets a data defined expression for a property.
static QPointF _rotatedOffset(const QPointF &offset, double angle)