27 #include <QDomDocument>
28 #include <QDomElement>
32 , mSymbolName(
"circle" )
37 , mOutlineColor(
Qt::black )
38 , mOutlineStyle(
Qt::SolidLine )
61 if ( properties.
contains(
"symbol_name" ) )
65 if ( properties.
contains(
"symbol_width" ) )
69 if ( properties.
contains(
"symbol_width_unit" ) )
73 if ( properties.
contains(
"symbol_width_map_unit_scale" ) )
77 if ( properties.
contains(
"symbol_height" ) )
81 if ( properties.
contains(
"symbol_height_unit" ) )
85 if ( properties.
contains(
"symbol_height_map_unit_scale" ) )
89 if ( properties.
contains(
"angle" ) )
91 layer->
setAngle( properties[
"angle"].toDouble() );
93 if ( properties.
contains(
"outline_style" ) )
97 else if ( properties.
contains(
"line_style" ) )
101 if ( properties.
contains(
"outline_width" ) )
105 else if ( properties.
contains(
"line_width" ) )
109 if ( properties.
contains(
"outline_width_unit" ) )
113 else if ( properties.
contains(
"line_width_unit" ) )
117 if ( properties.
contains(
"outline_width_map_unit_scale" ) )
121 if ( properties.
contains(
"fill_color" ) )
126 else if ( properties.
contains(
"color" ) )
130 if ( properties.
contains(
"outline_color" ) )
134 else if ( properties.
contains(
"line_color" ) )
138 if ( properties.
contains(
"size" ) )
140 layer->
setSize( properties[
"size"].toDouble() );
142 if ( properties.
contains(
"size_unit" ) )
146 if ( properties.
contains(
"size_map_unit_scale" ) )
150 if ( properties.
contains(
"offset" ) )
154 if ( properties.
contains(
"offset_unit" ) )
158 if ( properties.
contains(
"offset_map_unit_scale" ) )
162 if ( properties.
contains(
"horizontal_anchor_point" ) )
166 if ( properties.
contains(
"vertical_anchor_point" ) )
175 if ( !properties[
"width_field"].isEmpty() )
179 if ( !properties[
"height_field"].isEmpty() )
183 if ( !properties[
"rotation_field"].isEmpty() )
187 if ( !properties[
"outline_width_field"].isEmpty() )
191 if ( !properties[
"fill_color_field"].isEmpty() )
195 if ( !properties[
"outline_color_field"].isEmpty() )
199 if ( !properties[
"symbol_name_field"].isEmpty() )
241 double scaledWidth = mSymbolWidth;
242 double scaledHeight = mSymbolHeight;
251 preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.
feature() );
255 bool hasDataDefinedRotation =
false;
258 calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation, offset, angle );
267 transform.
translate( point.
x() + offset.
x(), point.
y() + offset.
y() );
270 transform.
rotate( angle );
282 bool& hasDataDefinedRotation,
284 double&
angle )
const
288 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
289 offset =
QPointF( offsetX, offsetY );
294 bool usingDataDefinedRotation =
false;
299 usingDataDefinedRotation = ok;
303 if ( hasDataDefinedRotation )
328 return "EllipseMarker";
336 preparePath( mSymbolName, context );
381 if ( !props.
value(
"uom",
"" ).isEmpty() )
407 if ( ddRotation && ddRotation->
isActive() )
414 else if ( ddRotation && ddRotation->
isActive() )
424 double angle = angleFunc.
toDouble( &ok );
444 double widthHeightFactor = mSymbolWidth / mSymbolHeight;
454 if ( graphicElem.
isNull() )
459 double borderWidth,
size;
460 double widthHeightFactor = 1.0;
461 Qt::PenStyle borderStyle;
466 if ( it.key() ==
"widthHeightFactor" )
469 double v = it.value().toDouble( &ok );
471 widthHeightFactor = v;
483 double d = angleFunc.
toDouble( &ok );
503 map[
"symbol_name"] = mSymbolName;
544 width = mSymbolWidth;
548 *scaledWidth = width;
564 height = mSymbolHeight;
568 *scaledHeight = height;
571 return QSizeF( width, height );
578 QSizeF size = calculateSize( context, scaledWidth, scaledHeight );
580 if ( symbolName ==
"circle" )
584 else if ( symbolName ==
"rectangle" )
588 else if ( symbolName ==
"cross" )
595 else if ( symbolName ==
"triangle" )
607 mSymbolWidthUnit = unit;
608 mSymbolHeightUnit = unit;
609 mOutlineWidthUnit = unit;
615 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit )
625 mSymbolWidthMapUnitScale = scale;
626 mSymbolHeightMapUnitScale = scale;
627 mOutlineWidthMapUnitScale = scale;
633 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
634 mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale )
636 return mSymbolWidthMapUnitScale;
643 QSizeF size = calculateSize( context );
645 bool hasDataDefinedRotation =
false;
648 calculateOffsetAndRotation( context, size.
width(), size.
height(), hasDataDefinedRotation,
offset,
angle );
655 transform.
translate( point.
x() + offset.x(), point.
y() + offset.y() );
658 transform.
rotate( angle );
660 double penWidth = 0.0;
675 if ( ok && outlineStyle ==
"no" )
682 penWidth += pixelSize;
690 symbolBounds.
adjust( -penWidth / 2.0, -penWidth / 2.0,
691 penWidth / 2.0, penWidth / 2.0 );
712 symbolWidth *= mmMapUnitScaleFactor;
724 symbolHeight =
mSize;
728 symbolHeight *= mmMapUnitScaleFactor;
756 QColor oc = mOutlineColor;
766 QString symbolName = mSymbolName;
777 QPointF off( offsetX, offsetY );
780 double rotation = 0.0;
790 rotation = -rotation;
795 t.
translate( shift.
x() + offsetX, shift.
y() + offsetY );
800 double halfWidth = symbolWidth / 2.0;
801 double halfHeight = symbolHeight / 2.0;
803 if ( symbolName ==
"circle" )
814 double stepsize = 2 *
M_PI / 40;
815 for (
int i = 0; i < 39; ++i )
817 double angle = stepsize * i;
818 double x = halfWidth * cos( angle );
819 double y = halfHeight * sin( angle );
825 if ( mBrush.
style() != Qt::NoBrush )
827 if ( mPen.
style() != Qt::NoPen )
828 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
831 else if ( symbolName ==
"rectangle" )
835 p[0][0] = t.
map(
QPointF( -halfWidth, -halfHeight ) );
836 p[0][1] = t.
map(
QPointF( halfWidth, -halfHeight ) );
837 p[0][2] = t.
map(
QPointF( halfWidth, halfHeight ) );
838 p[0][3] = t.
map(
QPointF( -halfWidth, halfHeight ) );
840 if ( mBrush.
style() != Qt::NoBrush )
842 if ( mPen.
style() != Qt::NoPen )
843 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
846 else if ( symbolName ==
"cross" && mPen.
style() != Qt::NoPen )
851 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
855 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
859 else if ( symbolName ==
"triangle" )
867 if ( mBrush.
style() != Qt::NoBrush )
869 if ( mPen.
style() != Qt::NoPen )
870 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
void addEllipse(const QRectF &boundingRectangle)
static QString encodeOutputUnit(QgsSymbolV2::OutputUnit unit)
~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)
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)
static QPointF _rotatedOffset(QPointF offset, double angle)
void renderPoint(QPointF point, QgsSymbolV2RenderContext &context) override
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)
void startRender(QgsSymbolV2RenderContext &context) override
void setSymbolWidth(double w)
QDomNode appendChild(const QDomNode &newChild)
static double rescaleUom(double size, QgsSymbolV2::OutputUnit unit, const QgsStringMap &props)
Rescales the given size based on the uomScale found in the props, if any is found, otherwise returns the value un-modified.
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)
QGis::GeometryType type() const
Returns type of the geometry as a QGis::GeometryType.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
QgsEllipseSymbolLayerV2 * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
A geometry is the spatial representation of a feature.
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.
void copyPaintEffect(QgsSymbolLayerV2 *destLayer) const
Copies paint effect of this layer to another symbol layer.
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...
QRectF bounds(QPointF point, QgsSymbolV2RenderContext &context) override
Returns the approximate bounding box of the marker symbol layer, taking into account any data defined...
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)
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
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
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
double symbolWidth() const
double mapRotation() const
Return current map rotation in degrees.
void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
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)
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
Writes the SLD element following the SLD v1.1 specs.
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)
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolV2RenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const override
void setWidthF(qreal width)
void setBrush(const QBrush &brush)
double rasterScaleFactor() const
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
virtual QColor color() const
The fill color.
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.
double ANALYSIS_EXPORT angle(Point3D *p1, Point3D *p2, Point3D *p3, Point3D *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
QRect mapRect(const QRect &rectangle) const
void startRender(QgsSymbolV2RenderContext &context) override
static const QString EXPR_OUTLINE_WIDTH
const T & at(int i) const
QMatrix & rotate(qreal degrees)
void drawPath(const QPainterPath &path)
static QgsSymbolLayerV2 * createFromSld(QDomElement &element)
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.
const QgsGeometry * constGeometry() const
Gets a const pointer to the geometry object associated with this feature.
void writePolygon(const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf filled polygon (HATCH)
static const QString EXPR_ROTATION
const QgsMapToPixel & mapToPixel() const
void push_back(const T &value)
Qt::PenStyle outlineStyle() const
QgsSymbolV2::OutputUnit mOffsetUnit
virtual void setColor(const QColor &color)
The fill color.
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
Returns a string that represents this layer type.
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 copyDataDefinedProperties(QgsSymbolLayerV2 *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
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.
virtual Q_DECL_DEPRECATED QVariant evaluateDataDefinedProperty(const QString &property, const QgsFeature *feature, const QVariant &defaultVal=QVariant(), bool *ok=nullptr) const
Evaluates the matching data defined property and returns the calculated value.