28 #include <QDomDocument>
29 #include <QDomElement>
32 : mStrokeColor( QColor( 35, 35, 35 ) )
35 mPen.setColor( mStrokeColor );
36 mPen.setStyle( mStrokeStyle );
37 mPen.setJoinStyle( mPenJoinStyle );
40 mBrush.setStyle( Qt::SolidPattern );
50 if (
properties.contains( QStringLiteral(
"symbol_name" ) ) )
54 if (
properties.contains( QStringLiteral(
"size" ) ) )
58 if (
properties.contains( QStringLiteral(
"size_unit" ) ) )
62 if (
properties.contains( QStringLiteral(
"size_map_unit_scale" ) ) )
66 if (
properties.contains( QStringLiteral(
"symbol_width" ) ) )
70 if (
properties.contains( QStringLiteral(
"symbol_width_unit" ) ) )
74 if (
properties.contains( QStringLiteral(
"symbol_width_map_unit_scale" ) ) )
78 if (
properties.contains( QStringLiteral(
"symbol_height" ) ) )
82 if (
properties.contains( QStringLiteral(
"symbol_height_unit" ) ) )
86 if (
properties.contains( QStringLiteral(
"symbol_height_map_unit_scale" ) ) )
90 if (
properties.contains( QStringLiteral(
"angle" ) ) )
94 if (
properties.contains( QStringLiteral(
"outline_style" ) ) )
98 else if (
properties.contains( QStringLiteral(
"line_style" ) ) )
102 if (
properties.contains( QStringLiteral(
"joinstyle" ) ) )
106 if (
properties.contains( QStringLiteral(
"cap_style" ) ) )
110 if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
114 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
118 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
122 else if (
properties.contains( QStringLiteral(
"line_width_unit" ) ) )
126 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
130 if (
properties.contains( QStringLiteral(
"fill_color" ) ) )
135 else if (
properties.contains( QStringLiteral(
"color" ) ) )
139 if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
143 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
147 if (
properties.contains( QStringLiteral(
"offset" ) ) )
151 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
155 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
159 if (
properties.contains( QStringLiteral(
"horizontal_anchor_point" ) ) )
163 if (
properties.contains( QStringLiteral(
"vertical_anchor_point" ) ) )
176 double scaledWidth = mSymbolWidth;
177 double scaledHeight = mSymbolHeight;
179 QColor brushColor =
mColor;
180 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
181 mBrush.setColor( brushColor );
183 QColor penColor = mStrokeColor;
184 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
185 mPen.setColor( penColor );
192 if ( !exprVal.isNull() )
194 double width = exprVal.toDouble( &ok );
198 mPen.setWidthF( width );
199 mSelPen.setWidthF( width );
208 if ( !exprVal.isNull() )
211 mSelPen.setStyle( mPen.style() );
219 if ( !exprVal.isNull() )
222 mSelPen.setJoinStyle( mPen.joinStyle() );
241 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
242 mBrush.setColor( brushColor );
249 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
250 mPen.setColor( penColor );
258 if ( !exprVal.isNull() )
262 preparePath(
shape, context, &scaledWidth, &scaledHeight, context.
feature() );
266 bool hasDataDefinedRotation =
false;
269 calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation,
offset,
angle );
277 QTransform transform;
278 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
281 transform.rotate(
angle );
286 p->setPen( context.
selected() ? mSelPen : mPen );
287 p->setBrush( context.
selected() ? mSelBrush : mBrush );
291 p->setPen( context.
selected() ? mSelPen : mPen );
292 p->setBrush( QBrush() );
294 p->drawPath( transform.map( mPainterPath ) );
301 bool &hasDataDefinedRotation,
303 double &
angle )
const
307 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
308 offset = QPointF( offsetX, offsetY );
311 const bool ok =
true;
313 bool usingDataDefinedRotation =
false;
318 usingDataDefinedRotation = ok;
322 if ( hasDataDefinedRotation )
347 return QStringLiteral(
"EllipseMarker" );
355 preparePath( mShape, context );
357 mPen.setColor( mStrokeColor );
358 mPen.setStyle( mStrokeStyle );
359 mPen.setJoinStyle( mPenJoinStyle );
360 mPen.setCapStyle( mPenCapStyle );
362 mBrush.setColor(
mColor );
365 QColor selPenColor = selBrushColor ==
mColor ? selBrushColor : mStrokeColor;
368 selBrushColor.setAlphaF( context.
opacity() );
369 selPenColor.setAlphaF( context.
opacity() );
371 mSelBrush = QBrush( selBrushColor );
372 mSelPen = QPen( !
shapeIsFilled( mShape ) ? selBrushColor : selPenColor );
373 mSelPen.setStyle( mStrokeStyle );
414 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PointSymbolizer" ) );
415 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
416 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
417 element.appendChild( symbolizerElem );
428 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
429 element.appendChild( graphicElem );
438 QString angleFunc = props.
value( QStringLiteral(
"angle" ), QString() ).toString();
439 if ( angleFunc.isEmpty() )
441 if ( ddRotation && ddRotation.
isActive() )
446 angleFunc = QString::number(
mAngle );
448 else if ( ddRotation && ddRotation.
isActive() )
452 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc, ddRotation.
asExpression() );
458 const double angle = angleFunc.toDouble( &ok );
462 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc ).arg(
mAngle );
477 const double widthHeightFactor = mSymbolWidth / mSymbolHeight;
479 graphicElem.appendChild( factorElem );
486 QDomElement graphicElem = element.firstChildElement( QStringLiteral(
"Graphic" ) );
487 if ( graphicElem.isNull() )
490 QString name = QStringLiteral(
"circle" );
493 double widthHeightFactor = 1.0;
497 for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
499 if ( it.key() == QLatin1String(
"widthHeightFactor" ) )
502 const double v = it.value().toDouble( &ok );
504 widthHeightFactor = v;
511 const QString uom = element.attribute( QStringLiteral(
"uom" ) );
520 const double d = angleFunc.toDouble( &ok );
541 map[QStringLiteral(
"symbol_name" )] =
encodeShape( mShape );
542 map[QStringLiteral(
"symbol_width" )] = QString::number( mSymbolWidth );
545 map[QStringLiteral(
"symbol_height" )] = QString::number( mSymbolHeight );
548 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
550 map[QStringLiteral(
"outline_width" )] = QString::number( mStrokeWidth );
560 map[QStringLiteral(
"size" )] = QString::number(
mSize );
568 QSizeF QgsEllipseSymbolLayer::calculateSize(
QgsSymbolRenderContext &context,
double *scaledWidth,
double *scaledHeight )
579 width = mSymbolWidth;
583 *scaledWidth = width;
595 height = mSymbolHeight;
599 *scaledHeight = height;
602 return QSizeF( width, height );
607 mPainterPath = QPainterPath();
609 const QSizeF
size = calculateSize( context, scaledWidth, scaledHeight );
614 mPainterPath.addEllipse( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
618 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
619 mPainterPath.lineTo( 0, 0 );
623 mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
627 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
628 mPainterPath.lineTo( 0,
size.height() / 2.0 );
629 mPainterPath.lineTo(
size.width() / 2.0, 0 );
630 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
631 mPainterPath.lineTo( -
size.width() / 2.0, 0 );
635 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
636 mPainterPath.lineTo( 0,
size.height() / 2.0 );
637 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
638 mPainterPath.lineTo(
size.width() / 2.0, 0 );
642 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
643 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
644 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
648 mPainterPath.moveTo(
size.width() / 2.0, 0 );
649 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
653 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
654 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
655 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
656 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
660 mPainterPath.moveTo( 0,
size.height() / 2.0 );
661 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
662 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
663 mPainterPath.lineTo( 0,
size.height() / 2.0 );
667 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
668 mPainterPath.lineTo( 0,
size.height() / 2.0 );
669 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
670 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
699 if ( mSymbolWidth >= mSymbolHeight )
701 mSymbolHeight = mSymbolHeight *
size / mSymbolWidth;
706 mSymbolWidth = mSymbolWidth *
size / mSymbolHeight;
707 mSymbolHeight =
size;
727 mSymbolWidthUnit = unit;
728 mSymbolHeightUnit = unit;
729 mStrokeWidthUnit = unit;
735 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
753 mSymbolWidthMapUnitScale = scale;
754 mSymbolHeightMapUnitScale = scale;
755 mStrokeWidthMapUnitScale = scale;
761 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
762 mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
764 return mSymbolWidthMapUnitScale;
771 const QSizeF
size = calculateSize( context );
773 bool hasDataDefinedRotation =
false;
776 calculateOffsetAndRotation( context,
size.width(),
size.height(), hasDataDefinedRotation,
offset,
angle );
778 QTransform transform;
781 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
784 transform.rotate(
angle );
786 double penWidth = mStrokeWidth;
792 if ( !exprVal.isNull() )
795 const double strokeWidth = exprVal.toDouble( &ok );
808 if ( !exprVal.isNull() && exprVal.toString() == QLatin1String(
"no" ) )
813 else if ( mStrokeStyle == Qt::NoPen )
819 QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
820 -
size.height() / 2.0,
825 symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
826 penWidth / 2.0, penWidth / 2.0 );
880 QColor oc = mStrokeColor;
899 QPointF off( offsetX, offsetY );
902 double rotation = 0.0;
912 rotation = -rotation;
917 t.translate( shift.x() + offsetX, shift.y() + offsetY );
920 t.rotate( rotation );
931 const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
938 const double stepsize = 2 * M_PI / 40;
939 for (
int i = 0; i < 39; ++i )
941 const double angle = stepsize * i;
942 const double x = halfWidth * std::cos(
angle );
943 const double y = halfHeight * std::sin(
angle );
944 line <<
QgsPoint( t.map( QPointF( x, y ) ) );
947 line << line.at( 0 );
949 if ( mBrush.style() != Qt::NoBrush )
951 if ( mPen.style() != Qt::NoPen )
960 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
961 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
962 <<
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
963 <<
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
966 if ( mBrush.style() != Qt::NoBrush )
968 if ( mPen.style() != Qt::NoPen )
974 if ( mPen.style() != Qt::NoPen )
977 <<
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
978 <<
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
979 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
981 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
982 <<
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
983 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
992 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
993 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
994 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
996 if ( mBrush.style() != Qt::NoBrush )
998 if ( mPen.style() != Qt::NoPen )
1019 const QString cleaned = name.toLower().trimmed();
1021 if ( cleaned == QLatin1String(
"circle" ) )
1023 else if ( cleaned == QLatin1String(
"square" ) || cleaned == QLatin1String(
"rectangle" ) )
1025 else if ( cleaned == QLatin1String(
"diamond" ) )
1027 else if ( cleaned == QLatin1String(
"cross" ) )
1029 else if ( cleaned == QLatin1String(
"arrow" ) )
1031 else if ( cleaned == QLatin1String(
"half_arc" ) )
1033 else if ( cleaned == QLatin1String(
"triangle" ) )
1035 else if ( cleaned == QLatin1String(
"right_half_triangle" ) )
1037 else if ( cleaned == QLatin1String(
"left_half_triangle" ) )
1039 else if ( cleaned == QLatin1String(
"semi_circle" ) )
1052 return QStringLiteral(
"circle" );
1054 return QStringLiteral(
"rectangle" );
1056 return QStringLiteral(
"diamond" );
1058 return QStringLiteral(
"cross" );
1060 return QStringLiteral(
"arrow" );
1062 return QStringLiteral(
"half_arc" );
1064 return QStringLiteral(
"triangle" );
1066 return QStringLiteral(
"right_half_triangle" );
1068 return QStringLiteral(
"left_half_triangle" );
1070 return QStringLiteral(
"semi_circle" );
1077 QList< Shape > shapes;
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
Exports QGIS layers to the DXF format.
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
void writePolygon(const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf filled polygon (HATCH)
void writePolyline(const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
A symbol layer for rendering objects with major and minor axis (e.g.
void setPenCapStyle(Qt::PenCapStyle style)
Sets the marker's stroke cap style (e.g., flat, round, etc).
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const override
write as DXF
void setStrokeWidth(double w)
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QRectF bounds(QPointF point, QgsSymbolRenderContext &context) override
Returns the approximate bounding box of the marker symbol layer, taking into account any data defined...
void setSymbolWidth(double w)
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double strokeWidth() const
void setStrokeColor(const QColor &c) override
Sets the stroke color for the symbol layer.
void setStrokeStyle(Qt::PenStyle strokeStyle)
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
static QgsEllipseSymbolLayer::Shape decodeShape(const QString &name, bool *ok=nullptr)
Attempts to decode a string representation of a shape name to the corresponding shape.
void setSize(double size) override
Sets the symbol size.
QgsMapUnitScale mapUnitScale() const override
Shape
Marker symbol shapes.
@ Cross
Stroke-only cross.
@ HalfArc
Stroke-only half arc (since QGIS 3.20)
@ Arrow
Stroke-only arrow (since QGIS 3.20)
@ RightHalfTriangle
Right half of a triangle.
@ LeftHalfTriangle
Left half of a triangle.
QColor fillColor() const override
Returns the fill color for the symbol layer.
QgsEllipseSymbolLayer::Shape shape() const
Returns the shape for the rendered ellipse marker symbol.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void setFillColor(const QColor &c) override
Sets the fill color for the symbol layer.
void setShape(QgsEllipseSymbolLayer::Shape shape)
Sets the rendered ellipse marker shape.
static QList< QgsEllipseSymbolLayer::Shape > availableShapes()
Returns a list of all available shape types.
Qt::PenStyle strokeStyle() const
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates the symbol layer.
static QgsSymbolLayer * createFromSld(QDomElement &element)
static QString encodeShape(QgsEllipseSymbolLayer::Shape shape)
Encodes a shape to its string representation.
double symbolWidth() const
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
QColor strokeColor() const override
Returns the stroke color for the symbol layer.
void setSymbolWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's width.
void setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
static bool shapeIsFilled(const QgsEllipseSymbolLayer::Shape &shape)
Returns true if a shape has a fill.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's stroke width.
~QgsEllipseSymbolLayer() override
void setMapUnitScale(const QgsMapUnitScale &scale) override
double symbolHeight() const
void setSymbolHeight(double h)
void setSymbolHeightUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's height.
void writeSldMarker(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Writes the symbol layer definition as a SLD XML element.
QgsEllipseSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
A geometry is the spatial representation of a feature.
QgsWkbTypes::GeometryType type
Perform transforms between map coordinates and device coordinates.
double mapRotation() const
Returns the current map rotation in degrees (clockwise).
Struct for storing maximum and minimum scales for measurements in map units.
virtual void setSize(double size)
Sets the symbol size.
QPointF offset() const
Returns the marker's offset, which is the horizontal and vertical displacement which the rendered mar...
double mLineAngle
Line rotation angle (see setLineAngle() for details)
HorizontalAnchorPoint
Symbol horizontal anchor points.
void setAngle(double angle)
Sets the rotation angle for the marker.
QgsUnitTypes::RenderUnit mOffsetUnit
Offset units.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's size.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QPointF mOffset
Marker offset.
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
QgsMapUnitScale mapUnitScale() const override
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's size.
double size() const
Returns the symbol size.
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
HorizontalAnchorPoint mHorizontalAnchorPoint
Horizontal anchor point.
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
VerticalAnchorPoint
Symbol vertical anchor points.
void markerOffset(QgsSymbolRenderContext &context, double &offsetX, double &offsetY) const
Calculates the required marker offset, including both the symbol offset and any displacement required...
VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
QgsUnitTypes::RenderUnit mSizeUnit
Marker size unit.
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's offset.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
double mAngle
Marker rotation angle, in degrees clockwise from north.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
void setMapUnitScale(const QgsMapUnitScale &scale) override
Point geometry type, with support for z-dimension and m-values.
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const override
Returns the calculated value of the property with the specified key from within the collection.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
A store for object properties.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
bool isActive() const
Returns whether the property is currently active.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QColor selectionColor() const
Returns the color to use when rendering selected features.
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
static QString encodePenStyle(Qt::PenStyle style)
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QColor decodeColor(const QString &str)
static double rescaleUom(double size, QgsUnitTypes::RenderUnit unit, const QVariantMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
static QString encodePenCapStyle(Qt::PenCapStyle style)
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
static double sizeInPixelsFromSldUom(const QString &uom, double size)
Returns the size scaled in pixels according to the uom attribute.
static bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
static QString encodeColor(const QColor &color)
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
static void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle, double strokeWidth=-1, double size=-1)
static Qt::PenStyle decodePenStyle(const QString &str)
static void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
static QgsStringMap getVendorOptionList(QDomElement &element)
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
@ PropertyStrokeStyle
Stroke style (eg solid, dashed)
@ PropertyCapStyle
Line cap style.
@ PropertyAngle
Symbol angle.
@ PropertyJoinStyle
Line join style.
@ PropertyStrokeWidth
Stroke width.
@ PropertyFillColor
Fill color.
@ PropertyHeight
Symbol height.
@ PropertyName
Name, eg shape name for simple markers.
@ PropertyStrokeColor
Stroke color.
@ PropertyWidth
Symbol width.
static const bool SELECTION_IS_OPAQUE
Whether styles for selected features ignore symbol alpha.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
virtual QColor color() const
Returns the "representative" color of the symbol layer.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
QgsPropertyCollection mDataDefinedProperties
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style.
Qgis::SymbolRenderHints renderHints() const
Returns the rendering hint flags for the symbol.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
const QgsFeature * feature() const
Returns the current feature being rendered.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
qreal opacity() const
Returns the opacity for the symbol.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
RenderUnit
Rendering size units.
@ RenderUnknownUnit
Mixed or unknown units.
@ RenderMetersInMapUnits
Meters value as Map units.
@ RenderMillimeters
Millimeters.
@ RenderMapUnits
Map units.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QMap< QString, QString > QgsStringMap
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
#define QgsDebugMsgLevel(str, level)