49  if ( props.contains( QStringLiteral( 
"arrow_width" ) ) )
 
   50    l->
setArrowWidth( props[QStringLiteral( 
"arrow_width" )].toDouble() );
 
   52  if ( props.contains( QStringLiteral( 
"arrow_width_unit" ) ) )
 
   55  if ( props.contains( QStringLiteral( 
"arrow_width_unit_scale" ) ) )
 
   58  if ( props.contains( QStringLiteral( 
"arrow_start_width" ) ) )
 
   61  if ( props.contains( QStringLiteral( 
"arrow_start_width_unit" ) ) )
 
   64  if ( props.contains( QStringLiteral( 
"arrow_start_width_unit_scale" ) ) )
 
   67  if ( props.contains( QStringLiteral( 
"is_curved" ) ) )
 
   68    l->
setIsCurved( props[QStringLiteral( 
"is_curved" )].toInt() == 1 );
 
   70  if ( props.contains( QStringLiteral( 
"is_repeated" ) ) )
 
   71    l->
setIsRepeated( props[QStringLiteral( 
"is_repeated" )].toInt() == 1 );
 
   73  if ( props.contains( QStringLiteral( 
"head_length" ) ) )
 
   74    l->
setHeadLength( props[QStringLiteral( 
"head_length" )].toDouble() );
 
   76  if ( props.contains( QStringLiteral( 
"head_length_unit" ) ) )
 
   79  if ( props.contains( QStringLiteral( 
"head_length_unit_scale" ) ) )
 
   82  if ( props.contains( QStringLiteral( 
"head_thickness" ) ) )
 
   85  if ( props.contains( QStringLiteral( 
"head_thickness_unit" ) ) )
 
   88  if ( props.contains( QStringLiteral( 
"head_thickness_unit_scale" ) ) )
 
   91  if ( props.contains( QStringLiteral( 
"head_type" ) ) )
 
   94  if ( props.contains( QStringLiteral( 
"arrow_type" ) ) )
 
   97  if ( props.contains( QStringLiteral( 
"offset" ) ) )
 
   98    l->
