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() )
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;
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 markerOffset(QgsSymbolV2RenderContext &context, double &offsetX, double &offsetY) const
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.
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)
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)
virtual bool hasDataDefinedProperties() const
Checks whether the layer has any associated data defined properties.
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)
const QgsGeometry * constGeometry() const
Gets a const pointer to the geometry object associated with this feature.
const QgsFeature * feature() const
Current feature being rendered - may be null.
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
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)
virtual QgsDataDefined * getDataDefinedProperty(const QString &property) const
Returns the data defined property corresponding to the specified property key.
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.
double symbolHeight() const
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
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
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.
double mapRotation() const
Return current map rotation in degrees.
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
bool useExpression() const
Returns if the field or the expression part is active.
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 setOutputUnit(QgsSymbolV2::OutputUnit unit) override
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)
QString expressionString() const
Returns the expression string of this QgsDataDefined.
void addRect(const QRectF &rectangle)
double outlineWidth() const
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)
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
Qt::PenStyle outlineStyle() const
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.
QGis::GeometryType type() const
Returns type of the geometry as a QGis::GeometryType.
virtual QColor color() const
The fill color.
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())
void copyDataDefinedProperties(QgsSymbolLayerV2 *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
void saveDataDefinedProperties(QgsStringMap &stringMap) const
Saves all data defined properties to a string map.
QString symbolName() const
QRect mapRect(const QRect &rectangle) const
QString field() const
Get the field which this QgsDataDefined represents.
void startRender(QgsSymbolV2RenderContext &context) override
static const QString EXPR_OUTLINE_WIDTH
void copyPaintEffect(QgsSymbolLayerV2 *destLayer) const
Copies paint effect of this layer to another symbol layer.
const T & at(int i) const
QMatrix & rotate(qreal degrees)
const QgsMapToPixel & mapToPixel() const
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
virtual bool hasDataDefinedProperty(const QString &property) const
Checks whether the layer has a matching data defined property and if that property is currently activ...
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
double symbolWidth() const
QgsRenderContext & renderContext()
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 filled polygon (HATCH)
static const QString EXPR_ROTATION
void push_back(const T &value)
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.
double rasterScaleFactor() const
QDomElement createElement(const QString &tagName)
static const QString EXPR_SYMBOL_NAME
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
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.