20#include <QSvgGenerator> 
   66  for ( 
int i = 0; i < 
mLayers.count(); i++ )
 
   72    else if ( !
mLayers.at( i )->isCompatibleWithSymbol( 
this ) )
 
 
   84    return _getLineString3d( context, curve, clipToExtent );
 
   86    return _getLineString2d( context, curve, clipToExtent );
 
 
   91  const unsigned int nPoints = curve.
numPoints();
 
   95  QVector< double > pointsX;
 
   96  QVector< double > pointsY;
 
   97  QVector< double > pointsZ;
 
  103    const double cw = e.
width() / 10;
 
  104    const double ch = e.
height() / 10;
 
  108    std::unique_ptr< QgsLineString > segmentized;
 
  109    if ( 
const QgsLineString *ls = qgsgeometry_cast< const QgsLineString * >( &curve ) )
 
  115      segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
 
  116      lineString = segmentized.get();
 
  124    if ( 
const QgsLineString *ls = qgsgeometry_cast<const QgsLineString *>( &curve ) )
 
  126      pointsX = ls->xVector();
 
  127      pointsY = ls->yVector();
 
  128      pointsZ = ls->zVector();
 
  132      std::unique_ptr< QgsLineString > segmentized;
 
  133      segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
 
  135      pointsX = segmentized->xVector();
 
  136      pointsY = segmentized->yVector();
 
  137      pointsZ = segmentized->zVector();
 
  142  const QVector< double > preTransformPointsZ = pointsZ;
 
  143  bool wasTransformed = 
false;
 
  147    const int nVertices = pointsX.size();
 
  148    wasTransformed = 
true;
 
  162    const int size = pointsX.size();
 
  164    const double *xIn = pointsX.data();
 
  165    const double *yIn = pointsY.data();
 
  166    const double *zIn = pointsZ.data();
 
  168    const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() : 
nullptr;
 
  170    double *xOut = pointsX.data();
 
  171    double *yOut = pointsY.data();
 
  172    double *zOut = pointsZ.data();
 
  174    for ( 
int i = 0; i < size; ++i )
 
  176      bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
 
  183      pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
 
  199      if ( preTransformZIn )
 
  202    pointsX.resize( outSize );
 
  203    pointsY.resize( outSize );
 
  204    pointsZ.resize( outSize );
 
  211    const double cw = e.
width() / 10;
 
  212    const double ch = e.
height() / 10;
 
  215    QVector< double > tempX;
 
  216    QVector< double > tempY;
 
  217    QVector< double > tempZ;
 
  224  const int polygonSize = pointsX.size();
 
  225  QPolygonF out( polygonSize );
 
  226  const double *x = pointsX.constData();
 
  227  const double *y = pointsY.constData();
 
  228  QPointF *dest = out.data();
 
  229  for ( 
int i = 0; i < polygonSize; ++i )
 
  231    double screenX = *x++;
 
  232    double screenY = *y++;
 
  234    *dest++ = QPointF( screenX, screenY );
 
  242  const unsigned int nPoints = curve.
numPoints();
 
  252    const double cw = e.
width() / 10;
 
  253    const double ch = e.