setOffset( props[QStringLiteral( 
"offset" )].toDouble() );
 
  100  if ( props.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  103  if ( props.contains( QStringLiteral( 
"offset_unit_scale" ) ) )
 
  106  if ( props.contains( QStringLiteral( 
"ring_filter" ) ) )
 
 
  127  return mSymbol.get();
 
 
  132  return QStringLiteral( 
"ArrowLine" );
 
 
  139  map[QStringLiteral( 
"arrow_width" )] = QString::number( 
arrowWidth() );
 
  143  map[QStringLiteral( 
"arrow_start_width" )] = QString::number( 
arrowStartWidth() );
 
  147  map[QStringLiteral( 
"is_curved" )] = QString::number( 
isCurved() ? 1 : 0 );
 
  148  map[QStringLiteral( 
"is_repeated" )] = QString::number( 
isRepeated() ? 1 : 0 );
 
  150  map[QStringLiteral( 
"head_length" )] = QString::number( 
headLength() );
 
  154  map[QStringLiteral( 
"head_thickness" )] = QString::number( 
headThickness() );
 
  158  map[QStringLiteral( 
"head_type" )] = QString::number( 
headType() );
 
  159  map[QStringLiteral( 
"arrow_type" )] = QString::number( 
arrowType() );
 
  161  map[QStringLiteral( 
"offset" )] = QString::number( 
offset() );
 
  165  map[QStringLiteral( 
"ring_filter" )] = QString::number( 
static_cast< int >( 
mRingFilter ) );
 
 
  174  attributes.unite( mSymbol->usedAttributes( context ) );
 
 
  183  if ( mSymbol && mSymbol->hasDataDefinedProperties() )
 
 
  201  mArrowWidthUnit = unit;
 
  202  mArrowStartWidthUnit = unit;
 
  203  mHeadLengthUnit = unit;
 
  204  mHeadThicknessUnit = unit;
 
 
  248                         qreal startWidth, qreal width,
 
  249                         qreal headWidth, qreal headHeight,
 
  260    po = pd - ( pd - po ) / length * headWidth;
 
  265    pd = po + ( pd - po ) / length * headWidth;
 
  270    const QPointF v = ( pd - po ) / length * headWidth;
 
  271    const QPointF npo = ( po + pd ) / 2.0 - v;
 
  272    const QPointF npd = ( po + pd ) / 2.0 + v;
 
  275    length = 2 * headWidth;
 
  278  const qreal bodyLength = length - headWidth;
 
  281  const QPointF unitVec = ( pd - po ) / length;
 
  283  const QPointF perpVec( -unitVec.y(), unitVec.x() );
 
  286  po += perpVec * offset;
 
  287  pd += perpVec * offset;
 
  295      polygon << po + unitVec *headWidth + perpVec *headHeight;
 
  296      polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
 
  298      polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
 
  301      polygon << po + unitVec *bodyLength + perpVec *headHeight;
 
  307      polygon << po + unitVec *bodyLength - perpVec *headHeight;
 
  308      polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
 
  311      polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
 
  312      polygon << po + unitVec *headWidth - perpVec *headHeight;
 
  319      polygon << po + perpVec * ( startWidth * 0.5 );
 
  320      polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
 
  321      polygon << po + unitVec *bodyLength + perpVec *headHeight;
 
  330      polygon << po + unitVec *bodyLength - perpVec *headHeight;
 
  331      polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
 
  332      polygon << po - perpVec * ( startWidth * 0.5 );
 
  344      polygon << po + unitVec *headWidth + perpVec *headHeight;
 
  345      polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
 
  347      polygon << pd + perpVec * ( startWidth * 0.5 );
 
  355      polygon << pd - perpVec * ( startWidth * 0.5 );
 
  357      polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
 
  358      polygon << po + unitVec *headWidth - perpVec *headHeight;
 
  366  polygon << polygon.first();
 
 
  390  const QPointF ab = b - a;
 
  391  const QPointF bc = 
c - b;
 
  394  const QPointF ab2 = ( a + b ) / 2.0;
 
  395  const QPointF bc2 = ( b + 
c ) / 2.0;
 
  398  if ( std::fabs( ab.x() * bc.y() - ab.y() * bc.x() ) < 0.001 ) 
 
  405    cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
 
  408  else if ( bc.y() == 0 )
 
  411    cy = ab2.y() - ( cx - ab2.x() ) * ab.x() / ab.y();
 
  416    cx = ( bc2.y() - ab2.y() + bc.x() * bc2.x() / bc.y() - ab.x() * ab2.x() / ab.y() ) / ( bc.x() / bc.y() - ab.x() / ab.y() );
 
  417    cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
 
 
  430  return QPointF( std::cos( -angle ) * radius + center.x(), std::sin( -angle ) * radius + center.y() );
 
 
  433void pathArcTo( QPainterPath &path, QPointF circleCenter, qreal circleRadius, qreal angle_o, qreal angle_d, 
int direction )
 
  435  const QRectF circleRect( circleCenter - QPointF( circleRadius, circleRadius ), circleCenter + QPointF( circleRadius, circleRadius ) );
 
  436  if ( direction == 1 )
 
  438    if ( angle_o < angle_d )
 
  439      path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
 
  441      path.arcTo( circleRect, angle_o / M_PI * 180.0, 360.0 - ( angle_o - angle_d ) / M_PI * 180.0 );
 
  445    if ( angle_o < angle_d )
 
  446      path.arcTo( circleRect, angle_o / M_PI * 180.0, - ( 360.0 - ( angle_d - angle_o ) / M_PI * 180.0 ) );
 
  448      path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
 
 
  453void spiralArcTo( QPainterPath &path, QPointF center, qreal startAngle, qreal startRadius, qreal endAngle, qreal endRadius, 
int direction )
 
  456  const QPointF A = 
circlePoint( center, startRadius, startAngle );
 
  458  const QPointF B = 
circlePoint( center, endRadius, endAngle );
 
  462  deltaAngle = endAngle - startAngle;
 
  463  if ( direction * deltaAngle < 0.0 )
 
  464    deltaAngle = deltaAngle + direction * 2 * M_PI;
 
  466  const QPointF I1 = 
circlePoint( center, 0.75 * startRadius + 0.25 * endRadius, startAngle + 0.25 * deltaAngle );
 
  467  const QPointF I2 = 
circlePoint( center, 0.50 * startRadius + 0.50 * endRadius, startAngle + 0.50 * deltaAngle );
 
  468  const QPointF I3 = 
circlePoint( center, 0.25 * startRadius + 0.75 * endRadius, startAngle + 0.75 * deltaAngle );
 
  481    const qreal a1 = std::atan2( cCenter.y() - A.y(), A.x() - cCenter.x() );
 
  482    const qreal a2 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
 
  483    pathArcTo( path, cCenter, cRadius, a1, a2, direction );
 
  495    const qreal a1 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
 
  496    const qreal a2 = std::atan2( cCenter.y() - B.y(), B.x() - cCenter.x() );
 
  497    pathArcTo( path, cCenter, cRadius, a1, a2, direction );
 
 
  502                       qreal startWidth, qreal width,
 
  503                       qreal headWidth, qreal headHeight,
 
  508  QPointF circleCenter;
 
  512    return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
 
  516  const qreal angle_o = 
clampAngle( std::atan2( circleCenter.y() - po.y(), po.x() - circleCenter.x() ) );
 
  517  const qreal angle_m = 
clampAngle( std::atan2( circleCenter.y() - pm.y(), pm.x() - circleCenter.x() ) );
 
  518  const qreal angle_d = 
clampAngle( std::atan2( circleCenter.y() - pd.y(), pd.x() - circleCenter.x() ) );
 
  521  const int direction = 
clampAngle( angle_m - angle_o ) < 
clampAngle( angle_m - angle_d ) ? 1 : -1;
 
  530  qreal deltaAngle = angle_d - angle_o;
 
  531  if ( direction * deltaAngle < 0.0 )
 
  532    deltaAngle = deltaAngle + direction * 2 * M_PI;
 
  540    return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
 
  544  circleRadius += offset;
 
  545  po = 
circlePoint( circleCenter, circleRadius, angle_o );
 
  546  pm = 
circlePoint( circleCenter, circleRadius, angle_m );
 
  547  pd = 
circlePoint( circleCenter, circleRadius, angle_d );
 
  549  const qreal headAngle = direction * std::atan( headWidth / circleRadius );
 
  559      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
 
  561      pathArcTo( path, circleCenter, circleRadius + direction * width / 2, angle_o + headAngle, angle_d - headAngle, direction );
 
  564      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
 
  569      pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  573      path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
 
  575      pathArcTo( path, circleCenter, circleRadius - direction * width / 2, angle_d - headAngle, angle_o + headAngle, -direction );
 
  578      path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
 
  583      pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  590      path.moveTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  592      spiralArcTo( path, circleCenter, angle_o, circleRadius + direction * startWidth / 2, angle_d - headAngle, circleRadius + direction * width / 2, direction );
 
  595      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
 
  601      pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  605      path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
 
  607      spiralArcTo( path, circleCenter, angle_d - headAngle, circleRadius - direction * width / 2, angle_o, circleRadius - direction * startWidth / 2, -direction );
 
  609      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  613      pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  614      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  622      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
 
  623      path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * width / 2, angle_o + headAngle ) );
 
  625      spiralArcTo( path, circleCenter, angle_o + headAngle, circleRadius + direction * width / 2, angle_d, circleRadius + direction * startWidth / 2, direction );
 
  629      pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  633      path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * startWidth / 2, angle_d ) );
 
  635      spiralArcTo( path, circleCenter, angle_d, circleRadius - direction * startWidth / 2, angle_o + headAngle, circleRadius - direction * width / 2, - direction );
 
  637      path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
 
  643      pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  647  return path.toSubpathPolygons().at( 0 );
 
 
  662      const double w = exprVal.toDouble( &ok );
 
  675      const double w = exprVal.toDouble( &ok );
 
  688      const double w = exprVal.toDouble( &ok );
 
  701      const double w = exprVal.toDouble( &ok );
 
  712    const double w = exprVal.toDouble( &ok );
 
  728        mComputedHeadType = h;
 
  742        mComputedArrowType = h;
 
  764  const double prevOpacity = mSymbol->opacity();
 
  765  mSymbol->setOpacity( prevOpacity * context.
opacity() );
 
  770    _resolveDataDefined( context );
 
  774      if ( points.size() >= 3 )
 
  777        const QPointF po( points.at( 0 ) );
 
  779        const QPointF pm( points.at( points.size() / 2 ) );
 
  781        const QPointF pd( points.back() );
 
  783        const QPolygonF poly = 
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  784        mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  787      else if ( points.size() == 2 )
 
  790        const QPointF po( points.at( 0 ) );
 
  792        const QPointF pd( points.at( 1 ) );
 
  794        const QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  795        mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  800      for ( 
int pIdx = 0; pIdx < points.size() - 1; pIdx += 2 )
 
  806        _resolveDataDefined( context );
 
  808        if ( points.size() - pIdx >= 3 )
 
  811          const QPointF po( points.at( pIdx ) );
 
  813          const QPointF pm( points.at( pIdx + 1 ) );
 
  815          const QPointF pd( points.at( pIdx + 2 ) );
 
  817          const QPolygonF poly = 
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  818          mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  821        else if ( points.size() - pIdx == 2 )
 
  824          const QPointF po( points.at( pIdx ) );
 
  826          const QPointF pd( points.at( pIdx + 1 ) );
 
  828          const QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  829          mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  838      _resolveDataDefined( context );
 
  840      if ( !points.isEmpty() )
 
  843        const QPointF po( points.at( 0 ) );
 
  845        const QPointF pd( points.back() );
 
  847        const QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  848        mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  854      for ( 
int pIdx = 0; pIdx < points.size() - 1; pIdx++ )
 
  860        _resolveDataDefined( context );
 
  863        const QPointF po( points.at( pIdx ) );
 
  865        const QPointF pd( points.at( pIdx + 1 ) );
 
  867        const QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  869        mSymbol->renderPolygon( poly,  
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
 
  876  mSymbol->setOpacity( prevOpacity );
 
 
  883    mSymbol->setColor( 
c );
 
 
  890  return mSymbol.get() ? mSymbol->color() : 
mColor;
 
 
@ IsSymbolLayerSubSymbol
Symbol is being rendered as a sub-symbol of a QgsSymbolLayer.
 
RenderUnit
Rendering size units.
 
@ Millimeters
Millimeters.
 
@ MetersInMapUnits
Meters value as Map units.
 
@ RenderingSubSymbol
Set whenever a sub-symbol of a parent symbol is currently being rendered. Can be used during symbol a...
 
Line symbol layer used for representing lines as arrows.
 
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
 
bool isCurved() const
Returns whether it is a curved arrow or a straight one.
 
ArrowType arrowType() const
Gets the current arrow type.
 
QString layerType() const override
Returns a string that represents this layer type.
 
HeadType
Possible head types.
 
HeadType headType() const
Gets the current head type.
 
void setArrowStartWidth(double width)
Sets the arrow start width.
 
bool isRepeated() const
Returns whether the arrow is repeated along the line or not.
 
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
 
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
 
void setArrowWidth(double width)
Sets the arrow width.
 
void setArrowType(ArrowType type)
Sets the arrow type.
 
void setHeadLengthUnitScale(const QgsMapUnitScale &scale)
Sets the scale for the head length.
 
~QgsArrowSymbolLayer() override
 
QgsMapUnitScale headThicknessUnitScale() const
Gets the scale for the head height.
 
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
 
Qgis::RenderUnit arrowWidthUnit() const
Gets the unit for the arrow width.
 
Qgis::RenderUnit headLengthUnit() const
Gets the unit for the head length.
 
Qgis::RenderUnit headThicknessUnit() const
Gets the unit for the head height.
 
void setArrowWidthUnit(Qgis::RenderUnit unit)
Sets the unit for the arrow width.
 
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
 
void setIsCurved(bool isCurved)
Sets whether it is a curved arrow or a straight one.
 
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
 
void setHeadThickness(double thickness)
Sets the arrow head height.
 
QgsArrowSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
 
void setHeadLengthUnit(Qgis::RenderUnit unit)
Sets the unit for the head length.
 
void setIsRepeated(bool isRepeated)
Sets whether the arrow is repeated along the line.
 
QColor color() const override
Returns the "representative" color of the symbol layer.
 
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
 
double arrowStartWidth() const
Gets current arrow start width. Only meaningful for single headed arrows.
 
void setArrowStartWidthUnitScale(const QgsMapUnitScale &scale)
Sets the scale for the arrow start width.
 
void setHeadThicknessUnitScale(const QgsMapUnitScale &scale)
Sets the scale for the head height.
 
void setHeadType(HeadType type)
Sets the head type.
 
QgsMapUnitScale arrowStartWidthUnitScale() const
Gets the scale for the arrow start width.
 
double headThickness() const
Gets the current arrow head height.
 
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
 
void setArrowWidthUnitScale(const QgsMapUnitScale &scale)
Sets the scale for the arrow width.
 
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Create a new QgsArrowSymbolLayer.
 
void setColor(const QColor &c) override
Sets the "representative" color for the symbol layer.
 
ArrowType
Possible arrow types.
 
double arrowWidth() const
Gets current arrow width.
 
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
 
QgsMapUnitScale arrowWidthUnitScale() const
Gets the scale for the arrow width.
 
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
 
void renderPolyline(const QPolygonF &points, QgsSymbolRenderContext &context) override
Renders the line symbol layer along the line joining points, using the given render context.
 
void setArrowStartWidthUnit(Qgis::RenderUnit unit)
Sets the unit for the arrow start width.
 
Qgis::RenderUnit arrowStartWidthUnit() const
Gets the unit for the arrow start width.
 
QgsMapUnitScale headLengthUnitScale() const
Gets the scale for the head length.
 
QgsArrowSymbolLayer()
Simple constructor.
 
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
 
void setHeadLength(double length)
Sets the arrow head length.
 
double headLength() const
Gets the current arrow head length.
 
void setHeadThicknessUnit(Qgis::RenderUnit unit)
Sets the unit for the head height.
 
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
static const QString EXPR_GEOMETRY_POINT_COUNT
Inbuilt variable name for point count variable.
 
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
 
static const QString EXPR_GEOMETRY_POINT_NUM
Inbuilt variable name for point number variable.
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
 
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
 
static double distance2D(double x1, double y1, double x2, double y2)
Returns the 2D distance between (x1, y1) and (x2, y2).
 
Qgis::RenderUnit mOffsetUnit
 
RenderRingFilter
Options for filtering rings when the line symbol layer is being used to render a polygon's rings.
 
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
 
Qgis::RenderUnit mWidthUnit
 
void setOffset(double offset)
Sets the line's offset.
 
RenderRingFilter mRingFilter
 
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the unit for the line's offset.
 
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the line's offset.
 
void setRingFilter(QgsLineSymbolLayer::RenderRingFilter filter)
Sets the line symbol layer's ring filter, which controls which rings are rendered when the line symbo...
 
double offset() const
Returns the line's offset.
 
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the line's offset.
 
Qgis::RenderUnit offsetUnit() const
Returns the units for the line's offset.
 
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const final
Returns the calculated value of the property with the specified key from within the collection.
 
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
 
Contains information about the context of a rendering operation.
 
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
 
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
 
static QgsArrowSymbolLayer::HeadType decodeArrowHeadType(const QVariant &value, bool *ok=nullptr)
Decodes a value representing an arrow head type.
 
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
 
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
 
static QgsArrowSymbolLayer::ArrowType decodeArrowType(const QVariant &value, bool *ok=nullptr)
Decodes a value representing an arrow type.
 
Abstract base class for symbol layers.
 
bool shouldRenderUsingSelectionColor(const QgsSymbolRenderContext &context) const
Returns true if the symbol layer should be rendered using the selection color from the render context...
 
bool installMasks(QgsRenderContext &context, bool recursive, const QRectF &rect=QRectF())
When rendering, install masks on context painter.
 
void removeMasks(QgsRenderContext &context, bool recursive)
When rendering, remove previously installed masks from context painter if recursive is true masks are...
 
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.
 
@ ArrowHeadLength
Arrow head length.
 
@ ArrowWidth
Arrow tail width.
 
@ ArrowHeadType
Arrow head type.
 
@ ArrowHeadThickness
Arrow head thickness.
 
@ ArrowStartWidth
Arrow tail start width.
 
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
 
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
 
QgsPropertyCollection mDataDefinedProperties
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
 
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
 
Encapsulates the context in which a symbol is being rendered.
 
const QgsFeature * feature() const
Returns the current feature being rendered.
 
QgsFields fields() const
Fields of the layer.
 
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
 
qreal opacity() const
Returns the opacity for the symbol.
 
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
 
Abstract base class for all rendered symbols.
 
Qgis::SymbolType type() const
Returns the symbol's type.
 
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
 
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
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
 
void pathArcTo(QPainterPath &path, QPointF circleCenter, qreal circleRadius, qreal angle_o, qreal angle_d, int direction)
 
void spiralArcTo(QPainterPath &path, QPointF center, qreal startAngle, qreal startRadius, qreal endAngle, qreal endRadius, int direction)
 
qreal euclidean_distance(QPointF po, QPointF pd)
 
QPointF circlePoint(QPointF center, qreal radius, qreal angle)
 
QPolygonF straightArrow(QPointF po, QPointF pd, qreal startWidth, qreal width, qreal headWidth, qreal headHeight, QgsArrowSymbolLayer::HeadType headType, QgsArrowSymbolLayer::ArrowType arrowType, qreal offset)
 
bool pointsToCircle(QPointF a, QPointF b, QPointF c, QPointF ¢er, qreal &radius)
Compute the circumscribed circle from three points.
 
qreal clampAngle(qreal a)
 
QPolygonF curvedArrow(QPointF po, QPointF pm, QPointF pd, qreal startWidth, qreal width, qreal headWidth, qreal headHeight, QgsArrowSymbolLayer::HeadType headType, QgsArrowSymbolLayer::ArrowType arrowType, qreal offset)
 
Single variable definition for use within a QgsExpressionContextScope.