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 );
357 if ( !props.
value(
"uom",
"" ).isEmpty() )
376 double widthHeightFactor = mSymbolWidth / mSymbolHeight;
386 if ( ddRotation && ddRotation->
isActive() )
393 else if ( ddRotation && ddRotation->
isActive() )
423 if ( graphicElem.
isNull() )
428 double borderWidth,
size;
429 double widthHeightFactor = 1.0;
430 Qt::PenStyle borderStyle;
435 if ( it.key() ==
"widthHeightFactor" )
438 double v = it.value().toDouble( &ok );
440 widthHeightFactor = v;
452 double d = angleFunc.
toDouble( &ok );
472 map[
"symbol_name"] = mSymbolName;
513 width = mSymbolWidth;
517 *scaledWidth = width;
533 height = mSymbolHeight;
537 *scaledHeight = height;
540 return QSizeF( width, height );
547 QSizeF size = calculateSize( context, scaledWidth, scaledHeight );
549 if ( symbolName ==
"circle" )
553 else if ( symbolName ==
"rectangle" )
557 else if ( symbolName ==
"cross" )
564 else if ( symbolName ==
"triangle" )
576 mSymbolWidthUnit = unit;
577 mSymbolHeightUnit = unit;
578 mOutlineWidthUnit = unit;
584 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mOutlineWidthUnit != unit )
594 mSymbolWidthMapUnitScale = scale;
595 mSymbolHeightMapUnitScale = scale;
596 mOutlineWidthMapUnitScale = scale;
602 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
603 mSymbolHeightMapUnitScale == mOutlineWidthMapUnitScale )
605 return mSymbolWidthMapUnitScale;
614 bool hasDataDefinedRotation =
false;
617 calculateOffsetAndRotation( context, size.
width(), size.
height(), hasDataDefinedRotation,
offset,
angle );
624 transform.
translate( point.
x() + offset.x(), point.
y() + offset.y() );
627 transform.
rotate( angle );
629 double penWidth = 0.0;
644 if ( ok && outlineStyle ==
"no" )
651 penWidth += pixelSize;
659 symbolBounds.
adjust( -penWidth / 2.0, -penWidth / 2.0,
660 penWidth / 2.0, penWidth / 2.0 );
681 symbolWidth *= mmMapUnitScaleFactor;
693 symbolHeight =
mSize;
697 symbolHeight *= mmMapUnitScaleFactor;
725 QColor oc = mOutlineColor;
735 QString symbolName = mSymbolName;
746 QPointF off( offsetX, offsetY );
749 double rotation = 0.0;
759 rotation = -rotation;
764 t.
translate( shift.
x() + offsetX, shift.
y() + offsetY );
769 double halfWidth = symbolWidth / 2.0;
770 double halfHeight = symbolHeight / 2.0;
772 if ( symbolName ==
"circle" )
783 double stepsize = 2 *
M_PI / 40;
784 for (
int i = 0; i < 39; ++i )
786 double angle = stepsize * i;
787 double x = halfWidth * cos( angle );
788 double y = halfHeight * sin( angle );
794 if ( mBrush.
style() != Qt::NoBrush )
796 if ( mPen.
style() != Qt::NoPen )
797 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
800 else if ( symbolName ==
"rectangle" )
804 p[0][0] = t.
map(
QPointF( -halfWidth, -halfHeight ) );
805 p[0][1] = t.
map(
QPointF( halfWidth, -halfHeight ) );
806 p[0][2] = t.
map(
QPointF( halfWidth, halfHeight ) );
807 p[0][3] = t.
map(
QPointF( -halfWidth, halfHeight ) );
809 if ( mBrush.
style() != Qt::NoBrush )
811 if ( mPen.
style() != Qt::NoPen )
812 e.
writePolyline( p[0], layerName,
"CONTINUOUS", oc, outlineWidth );
815 else if ( symbolName ==
"cross" && mPen.
style() != Qt::NoPen )
820 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
824 e.
writePolyline( line, layerName,
"CONTINUOUS", oc, outlineWidth );
828 else if ( symbolName ==
"triangle" )
836 if ( mBrush.
style() != Qt::NoBrush )
838 if ( mPen.
style() != Qt::NoPen )
839 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.
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)
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolV2RenderContext *context, const QgsFeature *f, QPointF shift=QPointF(0.0, 0.0)) const override
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)
double rasterScaleFactor() const
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.
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
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 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.