28#include <QDomDocument>
34 : mStrokeColor( QColor( 35, 35, 35 ) )
37 mPen.setColor( mStrokeColor );
38 mPen.setStyle( mStrokeStyle );
39 mPen.setJoinStyle( mPenJoinStyle );
42 mBrush.setStyle( Qt::SolidPattern );
52 if (
properties.contains( QStringLiteral(
"symbol_name" ) ) )
56 if (
properties.contains( QStringLiteral(
"size" ) ) )
60 if (
properties.contains( QStringLiteral(
"size_unit" ) ) )
64 if (
properties.contains( QStringLiteral(
"size_map_unit_scale" ) ) )
68 if (
properties.contains( QStringLiteral(
"symbol_width" ) ) )
72 if (
properties.contains( QStringLiteral(
"symbol_width_unit" ) ) )
76 if (
properties.contains( QStringLiteral(
"symbol_width_map_unit_scale" ) ) )
80 if (
properties.contains( QStringLiteral(
"symbol_height" ) ) )
84 if (
properties.contains( QStringLiteral(
"symbol_height_unit" ) ) )
88 if (
properties.contains( QStringLiteral(
"symbol_height_map_unit_scale" ) ) )
92 if (
properties.contains( QStringLiteral(
"angle" ) ) )
96 if (
properties.contains( QStringLiteral(
"outline_style" ) ) )
100 else if (
properties.contains( QStringLiteral(
"line_style" ) ) )
104 if (
properties.contains( QStringLiteral(
"joinstyle" ) ) )
108 if (
properties.contains( QStringLiteral(
"cap_style" ) ) )
112 if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
116 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
120 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
124 else if (
properties.contains( QStringLiteral(
"line_width_unit" ) ) )
128 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
132 if (
properties.contains( QStringLiteral(
"fill_color" ) ) )
137 else if (
properties.contains( QStringLiteral(
"color" ) ) )
141 if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
145 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
149 if (
properties.contains( QStringLiteral(
"offset" ) ) )
153 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
157 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
161 if (
properties.contains( QStringLiteral(
"horizontal_anchor_point" ) ) )
165 if (
properties.contains( QStringLiteral(
"vertical_anchor_point" ) ) )
178 double scaledWidth = mSymbolWidth;
179 double scaledHeight = mSymbolHeight;
181 QColor brushColor =
mColor;
182 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
183 mBrush.setColor( brushColor );
185 QColor penColor = mStrokeColor;
186 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
187 mPen.setColor( penColor );
196 double width = exprVal.toDouble( &ok );
200 mPen.setWidthF( width );
201 mSelPen.setWidthF( width );
213 mSelPen.setStyle( mPen.style() );
224 mSelPen.setJoinStyle( mPen.joinStyle() );
243 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
244 mBrush.setColor( brushColor );
251 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
252 mPen.setColor( penColor );
264 preparePath(
shape, context, &scaledWidth, &scaledHeight, context.
feature() );
268 bool hasDataDefinedRotation =
false;
271 calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation,
offset,
angle );
279 QTransform transform;
280 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
283 transform.rotate(
angle );
289 p->setPen( useSelectedColor ? mSelPen : mPen );
290 p->setBrush( useSelectedColor ? mSelBrush : mBrush );
294 p->setPen( useSelectedColor ? mSelPen : mPen );
295 p->setBrush( QBrush() );
297 p->drawPath( transform.map( mPainterPath ) );
304 bool &hasDataDefinedRotation,
306 double &angle )
const
310 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
311 offset = QPointF( offsetX, offsetY );
314 const bool ok =
true;
316 bool usingDataDefinedRotation =
false;
321 usingDataDefinedRotation = ok;
325 if ( hasDataDefinedRotation )
332 const QgsFeature *f = context.
feature();
335 const QgsGeometry g = f->
geometry();
350 return QStringLiteral(
"EllipseMarker" );
363 preparePath( mShape, context );
365 mPen.setColor( mStrokeColor );
366 mPen.setStyle( mStrokeStyle );
367 mPen.setJoinStyle( mPenJoinStyle );
368 mPen.setCapStyle( mPenCapStyle );
370 mBrush.setColor(
mColor );
373 QColor selPenColor = selBrushColor ==
mColor ? selBrushColor : mStrokeColor;
376 selBrushColor.setAlphaF( context.
opacity() );
377 selPenColor.setAlphaF( context.
opacity() );
379 mSelBrush = QBrush( selBrushColor );
380 mSelPen = QPen( !
shapeIsFilled( mShape ) ? selBrushColor : selPenColor );
381 mSelPen.setStyle( mStrokeStyle );
426 toSld( doc, element, context );
431 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PointSymbolizer" ) );
433 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
434 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
435 element.appendChild( symbolizerElem );
453 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
454 element.appendChild( graphicElem );
464 QString angleFunc = props.value( QStringLiteral(
"angle" ), QString() ).toString();
465 if ( angleFunc.isEmpty() )
467 if ( ddRotation && ddRotation.
isActive() )
472 angleFunc = QString::number(
mAngle );
474 else if ( ddRotation && ddRotation.
isActive() )
478 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc, ddRotation.
asExpression() );
484 const double angle = angleFunc.toDouble( &ok );
488 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc ).arg(
mAngle );
503 const double widthHeightFactor = mSymbolWidth / mSymbolHeight;
505 graphicElem.appendChild( factorElem );
513 QDomElement graphicElem = element.firstChildElement( QStringLiteral(
"Graphic" ) );
514 if ( graphicElem.isNull() )
517 QString name = QStringLiteral(
"circle" );
520 double widthHeightFactor = 1.0;
524 for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
526 if ( it.key() == QLatin1String(
"widthHeightFactor" ) )
529 const double v = it.value().toDouble( &ok );
531 widthHeightFactor = v;
538 double scaleFactor = 1.0;
539 const QString uom = element.attribute( QStringLiteral(
"uom" ) );
549 const double d = angleFunc.toDouble( &ok );
570 map[QStringLiteral(
"symbol_name" )] =
encodeShape( mShape );
571 map[QStringLiteral(
"symbol_width" )] = QString::number( mSymbolWidth );
574 map[QStringLiteral(
"symbol_height" )] = QString::number( mSymbolHeight );
577 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
579 map[QStringLiteral(
"outline_width" )] = QString::number( mStrokeWidth );
589 map[QStringLiteral(
"size" )] = QString::number(
mSize );
592 map[QStringLiteral(
"horizontal_anchor_point" )] = QString::number(
static_cast< int >(
mHorizontalAnchorPoint ) );
593 map[QStringLiteral(
"vertical_anchor_point" )] = QString::number(
static_cast< int >(
mVerticalAnchorPoint ) );
597QSizeF QgsEllipseSymbolLayer::calculateSize(
QgsSymbolRenderContext &context,
double *scaledWidth,
double *scaledHeight )
608 width = mSymbolWidth;
612 *scaledWidth = width;
624 height = mSymbolHeight;
628 *scaledHeight = height;
631 return QSizeF( width, height );
636 mPainterPath = QPainterPath();
638 const QSizeF
size = calculateSize( context, scaledWidth, scaledHeight );
643 mPainterPath.addEllipse( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
647 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
648 mPainterPath.lineTo( 0, 0 );
652 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 120 );
653 mPainterPath.lineTo( 0, 0 );
657 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 90 );
658 mPainterPath.lineTo( 0, 0 );
662 mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
666 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
667 mPainterPath.lineTo( 0,
size.height() / 2.0 );
668 mPainterPath.lineTo(
size.width() / 2.0, 0 );
669 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
670 mPainterPath.lineTo( -
size.width() / 2.0, 0 );
674 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
675 mPainterPath.lineTo( 0,
size.height() / 2.0 );
676 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
677 mPainterPath.lineTo(
size.width() / 2.0, 0 );
681 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
682 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
683 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
687 mPainterPath.moveTo(
size.width() / 2.0, 0 );
688 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
692 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
693 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
694 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
695 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
699 mPainterPath.moveTo( 0,
size.height() / 2.0 );
700 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
701 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
702 mPainterPath.lineTo( 0,
size.height() / 2.0 );
706 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
707 mPainterPath.lineTo( 0,
size.height() / 2.0 );
708 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
709 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
713 mPainterPath.moveTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
714 mPainterPath.lineTo( (
size.width() * -0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
715 mPainterPath.lineTo( (
size.width() * 0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
716 mPainterPath.lineTo( (
size.width() * 0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
717 mPainterPath.lineTo( 0,
size.height() / -2.0 );
718 mPainterPath.lineTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
722 mPainterPath.moveTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
723 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / -4.0 );
724 mPainterPath.lineTo( 0,
size.height() / -2.0 );
725 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / -4.0 );
726 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / 4.0 );
727 mPainterPath.lineTo( 0,
size.height() / 2.0 );
728 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
733 static constexpr double VERTEX_OFFSET_FROM_ORIGIN = 1.0 / ( 1 + M_SQRT2 );
734 mPainterPath.moveTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
735 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / 2.0 );
736 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
737 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
738 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / -2.0 );
739 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / -2.0 );
740 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
741 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
742 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
748 const double inner_r = std::cos(
DEG2RAD( 72.0 ) ) / std::cos(
DEG2RAD( 36.0 ) );
749 mPainterPath.moveTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
750 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 288.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 288.0 ) ) ) / -2.0 );
751 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 252.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 252.0 ) ) ) / -2.0 );
752 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 216.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 216.0 ) ) ) / -2.0 );
753 mPainterPath.lineTo( 0, (
size.height() * inner_r ) / 2.0 );
754 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 144.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 144.0 ) ) ) / -2.0 );
755 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 108.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 108.0 ) ) ) / -2.0 );
756 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 72.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 72.0 ) ) ) / -2.0 );
757 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 36.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 36.0 ) ) ) / -2.0 );
758 mPainterPath.lineTo( 0,
size.height() / -2.0 );
759 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
795 if ( mSymbolWidth >= mSymbolHeight )
797 mSymbolHeight = mSymbolHeight *
size / mSymbolWidth;
802 mSymbolWidth = mSymbolWidth *
size / mSymbolHeight;
803 mSymbolHeight =
size;
823 mSymbolWidthUnit = unit;
824 mSymbolHeightUnit = unit;
825 mStrokeWidthUnit = unit;
831 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
849 mSymbolWidthMapUnitScale = scale;
850 mSymbolHeightMapUnitScale = scale;
851 mStrokeWidthMapUnitScale = scale;
857 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
858 mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
860 return mSymbolWidthMapUnitScale;
867 const QSizeF
size = calculateSize( context );
869 bool hasDataDefinedRotation =
false;
872 calculateOffsetAndRotation( context,
size.width(),
size.height(), hasDataDefinedRotation,
offset,
angle );
874 QTransform transform;
877 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
880 transform.rotate(
angle );
882 double penWidth = mStrokeWidth;
891 const double strokeWidth = exprVal.toDouble( &ok );
909 else if ( mStrokeStyle == Qt::NoPen )
915 QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
916 -
size.height() / 2.0,
921 symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
922 penWidth / 2.0, penWidth / 2.0 );
976 QColor oc = mStrokeColor;
995 QPointF off( offsetX, offsetY );
998 double rotation = 0.0;
1008 rotation = -rotation;
1013 t.translate( shift.x() + offsetX, shift.y() + offsetY );
1016 t.rotate( rotation );
1027 const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
1034 const double stepsize = 2 * M_PI / 40;
1035 for (
int i = 0; i < 39; ++i )
1037 const double angle = stepsize * i;
1038 const double x = halfWidth * std::cos(
angle );
1039 const double y = halfHeight * std::sin(
angle );
1040 line <<
QgsPoint( t.map( QPointF( x, y ) ) );
1043 line << line.at( 0 );
1045 if ( mBrush.style() != Qt::NoBrush )
1047 if ( mPen.style() != Qt::NoPen )
1056 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1057 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1058 <<
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
1059 <<
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
1062 if ( mBrush.style() != Qt::NoBrush )
1064 if ( mPen.style() != Qt::NoPen )
1070 if ( mPen.style() != Qt::NoPen )
1073 <<
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
1074 <<
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
1075 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1077 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
1078 <<
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
1079 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1088 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1089 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1090 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
1092 if ( mBrush.style() != Qt::NoBrush )
1094 if ( mPen.style() != Qt::NoPen )
1121 const QString cleaned = name.toLower().trimmed();
1123 if ( cleaned == QLatin1String(
"circle" ) )
1125 else if ( cleaned == QLatin1String(
"square" ) || cleaned == QLatin1String(
"rectangle" ) )
1127 else if ( cleaned == QLatin1String(
"diamond" ) )
1129 else if ( cleaned == QLatin1String(
"cross" ) )
1131 else if ( cleaned == QLatin1String(
"arrow" ) )
1133 else if ( cleaned == QLatin1String(
"half_arc" ) )
1135 else if ( cleaned == QLatin1String(
"triangle" ) )
1137 else if ( cleaned == QLatin1String(
"right_half_triangle" ) )
1139 else if ( cleaned == QLatin1String(
"left_half_triangle" ) )
1141 else if ( cleaned == QLatin1String(
"semi_circle" ) )
1143 else if ( cleaned == QLatin1String(
"third_circle" ) )
1145 else if ( cleaned == QLatin1String(
"quarter_circle" ) )
1147 else if ( cleaned == QLatin1String(
"pentagon" ) )
1149 else if ( cleaned == QLatin1String(
"hexagon" ) )
1151 else if ( cleaned == QLatin1String(
"octagon" ) )
1153 else if ( cleaned == QLatin1String(
"star" ) )
1154 return Star;
if ( ok )
1164 return QStringLiteral(
"circle" );
1166 return QStringLiteral(
"rectangle" );
1168 return QStringLiteral(
"diamond" );
1170 return QStringLiteral(
"cross" );
1172 return QStringLiteral(
"arrow" );
1174 return QStringLiteral(
"half_arc" );
1176 return QStringLiteral(
"triangle" );
1178 return QStringLiteral(
"right_half_triangle" );
1180 return QStringLiteral(
"left_half_triangle" );
1182 return QStringLiteral(
"semi_circle" );
1184 return QStringLiteral(
"third_circle" );
1186 return QStringLiteral(
"quarter_circle" );
1188 return QStringLiteral(
"pentagon" );
1190 return QStringLiteral(
"hexagon" );
1192 return QStringLiteral(
"octagon" );
1194 return QStringLiteral(
"star" );
1201 QList< Shape > shapes;
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
@ CanCalculateMaskGeometryPerFeature
If present, indicates that mask geometry can safely be calculated per feature for the symbol layer....
QFlags< SymbolLayerFlag > SymbolLayerFlags
Symbol layer flags.
VerticalAnchorPoint
Marker symbol vertical anchor points.
RenderUnit
Rendering size units.
@ Millimeters
Millimeters.
@ Unknown
Mixed or unknown units.
@ MetersInMapUnits
Meters value as Map units.
HorizontalAnchorPoint
Marker symbol horizontal anchor points.
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.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
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).
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...
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void setSymbolWidth(double w)
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
double strokeWidth() const
void setStrokeColor(const QColor &c) override
Sets the stroke color for the symbol layer.
void setStrokeStyle(Qt::PenStyle strokeStyle)
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 setStrokeWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's stroke width.
void setSize(double size) override
Sets the symbol size.
QgsMapUnitScale mapUnitScale() const override
Shape
Marker symbol shapes.
@ ThirdCircle
Third Circle.
@ Cross
Stroke-only cross.
@ QuarterCircle
Quarter Circle.
@ HalfArc
Stroke-only half arc.
@ Arrow
Stroke-only arrow.
@ 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)
Qgis::SymbolLayerFlags flags() const override
Returns flags which control the symbol layer's behavior.
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const override
Saves the symbol layer as SLD.
static QString encodeShape(QgsEllipseSymbolLayer::Shape shape)
Encodes a shape to its string representation.
double symbolWidth() const
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
void setSymbolHeightUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's height.
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 setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
static bool shapeIsFilled(const QgsEllipseSymbolLayer::Shape &shape)
Returns true if a shape has a fill.
void setSymbolWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's width.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
~QgsEllipseSymbolLayer() override
void setMapUnitScale(const QgsMapUnitScale &scale) override
double symbolHeight() const
void setSymbolHeight(double h)
Q_DECL_DEPRECATED 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.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
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.
void setVerticalAnchorPoint(Qgis::VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
Qgis::RenderUnit mOffsetUnit
Offset units.
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).
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's offset.
void setAngle(double angle)
Sets the rotation angle for the marker.
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QPointF mOffset
Marker offset.
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.
Qgis::VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
void setHorizontalAnchorPoint(Qgis::HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
Qgis::RenderUnit mSizeUnit
Marker size unit.
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's size.
void markerOffset(QgsSymbolRenderContext &context, double &offsetX, double &offsetY) const
Calculates the required marker offset, including both the symbol offset and any displacement required...
Qgis::HorizontalAnchorPoint mHorizontalAnchorPoint
Horizontal anchor point.
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.
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.
bool isActive(int key) const final
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...
bool isActive() const
Returns whether the property is currently active.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
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...
QColor selectionColor() const
Returns the color to use when rendering selected features.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
QVariantMap extraProperties() const
Returns the open ended set of properties that can drive/inform the SLD encoding.
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 QgsMapUnitScale decodeMapUnitScale(const QString &str)
static double rescaleUom(double size, Qgis::RenderUnit unit, const QVariantMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
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 bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
Extracts properties from an SLD marker definition.
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
static QString encodeColor(const QColor &color)
static Qgis::RenderUnit decodeSldUom(const QString &str, double *scaleFactor=nullptr)
Decodes a SLD unit of measure string to a render unit.
static Q_DECL_DEPRECATED void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
Creates an SLD geometry element.
static Q_DECL_DEPRECATED void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle, double strokeWidth=-1, double size=-1)
Exports a marker to SLD.
static Qt::PenStyle decodePenStyle(const QString &str)
static Q_DECL_DEPRECATED void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
Creates SLD rotation element.
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.
bool shouldRenderUsingSelectionColor(const QgsSymbolRenderContext &context) const
Returns true if the symbol layer should be rendered using the selection color from the render context...
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.
@ StrokeStyle
Stroke style (eg solid, dashed).
@ Name
Name, eg shape name for simple markers.
@ StrokeColor
Stroke color.
@ CapStyle
Line cap style.
@ JoinStyle
Line join style.
@ StrokeWidth
Stroke width.
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.
virtual Qgis::SymbolLayerFlags flags() const
Returns flags which control the symbol layer's behavior.
QgsPropertyCollection mDataDefinedProperties
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
QgsSymbolLayer(const QgsSymbolLayer &other)
Encapsulates the context in which a symbol is being rendered.
const QgsFeature * feature() const
Returns the current feature being rendered.
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 Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
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)