26#include <QDomDocument>
30 : mStrokeColor( QColor( 35, 35, 35 ) )
33 mPen.setColor( mStrokeColor );
34 mPen.setStyle( mStrokeStyle );
35 mPen.setJoinStyle( mPenJoinStyle );
38 mBrush.setStyle( Qt::SolidPattern );
48 if (
properties.contains( QStringLiteral(
"symbol_name" ) ) )
52 if (
properties.contains( QStringLiteral(
"size" ) ) )
56 if (
properties.contains( QStringLiteral(
"size_unit" ) ) )
60 if (
properties.contains( QStringLiteral(
"size_map_unit_scale" ) ) )
64 if (
properties.contains( QStringLiteral(
"symbol_width" ) ) )
68 if (
properties.contains( QStringLiteral(
"symbol_width_unit" ) ) )
72 if (
properties.contains( QStringLiteral(
"symbol_width_map_unit_scale" ) ) )
76 if (
properties.contains( QStringLiteral(
"symbol_height" ) ) )
80 if (
properties.contains( QStringLiteral(
"symbol_height_unit" ) ) )
84 if (
properties.contains( QStringLiteral(
"symbol_height_map_unit_scale" ) ) )
88 if (
properties.contains( QStringLiteral(
"angle" ) ) )
92 if (
properties.contains( QStringLiteral(
"outline_style" ) ) )
96 else if (
properties.contains( QStringLiteral(
"line_style" ) ) )
100 if (
properties.contains( QStringLiteral(
"joinstyle" ) ) )
104 if (
properties.contains( QStringLiteral(
"cap_style" ) ) )
108 if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
112 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
116 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
120 else if (
properties.contains( QStringLiteral(
"line_width_unit" ) ) )
124 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
128 if (
properties.contains( QStringLiteral(
"fill_color" ) ) )
133 else if (
properties.contains( QStringLiteral(
"color" ) ) )
137 if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
141 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
145 if (
properties.contains( QStringLiteral(
"offset" ) ) )
149 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
153 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
157 if (
properties.contains( QStringLiteral(
"horizontal_anchor_point" ) ) )
161 if (
properties.contains( QStringLiteral(
"vertical_anchor_point" ) ) )
174 double scaledWidth = mSymbolWidth;
175 double scaledHeight = mSymbolHeight;
177 QColor brushColor =
mColor;
178 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
179 mBrush.setColor( brushColor );
181 QColor penColor = mStrokeColor;
182 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
183 mPen.setColor( penColor );
192 double width = exprVal.toDouble( &ok );
196 mPen.setWidthF( width );
197 mSelPen.setWidthF( width );
209 mSelPen.setStyle( mPen.style() );
220 mSelPen.setJoinStyle( mPen.joinStyle() );
239 brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
240 mBrush.setColor( brushColor );
247 penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
248 mPen.setColor( penColor );
260 preparePath(
shape, context, &scaledWidth, &scaledHeight, context.
feature() );
264 bool hasDataDefinedRotation =
false;
267 calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation,
offset,
angle );
275 QTransform transform;
276 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
279 transform.rotate(
angle );
284 p->setPen( context.
selected() ? mSelPen : mPen );
285 p->setBrush( context.
selected() ? mSelBrush : mBrush );
289 p->setPen( context.
selected() ? mSelPen : mPen );
290 p->setBrush( QBrush() );
292 p->drawPath( transform.map( mPainterPath ) );
299 bool &hasDataDefinedRotation,
301 double &
angle )
const
305 markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
306 offset = QPointF( offsetX, offsetY );
309 const bool ok =
true;
311 bool usingDataDefinedRotation =
false;
316 usingDataDefinedRotation = ok;
320 if ( hasDataDefinedRotation )
331 if ( !g.
isNull() && g.
type() == Qgis::GeometryType::Point )
345 return QStringLiteral(
"EllipseMarker" );
353 preparePath( mShape, context );
355 mPen.setColor( mStrokeColor );
356 mPen.setStyle( mStrokeStyle );
357 mPen.setJoinStyle( mPenJoinStyle );
358 mPen.setCapStyle( mPenCapStyle );
360 mBrush.setColor(
mColor );
363 QColor selPenColor = selBrushColor ==
mColor ? selBrushColor : mStrokeColor;
366 selBrushColor.setAlphaF( context.
opacity() );
367 selPenColor.setAlphaF( context.
opacity() );
369 mSelBrush = QBrush( selBrushColor );
370 mSelPen = QPen( !
shapeIsFilled( mShape ) ? selBrushColor : selPenColor );
371 mSelPen.setStyle( mStrokeStyle );
412 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PointSymbolizer" ) );
413 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
414 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
415 element.appendChild( symbolizerElem );
426 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
427 element.appendChild( graphicElem );
436 QString angleFunc = props.
value( QStringLiteral(
"angle" ), QString() ).toString();
437 if ( angleFunc.isEmpty() )
439 if ( ddRotation && ddRotation.
isActive() )
444 angleFunc = QString::number(
mAngle );
446 else if ( ddRotation && ddRotation.
isActive() )
450 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc, ddRotation.
asExpression() );
456 const double angle = angleFunc.toDouble( &ok );
460 angleFunc = QStringLiteral(
"%1 + %2" ).arg( angleFunc ).arg(
mAngle );
475 const double widthHeightFactor = mSymbolWidth / mSymbolHeight;
477 graphicElem.appendChild( factorElem );
484 QDomElement graphicElem = element.firstChildElement( QStringLiteral(
"Graphic" ) );
485 if ( graphicElem.isNull() )
488 QString name = QStringLiteral(
"circle" );
491 double widthHeightFactor = 1.0;
495 for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
497 if ( it.key() == QLatin1String(
"widthHeightFactor" ) )
500 const double v = it.value().toDouble( &ok );
502 widthHeightFactor = v;
509 double scaleFactor = 1.0;
510 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 );
568QSizeF 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.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 120 );
624 mPainterPath.lineTo( 0, 0 );
628 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 90, 90 );
629 mPainterPath.lineTo( 0, 0 );
633 mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height() ) );
637 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
638 mPainterPath.lineTo( 0,
size.height() / 2.0 );
639 mPainterPath.lineTo(
size.width() / 2.0, 0 );
640 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
641 mPainterPath.lineTo( -
size.width() / 2.0, 0 );
645 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
646 mPainterPath.lineTo( 0,
size.height() / 2.0 );
647 mPainterPath.moveTo( -
size.width() / 2.0, 0 );
648 mPainterPath.lineTo(
size.width() / 2.0, 0 );
652 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
653 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
654 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
658 mPainterPath.moveTo(
size.width() / 2.0, 0 );
659 mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0,
size.width(),
size.height(), 0, 180 );
663 mPainterPath.moveTo( 0, -
size.height() / 2.0 );
664 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
665 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
666 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
670 mPainterPath.moveTo( 0,
size.height() / 2.0 );
671 mPainterPath.lineTo(
size.width() / 2.0,
size.height() / 2.0 );
672 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
673 mPainterPath.lineTo( 0,
size.height() / 2.0 );
677 mPainterPath.moveTo( -
size.width() / 2.0,
size.height() / 2.0 );
678 mPainterPath.lineTo( 0,
size.height() / 2.0 );
679 mPainterPath.lineTo( 0, -
size.height() / 2.0 );
680 mPainterPath.lineTo( -
size.width() / 2.0,
size.height() / 2.0 );
684 mPainterPath.moveTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
685 mPainterPath.lineTo( (
size.width() * -0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
686 mPainterPath.lineTo( (
size.width() * 0.5878 ) / 2.0,
size.height() / ( 2 / 0.8090 ) );
687 mPainterPath.lineTo( (
size.width() * 0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
688 mPainterPath.lineTo( 0,
size.height() / -2.0 );
689 mPainterPath.lineTo( (
size.width() * -0.9511 ) / 2.0,
size.height() / ( 2 / -0.309 ) );
693 mPainterPath.moveTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
694 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / -4.0 );
695 mPainterPath.lineTo( 0,
size.height() / -2.0 );
696 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / -4.0 );
697 mPainterPath.lineTo( (
size.width() * 0.8660 ) / -2.0,
size.height() / 4.0 );
698 mPainterPath.lineTo( 0,
size.height() / 2.0 );
699 mPainterPath.lineTo( (
size.width() * 0.8660 ) / 2.0,
size.height() / 4.0 );
704 static constexpr double VERTEX_OFFSET_FROM_ORIGIN = 1.0 / ( 1 + M_SQRT2 );
705 mPainterPath.moveTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
706 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / 2.0 );
707 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
708 mPainterPath.lineTo(
size.width() / 2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
709 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0,
size.height() / -2.0 );
710 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / -2.0 );
711 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
712 mPainterPath.lineTo(
size.width() / -2.0, (
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
713 mPainterPath.lineTo( (
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0,
size.height() / 2.0 );
719 const double inner_r = std::cos(
DEG2RAD( 72.0 ) ) / std::cos(
DEG2RAD( 36.0 ) );
720 mPainterPath.moveTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
721 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 288.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 288.0 ) ) ) / -2.0 );
722 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 252.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 252.0 ) ) ) / -2.0 );
723 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 216.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 216.0 ) ) ) / -2.0 );
724 mPainterPath.lineTo( 0, (
size.height() * inner_r ) / 2.0 );
725 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 144.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 144.0 ) ) ) / -2.0 );
726 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 108.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 108.0 ) ) ) / -2.0 );
727 mPainterPath.lineTo( (
size.width() * std::sin(
DEG2RAD( 72.0 ) ) ) / 2.0, (
size.height() * std::cos(
DEG2RAD( 72.0 ) ) ) / -2.0 );
728 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 36.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 36.0 ) ) ) / -2.0 );
729 mPainterPath.lineTo( 0,
size.height() / -2.0 );
730 mPainterPath.lineTo( (
size.width() * inner_r * std::sin(
DEG2RAD( 324.0 ) ) ) / 2.0, (
size.height() * inner_r * std::cos(
DEG2RAD( 324.0 ) ) ) / -2.0 );
766 if ( mSymbolWidth >= mSymbolHeight )
768 mSymbolHeight = mSymbolHeight *
size / mSymbolWidth;
773 mSymbolWidth = mSymbolWidth *
size / mSymbolHeight;
774 mSymbolHeight =
size;
794 mSymbolWidthUnit = unit;
795 mSymbolHeightUnit = unit;
796 mStrokeWidthUnit = unit;
802 if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
804 return Qgis::RenderUnit::Unknown;
811 return mSymbolWidthUnit == Qgis::RenderUnit::MapUnits || mSymbolWidthUnit == Qgis::RenderUnit::MetersInMapUnits
812 || mSymbolHeightUnit == Qgis::RenderUnit::MapUnits || mSymbolHeightUnit == Qgis::RenderUnit::MetersInMapUnits
813 || mStrokeWidthUnit == Qgis::RenderUnit::MapUnits || mStrokeWidthUnit == Qgis::RenderUnit::MetersInMapUnits
820 mSymbolWidthMapUnitScale = scale;
821 mSymbolHeightMapUnitScale = scale;
822 mStrokeWidthMapUnitScale = scale;
828 mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
829 mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
831 return mSymbolWidthMapUnitScale;
838 const QSizeF
size = calculateSize( context );
840 bool hasDataDefinedRotation =
false;
843 calculateOffsetAndRotation( context,
size.width(),
size.height(), hasDataDefinedRotation,
offset,
angle );
845 QTransform transform;
848 transform.translate( point.x() +
offset.x(), point.y() +
offset.y() );
851 transform.rotate(
angle );
853 double penWidth = mStrokeWidth;
862 const double strokeWidth = exprVal.toDouble( &ok );
880 else if ( mStrokeStyle == Qt::NoPen )
886 QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
887 -
size.height() / 2.0,
892 symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
893 penWidth / 2.0, penWidth / 2.0 );
908 if ( mSymbolWidthUnit == Qgis::RenderUnit::Millimeters )
920 if ( mSymbolHeightUnit == Qgis::RenderUnit::Millimeters )
933 if ( mStrokeWidthUnit == Qgis::RenderUnit::Millimeters )
947 QColor oc = mStrokeColor;
966 QPointF off( offsetX, offsetY );
969 double rotation = 0.0;
979 rotation = -rotation;
984 t.translate( shift.x() + offsetX, shift.y() + offsetY );
987 t.rotate( rotation );
998 const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
1005 const double stepsize = 2 * M_PI / 40;
1006 for (
int i = 0; i < 39; ++i )
1008 const double angle = stepsize * i;
1009 const double x = halfWidth * std::cos(
angle );
1010 const double y = halfHeight * std::sin(
angle );
1011 line <<
QgsPoint( t.map( QPointF( x, y ) ) );
1014 line << line.at( 0 );
1016 if ( mBrush.style() != Qt::NoBrush )
1018 if ( mPen.style() != Qt::NoPen )
1027 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1028 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1029 <<
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
1030 <<
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
1033 if ( mBrush.style() != Qt::NoBrush )
1035 if ( mPen.style() != Qt::NoPen )
1041 if ( mPen.style() != Qt::NoPen )
1044 <<
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
1045 <<
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
1046 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1048 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
1049 <<
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
1050 layerName, QStringLiteral(
"CONTINUOUS" ), oc,
strokeWidth );
1059 p <<
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
1060 <<
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
1061 <<
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
1063 if ( mBrush.style() != Qt::NoBrush )
1065 if ( mPen.style() != Qt::NoPen )
1092 const QString cleaned = name.toLower().trimmed();
1094 if ( cleaned == QLatin1String(
"circle" ) )
1096 else if ( cleaned == QLatin1String(
"square" ) || cleaned == QLatin1String(
"rectangle" ) )
1098 else if ( cleaned == QLatin1String(
"diamond" ) )
1100 else if ( cleaned == QLatin1String(
"cross" ) )
1102 else if ( cleaned == QLatin1String(
"arrow" ) )
1104 else if ( cleaned == QLatin1String(
"half_arc" ) )
1106 else if ( cleaned == QLatin1String(
"triangle" ) )
1108 else if ( cleaned == QLatin1String(
"right_half_triangle" ) )
1110 else if ( cleaned == QLatin1String(
"left_half_triangle" ) )
1112 else if ( cleaned == QLatin1String(
"semi_circle" ) )
1114 else if ( cleaned == QLatin1String(
"third_circle" ) )
1116 else if ( cleaned == QLatin1String(
"quarter_circle" ) )
1118 else if ( cleaned == QLatin1String(
"pentagon" ) )
1120 else if ( cleaned == QLatin1String(
"hexagon" ) )
1122 else if ( cleaned == QLatin1String(
"octagon" ) )
1124 else if ( cleaned == QLatin1String(
"star" ) )
1125 return Star;
if ( ok )
1135 return QStringLiteral(
"circle" );
1137 return QStringLiteral(
"rectangle" );
1139 return QStringLiteral(
"diamond" );
1141 return QStringLiteral(
"cross" );
1143 return QStringLiteral(
"arrow" );
1145 return QStringLiteral(
"half_arc" );
1147 return QStringLiteral(
"triangle" );
1149 return QStringLiteral(
"right_half_triangle" );
1151 return QStringLiteral(
"left_half_triangle" );
1153 return QStringLiteral(
"semi_circle" );
1155 return QStringLiteral(
"third_circle" );
1157 return QStringLiteral(
"quarter_circle" );
1159 return QStringLiteral(
"pentagon" );
1161 return QStringLiteral(
"hexagon" );
1163 return QStringLiteral(
"octagon" );
1165 return QStringLiteral(
"star" );
1172 QList< Shape > shapes;
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
RenderUnit
Rendering size units.
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...
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.
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)
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 (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)
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
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)
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...
A geometry is the spatial representation of a feature.
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.
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)
HorizontalAnchorPoint
Symbol horizontal anchor points.
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.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
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.
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.
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.
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.
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.
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.
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 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)
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 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 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)
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)