43 #include <QSvgRenderer>
44 #include <QDomDocument>
45 #include <QDomElement>
53 Qt::PenJoinStyle penJoinStyle )
54 : mBrushStyle( style )
55 , mStrokeColor( strokeColor )
56 , mStrokeStyle( strokeStyle )
57 , mStrokeWidth( strokeWidth )
58 , mPenJoinStyle( penJoinStyle )
102 void QgsSimpleFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context, QBrush &brush, QPen &pen, QPen &selPen )
120 if ( !exprVal.isNull() )
127 penColor.setAlphaF( context.
opacity() * penColor.alphaF() );
128 pen.setColor( penColor );
134 if ( !exprVal.isNull() )
136 double width = exprVal.toDouble( &ok );
140 pen.setWidthF( width );
141 selPen.setWidthF( width );
178 if ( props.contains( QStringLiteral(
"color" ) ) )
180 if ( props.contains( QStringLiteral(
"style" ) ) )
182 if ( props.contains( QStringLiteral(
"color_border" ) ) )
187 else if ( props.contains( QStringLiteral(
"outline_color" ) ) )
191 else if ( props.contains( QStringLiteral(
"line_color" ) ) )
196 if ( props.contains( QStringLiteral(
"style_border" ) ) )
201 else if ( props.contains( QStringLiteral(
"outline_style" ) ) )
205 else if ( props.contains( QStringLiteral(
"line_style" ) ) )
209 if ( props.contains( QStringLiteral(
"width_border" ) ) )
212 strokeWidth = props[QStringLiteral(
"width_border" )].toDouble();
214 else if ( props.contains( QStringLiteral(
"outline_width" ) ) )
216 strokeWidth = props[QStringLiteral(
"outline_width" )].toDouble();
218 else if ( props.contains( QStringLiteral(
"line_width" ) ) )
220 strokeWidth = props[QStringLiteral(
"line_width" )].toDouble();
222 if ( props.contains( QStringLiteral(
"offset" ) ) )
224 if ( props.contains( QStringLiteral(
"joinstyle" ) ) )
229 if ( props.contains( QStringLiteral(
"border_width_unit" ) ) )
233 else if ( props.contains( QStringLiteral(
"outline_width_unit" ) ) )
237 else if ( props.contains( QStringLiteral(
"line_width_unit" ) ) )
241 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
244 if ( props.contains( QStringLiteral(
"border_width_map_unit_scale" ) ) )
246 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
249 sl->restoreOldDataDefinedProperties( props );
257 return QStringLiteral(
"SimpleFill" );
269 selColor.setAlphaF( context.
opacity() );
326 #ifndef QT_NO_PRINTER
327 if (
mBrush.style() == Qt::SolidPattern ||
mBrush.style() == Qt::NoBrush || !
dynamic_cast<QPrinter *
>( p->device() ) )
334 #ifndef QT_NO_PRINTER
341 p->setPen( Qt::NoPen );
345 p->setBrush( Qt::NoBrush );
363 map[QStringLiteral(
"outline_width" )] = QString::number(
mStrokeWidth );
391 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
392 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
393 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
394 element.appendChild( symbolizerElem );
402 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
403 symbolizerElem.appendChild( fillElem );
410 QDomElement strokeElem = doc.createElement( QStringLiteral(
"se:Stroke" ) );
411 symbolizerElem.appendChild( strokeElem );
426 symbolStyle.append(
';' );
435 Qt::BrushStyle fillStyle;
439 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
442 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
448 QString uom = element.attribute( QStringLiteral(
"uom" ), QString() );
454 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
463 return penBleed + offsetBleed;
524 : mGradientColorType( colorType )
525 , mGradientType( gradientType )
526 , mCoordinateMode( coordinateMode )
527 , mGradientSpread( spread )
528 , mReferencePoint1( QPointF( 0.5, 0 ) )
529 , mReferencePoint2( QPointF( 0.5, 1 ) )
550 bool refPoint1IsCentroid =
false;
552 bool refPoint2IsCentroid =
false;
557 if ( props.contains( QStringLiteral(
"type" ) ) )
558 type =
static_cast< GradientType >( props[QStringLiteral(
"type" )].toInt() );
559 if ( props.contains( QStringLiteral(
"coordinate_mode" ) ) )
561 if ( props.contains( QStringLiteral(
"spread" ) ) )
563 if ( props.contains( QStringLiteral(
"color_type" ) ) )
564 colorType =
static_cast< GradientColorType >( props[QStringLiteral(
"color_type" )].toInt() );
565 if ( props.contains( QStringLiteral(
"gradient_color" ) ) )
570 else if ( props.contains( QStringLiteral(
"color" ) ) )
574 if ( props.contains( QStringLiteral(
"gradient_color2" ) ) )
579 if ( props.contains( QStringLiteral(
"reference_point1" ) ) )
581 if ( props.contains( QStringLiteral(
"reference_point1_iscentroid" ) ) )
582 refPoint1IsCentroid = props[QStringLiteral(
"reference_point1_iscentroid" )].toInt();
583 if ( props.contains( QStringLiteral(
"reference_point2" ) ) )
585 if ( props.contains( QStringLiteral(
"reference_point2_iscentroid" ) ) )
586 refPoint2IsCentroid = props[QStringLiteral(
"reference_point2_iscentroid" )].toInt();
587 if ( props.contains( QStringLiteral(
"angle" ) ) )
588 angle = props[QStringLiteral(
"angle" )].toDouble();
590 if ( props.contains( QStringLiteral(
"offset" ) ) )
607 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
609 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
612 sl->setReferencePoint1IsCentroid( refPoint1IsCentroid );
614 sl->setReferencePoint2IsCentroid( refPoint2IsCentroid );
615 sl->setAngle(
angle );
617 sl->setColorRamp( gradientRamp );
619 sl->restoreOldDataDefinedProperties( props );
632 return QStringLiteral(
"GradientFill" );
635 void QgsGradientFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context,
const QPolygonF &points )
680 if ( currentType == QObject::tr(
"linear" ) )
684 else if ( currentType == QObject::tr(
"radial" ) )
688 else if ( currentType == QObject::tr(
"conical" ) )
702 if ( currentCoordMode == QObject::tr(
"feature" ) )
706 else if ( currentCoordMode == QObject::tr(
"viewport" ) )
720 if ( currentSpread == QObject::tr(
"pad" ) )
724 else if ( currentSpread == QObject::tr(
"repeat" ) )
728 else if ( currentSpread == QObject::tr(
"reflect" ) )
775 if ( refPoint1IsCentroid || refPoint2IsCentroid )
780 QRectF bbox = points.boundingRect();
781 double centroidX = ( centroid.x() - bbox.left() ) / bbox.width();
782 double centroidY = ( centroid.y() - bbox.top() ) / bbox.height();
784 if ( refPoint1IsCentroid )
786 refPoint1X = centroidX;
787 refPoint1Y = centroidY;
789 if ( refPoint2IsCentroid )
791 refPoint2X = centroidX;
792 refPoint2Y = centroidY;
798 spread, QPointF( refPoint1X, refPoint1Y ), QPointF( refPoint2X, refPoint2Y ),
angle );
801 QPointF QgsGradientFillSymbolLayer::rotateReferencePoint( QPointF refPoint,
double angle )
806 QLineF refLine = QLineF( QPointF( 0.5, 0.5 ), refPoint );
808 refLine.setAngle( refLine.angle() +
angle );
810 QPointF rotatedReferencePoint = refLine.p2();
812 if ( rotatedReferencePoint.x() > 1 )
813 rotatedReferencePoint.setX( 1 );
814 if ( rotatedReferencePoint.x() < 0 )
815 rotatedReferencePoint.setX( 0 );
816 if ( rotatedReferencePoint.y() > 1 )
817 rotatedReferencePoint.setY( 1 );
818 if ( rotatedReferencePoint.y() < 0 )
819 rotatedReferencePoint.setY( 0 );
821 return rotatedReferencePoint;
825 const QColor &color,
const QColor &color2, GradientColorType gradientColorType,
827 GradientCoordinateMode coordinateMode, GradientSpread gradientSpread,
828 QPointF referencePoint1, QPointF referencePoint2,
const double angle )
833 QColor fillColor2 =
color2;
834 fillColor2.setAlphaF( context.
opacity() * fillColor2.alphaF() );
845 gradient = QLinearGradient( rotatedReferencePoint1, rotatedReferencePoint2 );
848 gradient = QRadialGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).length() );
851 gradient = QConicalGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).
angle() );
857 gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
860 gradient.setCoordinateMode( QGradient::StretchToDeviceMode );
866 gradient.setSpread( QGradient::PadSpread );
869 gradient.setSpread( QGradient::ReflectSpread );
872 gradient.setSpread( QGradient::RepeatSpread );
888 gradient.setColorAt( 1.0, fillColor2 );
892 brush = QBrush( gradient );
899 selColor.setAlphaF( context.
opacity() );
916 applyDataDefinedSymbology( context, points );
919 p->setPen( Qt::NoPen );
953 map[QStringLiteral(
"type" )] = QString::number(
mGradientType );
954 map[QStringLiteral(
"coordinate_mode" )] = QString::number(
mCoordinateMode );
960 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
966 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1032 int blurRadius,
bool useWholeShape,
double maxDistance )
1033 : mBlurRadius( blurRadius )
1034 , mUseWholeShape( useWholeShape )
1035 , mMaxDistance( maxDistance )
1036 , mColorType( colorType )
1055 if ( props.contains( QStringLiteral(
"color_type" ) ) )
1059 if ( props.contains( QStringLiteral(
"shapeburst_color" ) ) )
1064 else if ( props.contains( QStringLiteral(
"color" ) ) )
1069 if ( props.contains( QStringLiteral(
"shapeburst_color2" ) ) )
1074 else if ( props.contains( QStringLiteral(
"gradient_color2" ) ) )
1078 if ( props.contains( QStringLiteral(
"blur_radius" ) ) )
1080 blurRadius = props[QStringLiteral(
"blur_radius" )].toInt();
1082 if ( props.contains( QStringLiteral(
"use_whole_shape" ) ) )
1084 useWholeShape = props[QStringLiteral(
"use_whole_shape" )].toInt();
1086 if ( props.contains( QStringLiteral(
"max_distance" ) ) )
1088 maxDistance = props[QStringLiteral(
"max_distance" )].toDouble();
1090 if ( props.contains( QStringLiteral(
"offset" ) ) )
1109 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
1113 if ( props.contains( QStringLiteral(
"distance_unit" ) ) )
1117 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
1121 if ( props.contains( QStringLiteral(
"distance_map_unit_scale" ) ) )
1125 if ( props.contains( QStringLiteral(
"ignore_rings" ) ) )
1127 sl->setIgnoreRings( props[QStringLiteral(
"ignore_rings" )].toInt() );
1131 sl->setColorRamp( gradientRamp );
1134 sl->restoreOldDataDefinedProperties( props );
1136 return sl.release();
1141 return QStringLiteral(
"ShapeburstFill" );
1146 if ( mGradientRamp.get() == ramp )
1149 mGradientRamp.reset( ramp );
1152 void QgsShapeburstFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context, QColor &color, QColor &color2,
int &blurRadius,
bool &useWholeShape,
1153 double &maxDistance,
bool &ignoreRings )
1210 selColor.setAlphaF( context.
opacity() );
1211 mSelBrush = QBrush( selColor );
1230 p->setBrush( mSelBrush );
1231 QPointF
offset = mOffset;
1266 int outputPixelMaxDist = 0;
1274 std::unique_ptr< QgsGradientColorRamp > twoColorGradientRamp;
1277 twoColorGradientRamp = std::make_unique< QgsGradientColorRamp >( color1,
color2 );
1281 p->setPen( QPen( Qt::NoPen ) );
1286 int pointsWidth =
static_cast< int >( std::round( points.boundingRect().width() ) );
1287 int pointsHeight =
static_cast< int >( std::round( points.boundingRect().height() ) );
1288 int imWidth = pointsWidth + ( sideBuffer * 2 );
1289 int imHeight = pointsHeight + ( sideBuffer * 2 );
1290 std::unique_ptr< QImage > fillImage = std::make_unique< QImage >( imWidth,
1291 imHeight, QImage::Format_ARGB32_Premultiplied );
1292 if ( fillImage->isNull() )
1299 std::unique_ptr< QImage > alphaImage = std::make_unique< QImage >( fillImage->width(), fillImage->height(), QImage::Format_ARGB32_Premultiplied );
1300 if ( alphaImage->isNull() )
1309 fillImage->fill( Qt::black );
1312 alphaImage->fill( Qt::transparent );
1315 QPainter imgPainter;
1316 imgPainter.begin( alphaImage.get() );
1317 imgPainter.setRenderHint( QPainter::Antialiasing,
true );
1318 imgPainter.setBrush( QBrush( Qt::white ) );
1319 imgPainter.setPen( QPen( Qt::black ) );
1320 imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
1326 imgPainter.begin( fillImage.get() );
1329 imgPainter.drawImage( 0, 0, *alphaImage );
1336 imgPainter.setBrush( QBrush( Qt::white ) );
1337 imgPainter.setPen( QPen( Qt::black ) );
1338 imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
1344 double *dtArray = distanceTransform( fillImage.get(), context.
renderContext() );
1364 imgPainter.begin( fillImage.get() );
1365 imgPainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
1366 imgPainter.drawImage( 0, 0, *alphaImage );
1374 QPointF
offset = mOffset;
1391 p->drawImage( points.boundingRect().left() - sideBuffer, points.boundingRect().top() - sideBuffer, *fillImage );
1402 void QgsShapeburstFillSymbolLayer::distanceTransform1d(
double *f,
int n,
int *v,
double *z,
double *d )
1408 for (
int q = 1; q <= n - 1; q++ )
1410 double s = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
1414 s = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
1423 for (
int q = 0; q <= n - 1; q++ )
1425 while ( z[k + 1] < q )
1427 d[q] = ( q - v[k] ) * ( q - v[k] ) + f[v[k]];
1432 void QgsShapeburstFillSymbolLayer::distanceTransform2d(
double *im,
int width,
int height,
QgsRenderContext &context )
1434 int maxDimension = std::max( width, height );
1435 double *f =
new double[ maxDimension ];
1436 int *v =
new int[ maxDimension ];
1437 double *z =
new double[ maxDimension + 1 ];
1438 double *d =
new double[ maxDimension ];
1441 for (
int x = 0; x < width; x++ )
1446 for (
int y = 0; y < height; y++ )
1448 f[y] = im[ x + y * width ];
1450 distanceTransform1d( f, height, v, z, d );
1451 for (
int y = 0; y < height; y++ )
1453 im[ x + y * width ] = d[y];
1458 for (
int y = 0; y < height; y++ )
1463 for (
int x = 0; x < width; x++ )
1465 f[x] = im[ x + y * width ];
1467 distanceTransform1d( f, width, v, z, d );
1468 for (
int x = 0; x < width; x++ )
1470 im[ x + y * width ] = d[x];
1481 double *QgsShapeburstFillSymbolLayer::distanceTransform( QImage *im,
QgsRenderContext &context )
1483 int width = im->width();
1484 int height = im->height();
1486 double *dtArray =
new double[width * height];
1491 for (
int heightIndex = 0; heightIndex < height; ++heightIndex )
1496 const QRgb *scanLine =
reinterpret_cast< const QRgb *
>( im->constScanLine( heightIndex ) );
1497 for (
int widthIndex = 0; widthIndex < width; ++widthIndex )
1499 tmpRgb = scanLine[widthIndex];
1500 if ( qRed( tmpRgb ) == 0 )
1508 dtArray[ idx ] =
INF;
1515 distanceTransform2d( dtArray, width, height, context );
1520 void QgsShapeburstFillSymbolLayer::dtArrayToQImage(
double *array, QImage *im,
QgsColorRamp *ramp,
QgsRenderContext &context,
bool useWholeShape,
int maxPixelDistance )
1522 int width = im->width();
1523 int height = im->height();
1526 double maxDistanceValue;
1531 double dtMaxValue = array[0];
1532 for (
int i = 1; i < ( width * height ); ++i )
1534 if ( array[i] > dtMaxValue )
1536 dtMaxValue = array[i];
1541 maxDistanceValue = std::sqrt( dtMaxValue );
1546 maxDistanceValue = maxPixelDistance;
1551 double squaredVal = 0;
1554 for (
int heightIndex = 0; heightIndex < height; ++heightIndex )
1559 QRgb *scanLine =
reinterpret_cast< QRgb *
>( im->scanLine( heightIndex ) );
1560 for (
int widthIndex = 0; widthIndex < width; ++widthIndex )
1563 squaredVal = array[idx];
1566 if ( maxDistanceValue > 0 )
1568 pixVal = squaredVal > 0 ? std::min( ( std::sqrt( squaredVal ) / maxDistanceValue ), 1.0 ) : 0;
1577 scanLine[widthIndex] = qPremultiply( ramp->
color( pixVal ).rgba() );
1588 map[QStringLiteral(
"color_type" )] = QString::number( mColorType );
1589 map[QStringLiteral(
"blur_radius" )] = QString::number( mBlurRadius );
1590 map[QStringLiteral(
"use_whole_shape" )] = QString::number( mUseWholeShape );
1591 map[QStringLiteral(
"max_distance" )] = QString::number( mMaxDistance );
1594 map[QStringLiteral(
"ignore_rings" )] = QString::number( mIgnoreRings );
1598 if ( mGradientRamp )
1600 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1601 map.unite( mGradientRamp->properties() );
1603 map.insert( mGradientRamp->properties() );
1612 std::unique_ptr< QgsShapeburstFillSymbolLayer > sl = std::make_unique< QgsShapeburstFillSymbolLayer >(
mColor, mColor2, mColorType, mBlurRadius, mUseWholeShape, mMaxDistance );
1613 if ( mGradientRamp )
1615 sl->setColorRamp( mGradientRamp->clone() );
1617 sl->setDistanceUnit( mDistanceUnit );
1618 sl->setDistanceMapUnitScale( mDistanceMapUnitScale );
1619 sl->setIgnoreRings( mIgnoreRings );
1620 sl->setOffset( mOffset );
1621 sl->setOffsetUnit( mOffsetUnit );
1622 sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
1625 return sl.release();
1630 double offsetBleed = context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
1641 mDistanceUnit = unit;
1647 if ( mDistanceUnit == mOffsetUnit )
1649 return mDistanceUnit;
1662 mDistanceMapUnitScale = scale;
1663 mOffsetMapUnitScale = scale;
1668 if ( mDistanceMapUnitScale == mOffsetMapUnitScale )
1670 return mDistanceMapUnitScale;
1696 p->setPen( QPen( Qt::NoPen ) );
1698 QTransform bkTransform =
mBrush.transform();
1702 QTransform t =
mBrush.transform();
1703 t.translate( leftCorner.x(), leftCorner.y() );
1704 mBrush.setTransform( t );
1710 p->setBrush( QBrush( selColor ) );
1716 QTransform t =
mBrush.transform();
1718 mBrush.setTransform( t );
1727 for (
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
1734 mBrush.setTransform( bkTransform );
1791 double subLayerBleed =
mStroke->symbolLayer( 0 )->estimateMaxBleed( context );
1792 return subLayerBleed;
1813 return QColor( Qt::black );
1820 return Qt::SolidLine;
1824 return Qt::SolidLine;
1828 return mStroke->dxfPenStyle();
1837 attr.unite(
mStroke->usedAttributes( context ) );
1860 , mPatternWidth( width )
1864 mColor = QColor( 255, 255, 255 );
1870 , mPatternWidth( width )
1871 , mSvgData( svgData )
1876 mColor = QColor( 255, 255, 255 );
1878 setDefaultSvgParams();
1886 mPatternWidthUnit = unit;
1887 mSvgStrokeWidthUnit = unit;
1889 mStroke->setOutputUnit( unit );
1895 if ( mPatternWidthUnit != unit || mSvgStrokeWidthUnit != unit ||
mStrokeWidthUnit != unit )
1905 mPatternWidthMapUnitScale = scale;
1906 mSvgStrokeWidthMapUnitScale = scale;
1913 mPatternWidthMapUnitScale == mSvgStrokeWidthMapUnitScale &&
1916 return mPatternWidthMapUnitScale;
1926 mSvgFilePath = svgPath;
1927 setDefaultSvgParams();
1937 if (
properties.contains( QStringLiteral(
"width" ) ) )
1939 width =
properties[QStringLiteral(
"width" )].toDouble();
1941 if (
properties.contains( QStringLiteral(
"svgFile" ) ) )
1945 if (
properties.contains( QStringLiteral(
"angle" ) ) )
1950 std::unique_ptr< QgsSVGFillSymbolLayer > symbolLayer;
1953 symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >(
svgFilePath, width,
angle );
1957 if (
properties.contains( QStringLiteral(
"data" ) ) )
1959 data = QByteArray::fromHex(
properties[QStringLiteral(
"data" )].toString().toLocal8Bit() );
1961 symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >( data, width,
angle );
1965 if (
properties.contains( QStringLiteral(
"svgFillColor" ) ) )
1970 else if (
properties.contains( QStringLiteral(
"color" ) ) )
1974 if (
properties.contains( QStringLiteral(
"svgOutlineColor" ) ) )
1979 else if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
1983 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
1987 if (
properties.contains( QStringLiteral(
"svgOutlineWidth" ) ) )
1990 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"svgOutlineWidth" )].toDouble() );
1992 else if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
1994 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"outline_width" )].toDouble() );
1996 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
1998 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"line_width" )].toDouble() );
2002 if (
properties.contains( QStringLiteral(
"pattern_width_unit" ) ) )
2006 if (
properties.contains( QStringLiteral(
"pattern_width_map_unit_scale" ) ) )
2010 if (
properties.contains( QStringLiteral(
"svg_outline_width_unit" ) ) )
2014 if (
properties.contains( QStringLiteral(
"svg_outline_width_map_unit_scale" ) ) )
2018 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2022 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
2027 if (
properties.contains( QStringLiteral(
"parameters" ) ) )
2033 symbolLayer->restoreOldDataDefinedProperties(
properties );
2035 return symbolLayer.release();
2040 QVariantMap::iterator it =
properties.find( QStringLiteral(
"svgFile" ) );
2052 return QStringLiteral(
"SVGFill" );
2055 void QgsSVGFillSymbolLayer::applyPattern( QBrush &brush,
const QString &svgFilePath,
double patternWidth,
QgsUnitTypes::RenderUnit patternWidthUnit,
2056 const QColor &svgFillColor,
const QColor &svgStrokeColor,
double svgStrokeWidth,
2060 if ( mSvgViewBox.isNull() )
2067 if (
static_cast< int >( size ) < 1.0 || 10000.0 < size )
2069 brush.setTextureImage( QImage() );
2073 bool fitsInCache =
true;
2081 double hwRatio = 1.0;
2082 if ( patternPict.width() > 0 )
2084 hwRatio =
static_cast< double >( patternPict.height() ) /
static_cast< double >( patternPict.width() );
2086 patternImage = QImage(
static_cast< int >( size ),
static_cast< int >( size * hwRatio ), QImage::Format_ARGB32_Premultiplied );
2087 patternImage.fill( 0 );
2089 QPainter p( &patternImage );
2090 p.drawPicture( QPointF( size / 2, size * hwRatio / 2 ), patternPict );
2093 QTransform brushTransform;
2096 QImage transparentImage = patternImage.copy();
2098 brush.setTextureImage( transparentImage );
2102 brush.setTextureImage( patternImage );
2104 brush.setTransform( brushTransform );
2112 applyPattern(
mBrush, mSvgFilePath, mPatternWidth, mPatternWidthUnit,
mColor, mSvgStrokeColor, mSvgStrokeWidth, mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
2131 if ( !mSvgFilePath.isEmpty() )
2133 map.insert( QStringLiteral(
"svgFile" ), mSvgFilePath );
2137 map.insert( QStringLiteral(
"data" ), QString( mSvgData.toHex() ) );
2140 map.insert( QStringLiteral(
"width" ), QString::number( mPatternWidth ) );
2141 map.insert( QStringLiteral(
"angle" ), QString::number(
mAngle ) );
2146 map.insert( QStringLiteral(
"outline_width" ), QString::number( mSvgStrokeWidth ) );
2163 std::unique_ptr< QgsSVGFillSymbolLayer > clonedLayer;
2164 if ( !mSvgFilePath.isEmpty() )
2166 clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgFilePath, mPatternWidth,
mAngle );
2167 clonedLayer->setSvgFillColor(
mColor );
2168 clonedLayer->setSvgStrokeColor( mSvgStrokeColor );
2169 clonedLayer->setSvgStrokeWidth( mSvgStrokeWidth );
2173 clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgData, mPatternWidth,
mAngle );
2176 clonedLayer->setPatternWidthUnit( mPatternWidthUnit );
2177 clonedLayer->setPatternWidthMapUnitScale( mPatternWidthMapUnitScale );
2178 clonedLayer->setSvgStrokeWidthUnit( mSvgStrokeWidthUnit );
2179 clonedLayer->setSvgStrokeWidthMapUnitScale( mSvgStrokeWidthMapUnitScale );
2183 clonedLayer->setParameters( mParameters );
2187 clonedLayer->setSubSymbol(
mStroke->clone() );
2191 return clonedLayer.release();
2196 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
2197 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
2198 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
2199 element.appendChild( symbolizerElem );
2203 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
2204 symbolizerElem.appendChild( fillElem );
2206 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
2207 fillElem.appendChild( graphicFillElem );
2209 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
2210 graphicFillElem.appendChild( graphicElem );
2212 if ( !mSvgFilePath.isEmpty() )
2223 symbolizerElem.appendChild( doc.createComment( QStringLiteral(
"SVG from data not implemented yet" ) ) );
2229 double angle = props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toDouble( &ok );
2232 angleFunc = QStringLiteral(
"%1 + %2" ).arg( props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toString() ).arg(
mAngle );
2245 mStroke->toSld( doc, element, props );
2257 QString path, mimeType;
2259 Qt::PenStyle penStyle;
2260 double size, strokeWidth;
2262 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
2263 if ( fillElem.isNull() )
2266 QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral(
"GraphicFill" ) );
2267 if ( graphicFillElem.isNull() )
2270 QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral(
"Graphic" ) );
2271 if ( graphicElem.isNull() )
2277 if ( mimeType != QLatin1String(
"image/svg+xml" ) )
2282 QString uom = element.attribute( QStringLiteral(
"uom" ) );
2291 double d = angleFunc.toDouble( &ok );
2296 std::unique_ptr< QgsSVGFillSymbolLayer > sl = std::make_unique< QgsSVGFillSymbolLayer >( path, size,
angle );
2297 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
2300 sl->setSvgStrokeWidth( strokeWidth );
2303 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
2304 if ( !strokeElem.isNull() )
2315 return sl.release();
2333 double width = mPatternWidth;
2339 QString svgFile = mSvgFilePath;
2358 double strokeWidth = mSvgStrokeWidth;
2367 mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
2371 void QgsSVGFillSymbolLayer::storeViewBox()
2373 if ( !mSvgData.isEmpty() )
2375 QSvgRenderer r( mSvgData );
2378 mSvgViewBox = r.viewBoxF();
2383 mSvgViewBox = QRectF();
2386 void QgsSVGFillSymbolLayer::setDefaultSvgParams()
2388 if ( mSvgFilePath.isEmpty() )
2393 bool hasFillParam, hasFillOpacityParam, hasStrokeParam, hasStrokeWidthParam, hasStrokeOpacityParam;
2394 bool hasDefaultFillColor, hasDefaultFillOpacity, hasDefaultStrokeColor, hasDefaultStrokeWidth, hasDefaultStrokeOpacity;
2395 QColor defaultFillColor, defaultStrokeColor;
2396 double defaultStrokeWidth, defaultFillOpacity, defaultStrokeOpacity;
2398 hasFillOpacityParam, hasDefaultFillOpacity, defaultFillOpacity,
2399 hasStrokeParam, hasDefaultStrokeColor, defaultStrokeColor,
2400 hasStrokeWidthParam, hasDefaultStrokeWidth, defaultStrokeWidth,
2401 hasStrokeOpacityParam, hasDefaultStrokeOpacity, defaultStrokeOpacity );
2403 double newFillOpacity = hasFillOpacityParam ?
mColor.alphaF() : 1.0;
2404 double newStrokeOpacity = hasStrokeOpacityParam ? mSvgStrokeColor.alphaF() : 1.0;
2406 if ( hasDefaultFillColor )
2408 mColor = defaultFillColor;
2409 mColor.setAlphaF( newFillOpacity );
2411 if ( hasDefaultFillOpacity )
2413 mColor.setAlphaF( defaultFillOpacity );
2415 if ( hasDefaultStrokeColor )
2417 mSvgStrokeColor = defaultStrokeColor;
2418 mSvgStrokeColor.setAlphaF( newStrokeOpacity );
2420 if ( hasDefaultStrokeOpacity )
2422 mSvgStrokeColor.setAlphaF( defaultStrokeOpacity );
2424 if ( hasDefaultStrokeWidth )
2426 mSvgStrokeWidth = defaultStrokeWidth;
2445 delete mFillLineSymbol;
2462 return mFillLineSymbol ? mFillLineSymbol->
color() :
mColor;
2477 delete mFillLineSymbol;
2478 mFillLineSymbol = lineSymbol;
2489 return mFillLineSymbol;
2495 if ( mFillLineSymbol )
2517 mDistanceUnit = unit;
2518 mLineWidthUnit = unit;
2525 if ( mDistanceUnit != unit || mLineWidthUnit != unit || mOffsetUnit != unit )
2542 mDistanceMapUnitScale = scale;
2543 mLineWidthMapUnitScale = scale;
2544 mOffsetMapUnitScale = scale;
2550 mDistanceMapUnitScale == mLineWidthMapUnitScale &&
2551 mLineWidthMapUnitScale == mOffsetMapUnitScale )
2553 return mDistanceMapUnitScale;
2560 std::unique_ptr< QgsLinePatternFillSymbolLayer > patternLayer = std::make_unique< QgsLinePatternFillSymbolLayer >();
2566 QColor
color( Qt::black );
2569 if (
properties.contains( QStringLiteral(
"lineangle" ) ) )
2574 else if (
properties.contains( QStringLiteral(
"angle" ) ) )
2578 patternLayer->setLineAngle(
lineAngle );
2580 if (
properties.contains( QStringLiteral(
"distance" ) ) )
2584 patternLayer->setDistance(
distance );
2586 if (
properties.contains( QStringLiteral(
"linewidth" ) ) )
2591 else if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
2595 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
2599 patternLayer->setLineWidth(
lineWidth );
2601 if (
properties.contains( QStringLiteral(
"color" ) ) )
2605 else if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
2609 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
2613 patternLayer->setColor(
color );
2615 if (
properties.contains( QStringLiteral(
"offset" ) ) )
2619 patternLayer->setOffset(
offset );
2622 if (
properties.contains( QStringLiteral(
"distance_unit" ) ) )
2626 if (
properties.contains( QStringLiteral(
"distance_map_unit_scale" ) ) )
2630 if (
properties.contains( QStringLiteral(
"line_width_unit" ) ) )
2634 else if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2638 if (
properties.contains( QStringLiteral(
"line_width_map_unit_scale" ) ) )
2642 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
2646 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
2650 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2654 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
2659 patternLayer->restoreOldDataDefinedProperties(
properties );
2661 return patternLayer.release();
2666 return QStringLiteral(
"LinePatternFill" );
2669 void QgsLinePatternFillSymbolLayer::applyPattern(
const QgsSymbolRenderContext &context, QBrush &brush,
double lineAngle,
double distance )
2671 mBrush.setTextureImage( QImage() );
2673 if ( !mFillLineSymbol )
2678 std::unique_ptr< QgsLineSymbol > fillLineSymbol( mFillLineSymbol->
clone() );
2679 if ( !fillLineSymbol )
2694 outputPixelOffset = std::fmod( outputPixelOffset, outputPixelDist );
2695 if ( outputPixelOffset > outputPixelDist / 2.0 )
2696 outputPixelOffset -= outputPixelDist;
2700 double outputPixelBleed = 0;
2701 double outputPixelInterval = 0;
2702 for (
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
2706 outputPixelBleed = std::max( outputPixelBleed, outputPixelLayerBleed );
2709 if ( markerLineLayer )
2718 outputPixelInterval = std::max( outputPixelInterval, outputPixelLayerInterval );
2722 if ( outputPixelInterval > 0 )
2726 double intervalScale = std::round( outputPixelInterval ) / outputPixelInterval;
2727 outputPixelInterval = std::round( outputPixelInterval );
2729 for (
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
2734 if ( markerLineLayer )
2748 height = outputPixelDist;
2749 width = outputPixelInterval > 0 ? outputPixelInterval : height;
2753 width = outputPixelDist;
2754 height = outputPixelInterval > 0 ? outputPixelInterval : width;
2758 height = outputPixelDist / std::cos(
lineAngle * M_PI / 180 );
2759 width = outputPixelDist / std::sin(
lineAngle * M_PI / 180 );
2762 lineAngle = 180 * std::atan2(
static_cast< double >( height ),
static_cast< double >( width ) ) / M_PI;
2768 height = std::abs( height );
2769 width = std::abs( width );
2771 outputPixelDist = std::abs( height * std::cos(
lineAngle * M_PI / 180 ) );
2775 int offsetHeight =
static_cast< int >( std::round( outputPixelOffset / std::cos(
lineAngle * M_PI / 180 ) ) );
2776 outputPixelOffset = offsetHeight * std::cos(
lineAngle * M_PI / 180 );
2785 int bufferMulti =
static_cast< int >( std::max( std::ceil( outputPixelBleed / width ), std::ceil( outputPixelBleed / width ) ) );
2789 bufferMulti = std::max( bufferMulti, 1 );
2791 int xBuffer = width * bufferMulti;
2792 int yBuffer = height * bufferMulti;
2793 int innerWidth = width;
2794 int innerHeight = height;
2795 width += 2 * xBuffer;
2796 height += 2 * yBuffer;
2799 if ( width > 10000 || height > 10000 || width == 0 || height == 0 )
2804 QImage patternImage( width, height, QImage::Format_ARGB32 );
2805 patternImage.fill( 0 );
2807 QPointF p1, p2, p3, p4, p5, p6;
2810 p1 = QPointF( 0, yBuffer );
2811 p2 = QPointF( width, yBuffer );
2812 p3 = QPointF( 0, yBuffer + innerHeight );
2813 p4 = QPointF( width, yBuffer + innerHeight );
2817 p1 = QPointF( xBuffer, height );
2818 p2 = QPointF( xBuffer, 0 );
2819 p3 = QPointF( xBuffer + innerWidth, height );
2820 p4 = QPointF( xBuffer + innerWidth, 0 );
2824 dx = outputPixelDist * std::cos( ( 90 -
lineAngle ) * M_PI / 180.0 );
2825 dy = outputPixelDist * std::sin( ( 90 -
lineAngle ) * M_PI / 180.0 );
2826 p1 = QPointF( 0, height );
2827 p2 = QPointF( width, 0 );
2828 p3 = QPointF( -dx, height - dy );
2829 p4 = QPointF( width - dx, -dy );
2830 p5 = QPointF( dx, height + dy );
2831 p6 = QPointF( width + dx, dy );
2835 dx = outputPixelDist * std::cos( ( 90 -
lineAngle ) * M_PI / 180.0 );
2836 dy = outputPixelDist * std::sin( ( 90 -
lineAngle ) * M_PI / 180.0 );
2837 p1 = QPointF( width, 0 );
2838 p2 = QPointF( 0, height );
2839 p3 = QPointF( width - dx, -dy );
2840 p4 = QPointF( -dx, height - dy );
2841 p5 = QPointF( width + dx, dy );
2842 p6 = QPointF( dx, height + dy );
2846 dy = outputPixelDist * std::cos( ( 180 -
lineAngle ) * M_PI / 180 );
2847 dx = outputPixelDist * std::sin( ( 180 -
lineAngle ) * M_PI / 180 );
2848 p1 = QPointF( 0, 0 );
2849 p2 = QPointF( width, height );
2850 p5 = QPointF( dx, -dy );
2851 p6 = QPointF( width + dx, height - dy );
2852 p3 = QPointF( -dx, dy );
2853 p4 = QPointF( width - dx, height + dy );
2857 dy = outputPixelDist * std::cos( ( 180 -
lineAngle ) * M_PI / 180 );
2858 dx = outputPixelDist * std::sin( ( 180 -
lineAngle ) * M_PI / 180 );
2859 p1 = QPointF( width, height );
2860 p2 = QPointF( 0, 0 );
2861 p5 = QPointF( width + dx, height - dy );
2862 p6 = QPointF( dx, -dy );
2863 p3 = QPointF( width - dx, height + dy );
2864 p4 = QPointF( -dx, dy );
2871 p3 = QPointF( tempPt.x(), tempPt.y() );
2873 p4 = QPointF( tempPt.x(), tempPt.y() );
2875 p5 = QPointF( tempPt.x(), tempPt.y() );
2877 p6 = QPointF( tempPt.x(), tempPt.y() );
2881 p1 = QPointF( tempPt.x(), tempPt.y() );
2883 p2 = QPointF( tempPt.x(), tempPt.y() );
2886 QPainter p( &patternImage );
2890 p.setRenderHint( QPainter::Antialiasing,
false );
2891 QPen pen( QColor( Qt::black ) );
2892 pen.setWidthF( 0.1 );
2893 pen.setCapStyle( Qt::FlatCap );
2898 QPolygon polygon = QPolygon() << QPoint( 0, 0 ) << QPoint( width - 1, 0 ) << QPoint( width - 1, height - 1 ) << QPoint( 0, height - 1 ) << QPoint( 0, 0 );
2899 p.drawPolygon( polygon );
2901 polygon = QPolygon() << QPoint( xBuffer, yBuffer ) << QPoint( width - xBuffer - 1, yBuffer ) << QPoint( width - xBuffer - 1, height - yBuffer - 1 ) << QPoint( xBuffer, height - yBuffer - 1 ) << QPoint( xBuffer, yBuffer );
2902 p.drawPolygon( polygon );
2908 p.setRenderHint( QPainter::Antialiasing,
true );
2919 fillLineSymbol->startRender( lineRenderContext, context.
fields() );
2921 QVector<QPolygonF> polygons;
2922 polygons.append( QPolygonF() << p1 << p2 );
2923 polygons.append( QPolygonF() << p3 << p4 );
2926 polygons.append( QPolygonF() << p5 << p6 );
2929 for (
const QPolygonF &polygon : std::as_const( polygons ) )
2931 fillLineSymbol->renderPolyline( polygon, context.
feature(), lineRenderContext, -1, context.
selected() );
2934 fillLineSymbol->stopRender( lineRenderContext );
2938 patternImage = patternImage.copy( xBuffer, yBuffer, patternImage.width() - 2 * xBuffer, patternImage.height() - 2 * yBuffer );
2943 QImage transparentImage = patternImage.copy();
2945 brush.setTextureImage( transparentImage );
2949 brush.setTextureImage( patternImage );
2952 QTransform brushTransform;
2953 brush.setTransform( brushTransform );
2958 applyPattern( context,
mBrush, mLineAngle, mDistance );
2960 if ( mFillLineSymbol )
2968 if ( mFillLineSymbol )
2977 map.insert( QStringLiteral(
"angle" ), QString::number( mLineAngle ) );
2978 map.insert( QStringLiteral(
"distance" ), QString::number( mDistance ) );
2979 map.insert( QStringLiteral(
"line_width" ), QString::number( mLineWidth ) );
2981 map.insert( QStringLiteral(
"offset" ), QString::number( mOffset ) );
2996 if ( mFillLineSymbol )
3007 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
3008 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
3009 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
3010 element.appendChild( symbolizerElem );
3015 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
3016 symbolizerElem.appendChild( fillElem );
3018 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
3019 fillElem.appendChild( graphicFillElem );
3021 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
3022 graphicFillElem.appendChild( graphicElem );
3025 QColor lineColor = mFillLineSymbol ? mFillLineSymbol->
color() : QColor();
3026 double lineWidth = mFillLineSymbol ? mFillLineSymbol->
width() : 0.0;
3034 double angle = props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toDouble( &ok );
3037 angleFunc = QStringLiteral(
"%1 + %2" ).arg( props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toString() ).arg( mLineAngle );
3041 angleFunc = QString::number(
angle + mLineAngle );
3046 QPointF lineOffset( std::sin( mLineAngle ) * mOffset, std::cos( mLineAngle ) * mOffset );
3053 QString featureStyle;
3054 featureStyle.append(
"Brush(" );
3055 featureStyle.append( QStringLiteral(
"fc:%1" ).arg(
mColor.name() ) );
3056 featureStyle.append( QStringLiteral(
",bc:%1" ).arg( QLatin1String(
"#00000000" ) ) );
3057 featureStyle.append(
",id:\"ogr-brush-2\"" );
3058 featureStyle.append( QStringLiteral(
",a:%1" ).arg( mLineAngle ) );
3059 featureStyle.append( QStringLiteral(
",s:%1" ).arg( mLineWidth * widthScaleFactor ) );
3060 featureStyle.append(
",dx:0mm" );
3061 featureStyle.append( QStringLiteral(
",dy:%1mm" ).arg( mDistance * widthScaleFactor ) );
3062 featureStyle.append(
')' );
3063 return featureStyle;
3094 Qt::PenStyle lineStyle;
3096 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
3097 if ( fillElem.isNull() )
3100 QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral(
"GraphicFill" ) );
3101 if ( graphicFillElem.isNull() )
3104 QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral(
"Graphic" ) );
3105 if ( graphicElem.isNull() )
3111 if ( name != QLatin1String(
"horline" ) )
3119 double d = angleFunc.toDouble( &ok );
3128 offset = std::sqrt( std::pow( vectOffset.x(), 2 ) + std::pow( vectOffset.y(), 2 ) );
3131 QString uom = element.attribute( QStringLiteral(
"uom" ) );
3135 std::unique_ptr< QgsLinePatternFillSymbolLayer > sl = std::make_unique< QgsLinePatternFillSymbolLayer >();
3136 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
3137 sl->setColor( lineColor );
3139 sl->setLineAngle(
angle );
3141 sl->setDistance( size );
3144 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
3145 if ( !strokeElem.isNull() )
3156 return sl.release();
3243 std::unique_ptr< QgsPointPatternFillSymbolLayer > layer = std::make_unique< QgsPointPatternFillSymbolLayer >();
3244 if (
properties.contains( QStringLiteral(
"distance_x" ) ) )
3246 layer->setDistanceX(
properties[QStringLiteral(
"distance_x" )].toDouble() );
3248 if (
properties.contains( QStringLiteral(
"distance_y" ) ) )
3250 layer->setDistanceY(
properties[QStringLiteral(
"distance_y" )].toDouble() );
3252 if (
properties.contains( QStringLiteral(
"displacement_x" ) ) )
3254 layer->setDisplacementX(
properties[QStringLiteral(
"displacement_x" )].toDouble() );
3256 if (
properties.contains( QStringLiteral(
"displacement_y" ) ) )
3258 layer->setDisplacementY(
properties[QStringLiteral(
"displacement_y" )].toDouble() );
3260 if (
properties.contains( QStringLiteral(
"offset_x" ) ) )
3262 layer->setOffsetX(
properties[QStringLiteral(
"offset_x" )].toDouble() );
3264 if (
properties.contains( QStringLiteral(
"offset_y" ) ) )
3266 layer->setOffsetY(
properties[QStringLiteral(
"offset_y" )].toDouble() );
3269 if (
properties.contains( QStringLiteral(
"distance_x_unit" ) ) )
3273 if (
properties.contains( QStringLiteral(
"distance_x_map_unit_scale" ) ) )
3277 if (
properties.contains( QStringLiteral(
"distance_y_unit" ) ) )
3281 if (
properties.contains( QStringLiteral(
"distance_y_map_unit_scale" ) ) )
3285 if (
properties.contains( QStringLiteral(
"displacement_x_unit" ) ) )
3289 if (
properties.contains( QStringLiteral(
"displacement_x_map_unit_scale" ) ) )
3293 if (
properties.contains( QStringLiteral(
"displacement_y_unit" ) ) )
3297 if (
properties.contains( QStringLiteral(
"displacement_y_map_unit_scale" ) ) )
3301 if (
properties.contains( QStringLiteral(
"offset_x_unit" ) ) )
3305 if (
properties.contains( QStringLiteral(
"offset_x_map_unit_scale" ) ) )
3309 if (
properties.contains( QStringLiteral(
"offset_y_unit" ) ) )
3313 if (
properties.contains( QStringLiteral(
"offset_y_map_unit_scale" ) ) )
3318 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
3322 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
3327 layer->restoreOldDataDefinedProperties(
properties );
3329 return layer.release();
3334 return QStringLiteral(
"PointPatternFill" );
3337 void QgsPointPatternFillSymbolLayer::applyPattern(
const QgsSymbolRenderContext &context, QBrush &brush,
double distanceX,
double distanceY,
3338 double displacementX,
double displacementY,
double offsetX,
double offsetY )
3348 if ( width > 10000 || height > 10000 )
3351 brush.setTextureImage( img );
3355 QImage patternImage( width, height, QImage::Format_ARGB32 );
3356 patternImage.fill( 0 );
3357 if ( patternImage.isNull() )
3359 brush.setTextureImage( QImage() );
3364 QPainter p( &patternImage );
3385 for (
double currentX = -width; currentX <= width * 2.0; currentX += width )
3387 for (
double currentY = -height; currentY <= height * 2.0; currentY += height )
3396 for (
double currentX = -width; currentX <= width * 2.0; currentX += width )
3398 for (
double currentY = -height / 2.0; currentY <= height * 2.0; currentY += height )
3404 for (
double currentX = -width / 2.0; currentX <= width * 2.0; currentX += width )
3406 for (
double currentY = -height; currentY <= height * 2.0; currentY += height / 2.0 )
3408 mMarkerSymbol->
renderPoint( QPointF( currentX + widthOffset + ( std::fmod( currentY, height ) != 0 ? displacementPixelX : 0 ), currentY + heightOffset - displacementPixelY ), context.
feature(), pointRenderContext );
3417 QImage transparentImage = patternImage.copy();
3419 brush.setTextureImage( transparentImage );
3423 brush.setTextureImage( patternImage );
3425 QTransform brushTransform;
3426 brush.setTransform( brushTransform );
3435 if ( mRenderUsingMarkers )
3453 if ( mRenderUsingMarkers )
3466 if ( !mRenderUsingMarkers )
3528 p->setPen( QPen( Qt::NoPen ) );
3533 p->setBrush( QBrush( selColor ) );
3540 path.addPolygon( points );
3543 for (
const QPolygonF &ring : *rings )
3545 path.addPolygon( ring );
3548 p->setClipPath( path, Qt::IntersectClip );
3550 const double left = points.boundingRect().left();
3551 const double top = points.boundingRect().top();
3552 const double right = points.boundingRect().right();
3553 const double bottom = points.boundingRect().bottom();
3560 bool alternateColumn =
false;
3561 int currentCol = -3;
3562 for (
double currentX = ( std::floor( left / width ) - 2 ) * width; currentX <= right + 2 * width; currentX += width, alternateColumn = !alternateColumn )
3564 if ( needsExpressionContext )
3567 bool alternateRow =
false;
3568 const double columnX = currentX + widthOffset;
3569 int currentRow = -3;
3570 for (
double currentY = ( std::floor( top / height ) - 2 ) * height; currentY <= bottom + 2 * height; currentY += height, alternateRow = !alternateRow )
3572 double y = currentY + heightOffset;
3575 x += displacementPixelX;
3577 if ( !alternateColumn )
3578 y -= displacementPixelY;
3580 if ( needsExpressionContext )
3597 for (
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
3608 map.insert( QStringLiteral(
"distance_x" ), QString::number(
mDistanceX ) );
3609 map.insert( QStringLiteral(
"distance_y" ), QString::number(
mDistanceY ) );
3610 map.insert( QStringLiteral(
"displacement_x" ), QString::number(
mDisplacementX ) );
3611 map.insert( QStringLiteral(
"displacement_y" ), QString::number(
mDisplacementY ) );
3612 map.insert( QStringLiteral(
"offset_x" ), QString::number(
mOffsetX ) );
3613 map.insert( QStringLiteral(
"offset_y" ), QString::number(
mOffsetY ) );
3647 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
3648 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
3649 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
3650 element.appendChild( symbolizerElem );
3655 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
3656 symbolizerElem.appendChild( fillElem );
3658 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
3659 fillElem.appendChild( graphicFillElem );
3666 symbolizerElem.appendChild( distanceElem );
3671 markerLayer->writeSldMarker( doc, graphicFillElem, props );
3675 QString errorMsg = QStringLiteral(
"QgsMarkerSymbolLayer expected, %1 found. Skip it." ).arg( layer->
layerType() );
3676 graphicFillElem.appendChild( doc.createComment( errorMsg ) );
3680 QString errorMsg = QStringLiteral(
"Missing point pattern symbol layer. Skip it." );
3681 graphicFillElem.appendChild( doc.createComment( errorMsg ) );
3810 std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
3812 if (
properties.contains( QStringLiteral(
"point_on_surface" ) ) )
3813 sl->setPointOnSurface(
properties[QStringLiteral(
"point_on_surface" )].toInt() != 0 );
3814 if (
properties.contains( QStringLiteral(
"point_on_all_parts" ) ) )
3815 sl->setPointOnAllParts(
properties[QStringLiteral(
"point_on_all_parts" )].toInt() != 0 );
3816 if (
properties.contains( QStringLiteral(
"clip_points" ) ) )
3817 sl->setClipPoints(
properties[QStringLiteral(
"clip_points" )].toInt() != 0 );
3818 if (
properties.contains( QStringLiteral(
"clip_on_current_part_only" ) ) )
3819 sl->setClipOnCurrentPartOnly(
properties[QStringLiteral(
"clip_on_current_part_only" )].toInt() != 0 );
3821 sl->restoreOldDataDefinedProperties(
properties );
3823 return sl.release();
3828 return QStringLiteral(
"CentroidFill" );
3858 part.exterior = points;
3860 part.rings = *rings;
3867 mCurrentParts << part;
3872 const double prevOpacity =
mMarker->opacity();
3875 mMarker->setOpacity( prevOpacity );
3882 mCurrentParts.clear();
3889 const double prevOpacity =
mMarker->opacity();
3892 render( context, mCurrentParts, feature,
false );
3894 mMarker->setOpacity( prevOpacity );
3897 void QgsCentroidFillSymbolLayer::render(
QgsRenderContext &context,
const QVector<QgsCentroidFillSymbolLayer::Part> &parts,
const QgsFeature &feature,
bool selected )
3906 QVector< QgsGeometry > geometryParts;
3907 geometryParts.reserve( parts.size() );
3908 QPainterPath globalPath;
3911 int maxAreaPartIdx = 0;
3913 for (
int i = 0; i < parts.size(); i++ )
3915 const Part part = parts[i];
3918 if ( !geom.
isNull() && !part.rings.empty() )
3920 QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
3924 int area = poly->
area();
3926 if ( area > maxArea )
3936 globalPath.addPolygon( part.exterior );
3937 for (
const QPolygonF &ring : part.rings )
3939 globalPath.addPolygon( ring );
3944 for (
int i = 0; i < parts.size(); i++ )
3949 const Part part = parts[i];
3957 path.addPolygon( part.exterior );
3958 for (
const QPolygonF &ring : part.rings )
3960 path.addPolygon( ring );
3969 context.
painter()->setClipPath( path );
3973 mMarker->renderPoint( centroid, feature.
isValid() ? &feature :
nullptr, context, -1, selected );
3985 map[QStringLiteral(
"point_on_surface" )] = QString::number(
mPointOnSurface );
3986 map[QStringLiteral(
"point_on_all_parts" )] = QString::number(
mPointOnAllParts );
3987 map[QStringLiteral(
"clip_points" )] = QString::number(
mClipPoints );
3994 std::unique_ptr< QgsCentroidFillSymbolLayer > x = std::make_unique< QgsCentroidFillSymbolLayer >();
3997 x->setSubSymbol(
mMarker->clone() );
4012 mMarker->toSld( doc, element, props );
4023 std::unique_ptr< QgsMarkerSymbol > marker(
new QgsMarkerSymbol( layers ) );
4025 std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
4026 sl->setSubSymbol( marker.release() );
4027 sl->setPointOnAllParts(
false );
4028 return sl.release();
4055 attributes.unite(
mMarker->usedAttributes( context ) );
4078 mMarker->setOutputUnit( unit );
4095 return mMarker->usesMapUnits();
4104 mMarker->setMapUnitScale( scale );
4112 return mMarker->mapUnitScale();
4122 , mImageFilePath( imageFilePath )
4138 if (
properties.contains( QStringLiteral(
"imageFile" ) ) )
4140 imagePath =
properties[QStringLiteral(
"imageFile" )].toString();
4142 if (
properties.contains( QStringLiteral(
"coordinate_mode" ) ) )
4146 if (
properties.contains( QStringLiteral(
"alpha" ) ) )
4148 alpha =
properties[QStringLiteral(
"alpha" )].toDouble();
4150 if (
properties.contains( QStringLiteral(
"offset" ) ) )
4154 if (
properties.contains( QStringLiteral(
"angle" ) ) )
4158 if (
properties.contains( QStringLiteral(
"width" ) ) )
4162 std::unique_ptr< QgsRasterFillSymbolLayer > symbolLayer = std::make_unique< QgsRasterFillSymbolLayer >( imagePath );
4163 symbolLayer->setCoordinateMode( mode );
4164 symbolLayer->setOpacity( alpha );
4165 symbolLayer->setOffset(
offset );
4166 symbolLayer->setAngle(
angle );
4167 symbolLayer->setWidth(
width );
4168 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
4172 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
4176 if (
properties.contains( QStringLiteral(
"width_unit" ) ) )
4180 if (
properties.contains( QStringLiteral(
"width_map_unit_scale" ) ) )
4185 symbolLayer->restoreOldDataDefinedProperties(
properties );
4187 return symbolLayer.release();
4192 QVariantMap::iterator it =
properties.find( QStringLiteral(
"imageFile" ) );
4196 it.value() = pathResolver.
writePath( it.value().toString() );
4198 it.value() = pathResolver.
readPath( it.value().toString() );
4210 return QStringLiteral(
"RasterFill" );
4221 QPointF
offset = mOffset;
4237 if ( mCoordinateMode ==
Feature )
4239 QRectF boundingRect = points.boundingRect();
4240 mBrush.setTransform(
mBrush.transform().translate( boundingRect.left() -
mBrush.transform().dx(),
4241 boundingRect.top() -
mBrush.transform().dy() ) );
4253 applyPattern(
mBrush, mImageFilePath, mWidth, mOpacity * context.
opacity(), context );
4264 map[QStringLiteral(
"imageFile" )] = mImageFilePath;
4265 map[QStringLiteral(
"coordinate_mode" )] = QString::number( mCoordinateMode );
4266 map[QStringLiteral(
"alpha" )] = QString::number( mOpacity );
4270 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
4271 map[QStringLiteral(
"width" )] = QString::number( mWidth );
4279 std::unique_ptr< QgsRasterFillSymbolLayer > sl = std::make_unique< QgsRasterFillSymbolLayer >( mImageFilePath );
4280 sl->setCoordinateMode( mCoordinateMode );
4281 sl->setOpacity( mOpacity );
4282 sl->setOffset( mOffset );
4283 sl->setOffsetUnit( mOffsetUnit );
4284 sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
4286 sl->setWidth( mWidth );
4287 sl->setWidthUnit( mWidthUnit );
4288 sl->setWidthMapUnitScale( mWidthMapUnitScale );
4291 return sl.release();
4296 return context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
4307 mImageFilePath = imagePath;
4312 mCoordinateMode = mode;
4330 if ( !hasWidthExpression && !hasAngleExpression && !hasOpacityExpression && !hasFileExpression )
4336 if ( hasAngleExpression )
4344 if ( !hasWidthExpression && !hasOpacityExpression && !hasFileExpression )
4349 double width = mWidth;
4350 if ( hasWidthExpression )
4356 if ( hasOpacityExpression )
4361 QString file = mImageFilePath;
4362 if ( hasFileExpression )
4375 void QgsRasterFillSymbolLayer::applyPattern( QBrush &brush,
const QString &imageFilePath,
const double width,
const double alpha,
const QgsSymbolRenderContext &context )
4388 if ( size.isEmpty() )
4391 size.setWidth( (
width * size.width() ) / 100.0 );
4394 if (
static_cast< int >( size.width() ) < 1 || 10000.0 < size.width() )
4398 size.setHeight( 0 );
4406 brush.setTextureImage( img );
4415 : mCountMethod( method )
4416 , mPointCount( pointCount )
4417 , mDensityArea( densityArea )
4428 const int pointCount =
properties.value( QStringLiteral(
"point_count" ), QStringLiteral(
"10" ) ).toInt();
4429 const double densityArea =
properties.value( QStringLiteral(
"density_area" ), QStringLiteral(
"250.0" ) ).toDouble();
4431 unsigned long seed = 0;
4432 if (
properties.contains( QStringLiteral(
"seed" ) ) )
4438 std::random_device rd;
4439 std::mt19937 mt(
seed == 0 ? rd() :
seed );
4440 std::uniform_int_distribution<> uniformDist( 1, 999999999 );
4441 seed = uniformDist( mt );
4446 if (
properties.contains( QStringLiteral(
"density_area_unit" ) ) )
4448 if (
properties.contains( QStringLiteral(
"density_area_unit_scale" ) ) )
4451 if (
properties.contains( QStringLiteral(
"clip_points" ) ) )
4453 sl->setClipPoints(
properties[QStringLiteral(
"clip_points" )].toInt() );
4456 return sl.release();
4461 return QStringLiteral(
"RandomMarkerFill" );
4466 mMarker->setColor(
color );
4472 return mMarker ? mMarker->color() :
mColor;
4488 part.exterior = points;
4490 part.rings = *rings;
4492 if ( mRenderingFeature )
4496 mFeatureSymbolOpacity = context.
opacity();
4497 mCurrentParts << part;
4502 const double prevOpacity = mMarker->opacity();
4503 mMarker->setOpacity( mMarker->opacity() * context.
opacity() );
4505 mMarker->setOpacity( prevOpacity );
4509 void QgsRandomMarkerFillSymbolLayer::render(
QgsRenderContext &context,
const QVector<QgsRandomMarkerFillSymbolLayer::Part> &parts,
const QgsFeature &feature,
bool selected )
4518 QVector< QgsGeometry > geometryParts;
4519 geometryParts.reserve( parts.size() );
4522 for (
const Part &part : parts )
4525 if ( !geom.
isNull() && !part.rings.empty() )
4527 QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
4528 for (
const QPolygonF &ring : part.rings )
4535 geom = geom.
buffer( 0, 0 );
4537 geometryParts << geom;
4541 path.addPolygon( part.exterior );
4542 for (
const QPolygonF &ring : part.rings )
4544 path.addPolygon( ring );
4554 context.
painter()->setClipPath( path );
4558 int count = mPointCount;
4565 switch ( mCountMethod )
4577 count = std::max( 0.0, std::ceil( count * ( geom.
area() /
densityArea ) ) );
4584 unsigned long seed = mSeed;
4595 std::sort( randomPoints.begin(), randomPoints.end(), [](
const QgsPointXY & a,
const QgsPointXY & b )->bool
4597 return a.y() < b.y();
4605 for (
const QgsPointXY &p : std::as_const( randomPoints ) )
4607 if ( needsExpressionContext )
4609 mMarker->renderPoint( QPointF( p.x(), p.y() ), feature.
isValid() ? &feature :
nullptr, context, -1, selected );
4621 map.insert( QStringLiteral(
"count_method" ), QString::number(
static_cast< int >( mCountMethod ) ) );
4622 map.insert( QStringLiteral(
"point_count" ), QString::number( mPointCount ) );
4623 map.insert( QStringLiteral(
"density_area" ), QString::number( mDensityArea ) );
4626 map.insert( QStringLiteral(
"seed" ), QString::number( mSeed ) );
4627 map.insert( QStringLiteral(
"clip_points" ), QString::number( mClipPoints ) );
4633 std::unique_ptr< QgsRandomMarkerFillSymbolLayer > res = std::make_unique< QgsRandomMarkerFillSymbolLayer >( mPointCount, mCountMethod, mDensityArea, mSeed );
4636 res->setDensityAreaUnit( mDensityAreaUnit );
4637 res->setDensityAreaUnitScale( mDensityAreaUnitScale );
4638 res->mClipPoints = mClipPoints;
4639 res->setSubSymbol( mMarker->clone() );
4642 return res.release();
4652 return mMarker.get();
4664 mColor = mMarker->color();
4673 attributes.unite( mMarker->usedAttributes( context ) );
4682 if ( mMarker && mMarker->hasDataDefinedProperties() )
4719 return mCountMethod;
4724 mCountMethod = method;
4729 return mDensityArea;
4734 mDensityArea = area;
4739 mRenderingFeature =
true;
4740 mCurrentParts.clear();
4745 mRenderingFeature =
false;
4747 const double prevOpacity = mMarker->opacity();
4748 mMarker->setOpacity( mMarker->opacity() * mFeatureSymbolOpacity );
4750 render( context, mCurrentParts, feature,
false );
4752 mFeatureSymbolOpacity = 1;
4753 mMarker->setOpacity( prevOpacity );
4761 mMarker->setOutputUnit( unit );
4769 return mMarker->outputUnit();
4778 return mMarker->usesMapUnits();
4787 mMarker->setMapUnitScale( scale );
4795 return mMarker->mapUnitScale();
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.
int valueAsInt(int key, const QgsExpressionContext &context, int defaultValue=0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an integer.
bool valueAsBool(int key, const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an boolean.
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.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QgsSymbolLayer * createFromSld(QDomElement &element)
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
void setMapUnitScale(const QgsMapUnitScale &scale) override
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
bool pointOnSurface() const
QgsMapUnitScale mapUnitScale() const override
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
std::unique_ptr< QgsMarkerSymbol > mMarker
QString layerType() const override
Returns a string that represents this layer type.
void setColor(const QColor &color) override
The fill color.
bool pointOnAllParts() const
Returns whether a point is drawn for all parts or only on the biggest part of multi-part features.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsFeatureId mCurrentFeatureId
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
bool clipPoints() const
Returns true if point markers should be clipped to the polygon boundary.
QgsCentroidFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsCentroidFillSymbolLayer using the specified properties map containing symbol propert...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
~QgsCentroidFillSymbolLayer() override
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
double mFeatureSymbolOpacity
QgsCentroidFillSymbolLayer()
QColor color() const override
The fill color.
bool clipOnCurrentPartOnly() const
Returns true if point markers should be clipped to the current part boundary only.
bool mClipOnCurrentPartOnly
Abstract base class for color ramps.
virtual QColor color(double value) const =0
Returns the color corresponding to a specified value.
virtual QVariantMap properties() const =0
Returns a string map containing all the color ramp's properties.
virtual QString type() const =0
Returns a string representing the color ramp type.
virtual QgsColorRamp * clone() const =0
Creates a clone of the color ramp.
static QgsColorRamp * create(const QVariantMap &properties=QVariantMap())
Creates the symbol layer.
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
double area() const override SIP_HOLDGIL
Returns the planar, 2-dimensional area of the geometry.
Exports QGIS layers to the DXF format.
static double mapUnitScaleFactor(double scale, QgsUnitTypes::RenderUnit symbolUnits, QgsUnitTypes::DistanceUnit mapUnits, double mapUnitsPerPixel=1.0)
Returns scale factor for conversion to map units.
QgsUnitTypes::DistanceUnit mapUnits() const
Retrieve map units.
double symbologyScale() const
Returns the reference scale for output.
RAII class to pop scope from an expression context on destruction.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
static const QString EXPR_GEOMETRY_POINT_NUM
Inbuilt variable name for point number variable.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool isValid() const
Returns the validity of this feature.
void _renderPolygon(QPainter *p, const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Default method to render polygon.
A geometry is the spatial representation of a feature.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
bool isGeosValid(QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Checks validity of the geometry using GEOS.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
static QgsColorRamp * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsColorRamp from a map of properties.
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
void addStopsToGradient(QGradient *gradient, double opacity=1)
Copy color ramp stops to a QGradient.
void setColorRamp(QgsColorRamp *ramp)
Sets the color ramp used for the gradient fill.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsUnitTypes::RenderUnit mOffsetUnit
GradientCoordinateMode coordinateMode() const
Coordinate mode for gradient. Controls how the gradient stops are positioned.
QColor color2() const
Color for endpoint of gradient, only used if the gradient color type is set to SimpleTwoColor.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
QgsGradientFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
GradientColorType mGradientColorType
QgsMapUnitScale mapUnitScale() const override
bool mReferencePoint1IsCentroid
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
GradientSpread gradientSpread() const
Gradient spread mode. Controls how the gradient behaves outside of the predefined stops.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
GradientColorType gradientColorType() const
Gradient color mode, controls how gradient color stops are created.
GradientType mGradientType
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsGradientFillSymbolLayer using the specified properties map containing symbol propert...
void setMapUnitScale(const QgsMapUnitScale &scale) override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
GradientCoordinateMode mCoordinateMode
~QgsGradientFillSymbolLayer() override
QgsColorRamp * mGradientRamp
GradientSpread mGradientSpread
QPointF referencePoint1() const
bool mReferencePoint2IsCentroid
QgsMapUnitScale mOffsetMapUnitScale
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QPointF offset() const
Returns the offset by which polygons will be translated during rendering.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
QgsGradientFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, const QColor &color2=Qt::white, GradientColorType gradientColorType=SimpleTwoColor, GradientType gradientType=Linear, GradientCoordinateMode coordinateMode=Feature, GradientSpread gradientSpread=Pad)
GradientType gradientType() const
Type of gradient, e.g., linear or radial.
QPointF referencePoint2() const
QSize originalSize(const QString &path, bool blocking=false) const
Returns the original size (in pixels) of the image at the specified path.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
Base class for polygon renderers generating texture images.
std::unique_ptr< QgsLineSymbol > mStroke
Custom stroke.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QgsMapUnitScale mStrokeWidthMapUnitScale
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
QgsImageFillSymbolLayer()
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
double mStrokeWidth
Stroke width.
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsMapUnitScale mapUnitScale() const override
Qt::PenStyle dxfPenStyle() const override
Gets pen style.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
virtual void applyDataDefinedSettings(QgsSymbolRenderContext &context)
virtual bool applyBrushTransformFromContext() const
Returns true if the image brush should be transformed using the render context's texture origin.
QColor dxfColor(QgsSymbolRenderContext &context) const override
Gets color.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsUnitTypes::RenderUnit mStrokeWidthUnit
~QgsImageFillSymbolLayer() override
static void multiplyOpacity(QImage &image, double factor)
Multiplies opacity of image pixel values by a factor.
static void stackBlur(QImage &image, int radius, bool alphaOnly=false)
Performs a stack blur on an image.
A symbol fill consisting of repeated parallel lines.
QgsMapUnitScale mapUnitScale() const override
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
QgsLinePatternFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QColor color() const override
The fill color.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double lineWidth() const
Returns the width of the line subsymbol used to render the parallel lines in the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void setMapUnitScale(const QgsMapUnitScale &scale) override
double lineAngle() const
Returns the angle for the parallel lines used to fill the symbol.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setLineWidth(double w)
Sets the width of the line subsymbol used to render the parallel lines in the fill.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void setColor(const QColor &c) override
The fill color.
double offset() const
Returns the offset distance for lines within the fill, which is the distance to offset the parallel l...
QgsLinePatternFillSymbolLayer()
double distance() const
Returns the distance between lines in the fill pattern.
QString ogrFeatureStyleWidth(double widthScaleFactor) const
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
~QgsLinePatternFillSymbolLayer() override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsLinePatternFillSymbolLayer from a SLD element.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsLinePatternFillSymbolLayer from a properties map.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
A line symbol type, for rendering LineString and MultiLineString geometries.
QgsLineSymbol * clone() const override
Returns a deep copy of this symbol.
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
void setWidth(double width)
Sets the width for the whole line symbol.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns current map units per pixel.
Struct for storing maximum and minimum scales for measurements in map units.
Line symbol layer type which draws repeating marker symbols along a line feature.
Abstract base class for marker symbol layers.
A marker symbol type, for rendering Point and MultiPoint geometries.
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
void renderPoint(QPointF point, const QgsFeature *f, QgsRenderContext &context, int layer=-1, bool selected=false)
Renders the symbol at the specified point, using the given render context.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
QgsMapUnitScale mapUnitScale() const override
QgsMarkerSymbol * mMarkerSymbol
QgsMapUnitScale mDisplacementYMapUnitScale
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QgsMapUnitScale mDisplacementXMapUnitScale
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsMapUnitScale mDistanceYMapUnitScale
QgsUnitTypes::RenderUnit mDisplacementXUnit
double displacementY() const
QgsUnitTypes::RenderUnit mDistanceYUnit
void setColor(const QColor &c) override
The fill color.
QgsUnitTypes::RenderUnit mOffsetXUnit
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsPointPatternFillSymbolLayer using the specified properties map containing symbol pro...
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
double offsetY() const
Returns the vertical offset values for points in the pattern.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
QgsMapUnitScale mDistanceXMapUnitScale
void setMapUnitScale(const QgsMapUnitScale &scale) override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsMapUnitScale mOffsetXMapUnitScale
QColor color() const override
The fill color.
QgsPointPatternFillSymbolLayer()
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double offsetX() const
Returns the horizontal offset values for points in the pattern.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
QgsPointPatternFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsUnitTypes::RenderUnit mDistanceXUnit
QgsUnitTypes::RenderUnit mOffsetYUnit
double displacementX() const
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
~QgsPointPatternFillSymbolLayer() override
QgsMapUnitScale mOffsetYMapUnitScale
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsUnitTypes::RenderUnit mDisplacementYUnit
static QgsSymbolLayer * createFromSld(QDomElement &element)
A class to represent a 2D point.
void addInteriorRing(QgsCurve *ring) override
Adds an interior ring to the geometry (takes ownership)
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.
static QVariantMap propertyMapToVariantMap(const QMap< QString, QgsProperty > &propertyMap)
Convert a map of QgsProperty to a map of QVariant This is useful to save a map of properties.
static QMap< QString, QgsProperty > variantMapToPropertyMap(const QVariantMap &variantMap)
Convert a map of QVariant to a map of QgsProperty This is useful to restore a map of properties.
A fill symbol layer which places markers at random locations within polygons.
~QgsRandomMarkerFillSymbolLayer() override
int pointCount() const
Returns the count of random points to render in the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
unsigned long seed() const
Returns the random number seed to use when generating points, or 0 if a truly random sequence will be...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsRandomMarkerFillSymbolLayer using the specified properties map containing symbol pro...
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setCountMethod(CountMethod method)
Sets the count method used to randomly fill the polygon.
QString layerType() const override
Returns a string that represents this layer type.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsRandomMarkerFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void setMapUnitScale(const QgsMapUnitScale &scale) override
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
bool clipPoints() const
Returns true if point markers should be clipped to the polygon boundary.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
void setClipPoints(bool clipped)
Sets whether point markers should be clipped to the polygon boundary.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QColor color() const override
The fill color.
void setSeed(unsigned long seed)
Sets the random number seed to use when generating points, or 0 if a truly random sequence will be us...
QgsRandomMarkerFillSymbolLayer(int pointCount=10, CountMethod method=AbsoluteCount, double densityArea=250.0, unsigned long seed=0)
Constructor for QgsRandomMarkerFillSymbolLayer, with the specified pointCount.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void setPointCount(int count)
Sets the count of random points to render in the fill.
CountMethod
Methods to define the number of points randomly filling the polygon.
@ AbsoluteCount
The point count is used as an absolute count of markers.
@ DensityBasedCount
The point count is part of a marker density count.
double densityArea() const
Returns the density area used to count the number of points to randomly fill the polygon.
void setColor(const QColor &color) override
The fill color.
void setDensityArea(double area)
Sets the density area used to count the number of points to randomly fill the polygon.
QgsMapUnitScale mapUnitScale() const override
CountMethod countMethod() const
Returns the count method used to randomly fill the polygon.
A class for filling symbols with a repeated raster image.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
double width() const
Returns the width used for scaling the image used in the fill.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsRasterFillSymbolLayer from a properties map.
FillCoordinateMode
Fill coordinate modes, dictates fill tiling behavior.
@ Feature
Tiling is based on feature bounding box.
QString layerType() const override
Returns a string that represents this layer type.
QgsRasterFillSymbolLayer(const QString &imageFilePath=QString())
Constructor for QgsRasterFillSymbolLayer, using a raster fill from the specified imageFilePath.
double opacity() const
Returns the opacity for the raster image used in the fill.
~QgsRasterFillSymbolLayer() override
void setOpacity(double opacity)
Sets the opacity for the raster image used in the fill.
bool applyBrushTransformFromContext() const override
Returns true if the image brush should be transformed using the render context's texture origin.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString imageFilePath() const
The path to the raster image used for the fill.
void setImageFilePath(const QString &imagePath)
Sets the path to the raster image used for the fill.
static void resolvePaths(QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving)
Turns relative paths in properties map to absolute when reading and vice versa when writing.
void setCoordinateMode(FillCoordinateMode mode)
Set the coordinate mode for fill.
QPointF offset() const
Returns the offset for the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsRasterFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
Contains information about the context of a rendering operation.
void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
double rendererScale() const
Returns the renderer map scale.
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...
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
QColor selectionColor() const
Returns the color to use when rendering selected features.
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
@ Antialiasing
Use antialiasing while drawing.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
Flags flags() const
Returns combination of flags used for rendering.
QPointF textureOrigin() const
Returns the texture origin, which should be used as a brush transform when rendering using QBrush obj...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
void setRendererScale(double scale)
Sets the renderer map scale.
const QgsPathResolver & pathResolver() const
Returns the path resolver for conversion between relative and absolute paths during rendering operati...
A class for filling symbols with a repeated SVG file.
QMap< QString, QgsProperty > parameters() const
Returns the dynamic SVG parameters.
void setParameters(const QMap< QString, QgsProperty > ¶meters)
Sets the dynamic SVG parameters.
QString svgFilePath() const
Returns the path to the SVG file used to render the fill.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsSVGFillSymbolLayer from a SLD element.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QColor svgStrokeColor() const
Returns the stroke color used for rendering the SVG content.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
const QgsMapUnitScale & svgStrokeWidthMapUnitScale() const
Returns the map unit scale for the pattern's stroke.
QgsUnitTypes::RenderUnit svgStrokeWidthUnit() const
Returns the units for the stroke width.
double svgStrokeWidth() const
Returns the stroke width used for rendering the SVG content.
QString layerType() const override
Returns a string that represents this layer type.
QgsSVGFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsSVGFillSymbolLayer(const QString &svgFilePath, double width=20, double rotation=0.0)
Constructor for QgsSVGFillSymbolLayer, using the SVG picture at the specified absolute file path.
void setSvgFilePath(const QString &svgPath)
Sets the path to the SVG file to render in the fill.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsSVGFillSymbolLayer from a properties map.
QColor svgFillColor() const
Returns the fill color used for rendering the SVG content.
static void resolvePaths(QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving)
Turns relative paths in properties map to absolute when reading and vice versa when writing.
const QgsMapUnitScale & patternWidthMapUnitScale() const
Returns the map unit scale for the pattern's width.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
double patternWidth() const
Returns the width of the rendered SVG content within the fill (i.e.
~QgsSVGFillSymbolLayer() override
QgsUnitTypes::RenderUnit patternWidthUnit() const
Returns the units for the width of the SVG images in the pattern.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
QgsMapUnitScale mapUnitScale() const override
Scoped object for saving and restoring a QPainter object's state.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QgsShapeburstFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
~QgsShapeburstFillSymbolLayer() override
int blurRadius() const
Returns the blur radius, which controls the amount of blurring applied to the fill.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QColor color2() const
Returns the color used for the endpoint of the shapeburst fill.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsMapUnitScale mapUnitScale() const override
QgsShapeburstFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, const QColor &color2=Qt::white, ShapeburstColorType colorType=SimpleTwoColor, int blurRadius=0, bool useWholeShape=true, double maxDistance=5)
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsShapeburstFillSymbolLayer using the specified properties map containing symbol prope...
QPointF offset() const
Returns the offset for the shapeburst fill.
bool useWholeShape() const
Returns whether the shapeburst fill is set to cover the entire shape.
ShapeburstColorType colorType() const
Returns the color mode used for the shapeburst fill.
bool ignoreRings() const
Returns whether the shapeburst fill is set to ignore polygon interior rings.
double maxDistance() const
Returns the maximum distance from the shape's boundary which is shaded.
QString layerType() const override
Returns a string that represents this layer type.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void setColorRamp(QgsColorRamp *ramp)
Sets the color ramp used to draw the shapeburst fill.
QgsSimpleFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, Qt::BrushStyle style=DEFAULT_SIMPLEFILL_STYLE, const QColor &strokeColor=DEFAULT_SIMPLEFILL_BORDERCOLOR, Qt::PenStyle strokeStyle=DEFAULT_SIMPLEFILL_BORDERSTYLE, double strokeWidth=DEFAULT_SIMPLEFILL_BORDERWIDTH, Qt::PenJoinStyle penJoinStyle=DEFAULT_SIMPLEFILL_JOINSTYLE)
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
Qt::PenJoinStyle penJoinStyle() const
QColor strokeColor() const override
Gets stroke color.
QColor dxfBrushColor(QgsSymbolRenderContext &context) const override
Gets brush/fill color.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
Qt::BrushStyle dxfBrushStyle() const override
Gets brush/fill style.
QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const override
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QgsUnitTypes::RenderUnit mOffsetUnit
~QgsSimpleFillSymbolLayer() override
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QColor dxfColor(QgsSymbolRenderContext &context) const override
Gets color.
QColor fillColor() const override
Gets fill color.
Qt::PenStyle strokeStyle() const
QString layerType() const override
Returns a string that represents this layer type.
double dxfAngle(QgsSymbolRenderContext &context) const override
Gets angle.
QgsMapUnitScale mOffsetMapUnitScale
double strokeWidth() const
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
Qt::PenStyle dxfPenStyle() const override
Gets pen style.
QgsMapUnitScale mStrokeWidthMapUnitScale
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsSimpleFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QPointF offset()
Returns the offset by which polygons will be translated during rendering.
Qt::PenStyle mStrokeStyle
QgsMapUnitScale mapUnitScale() const override
Qt::PenJoinStyle mPenJoinStyle
Qt::BrushStyle mBrushStyle
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsSimpleFillSymbolLayer using the specified properties map containing symbol propertie...
static QgsSymbolLayer * createFromSld(QDomElement &element)
QgsUnitTypes::RenderUnit mStrokeWidthUnit
QByteArray getImageData(const QString &path, bool blocking=false) const
Gets the SVG content corresponding to the given path.
QPicture svgAsPicture(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool forceVectorOutput=false, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Returns an SVG drawing as a QPicture.
void containsParams(const QString &path, bool &hasFillParam, QColor &defaultFillColor, bool &hasStrokeParam, QColor &defaultStrokeColor, bool &hasStrokeWidthParam, double &defaultStrokeWidth, bool blocking=false) const
Tests if an SVG file contains parameters for fill, stroke color, stroke width.
QImage svgAsImage(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool &fitsInCache, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Returns an SVG drawing as a QImage.
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 QgsStringMap evaluatePropertiesMap(const QMap< QString, QgsProperty > &propertiesMap, const QgsExpressionContext &context)
Evaluates a map of properties using the given context and returns a variant map with evaluated expres...
static bool displacementFromSldElement(QDomElement &element, QPointF &offset)
static QColor decodeColor(const QString &str)
static QPointF polygonCentroid(const QPolygonF &points)
Calculate the centroid point of a QPolygonF.
static QString encodeBrushStyle(Qt::BrushStyle style)
static QString svgSymbolPathToName(const QString &path, const QgsPathResolver &pathResolver)
Determines an SVG symbol's name from its path.
static QPointF polygonPointOnSurface(const QPolygonF &points, const QVector< QPolygonF > *rings=nullptr)
Calculate a point on the surface of a QPolygonF.
static QPointF toPoint(const QVariant &value, bool *ok=nullptr)
Converts a value to a point.
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 void multiplyImageOpacity(QImage *image, qreal opacity)
Multiplies opacity of image pixel values with a (global) transparency value.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QString ogrFeatureStylePen(double width, double mmScaleFactor, double mapUnitsScaleFactor, const QColor &c, Qt::PenJoinStyle joinStyle=Qt::MiterJoin, Qt::PenCapStyle capStyle=Qt::FlatCap, double offset=0.0, const QVector< qreal > *dashPattern=nullptr)
Create ogr feature style string for pen.
static bool externalGraphicFromSld(QDomElement &element, QString &path, QString &mime, QColor &color, double &size)
static void parametricSvgToSld(QDomDocument &doc, QDomElement &graphicElem, const QString &path, const QColor &fillColor, double size, const QColor &strokeColor, double strokeWidth)
Encodes a reference to a parametric SVG into SLD, as a succession of parametric SVG using URL paramet...
static bool lineFromSld(QDomElement &element, Qt::PenStyle &penStyle, QColor &color, double &width, Qt::PenJoinStyle *penJoinStyle=nullptr, Qt::PenCapStyle *penCapStyle=nullptr, QVector< qreal > *customDashPattern=nullptr, double *dashOffset=nullptr)
static QString ogrFeatureStyleBrush(const QColor &fillColr)
Create ogr feature style string for brush.
static QPointF pointOnLineWithDistance(QPointF startPoint, QPointF directionPoint, double distance)
Returns a point on the line from startPoint to directionPoint that is a certain distance away from th...
static Qt::BrushStyle decodeBrushStyle(const QString &str)
static void lineToSld(QDomDocument &doc, QDomElement &element, Qt::PenStyle penStyle, const QColor &color, double width=-1, const Qt::PenJoinStyle *penJoinStyle=nullptr, const Qt::PenCapStyle *penCapStyle=nullptr, const QVector< qreal > *customDashPattern=nullptr, double dashOffset=0.0)
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
static double sizeInPixelsFromSldUom(const QString &uom, double size)
Returns the size scaled in pixels according to the uom attribute.
static bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
static QString encodeColor(const QColor &color)
static bool fillFromSld(QDomElement &element, Qt::BrushStyle &brushStyle, QColor &color)
static void fillToSld(QDomDocument &doc, QDomElement &element, Qt::BrushStyle brushStyle, const QColor &color=QColor())
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 QgsSymbolLayer * createMarkerLayerFromSld(QDomElement &element)
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
static QgsSymbolLayer * createLineLayerFromSld(QDomElement &element)
@ PropertyGradientReference1X
Gradient reference point 1 x.
@ PropertyShapeburstIgnoreRings
Shapeburst ignore rings.
@ PropertyGradientReference2X
Gradient reference point 2 x.
@ PropertyStrokeStyle
Stroke style (eg solid, dashed)
@ PropertyDistanceX
Horizontal distance between points.
@ PropertyFile
Filename, eg for svg files.
@ PropertyGradientType
Gradient fill type.
@ PropertyAngle
Symbol angle.
@ PropertyDistanceY
Vertical distance between points.
@ PropertyDisplacementX
Horizontal displacement.
@ PropertyGradientSpread
Gradient spread mode.
@ PropertyOffsetY
Vertical offset.
@ PropertyGradientReference1Y
Gradient reference point 1 y.
@ PropertyLineDistance
Distance between lines, or length of lines for hash line symbols.
@ PropertyBlurRadius
Shapeburst blur radius.
@ PropertyGradientReference2Y
Gradient reference point 2 y.
@ PropertyDensityArea
Density area.
@ PropertyGradientReference1IsCentroid
Gradient reference point 1 is centroid.
@ PropertyShapeburstUseWholeShape
Shapeburst use whole shape.
@ PropertyOffsetX
Horizontal offset.
@ PropertyJoinStyle
Line join style.
@ PropertyOpacity
Opacity.
@ PropertySecondaryColor
Secondary color (eg for gradient fills)
@ PropertyCoordinateMode
Gradient coordinate mode.
@ PropertyLineAngle
Line angle, or angle of hash lines for hash line symbols.
@ PropertyShapeburstMaxDistance
Shapeburst fill from edge distance.
@ PropertyOffset
Symbol offset.
@ PropertyStrokeWidth
Stroke width.
@ PropertyFillColor
Fill color.
@ PropertyClipPoints
Whether markers should be clipped to polygon boundaries.
@ PropertyPointCount
Point count.
@ PropertyRandomSeed
Random number seed.
@ PropertyFillStyle
Fill style (eg solid, dots)
@ PropertyDisplacementY
Vertical displacement.
@ PropertyStrokeColor
Stroke color.
@ PropertyGradientReference2IsCentroid
Gradient reference point 2 is centroid.
@ PropertyWidth
Symbol width.
Qgis::SymbolType type() const
static const bool SELECTION_IS_OPAQUE
Whether styles for selected features ignore symbol alpha.
virtual QColor color() const
The fill color.
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
virtual double estimateMaxBleed(const QgsRenderContext &context) const
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
static const bool SELECT_FILL_BORDER
Whether fill styles for selected features also highlight symbol stroke.
virtual QColor fillColor() const
Gets fill color.
virtual QString layerType() const =0
Returns a string that represents this layer type.
virtual QColor strokeColor() const
Gets stroke color.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
QgsPropertyCollection mDataDefinedProperties
static const bool SELECT_FILL_STYLE
Whether fill styles for selected features uses symbol layer style.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QgsFields fields() const
Fields of the layer.
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
const QgsFeature * feature() const
Returns the current feature being rendered.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
qreal opacity() const
Returns the opacity for the symbol.
Abstract base class for all rendered symbols.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
void stopRender(QgsRenderContext &context)
Ends the rendering process.
void setOutputUnit(QgsUnitTypes::RenderUnit unit)
Sets the units to use for sizes and widths within the symbol.
bool hasDataDefinedProperties() const
Returns whether the symbol utilizes any data defined properties.
QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns a list of attributes required to render this feature.
void setColor(const QColor &color)
Sets the color for the symbol.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
QColor color() const
Returns the symbol's color.
Qgis::SymbolType type() const
Returns the symbol's type.
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
const QgsMapUnitScale & intervalMapUnitScale() const
Returns the map unit scale for the interval between symbols.
double interval() const
Returns the interval between individual symbols.
void setInterval(double interval)
Sets the interval between individual symbols.
QgsUnitTypes::RenderUnit intervalUnit() const
Returns the units for the interval between symbols.
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.
@ RenderPercentage
Percentage of another measurement (e.g., canvas size, feature size)
@ RenderMapUnits
Map units.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
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
#define DEFAULT_SIMPLEFILL_JOINSTYLE
#define DEFAULT_SIMPLEFILL_COLOR
#define DEFAULT_SIMPLEFILL_STYLE
#define DEFAULT_SIMPLEFILL_BORDERSTYLE
#define DEFAULT_SIMPLEFILL_BORDERCOLOR
#define DEFAULT_SIMPLEFILL_BORDERWIDTH
QList< QgsSymbolLayer * > QgsSymbolLayerList
Single variable definition for use within a QgsExpressionContextScope.