28#include <QDomDocument>
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 );
194 double width = exprVal.toDouble( &ok );
198 mPen.setWidthF( width );
199 mSelPen.setWidthF( width );
211 mSelPen.setStyle( mPen.style() );
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 );
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 double scaleFactor = 1.0;
512 const QString uom = element.attribute( QStringLiteral(
"uom" ) );
522 const double d = angleFunc.toDouble( &ok );
543 map[QStringLiteral(
"symbol_name" )] =
encodeShape( mShape );
544 map[QStringLiteral(
"symbol_width" )] = QString::number( mSymbolWidth );
547 map[QStringLiteral(
"symbol_height" )] = QString::number( mSymbolHeight );
550 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
552 map[QStringLiteral(
"outline_width" )] = QString::number( mStrokeWidth );
562 map[QStringLiteral(
"size" )] = QString::number(
mSize );
570QSizeF QgsEllipseSymbolLayer::calculateSize(
QgsSymbolRenderContext &context,
double *scaledWidth,
double *scaledHeight )
581 width = mSymbolWidth;
585 *scaledWidth = width;
597 height = mSymbolHeight;
601 *scaledHeight = height;
604 return QSizeF( width, height );
609 mPainterPath = QPainterPath();
611 const QSizeF
size = calculateSize( context, scaledWidth, scaledHeight );
616 mPainterPath.addEllipse( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
620 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
621 mPainterPath.lineTo( 0, 0 );
625 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 120 );
626 mPainterPath.lineTo( 0, 0 );
630 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 90 );
631 mPainterPath.lineTo( 0, 0 );
635 mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
639 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
640 mPainterPath.lineTo( 0,
size.height() / 2.0 );
641 mPainterPath.lineTo(
size.width() / 2.0, 0 );
642 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
643 mPainterPath.lineTo( -
size.width() / 2.0, 0 );
647 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
648 mPainterPath.lineTo( 0,
size.height() / 2.0 );
649 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
650 mPainterPath.lineTo(
size.width() / 2.0, 0 );
654 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
655 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
656 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
660 mPainterPath.moveTo(
size.width() / 2.0, 0 );
661 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
665 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
666 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
667 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
668 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
672 mPainterPath.moveTo( 0,
size.height() / 2.0 );
673 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
674 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
675 mPainterPath.lineTo( 0,
size.height() / 2.0 );
679 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
680 mPainterPath.lineTo( 0,
size.height() / 2.0 );
681 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
682 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
686 mPainterPath.moveTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
687 mPainterPath.lineTo( (
size.width() * -0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
688 mPainterPath.lineTo( (
size.width() * 0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
689 mPainterPath.lineTo( (
size.width() * 0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
690 mPainterPath.lineTo( 0,
size.height() / -2.0 );
691 mPainterPath.lineTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
695 mPainterPath.moveTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
696 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / -4.0 );
697 mPainterPath.lineTo( 0,
size.height() / -2.0 );
698 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / -4.0 );
699 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / 4.0 );
700 mPainterPath.lineTo( 0,
size.height() / 2.0 );
701 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
706 static constexpr double VERTEX_OFFSET_FROM_ORIGIN = 1.0 / ( 1 + M_SQRT2 );
707 mPainterPath.moveTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
708 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / 2.0 );
709 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
710 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
711 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / -2.0 );
712 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / -2.0 );
713 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
714 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
715 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
721 const double inner_r = std::cos(
DEG2RAD( 72.0 ) ) / std::cos(
DEG2RAD( 36.0 ) );
722 mPainterPath.moveTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
723 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 288.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 288.0 ) ) ) / -2.0 );
724 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 252.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 252.0 ) ) ) / -2.0 );
725 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 216.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 216.0 ) ) ) / -2.0 );
726 mPainterPath.lineTo( 0, (
size.height() * inner_r ) / 2.0 );
727 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 144.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 144.0 ) ) ) / -2.0 );
728 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 108.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 108.0 ) ) ) / -2.0 );
729 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 72.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 72.0 ) ) ) / -2.0 );
730 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 36.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 36.0 ) ) ) / -2.0 );
731 mPainterPath.lineTo( 0,
size.height() / -2.0 );
732 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
768 if ( mSymbolWidth >= mSymbolHeight )
770 mSymbolHeight = mSymbolHeight *
size / mSymbolWidth;
775 mSymbolWidth = mSymbolWidth *
size / mSymbolHeight;
776 mSymbolHeight =
size;
796 mSymbolWidthUnit = unit;
797 mSymbolHeightUnit = unit;
798 mStrokeWidthUnit = unit;
804 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
822 mSymbolWidthMapUnitScale = scale;
823 mSymbolHeightMapUnitScale = scale;
824 mStrokeWidthMapUnitScale = scale;
830 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
831 mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
833 return mSymbolWidthMapUnitScale;
840 const QSizeF
size = calculateSize( context );
842 bool hasDataDefinedRotation =
false;
845 calculateOffsetAndRotation( context,
size.width(),
size.height(), hasDataDefinedRotation,
offset,
angle );
847 QTransform transform;
850 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
853 transform.rotate(
angle );
855 double penWidth = mStrokeWidth;
864 const double strokeWidth = exprVal.toDouble( &ok );
882 else if ( mStrokeStyle == Qt::NoPen )
888 QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
889 -
size.height() / 2.0,
894 symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
895 penWidth / 2.0, penWidth / 2.0 );
949 QColor oc = mStrokeColor;
968 QPointF off( offsetX, offsetY );
971 double rotation = 0.0;
981 rotation = -rotation;
986 t.translate( shift.x() + offsetX, shift.y() + offsetY );
989 t.rotate( rotation );
1000 const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
1007 const double stepsize = 2 * M_PI / 40;
1008 for (
int i = 0; i < 39; ++i )
1010 const double angle = stepsize * i;
1011 const double x = halfWidth * std::cos(
angle );
1012 const double y = halfHeight * std::sin(
angle );
1013 line <<
QgsPoint( t.map( QPointF( x, y ) ) );
1016 line << line.at( 0 );
1018 if ( mBrush.style() != Qt::NoBrush )
1020 if ( mPen.style() != Qt::NoPen )
1029 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1030 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1031 <<
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
1032 <<
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
1035 if ( mBrush.style() != Qt::NoBrush )
1037 if ( mPen.style() != Qt::NoPen )
1043 if ( mPen.style() != Qt::NoPen )
1046 <<
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
1047 <<
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
1048 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1050 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
1051 <<
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
1052 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1061 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1062 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1063 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
1065 if ( mBrush.style() != Qt::NoBrush )
1067 if ( mPen.style() != Qt::NoPen )
1094 const QString cleaned = name.toLower().trimmed();
1096 if ( cleaned == QLatin1String(
"circle" ) )
1098 else if ( cleaned == QLatin1String(
"square" ) || cleaned == QLatin1String(
"rectangle" ) )
1100 else if ( cleaned == QLatin1String(
"diamond" ) )
1102 else if ( cleaned == QLatin1String(
"cross" ) )
1104 else if ( cleaned == QLatin1String(
"arrow" ) )
1106 else if ( cleaned == QLatin1String(
"half_arc" ) )
1108 else if ( cleaned == QLatin1String(
"triangle" ) )
1110 else if ( cleaned == QLatin1String(
"right_half_triangle" ) )
1112 else if ( cleaned == QLatin1String(
"left_half_triangle" ) )
1114 else if ( cleaned == QLatin1String(
"semi_circle" ) )
1116 else if ( cleaned == QLatin1String(
"third_circle" ) )
1118 else if ( cleaned == QLatin1String(
"quarter_circle" ) )
1120 else if ( cleaned == QLatin1String(
"pentagon" ) )
1122 else if ( cleaned == QLatin1String(
"hexagon" ) )
1124 else if ( cleaned == QLatin1String(
"octagon" ) )
1126 else if ( cleaned == QLatin1String(
"star" ) )
1127 return Star;
if ( ok )
1137 return QStringLiteral(
"circle" );
1139 return QStringLiteral(
"rectangle" );
1141 return QStringLiteral(
"diamond" );
1143 return QStringLiteral(
"cross" );
1145 return QStringLiteral(
"arrow" );
1147 return QStringLiteral(
"half_arc" );
1149 return QStringLiteral(
"triangle" );
1151 return QStringLiteral(
"right_half_triangle" );
1153 return QStringLiteral(
"left_half_triangle" );
1155 return QStringLiteral(
"semi_circle" );
1157 return QStringLiteral(
"third_circle" );
1159 return QStringLiteral(
"quarter_circle" );
1161 return QStringLiteral(
"pentagon" );
1163 return QStringLiteral(
"hexagon" );
1165 return QStringLiteral(
"octagon" );
1167 return QStringLiteral(
"star" );
1174 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.
@ ThirdCircle
Third Circle (since QGIS 3.28)
@ Pentagon
Pentagon (since QGIS 3.28)
@ Hexagon
Hexagon (since QGIS 3.28)
@ Cross
Stroke-only cross.
@ QuarterCircle
Quarter Circle (since QGIS 3.28)
@ HalfArc
Stroke-only half arc (since QGIS 3.20)
@ Arrow
Stroke-only arrow (since QGIS 3.20)
@ RightHalfTriangle
Right half of a triangle.
@ Star
Star (since QGIS 3.28)
@ Octagon
Octagon (since QGIS 3.28)
@ 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.
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).
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...
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 QgsUnitTypes::RenderUnit decodeSldUom(const QString &str, double *scaleFactor=nullptr)
Decodes a SLD unit of measure string to a render unit.
static QString encodePenCapStyle(Qt::PenCapStyle style)
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
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.
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
QgsPropertyCollection mDataDefinedProperties
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
const QgsFeature * feature() const
Returns the current feature being rendered.
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.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
qreal opacity() const
Returns the opacity for the symbol.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
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.
static bool isNull(const QVariant &variant)
Returns true if the specified variant should be considered a NULL value.
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)