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() )
239 double scaledWidth = mSymbolWidth;
240 double scaledHeight = mSymbolHeight;
249 preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.
feature() );
255 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
256 QPointF off( offsetX, offsetY );
265 double rotation = 0.0;
284 transform.
translate( point.
x() + off.
x(), point.
y() + off.
y() );
287 transform.
rotate( rotation );
297 return "EllipseMarker";
305 preparePath( mSymbolName, context );
326 if ( !props.
value(
"uom",
"" ).isEmpty() )
345 double widthHeightFactor = mSymbolWidth / mSymbolHeight;
355 if ( ddRotation && ddRotation->
isActive() )
362 else if ( ddRotation && ddRotation->
isActive() )
392 if ( graphicElem.
isNull() )
397 double borderWidth,
size;
398 double widthHeightFactor = 1.0;
399 Qt::PenStyle borderStyle;
404 if ( it.key() ==
"widthHeightFactor" )
407 double v = it.value().toDouble( &ok );
409 widthHeightFactor = v;
421 double d = angleFunc.
toDouble( &ok );
441 map[
"symbol_name"] = mSymbolName;
485 width = mSymbolWidth;
489 *scaledWidth = width;
505 height = mSymbolHeight;
509 *scaledHeight = height;
513 if ( symbolName ==
"circle" )
515 mPainterPath.
addEllipse(
QRectF( -width / 2.0, -height / 2.0, width, height ) );
517 else if ( symbolName ==
"rectangle" )
519 mPainterPath.
addRect(
QRectF( -width / 2.0, -height / 2.0, width, height ) );
521 else if ( symbolName ==
"cross" )
523 mPainterPath.
moveTo( 0, -height / 2.0 );
524 mPainterPath.
lineTo( 0, height / 2.0 );
525 mPainterPath.
moveTo( -width / 2.0, 0 );
526 mPainterPath.
lineTo( width / 2.0, 0 );
528 else if ( symbolName ==
"triangle" )
530 mPainterPath.
moveTo( 0, -height / 2.0 );
531 mPainterPath.
lineTo( -width / 2.0, height / 2.0 );
532 mPainterPath.
lineTo( width / 2.0, height / 2.0 );
533 mPainterPath.
lineTo( 0, -height / 2.0 );
540 mSymbolWidthUnit = unit;
541 mSymbolHeightUnit = unit;
542 mOutlineWidthUnit = unit;
548 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit )
558 mSymbolWidthMapUnitScale = scale;
559 mSymbolHeightMapUnitScale = scale;
560 mOutlineWidthMapUnitScale = scale;
566 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
567 mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale )
569 return mSymbolWidthMapUnitScale;
590 symbolWidth *= mmMapUnitScaleFactor;
602 symbolHeight =
mSize;
606 symbolHeight *= mmMapUnitScaleFactor;
634 QColor oc = mOutlineColor;
644 QString symbolName = mSymbolName;
655 QPointF off( offsetX, offsetY );
658 double rotation = 0.0;
668 rotation = -rotation;
673 t.
translate( shift.
x() + offsetX, shift.
y() + offsetY );
678 double halfWidth = symbolWidth / 2.0;
679 double halfHeight = symbolHeight / 2.0;
681 if ( symbolName ==
"circle" )
692 double stepsize = 2 *
M_PI / 40;
693 for (
int i = 0; i < 39; ++i )
695 double angle = stepsize * i;
696 double x = halfWidth * cos( angle );
697 double y = halfHeight * sin( angle );
703 if ( mBrush.
style() != Qt::NoBrush )
705 if ( mPen.
style() != Qt::NoPen )
706 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
709 else if ( symbolName ==
"rectangle" )
713 p[0][0] = t.
map(
QPointF( -halfWidth, -halfHeight ) );
714 p[0][1] = t.
map(
QPointF( halfWidth, -halfHeight ) );
715 p[0][2] = t.
map(
QPointF( halfWidth, halfHeight ) );
716 p[0][3] = t.
map(
QPointF( -halfWidth, halfHeight ) );
718 if ( mBrush.
style() != Qt::NoBrush )
720 if ( mPen.
style() != Qt::NoPen )
721 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
724 else if ( symbolName ==
"cross" && mPen.
style() != Qt::NoPen )
729 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
733 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
737 else if ( symbolName ==
"triangle" )
745 if ( mBrush.
style() != Qt::NoBrush )
747 if ( mPen.
style() != Qt::NoPen )
748 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 writeSldMarker(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
static void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolV2RenderContext *context, const QgsFeature *f, const QPointF &shift=QPointF(0.0, 0.0)) 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)
OutputUnit
The unit of the output.
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
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
Qt::BrushStyle style() const
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
QString field() const
Get the field which this QgsDataDefined represents.
static QString encodeColor(const QColor &color)
static const QString EXPR_WIDTH
static QgsStringMap getVendorOptionList(QDomElement &element)
void setOffset(QPointF offset)
void setOutlineWidthUnit(QgsSymbolV2::OutputUnit unit)
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
void setJoinStyle(Qt::PenJoinStyle style)
void moveTo(const QPointF &point)
static QPointF decodePoint(const QString &str)
QString expressionString() const
Returns the expression string of this QgsDataDefined.
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
double mapRotation() const
Return current map rotation in degrees.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
void setMapUnitScale(const QgsMapUnitScale &scale) override
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
void setMapUnitScale(const QgsMapUnitScale &scale) override
static QgsSymbolV2::OutputUnit decodeOutputUnit(const QString &str)
const QColor & color() const
static QString encodePenStyle(Qt::PenStyle style)
Perform transforms between map coordinates and device coordinates.
Mixed units in symbol layers.
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
The output shall be in millimeters.
QString number(int n, int base)
static const QString EXPR_FILL_COLOR
void markerOffset(QgsSymbolV2RenderContext &context, double &offsetX, double &offsetY) const
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
const QgsFeature * feature() const
Current feature being rendered - may be null.
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
static QString encodePoint(QPointF point)
static double convertToPainterUnits(const QgsRenderContext &c, double size, QgsSymbolV2::OutputUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale())
Converts a size from the specied units to painter units.
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)
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
HorizontalAnchorPoint mHorizontalAnchorPoint
void setOutlineStyle(Qt::PenStyle outlineStyle)
void setColor(const QColor &color)
void setSymbolName(const QString &name)
virtual Q_DECL_DEPRECATED 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 Qt::PenStyle decodePenStyle(const QString &str)
static const QString EXPR_OUTLINE_STYLE
void writePolyline(const QgsPolyline &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
static QgsSymbolLayerV2 * create(const QgsStringMap &properties=QgsStringMap())
bool useExpression() const
Returns if the field or the expression part is active.
void startRender(QgsSymbolV2RenderContext &context) override
static const QString EXPR_OUTLINE_WIDTH
const T & at(int i) const
QMatrix & rotate(qreal degrees)
Contains information about the context of a rendering operation.
void drawPath(const QPainterPath &path)
static QgsSymbolLayerV2 * createFromSld(QDomElement &element)
virtual Q_DECL_DEPRECATED 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.
Struct for storing maximum and minimum scales for measurements in map units.
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 writePolygon(const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf polygon (HATCH)
static const QString EXPR_ROTATION
const QgsMapToPixel & mapToPixel() const
void push_back(const T &value)
QgsSymbolV2::OutputUnit mOffsetUnit
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
double toDouble(bool *ok) const
static QColor decodeColor(const QString &str)
VerticalAnchorPoint mVerticalAnchorPoint
void stopRender(QgsSymbolV2RenderContext &context) override
QgsEllipseSymbolLayerV2()
QgsSymbolV2::OutputUnit mSizeUnit
QgsMapUnitScale mOffsetMapUnitScale
void restoreDataDefinedProperties(const QgsStringMap &stringMap)
Restores all data defined properties from string map.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
QString layerType() 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 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)
void setOutlineWidth(double w)
static const QString EXPR_HEIGHT
const T value(const Key &key) const
static Q_DECL_DEPRECATED void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &borderColor=QColor(), double borderWidth=-1, double size=-1)
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)