height() / 10;
 
  276  pts.erase( std::remove_if( pts.begin(), pts.end(),
 
  277                             []( 
const QPointF point )
 
  279    return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
 
  286    const double cw = e.
width() / 10;
 
  287    const double ch = e.
height() / 10;
 
  292  QPointF *ptr = pts.data();
 
  293  for ( 
int i = 0; i < pts.size(); ++i, ++ptr )
 
  305    return _getPolygonRing3d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
 
  307    return _getPolygonRing2d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
 
 
  310QPolygonF QgsSymbol::_getPolygonRing3d( 
QgsRenderContext &context, 
const QgsCurve &curve, 
const bool clipToExtent, 
const bool isExteriorRing, 
const bool correctRingOrientation )
 
  315  QVector< double > pointsX;
 
  316  QVector< double > pointsY;
 
  317  QVector< double > pointsZ;
 
  322  bool reverseRing = 
false;
 
  323  if ( correctRingOrientation )
 
  336    const double cw = e.
width() / 10;
 
  337    const double ch = e.
height() / 10;
 
  341    std::unique_ptr< QgsLineString > segmentized;
 
  342    if ( 
const QgsLineString *ls = qgsgeometry_cast< const QgsLineString * >( &curve ) )
 
  348      segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
 
  349      lineString = segmentized.get();
 
  352    pointsX = lineString->
xVector();
 
  353    pointsY = lineString->
yVector();
 
  354    pointsZ = lineString->
zVector();
 
  361    if ( 
const QgsLineString *ls = qgsgeometry_cast<const QgsLineString *>( &curve ) )
 
  363      pointsX = ls->xVector();
 
  364      pointsY = ls->yVector();
 
  365      pointsZ = ls->zVector();
 
  369      std::unique_ptr< QgsLineString > segmentized;
 
  370      segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
 
  372      pointsX = segmentized->xVector();
 
  373      pointsY = segmentized->yVector();
 
  374      pointsZ = segmentized->zVector();
 
  380    std::reverse( pointsX.begin(), pointsX.end() );
 
  381    std::reverse( pointsY.begin(), pointsY.end() );
 
  382    std::reverse( pointsZ.begin(), pointsZ.end() );
 
  386  const QVector< double > preTransformPointsZ = pointsZ;
 
  387  bool wasTransformed = 
false;
 
  390    const int nVertices = pointsX.size();
 
  391    wasTransformed = 
true;
 
  404    const int size = pointsX.size();
 
  406    const double *xIn = pointsX.data();
 
  407    const double *yIn = pointsY.data();
 
  408    const double *zIn = pointsZ.data();
 
  410    const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() : 
nullptr;
 
  412    double *xOut = pointsX.data();
 
  413    double *yOut = pointsY.data();
 
  414    double *zOut = pointsZ.data();
 
  416    for ( 
int i = 0; i < size; ++i )
 
  418      bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
 
  424      pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
 
  440      if ( preTransformZIn )
 
  443    pointsX.resize( outSize );
 
  444    pointsY.resize( outSize );
 
  445    pointsZ.resize( outSize );
 
  452    const double cw = e.
width() / 10;
 
  453    const double ch = e.
height() / 10;
 
  459  const int polygonSize = pointsX.size();
 
  460  QPolygonF out( polygonSize );
 
  461  const double *x = pointsX.constData();
 
  462  const double *y = pointsY.constData();
 
  463  QPointF *dest = out.data();
 
  464  for ( 
int i = 0; i < polygonSize; ++i )
 
  466    double screenX = *x++;
 
  467    double screenY = *y++;
 
  469    *dest++ = QPointF( screenX, screenY );
 
  472  if ( !out.empty() && !out.isClosed() )
 
  479QPolygonF QgsSymbol::_getPolygonRing2d( 
QgsRenderContext &context, 
const QgsCurve &curve, 
const bool clipToExtent, 
const bool isExteriorRing, 
const bool correctRingOrientation )
 
  489  if ( correctRingOrientation )
 
  493      std::reverse( poly.begin(), poly.end() );
 
  495      std::reverse( poly.begin(), poly.end() );
 
  502    const double cw = e.
width() / 10;
 
  503    const double ch = e.
height() / 10;
 
  522  poly.erase( std::remove_if( poly.begin(), poly.end(),
 
  523                              []( 
const QPointF point )
 
  525    return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
 
  532    const double cw = e.
width() / 10;
 
  533    const double ch = e.
height() / 10;
 
  538  QPointF *ptr = poly.data();
 
  539  for ( 
int i = 0; i < poly.size(); ++i, ++ptr )
 
  544  if ( !poly.empty() && !poly.isClosed() )
 
  545    poly << poly.at( 0 );
 
  556  holes.reserve( ringCount );
 
  557  for ( 
int idx = 0; idx < ringCount; idx++ )
 
  560    if ( !hole.isEmpty() )
 
  561      holes.append( hole );
 
 
  570      return QObject::tr( 
"Marker" );
 
  572      return QObject::tr( 
"Line" );
 
  574      return QObject::tr( 
"Fill" );
 
  576      return QObject::tr( 
"Hybrid" );
 
 
  600  QgsSymbol::initPropertyDefinitions();
 
  601  return sPropertyDefinitions;
 
 
  617  QgsSymbolLayerList::const_iterator it = 
mLayers.constBegin();
 
  621  for ( ; it != 
mLayers.constEnd(); ++it )
 
  623    if ( ( *it )->outputUnit() != unit )
 
 
  640    if ( 
layer->usesMapUnits() )
 
 
  655  QgsSymbolLayerList::const_iterator it = 
mLayers.constBegin();
 
  656  if ( it == 
mLayers.constEnd() )
 
  662  for ( ; it != 
mLayers.constEnd(); ++it )
 
  664    if ( ( *it )->mapUnitScale() != scale )
 
 
  674  const auto constMLayers = 
mLayers;
 
  677    layer->setOutputUnit( u );
 
 
  683  const auto constMLayers = 
mLayers;
 
  686    layer->setMapUnitScale( scale );
 
 
  707  std::unique_ptr< QgsSymbol > s;
 
  731        s = std::make_unique< QgsMarkerSymbol >();
 
  734        s = std::make_unique< QgsLineSymbol >();
 
  737        s = std::make_unique< QgsFillSymbol >();
 
  740        QgsDebugError( QStringLiteral( 
"unknown layer's geometry type" ) );
 
 
  772  if ( index < 0 || index > 
mLayers.count() ) 
 
  775  if ( !
layer || !
layer->isCompatibleWithSymbol( 
this ) )
 
 
  785  if ( !
layer || !
layer->isCompatibleWithSymbol( 
this ) )
 
 
  795  if ( index < 0 || index >= 
mLayers.count() )
 
 
  806  if ( index < 0 || index >= 
mLayers.count() )
 
  809  return mLayers.takeAt( index );
 
 
  817  if ( oldLayer == 
layer )
 
  820  if ( !
layer || !
layer->isCompatibleWithSymbol( 
this ) )
 
 
  831  Q_ASSERT_X( !mStarted, 
"startRender", 
"Rendering has already been started for this symbol instance!" );
 
  844    const long long mapFrameNumber = context.
currentFrame();
 
  845    double animationTimeSeconds = 0;
 
  846    if ( mapFrameNumber >= 0 && context.
frameRate() > 0 )
 
  849      animationTimeSeconds = mapFrameNumber / context.
frameRate();
 
  854      animationTimeSeconds = QDateTime::currentMSecsSinceEpoch() / 1000.0;
 
  858    scope->setVariable( QStringLiteral( 
"symbol_frame" ), symbolFrame, true );
 
  861  mSymbolRenderContext->setExpressionContextScope( scope.release() );
 
  865  const auto constMLayers = 
mLayers;
 
  871    layer->prepareExpressions( symbolContext );
 
  872    layer->prepareMasks( symbolContext );
 
  873    layer->startRender( symbolContext );
 
 
  879  Q_ASSERT_X( mStarted, 
"startRender", 
"startRender was not called for this symbol instance!" );
 
  883  if ( mSymbolRenderContext )
 
  885    const auto constMLayers = 
mLayers;
 
  891      layer->stopRender( *mSymbolRenderContext );
 
  895  mSymbolRenderContext.reset( 
nullptr );
 
 
  904  const auto constMLayers = 
mLayers;
 
  907    if ( !
layer->isLocked() )
 
 
  917    if ( !
layer->isLocked() )
 
  919      const QColor layerColor = 
layer->color();
 
  920      if ( layerColor.isValid() )
 
  924  return QColor( 0, 0, 0 );
 
 
  930  std::unique_ptr< QgsRenderContext > tempContext;
 
  934    context = tempContext.get();
 
  969  if ( !customContext && expressionContext )
 
  973  else if ( !customContext )
 
  997        const QSizeF targetSize = QSizeF( size.width() - 1, size.height() - 1 );
 
 1005        std::unique_ptr< QgsEffectPainter > effectPainter;
 
 1006        if ( effect && effect->
enabled() )
 
 1007          effectPainter = std::make_unique< QgsEffectPainter >( symbolContext.
renderContext(), effect );
 
 1009        for ( 
const QList< QPolygonF > &poly : polys )
 
 1011          QVector< QPolygonF > rings;
 
 1012          rings.reserve( poly.size() );
 
 1013          for ( 
int i = 1; i < poly.size(); ++i )
 
 1014            rings << poly.at( i );
 
 1018        effectPainter.reset();
 
 1023      layer->drawPreviewIcon( symbolContext, size );
 
 
 1031  if ( format.compare( QLatin1String( 
"svg" ), Qt::CaseInsensitive ) == 0 )
 
 1033    QSvgGenerator generator;
 
 1034    generator.setFileName( path );
 
 1035    generator.setSize( size );
 
 1036    generator.setViewBox( QRect( 0, 0, size.height(), size.height() ) );
 
 1038    QPainter painter( &generator );
 
 1044    QImage image = 
asImage( size );
 
 
 1051  QImage image( size, QImage::Format_ARGB32_Premultiplied );
 
 1054  QPainter p( &image );
 
 1055  p.setRenderHint( QPainter::Antialiasing );
 
 1056  p.setRenderHint( QPainter::SmoothPixmapTransform );
 
 
 1067  QImage preview( QSize( 100, 100 ) * devicePixelRatio, QImage::Format_ARGB32_Premultiplied );
 
 1069  preview.setDevicePixelRatio( devicePixelRatio );
 
 1071  QPainter p( &preview );
 
 1072  p.setRenderHint( QPainter::Antialiasing );
 
 1073  p.translate( 0.5, 0.5 ); 
 
 1077    p.setPen( QPen( Qt::gray ) );
 
 1078    p.drawLine( QLineF( 0, 50, 100, 50 ) );
 
 1079    p.drawLine( QLineF( 50, 0, 50, 100 ) );
 
 1093  if ( expressionContext )
 
 1102    poly << QPointF( 0, 50 ) << QPointF( 99, 50 );
 
 1103    static_cast<QgsLineSymbol *
>( this )->renderPolyline( poly, 
nullptr, context );
 
 1108    polygon << QPointF( 20, 20 ) << QPointF( 80, 20 ) << QPointF( 80, 80 ) << QPointF( 20, 80 ) << QPointF( 20, 20 );
 
 1109    static_cast<QgsFillSymbol *
>( this )->renderPolygon( polygon, 
nullptr, 
nullptr, context );
 
 1113    static_cast<QgsMarkerSymbol *
>( this )->renderPoint( QPointF( 50, 50 ), 
nullptr, context );
 
 
 1131      t = QStringLiteral( 
"MARKER" );
 
 1134      t = QStringLiteral( 
"LINE" );
 
 1137      t = QStringLiteral( 
"FILL" );
 
 1140      Q_ASSERT( 
false && 
"unknown symbol type" );
 
 1144  for ( QgsSymbolLayerList::const_iterator it = 
mLayers.begin(); it != 
mLayers.end(); ++it )
 
 
 1153  props[ QStringLiteral( 
"alpha" )] = QString::number( 
opacity() );
 
 1154  double scaleFactor = 1.0;
 
 1158  for ( QgsSymbolLayerList::const_iterator it = 
mLayers.begin(); it != 
mLayers.end(); ++it )
 
 1160    ( *it )->toSld( doc, element, props );
 
 
 1167  for ( QgsSymbolLayerList::const_iterator it = 
mLayers.begin(); it != 
mLayers.end(); ++it )
 
 1170    layer->setLocked( ( *it )->isLocked() );
 
 1171    layer->setRenderingPass( ( *it )->renderingPass() );
 
 1172    layer->setEnabled( ( *it )->enabled() );
 
 1173    layer->setId( ( *it )->id() );
 
 1174    layer->setUserFlags( ( *it )->userFlags() );
 
 1175    lst.append( 
layer );
 
 
 1190  if ( effect && effect->
enabled() )
 
 1193    generatorLayer->
render( context, geometryType, points, rings );
 
 1197    generatorLayer->
render( context, geometryType, points, rings );
 
 
 1207  QgsSymbolLayerList::const_iterator sIt = 
mLayers.constBegin();
 
 1208  for ( ; sIt != 
mLayers.constEnd(); ++sIt )
 
 1212      attributes.unite( ( *sIt )->usedAttributes( context ) );
 
 
 1220  mDataDefinedProperties.
setProperty( key, property );
 
 
 1230    if ( 
layer->hasDataDefinedProperties() )
 
 
 1240    if ( 
layer->canCauseArtifactsBetweenAdjacentTiles() )
 
 
 1265class ExpressionContextScopePopper
 
 1269    ExpressionContextScopePopper() = 
default;
 
 1271    ~ExpressionContextScopePopper()
 
 1274        context->popScope();
 
 1283class GeometryRestorer
 
 1287      : mContext( context ),
 
 1288        mGeometry( context.geometry() )
 
 1293      mContext.setGeometry( mGeometry );
 
 1313  GeometryRestorer geomRestorer( context );
 
 1315  bool usingSegmentizedGeometry = 
false;
 
 1323      if ( std::isfinite( boundsOrigin.x() ) && std::isfinite( boundsOrigin.y() ) )
 
 1338      clippingEnabled = 
false;
 
 1349      clippingEnabled = 
false;
 
 1353    clippingEnabled = 
false;
 
 1356  mSymbolRenderContext->setGeometryPartNum( 1 );
 
 1359  ExpressionContextScopePopper scopePopper;
 
 1360  if ( mSymbolRenderContext->expressionContextScope() )
 
 1362    if ( needsExpressionContext )
 
 1388    QPointF renderPoint;
 
 1389    const QgsPoint *originalGeometry = 
nullptr;
 
 1391  QVector< PointInfo > pointsToRender;
 
 1395    QPolygonF renderLine;
 
 1396    const QgsCurve *originalGeometry = 
nullptr;
 
 1398  QVector< LineInfo > linesToRender;
 
 1402    QPolygonF renderExterior;
 
 1403    QVector< QPolygonF > renderRings;
 
 1405    int originalPartIndex = 0;
 
 1407  QVector< PolygonInfo > polygonsToRender;
 
 1410  getPartGeometry = [&pointsToRender, &linesToRender, &polygonsToRender, &getPartGeometry, &context, &clippingEnabled, &markers, &feature, &usingSegmentizedGeometry, 
this]( 
const QgsAbstractGeometry * part, 
int partIndex = 0 )
 
 1421    const bool isMultiPart = qgsgeometry_cast< const QgsGeometryCollection * >( part ) && qgsgeometry_cast< const QgsGeometryCollection * >( part )->numGeometries() > 1;
 
 1427      if ( needsSegmentizing )
 
 1430        if ( !segmentizedPart )
 
 1434        temporaryGeometryContainer.
set( segmentizedPart.release() );
 
 1435        processedGeometry = temporaryGeometryContainer.
constGet();
 
 1436        usingSegmentizedGeometry = 
true;
 
 1441        processedGeometry = part;
 
 1451        std::unique_ptr< QgsAbstractGeometry > simplified( simplifier.
simplify( processedGeometry ) );
 
 1454          temporaryGeometryContainer.
set( simplified.release() );
 
 1455          processedGeometry = temporaryGeometryContainer.
constGet();
 
 1470          temporaryGeometryContainer.
set( clippedGeom.release() );
 
 1471          processedGeometry = temporaryGeometryContainer.
constGet();
 
 1478      processedGeometry = part;
 
 1481    if ( !processedGeometry )
 
 1484      QgsDebugError( QStringLiteral( 
"No processed geometry to render for part!" ) );
 
 1494          QgsDebugMsgLevel( QStringLiteral( 
"point can be drawn only with marker symbol!" ), 2 );
 
 1499        info.originalGeometry = qgsgeometry_cast< const QgsPoint * >( part );
 
 1500        info.renderPoint = 
_getPoint( context, *info.originalGeometry );
 
 1501        pointsToRender << info;
 
 1509          QgsDebugMsgLevel( QStringLiteral( 
"linestring can be drawn only with line symbol!" ), 2 );
 
 1514        info.originalGeometry = qgsgeometry_cast<const QgsCurve *>( part );
 
 1515        info.renderLine = 
_getLineString( context, *qgsgeometry_cast<const QgsCurve *>( processedGeometry ), clippingEnabled );
 
 1516        linesToRender << info;
 
 1526          QgsDebugMsgLevel( QStringLiteral( 
"polygon can be drawn only with fill symbol!" ), 2 );
 
 1531        info.originalGeometry = qgsgeometry_cast<const QgsCurvePolygon *>( part );
 
 1532        info.originalPartIndex = partIndex;
 
 1533        if ( !qgsgeometry_cast<const QgsPolygon *>( processedGeometry )->exteriorRing() )
 
 1535          QgsDebugError( QStringLiteral( 
"cannot render polygon with no exterior ring" ) );
 
 1539        _getPolygon( info.renderExterior, info.renderRings, context, *qgsgeometry_cast<const QgsPolygon *>( processedGeometry ), clippingEnabled, 
mForceRHR );
 
 1540        polygonsToRender << info;
 
 1546        const QgsMultiPoint *mp = qgsgeometry_cast< const QgsMultiPoint * >( processedGeometry );
 
 1554        const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( processedGeometry );
 
 1557        for ( 
unsigned int i = 0; i < num; ++i )
 
 1562          getPartGeometry( geomCollection->
geometryN( i ), i );
 
 1572          QgsDebugMsgLevel( QStringLiteral( 
"multi-polygon can be drawn only with fill symbol!" ), 2 );
 
 1583        std::map<double, QList<unsigned int> > thisAreaToPartNum;
 
 1584        for ( 
unsigned int i = 0; i < num; ++i )
 
 1593        std::map<double, QList<unsigned int> >::const_reverse_iterator iter = thisAreaToPartNum.rbegin();
 
 1594        for ( ; iter != thisAreaToPartNum.rend(); ++iter )
 
 1596          const QList<unsigned int> &listPartIndex = iter->second;
 
 1597          for ( 
int idx = 0; idx < listPartIndex.size(); ++idx )
 
 1599            const unsigned i = listPartIndex[idx];
 
 1600            getPartGeometry( geomCollection->
geometryN( i ), i );
 
 1607        QgsDebugError( QStringLiteral( 
"feature %1: unsupported wkb type %2/%3 for rendering" )
 
 1608                       .arg( feature.
id() )
 
 1610                       .arg( 
static_cast< quint32
>( part->wkbType() ), 0, 16 ) );
 
 1620  std::vector< int > layers;
 
 1623    layers.reserve( 
mLayers.count() );
 
 1624    for ( 
int i = 0; i < 
mLayers.count(); ++i )
 
 1625      layers.emplace_back( i );
 
 1629    layers.emplace_back( 
layer );
 
 1634  if ( needsExpressionContext )
 
 1637  for ( 
const int symbolLayerIndex : layers )
 
 1643    if ( needsExpressionContext )
 
 1652        int geometryPartNumber = 0;
 
 1653        for ( 
const PointInfo &point : std::as_const( pointsToRender ) )
 
 1658          mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
 
 1659          if ( needsExpressionContext )
 
 1662          static_cast<QgsMarkerSymbol *
>( this )->renderPoint( point.renderPoint, &feature, context, symbolLayerIndex, selected );
 
 1663          geometryPartNumber++;
 
 1671        if ( linesToRender.empty() )
 
 1674        int geometryPartNumber = 0;
 
 1675        for ( 
const LineInfo &line : std::as_const( linesToRender ) )
 
 1680          mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
 
 1681          if ( needsExpressionContext )
 
 1685          static_cast<QgsLineSymbol *
>( this )->renderPolyline( line.renderLine, &feature, context, symbolLayerIndex, selected );
 
 1686          geometryPartNumber++;
 
 1693        for ( 
const PolygonInfo &info : std::as_const( polygonsToRender ) )
 
 1698          mSymbolRenderContext->setGeometryPartNum( info.originalPartIndex + 1 );
 
 1699          if ( needsExpressionContext )
 
 1703          static_cast<QgsFillSymbol *
>( this )->renderPolygon( info.renderExterior, ( !info.renderRings.isEmpty() ? &info.renderRings : nullptr ), &feature, context, symbolLayerIndex, selected );
 
 1721      markers.reserve( pointsToRender.size() );
 
 1722      for ( 
const PointInfo &info : std::as_const( pointsToRender ) )
 
 1726          const QRectF bounds = 
static_cast<QgsMarkerSymbol *
>( this )->bounds( info.renderPoint, context, feature );
 
 1735            context.
painter()->setPen( Qt::red );
 
 1736            context.
painter()->setBrush( QColor( 255, 0, 0, 100 ) );
 
 1737            context.
painter()->drawRect( bounds );
 
 1741        if ( drawVertexMarker && !usingSegmentizedGeometry )
 
 1743          markers.append( info.renderPoint );
 
 1751      for ( 
const LineInfo &info : std::as_const( linesToRender ) )
 
 1759        if ( drawVertexMarker && !usingSegmentizedGeometry )
 
 1761          markers << info.renderLine;
 
 1769      for ( 
const PolygonInfo &info : std::as_const( polygonsToRender ) )
 
 1778        if ( drawVertexMarker && !usingSegmentizedGeometry )
 
 1780          markers << info.renderExterior;
 
 1782          for ( 
const QPolygonF &hole : info.renderRings )
 
 1800      handler->handleRenderedFeature( feature, renderedBoundsGeom, featureContext );
 
 1803  if ( drawVertexMarker )
 
 1807      const auto constMarkers = markers;
 
 1808      for ( QPointF marker : constMarkers )
 
 1810        renderVertexMarker( marker, context, currentVertexMarkerType, currentVertexMarkerSize );
 
 1825        x = vertexPoint.
x();
 
 1826        y = vertexPoint.
y();
 
 1835        renderVertexMarker( mapPoint, context, currentVertexMarkerType, currentVertexMarkerSize );
 
 
 1843  return mSymbolRenderContext.get();
 
 
 1852void QgsSymbol::initPropertyDefinitions()
 
 1854  if ( !sPropertyDefinitions.isEmpty() )
 
 1857  QString origin = QStringLiteral( 
"symbol" );
 
 1878    const QList< QgsSymbolLayer * > layers = 
mLayers;
 
 
 1902    const QList< QgsSymbolLayer * > layers = 
mLayers;
 
 
@ CounterClockwise
Counter-clockwise direction.
@ Clockwise
Clockwise direction.
@ DisableFeatureClipping
If present, indicates that features should never be clipped to the map extent during rendering.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
RenderUnit
Rendering size units.
@ Millimeters
Millimeters.
@ Unknown
Mixed or unknown units.
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
@ ApplyClipAfterReprojection
Feature geometry clipping to mapExtent() must be performed after the geometries are transformed using...
@ DrawSymbolBounds
Draw bounds of symbols (for debugging/testing)
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
@ Antialiasing
Use antialiasing while drawing.
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
@ FlagIncludeCrosshairsForMarkerSymbols
Include a crosshairs reference image in the background of marker symbol previews.
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
SymbolType
Attribute editing capabilities which may be supported by vector data providers.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ GeometryCollection
GeometryCollection.
@ MultiSurface
MultiSurface.
@ Forward
Forward transform (from source to destination)
Abstract base class for all geometries.
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual int partCount() const =0
Returns count of parts contained in the geometry.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
A 3-dimensional box composed of x, y, z coordinates.
static void trimPolygon(QPolygonF &pts, const QgsRectangle &clipRect)
Trims the given polygon to a rectangular box, by modifying the given polygon in place.
static QPolygonF clippedLine(const QgsCurve &curve, const QgsRectangle &clipExtent)
Takes a linestring and clips it to clipExtent.
static void clipped3dLine(const QVector< double > &xIn, const QVector< double > &yIn, const QVector< double > &zIn, QVector< double > &x, QVector< double > &y, QVector< double > &z, const QgsBox3D &clipExtent)
Takes a line with 3D coordinates and clips it to clipExtent.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Custom exception class for Coordinate Reference System related exceptions.
Curve polygon geometry type.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
Abstract base class for curved geometry type.
Qgis::AngularDirection orientation() const
Returns the curve's orientation, e.g.
virtual int numPoints() const =0
Returns the number of points in the curve.
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
virtual QPolygonF asQPolygonF() const
Returns a QPolygonF representing the points.
A class to manager painter saving and restoring required for effect drawing.
Single scope for storing variables and functions for use within a QgsExpressionContext.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static const QString EXPR_GEOMETRY_PART_COUNT
Inbuilt variable name for geometry part count variable.
static const QString EXPR_GEOMETRY_PART_NUM
Inbuilt variable name for geometry part number variable.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Container of fields for a vector layer.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
void render(QgsSymbolRenderContext &context, Qgis::GeometryType geometryType=Qgis::GeometryType::Unknown, const QPolygonF *points=nullptr, const QVector< QPolygonF > *rings=nullptr)
Will render this symbol layer using the context.
A geometry is the spatial representation of a feature.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Does vector analysis using the geos library and handles import, export, exception handling*.
Represents a patch shape for use in map legends.
QList< QList< QPolygonF > > toQPolygonF(Qgis::SymbolType type, QSizeF size) const
Converts the patch shape to a set of QPolygonF objects representing how the patch should be drawn for...
Line string geometry type, with support for z-dimension and m-values.
QVector< double > xVector() const
Returns the x vertex values as a vector.
QVector< double > yVector() const
Returns the y vertex values as a vector.
QVector< double > zVector() const
Returns the z vertex values as a vector.
virtual void renderPolygonStroke(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Renders the line symbol layer along the outline of polygon, using the given render context.
A line symbol type, for rendering LineString and MultiLineString geometries.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
Implementation of GeometrySimplifier using the "MapToPixel" algorithm.
SimplifyAlgorithm
Types of simplification algorithms that can be used.
QgsGeometry simplify(const QgsGeometry &geometry) const override
Returns a simplified version the specified geometry.
Perform transforms between map coordinates and device coordinates.
void transformInPlace(double &x, double &y) const
Transforms device coordinates to map coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
A marker symbol type, for rendering Point and MultiPoint geometries.
Multi point geometry collection.
Base class for visual effects which can be applied to QPicture drawings.
bool enabled() const
Returns whether the effect is enabled.
Point geometry type, with support for z-dimension and m-values.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
bool hasActiveProperties() const final
Returns true if the collection has any active properties, or false if all properties within the colle...
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const final
Returns the set of any fields referenced by the active properties from the collection.
Definition for a property.
A store for object properties.
A rectangle specified with double values.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double width() const
Returns the width of the rectangle.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
bool isNull() const
Test if the rectangle is null (holding no spatial information).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
bool isEmpty() const
Returns true if the rectangle has no area.
double height() const
Returns the height of the rectangle.
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...
void setTextureOrigin(const QPointF &origin)
Sets the texture origin, which should be used as a brush transform when rendering using QBrush object...
bool hasRenderedFeatureHandlers() const
Returns true if the context has any rendered feature handlers.
double segmentationTolerance() const
Gets the segmentation tolerance applied when rendering curved geometries.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsExpressionContext & expressionContext()
Gets the expression context.
void setGeometry(const QgsAbstractGeometry *geometry)
Sets pointer to original (unsegmentized) geometry.
QgsGeometry featureClipGeometry() const
Returns the geometry to use to clip features at render time.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
bool testFlag(Qgis::RenderContextFlag flag) const
Check whether a particular flag is enabled.
bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
long long currentFrame() const
Returns the current frame number of the map (in frames per second), for maps which are part of an ani...
void setIsGuiPreview(bool preview)
Sets GUI preview mode.
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
QList< QgsRenderedFeatureHandlerInterface * > renderedFeatureHandlers() const
Returns the list of rendered feature handlers to use while rendering map layers.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
double frameRate() const
Returns the frame rate of the map, for maps which are part of an animation.
const QgsVectorSimplifyMethod & vectorSimplifyMethod() const
Returns the simplification settings to use when rendering vector layers.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
bool isSymbolLayerEnabled(const QgsSymbolLayer *layer) const
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
QgsAbstractGeometry::SegmentationToleranceType segmentationToleranceType() const
Gets segmentation tolerance type (maximum angle or maximum difference between curve and approximation...
An interface for classes which provider custom handlers for features rendered as part of a map render...
Stores properties relating to a screen.
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
bool isValid() const
Returns true if the properties are valid.
void updateRenderContextForScreen(QgsRenderContext &context) const
Updates the settings in a render context to match the screen settings.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
QList< QList< QPolygonF > > defaultPatchAsQPolygonF(Qgis::SymbolType type, QSizeF size) const
Returns the default patch geometry for the given symbol type and size as a set of QPolygonF objects (...
Contains settings relating to symbol animation.
bool isAnimated() const
Returns true if the symbol is animated.
double frameRate() const
Returns the symbol animation frame rate (in frames per second).
static void drawVertexMarker(double x, double y, QPainter &p, Qgis::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
static QString encodeSldUom(Qgis::RenderUnit unit, double *scaleFactor)
Encodes a render unit into an SLD unit of measure string.
virtual void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called before the layer will be rendered for a particular feature.
@ LayerEnabled
Whether symbol layer is enabled.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the layer.
virtual void startRender(QgsSymbolRenderContext &context)=0
Called before a set of rendering operations commences on the supplied render context.
bool enabled() const
Returns true if symbol layer is enabled and will be drawn.
virtual void stopRender(QgsSymbolRenderContext &context)=0
Called after a set of rendering operations has finished on the supplied render context.
virtual void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called after the layer has been rendered for a particular feature.
void setSelected(bool selected)
Sets whether symbols should be rendered using the selected symbol coloring and style.
void setOriginalGeometryType(Qgis::GeometryType type)
Sets the geometry type for the original feature geometry being rendered.
void setPatchShape(const QgsLegendPatchShape &shape)
Sets the symbol patch shape, to use if rendering symbol preview icons.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Abstract base class for all rendered symbols.
void renderUsingLayer(QgsSymbolLayer *layer, QgsSymbolRenderContext &context, Qgis::GeometryType geometryType=Qgis::GeometryType::Unknown, const QPolygonF *points=nullptr, const QVector< QPolygonF > *rings=nullptr)
Renders a context using a particular symbol layer without passing in a geometry.
QgsSymbolLayerList cloneLayers() const
Retrieve a cloned list of all layers that make up this symbol.
void setOutputUnit(Qgis::RenderUnit unit) const
Sets the units to use for sizes and widths within the symbol.
Property
Data definable properties.
QgsSymbolRenderContext * symbolRenderContext()
Returns the symbol render context.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the symbol.
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, Qgis::VertexMarkerType currentVertexMarkerType=Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize=0.0)
Render a feature.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol's property collection, used for data defined overrides.
static QPolygonF _getLineString(QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent=true)
Creates a line string in screen coordinates from a QgsCurve in map coordinates.
void stopRender(QgsRenderContext &context)
Ends the rendering process.
qreal mOpacity
Symbol opacity (in the range 0 - 1)
Q_DECL_DEPRECATED const QgsVectorLayer * mLayer
static QPolygonF _getPolygonRing(QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing=false, bool correctRingOrientation=false)
Creates a polygon ring in screen coordinates from a QgsCurve in map coordinates.
QgsSymbolAnimationSettings & animationSettings()
Returns a reference to the symbol animation settings.
void renderVertexMarker(QPointF pt, QgsRenderContext &context, Qgis::VertexMarkerType currentVertexMarkerType, double currentVertexMarkerSize)
Render editing vertex marker at specified point.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol property definitions.
bool appendSymbolLayer(QgsSymbolLayer *layer)
Appends a symbol layer at the end of the current symbol layer list.
bool usesMapUnits() const
Returns true if the symbol has any components which use map unit based sizes.
Qgis::SymbolFlags flags() const
Returns flags for the symbol.
void toSld(QDomDocument &doc, QDomElement &element, QVariantMap props) const
Converts the symbol to a SLD representation.
void setColor(const QColor &color) const
Sets the color for the symbol.
bool insertSymbolLayer(int index, QgsSymbolLayer *layer)
Inserts a symbol layer to specified index.
QgsMapUnitScale mapUnitScale() const
Returns the map unit scale for the symbol.
static QString symbolTypeToString(Qgis::SymbolType type)
Returns a translated string version of the specified symbol type.
qreal opacity() const
Returns the opacity for the symbol.
bool canCauseArtifactsBetweenAdjacentTiles() const
Returns true if the symbol rendering can cause visible artifacts across a single feature when the fea...
static Qgis::SymbolType symbolTypeForGeometryType(Qgis::GeometryType type)
Returns the default symbol type required for the specified geometry type.
void setMapUnitScale(const QgsMapUnitScale &scale) const
Sets the map unit scale for the symbol.
bool clipFeaturesToExtent() const
Returns whether features drawn by the symbol will be clipped to the render context's extent.
QImage bigSymbolPreviewImage(QgsExpressionContext *expressionContext=nullptr, Qgis::SymbolPreviewFlags flags=Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a large (roughly 100x100 pixel) preview image for the symbol.
QImage asImage(QSize size, QgsRenderContext *customContext=nullptr)
Returns an image of the symbol at the specified size.
static void _getPolygon(QPolygonF &pts, QVector< QPolygonF > &holes, QgsRenderContext &context, const QgsPolygon &polygon, bool clipToExtent=true, bool correctRingOrientation=false)
Creates a polygon in screen coordinates from a QgsPolygonXYin map coordinates.
QString dump() const
Returns a string dump of the symbol's properties.
bool hasDataDefinedProperties() const
Returns whether the symbol utilizes any data defined properties.
bool deleteSymbolLayer(int index)
Removes and deletes the symbol layer at the specified index.
QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns a list of attributes required to render this feature.
bool changeSymbolLayer(int index, QgsSymbolLayer *layer)
Deletes the current layer at the specified index and replaces it with layer.
QgsSymbolLayer * takeSymbolLayer(int index)
Removes a symbol layer from the list and returns a pointer to it.
Qgis::SymbolRenderHints mRenderHints
QgsSymbolLayerList mLayers
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *patchShape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Draws an icon of the symbol that occupies an area given by size using the specified painter.
Q_DECL_DEPRECATED const QgsVectorLayer * layer() const
QgsSymbolAnimationSettings mAnimationSettings
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context, int layer=-1)
Called before symbol layers will be rendered for a particular feature.
QColor color() const
Returns the symbol's color.
Qgis::RenderUnit outputUnit() const
Returns the units to use for sizes and widths within the symbol.
Qgis::SymbolType type() const
Returns the symbol's type.
QgsSymbol(Qgis::SymbolType type, const QgsSymbolLayerList &layers)
Constructor for a QgsSymbol of the specified type.
void setAnimationSettings(const QgsSymbolAnimationSettings &settings)
Sets a the symbol animation settings.
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
Q_DECL_DEPRECATED void setLayer(const QgsVectorLayer *layer)
void exportImage(const QString &path, const QString &format, QSize size)
Export the symbol as an image format, to the specified path and with the given size.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context, int layer=-1)
Called after symbol layers have been rendered for a particular feature.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Represents a vector layer which manages a vector based data sets.
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
double tolerance() const
Gets the tolerance of simplification in map units. Represents the maximum distance in map units betwe...
bool forceLocalOptimization() const
Gets where the simplification executes, after fetch the geometries from provider, or when supported,...
SimplifyHints simplifyHints() const
Gets the simplification hints of the vector layer managed.
SimplifyAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
static QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static bool isCurvedType(Qgis::WkbType type)
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
Contains geos related utilities and functions.
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
QList< QgsSymbolLayer * > QgsSymbolLayerList
Single variable definition for use within a QgsExpressionContextScope.
Utility class for identifying a unique vertex within a geometry.