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() )
400 double widthHeightFactor = mSymbolWidth / mSymbolHeight;
410 if ( ddRotation && ddRotation->
isActive() )
417 else if ( ddRotation && ddRotation->
isActive() )
447 if ( graphicElem.
isNull() )
452 double borderWidth,
size;
453 double widthHeightFactor = 1.0;
454 Qt::PenStyle borderStyle;
459 if ( it.key() ==
"widthHeightFactor" )
462 double v = it.value().toDouble( &ok );
464 widthHeightFactor = v;
476 double d = angleFunc.
toDouble( &ok );
496 map[
"symbol_name"] = mSymbolName;
537 width = mSymbolWidth;
541 *scaledWidth = width;
557 height = mSymbolHeight;
561 *scaledHeight = height;
564 return QSizeF( width, height );
571 QSizeF size = calculateSize( context, scaledWidth, scaledHeight );
573 if ( symbolName ==
"circle" )
577 else if ( symbolName ==
"rectangle" )
581 else if ( symbolName ==
"cross" )
588 else if ( symbolName ==
"triangle" )
600 mSymbolWidthUnit = unit;
601 mSymbolHeightUnit = unit;
602 mOutlineWidthUnit = unit;
608 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit )
618 mSymbolWidthMapUnitScale = scale;
619 mSymbolHeightMapUnitScale = scale;
620 mOutlineWidthMapUnitScale = scale;
626 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
627 mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale )
629 return mSymbolWidthMapUnitScale;
638 bool hasDataDefinedRotation =
false;
641 calculateOffsetAndRotation( context, size.
width(), size.
height(), hasDataDefinedRotation,
offset,
angle );
648 transform.
translate( point.
x() + offset.x(), point.
y() + offset.y() );
651 transform.
rotate( angle );
653 double penWidth = 0.0;
668 if ( ok && outlineStyle ==
"no" )
675 penWidth += pixelSize;
683 symbolBounds.
adjust( -penWidth / 2.0, -penWidth / 2.0,
684 penWidth / 2.0, penWidth / 2.0 );
705 symbolWidth *= mmMapUnitScaleFactor;
717 symbolHeight =
mSize;
721 symbolHeight *= mmMapUnitScaleFactor;
749 QColor oc = mOutlineColor;
759 QString symbolName = mSymbolName;
770 QPointF off( offsetX, offsetY );
773 double rotation = 0.0;
783 rotation = -rotation;
788 t.
translate( shift.
x() + offsetX, shift.
y() + offsetY );
793 double halfWidth = symbolWidth / 2.0;
794 double halfHeight = symbolHeight / 2.0;
796 if ( symbolName ==
"circle" )
807 double stepsize = 2 *
M_PI / 40;
808 for (
int i = 0; i < 39; ++i )
810 double angle = stepsize * i;
811 double x = halfWidth * cos( angle );
812 double y = halfHeight * sin( angle );
818 if ( mBrush.
style() != Qt::NoBrush )
820 if ( mPen.
style() != Qt::NoPen )
821 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
824 else if ( symbolName ==
"rectangle" )
828 p[0][0] = t.
map(
QPointF( -halfWidth, -halfHeight ) );
829 p[0][1] = t.
map(
QPointF( halfWidth, -halfHeight ) );
830 p[0][2] = t.
map(
QPointF( halfWidth, halfHeight ) );
831 p[0][3] = t.
map(
QPointF( -halfWidth, halfHeight ) );
833 if ( mBrush.
style() != Qt::NoBrush )
835 if ( mPen.
style() != Qt::NoPen )
836 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
839 else if ( symbolName ==
"cross" && mPen.
style() != Qt::NoPen )
844 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
848 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
852 else if ( symbolName ==
"triangle" )
860 if ( mBrush.
style() != Qt::NoBrush )
862 if ( mPen.
style() != Qt::NoPen )
863 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)
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)
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
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.
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.