47   if ( props.contains( QStringLiteral( 
"arrow_width" ) ) )
 
   48     l->
setArrowWidth( props[QStringLiteral( 
"arrow_width" )].toDouble() );
 
   50   if ( props.contains( QStringLiteral( 
"arrow_width_unit" ) ) )
 
   53   if ( props.contains( QStringLiteral( 
"arrow_width_unit_scale" ) ) )
 
   56   if ( props.contains( QStringLiteral( 
"arrow_start_width" ) ) )
 
   59   if ( props.contains( QStringLiteral( 
"arrow_start_width_unit" ) ) )
 
   62   if ( props.contains( QStringLiteral( 
"arrow_start_width_unit_scale" ) ) )
 
   65   if ( props.contains( QStringLiteral( 
"is_curved" ) ) )
 
   66     l->
setIsCurved( props[QStringLiteral( 
"is_curved" )].toInt() == 1 );
 
   68   if ( props.contains( QStringLiteral( 
"is_repeated" ) ) )
 
   69     l->
setIsRepeated( props[QStringLiteral( 
"is_repeated" )].toInt() == 1 );
 
   71   if ( props.contains( QStringLiteral( 
"head_length" ) ) )
 
   72     l->
setHeadLength( props[QStringLiteral( 
"head_length" )].toDouble() );
 
   74   if ( props.contains( QStringLiteral( 
"head_length_unit" ) ) )
 
   77   if ( props.contains( QStringLiteral( 
"head_length_unit_scale" ) ) )
 
   80   if ( props.contains( QStringLiteral( 
"head_thickness" ) ) )
 
   83   if ( props.contains( QStringLiteral( 
"head_thickness_unit" ) ) )
 
   86   if ( props.contains( QStringLiteral( 
"head_thickness_unit_scale" ) ) )
 
   89   if ( props.contains( QStringLiteral( 
"head_type" ) ) )
 
   92   if ( props.contains( QStringLiteral( 
"arrow_type" ) ) )
 
   95   if ( props.contains( QStringLiteral( 
"offset" ) ) )
 
   96     l->
setOffset( props[QStringLiteral( 
"offset" )].toDouble() );
 
   98   if ( props.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  101   if ( props.contains( QStringLiteral( 
"offset_unit_scale" ) ) )
 
  104   if ( props.contains( QStringLiteral( 
"ring_filter" ) ) )
 
  125   return mSymbol.get();
 
  130   return QStringLiteral( 
"ArrowLine" );
 
  137   map[QStringLiteral( 
"arrow_width" )] = QString::number( 
arrowWidth() );
 
  141   map[QStringLiteral( 
"arrow_start_width" )] = QString::number( 
arrowStartWidth() );
 
  145   map[QStringLiteral( 
"is_curved" )] = QString::number( 
isCurved() ? 1 : 0 );
 
  146   map[QStringLiteral( 
"is_repeated" )] = QString::number( 
isRepeated() ? 1 : 0 );
 
  148   map[QStringLiteral( 
"head_length" )] = QString::number( 
headLength() );
 
  152   map[QStringLiteral( 
"head_thickness" )] = QString::number( 
headThickness() );
 
  156   map[QStringLiteral( 
"head_type" )] = QString::number( 
headType() );
 
  157   map[QStringLiteral( 
"arrow_type" )] = QString::number( 
arrowType() );
 
  159   map[QStringLiteral( 
"offset" )] = QString::number( 
offset() );
 
  163   map[QStringLiteral( 
"ring_filter" )] = QString::number( 
static_cast< int >( 
mRingFilter ) );
 
  172   attributes.unite( mSymbol->usedAttributes( context ) );
 
  181   if ( mSymbol && mSymbol->hasDataDefinedProperties() )
 
  217   return std::sqrt( ( po.x() - pd.x() ) * ( po.x() - pd.x() ) + ( po.y() - pd.y() ) * ( po.y() - pd.y() ) );
 
  221                          qreal startWidth, qreal width,
 
  222                          qreal headWidth, qreal headHeight,
 
  233     po = pd - ( pd - po ) / length * headWidth;
 
  238     pd = po + ( pd - po ) / length * headWidth;
 
  243     QPointF v = ( pd - po ) / length * headWidth;
 
  244     QPointF npo = ( po + pd ) / 2.0 - v;
 
  245     QPointF npd = ( po + pd ) / 2.0 + v;
 
  248     length = 2 * headWidth;
 
  251   qreal bodyLength = length - headWidth;
 
  254   QPointF unitVec = ( pd - po ) / length;
 
  256   QPointF perpVec( -unitVec.y(), unitVec.x() );
 
  259   po += perpVec * offset;
 
  260   pd += perpVec * offset;
 
  268       polygon << po + unitVec *headWidth + perpVec *headHeight;
 
  269       polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
 
  271       polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
 
  274       polygon << po + unitVec *bodyLength + perpVec *headHeight;
 
  280       polygon << po + unitVec *bodyLength - perpVec *headHeight;
 
  281       polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
 
  284       polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
 
  285       polygon << po + unitVec *headWidth - perpVec *headHeight;
 
  292       polygon << po + perpVec * ( startWidth * 0.5 );
 
  293       polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
 
  294       polygon << po + unitVec *bodyLength + perpVec *headHeight;
 
  303       polygon << po + unitVec *bodyLength - perpVec *headHeight;
 
  304       polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
 
  305       polygon << po - perpVec * ( startWidth * 0.5 );
 
  317       polygon << po + unitVec *headWidth + perpVec *headHeight;
 
  318       polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
 
  320       polygon << pd + perpVec * ( startWidth * 0.5 );
 
  328       polygon << pd - perpVec * ( startWidth * 0.5 );
 
  330       polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
 
  331       polygon << po + unitVec *headWidth - perpVec *headHeight;
 
  339   polygon << polygon.first();
 
  358 bool pointsToCircle( QPointF a, QPointF b, QPointF 
c, QPointF ¢er, qreal &radius )
 
  367   QPointF ab2 = ( a + b ) / 2.0;
 
  368   QPointF bc2 = ( b + 
c ) / 2.0;
 
  371   if ( std::fabs( ab.x() * bc.y() - ab.y() * bc.x() ) < 0.001 ) 
 
  378     cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
 
  381   else if ( bc.y() == 0 )
 
  384     cy = ab2.y() - ( cx - ab2.x() ) * ab.x() / ab.y();
 
  389     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() );
 
  390     cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
 
  393   radius = std::sqrt( ( a.x() - cx ) * ( a.x() - cx ) + ( a.y() - cy ) * ( a.y() - cy ) );
 
  403   return QPointF( std::cos( -
angle ) * radius + center.x(), std::sin( -
angle ) * radius + center.y() );
 
  406 void pathArcTo( QPainterPath &path, QPointF circleCenter, qreal circleRadius, qreal angle_o, qreal angle_d, 
int direction )
 
  408   QRectF circleRect( circleCenter - QPointF( circleRadius, circleRadius ), circleCenter + QPointF( circleRadius, circleRadius ) );
 
  409   if ( direction == 1 )
 
  411     if ( angle_o < angle_d )
 
  412       path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
 
  414       path.arcTo( circleRect, angle_o / M_PI * 180.0, 360.0 - ( angle_o - angle_d ) / M_PI * 180.0 );
 
  418     if ( angle_o < angle_d )
 
  419       path.arcTo( circleRect, angle_o / M_PI * 180.0, - ( 360.0 - ( angle_d - angle_o ) / M_PI * 180.0 ) );
 
  421       path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
 
  426 void spiralArcTo( QPainterPath &path, QPointF center, qreal startAngle, qreal startRadius, qreal endAngle, qreal endRadius, 
int direction )
 
  429   QPointF A = 
circlePoint( center, startRadius, startAngle );
 
  431   QPointF B = 
circlePoint( center, endRadius, endAngle );
 
  435   deltaAngle = endAngle - startAngle;
 
  436   if ( direction * deltaAngle < 0.0 )
 
  437     deltaAngle = deltaAngle + direction * 2 * M_PI;
 
  439   QPointF I1 = 
circlePoint( center, 0.75 * startRadius + 0.25 * endRadius, startAngle + 0.25 * deltaAngle );
 
  440   QPointF I2 = 
circlePoint( center, 0.50 * startRadius + 0.50 * endRadius, startAngle + 0.50 * deltaAngle );
 
  441   QPointF I3 = 
circlePoint( center, 0.25 * startRadius + 0.75 * endRadius, startAngle + 0.75 * deltaAngle );
 
  454     qreal a1 = std::atan2( cCenter.y() - A.y(), A.x() - cCenter.x() );
 
  455     qreal a2 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
 
  456     pathArcTo( path, cCenter, cRadius, a1, a2, direction );
 
  468     qreal a1 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
 
  469     qreal a2 = std::atan2( cCenter.y() - B.y(), B.x() - cCenter.x() );
 
  470     pathArcTo( path, cCenter, cRadius, a1, a2, direction );
 
  475                        qreal startWidth, qreal width,
 
  476                        qreal headWidth, qreal headHeight,
 
  481   QPointF circleCenter;
 
  485     return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
 
  489   qreal angle_o = 
clampAngle( std::atan2( circleCenter.y() - po.y(), po.x() - circleCenter.x() ) );
 
  490   qreal angle_m = 
clampAngle( std::atan2( circleCenter.y() - pm.y(), pm.x() - circleCenter.x() ) );
 
  491   qreal angle_d = 
clampAngle( std::atan2( circleCenter.y() - pd.y(), pd.x() - circleCenter.x() ) );
 
  503   qreal deltaAngle = angle_d - angle_o;
 
  504   if ( direction * deltaAngle < 0.0 )
 
  505     deltaAngle = deltaAngle + direction * 2 * M_PI;
 
  513     return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
 
  517   circleRadius += offset;
 
  518   po = 
circlePoint( circleCenter, circleRadius, angle_o );
 
  519   pm = 
circlePoint( circleCenter, circleRadius, angle_m );
 
  520   pd = 
circlePoint( circleCenter, circleRadius, angle_d );
 
  522   qreal headAngle = direction * std::atan( headWidth / circleRadius );
 
  532       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
 
  534       pathArcTo( path, circleCenter, circleRadius + direction * width / 2, angle_o + headAngle, angle_d - headAngle, direction );
 
  537       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
 
  542       pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  546       path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
 
  548       pathArcTo( path, circleCenter, circleRadius - direction * width / 2, angle_d - headAngle, angle_o + headAngle, -direction );
 
  551       path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
 
  556       pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  563       path.moveTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  565       spiralArcTo( path, circleCenter, angle_o, circleRadius + direction * startWidth / 2, angle_d - headAngle, circleRadius + direction * width / 2, direction );
 
  568       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
 
  574       pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  578       path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
 
  580       spiralArcTo( path, circleCenter, angle_d - headAngle, circleRadius - direction * width / 2, angle_o, circleRadius - direction * startWidth / 2, -direction );
 
  582       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  586       pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  587       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
 
  595       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
 
  596       path.lineTo( 
circlePoint( circleCenter, circleRadius + direction * width / 2, angle_o + headAngle ) );
 
  598       spiralArcTo( path, circleCenter, angle_o + headAngle, circleRadius + direction * width / 2, angle_d, circleRadius + direction * startWidth / 2, direction );
 
  602       pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
 
  606       path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * startWidth / 2, angle_d ) );
 
  608       spiralArcTo( path, circleCenter, angle_d, circleRadius - direction * startWidth / 2, angle_o + headAngle, circleRadius - direction * width / 2, - direction );
 
  610       path.lineTo( 
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
 
  616       pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
 
  620   return path.toSubpathPolygons().at( 0 );
 
  633     if ( !exprVal.isNull() )
 
  635       double w = exprVal.toDouble( &ok );
 
  646     if ( !exprVal.isNull() )
 
  648       double w = exprVal.toDouble( &ok );
 
  659     if ( !exprVal.isNull() )
 
  661       double w = exprVal.toDouble( &ok );
 
  672     if ( !exprVal.isNull() )
 
  674       double w = exprVal.toDouble( &ok );
 
  685     double w = exprVal.toDouble( &ok );
 
  696     if ( !exprVal.isNull() )
 
  701         mComputedHeadType = h;
 
  710     if ( !exprVal.isNull() )
 
  715         mComputedArrowType = h;
 
  734   const double prevOpacity = mSymbol->opacity();
 
  735   mSymbol->setOpacity( prevOpacity * context.
opacity() );
 
  739     _resolveDataDefined( context );
 
  743       if ( points.size() >= 3 )
 
  746         QPointF po( points.at( 0 ) );
 
  748         QPointF pm( points.at( points.size() / 2 ) );
 
  750         QPointF pd( points.back() );
 
  752         QPolygonF poly = 
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  756       else if ( points.size() == 2 )
 
  759         QPointF po( points.at( 0 ) );
 
  761         QPointF pd( points.at( 1 ) );
 
  763         QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  769       for ( 
int pIdx = 0; pIdx < points.size() - 1; pIdx += 2 )
 
  775         _resolveDataDefined( context );
 
  777         if ( points.size() - pIdx >= 3 )
 
  780           QPointF po( points.at( pIdx ) );
 
  782           QPointF pm( points.at( pIdx + 1 ) );
 
  784           QPointF pd( points.at( pIdx + 2 ) );
 
  786           QPolygonF poly = 
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  790         else if ( points.size() - pIdx == 2 )
 
  793           QPointF po( points.at( pIdx ) );
 
  795           QPointF pd( points.at( pIdx + 1 ) );
 
  797           QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  807       _resolveDataDefined( context );
 
  809       if ( !points.isEmpty() )
 
  812         QPointF po( points.at( 0 ) );
 
  814         QPointF pd( points.back() );
 
  816         QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  823       for ( 
int pIdx = 0; pIdx < points.size() - 1; pIdx++ )
 
  829         _resolveDataDefined( context );
 
  832         QPointF po( points.at( pIdx ) );
 
  834         QPointF pd( points.at( pIdx + 1 ) );
 
  836         QPolygonF poly = 
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
 
  843   mSymbol->setOpacity( prevOpacity );
 
  850     mSymbol->setColor( 
c );
 
  857   return mSymbol.get() ? mSymbol->color() : 
mColor;
 
Line symbol layer used for representing lines as arrows.
bool isCurved() const
Returns whether it is a curved arrow or a straight one.
QgsUnitTypes::RenderUnit headLengthUnit() const
Gets the unit for the head length.
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.
QgsUnitTypes::RenderUnit arrowWidthUnit() const
Gets the unit for the arrow width.
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.
QgsUnitTypes::RenderUnit arrowStartWidthUnit() const
Gets the unit for the arrow start 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.
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 setIsRepeated(bool isRepeated)
Sets whether the arrow is repeated along the line.
QColor color() const override
The fill color.
double arrowStartWidth() const
Gets current arrow start width. Only meaningful for single headed arrows.
QgsUnitTypes::RenderUnit headThicknessUnit() const
Gets the unit for the head height.
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
The fill color.
ArrowType
Possible arrow types.
void setArrowWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the arrow width.
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.
void setArrowStartWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the arrow start 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 setHeadLengthUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the head length.
void setHeadThicknessUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the head height.
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.
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.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static QgsFillSymbol * createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
RenderRingFilter
Options for filtering rings when the line symbol layer is being used to render a polygon's rings.
QgsUnitTypes::RenderUnit mWidthUnit
QgsUnitTypes::RenderUnit offsetUnit() const
Returns the units for the line's offset.
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the line's offset.
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the line's offset.
void setOffset(double offset)
Sets the line's offset.
RenderRingFilter mRingFilter
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.
QgsUnitTypes::RenderUnit mOffsetUnit
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.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
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.
@ PropertyArrowStartWidth
Arrow tail start width.
@ PropertyArrowHeadLength
Arrow head length.
@ PropertyArrowHeadThickness
Arrow head thickness.
@ PropertyOffset
Symbol offset.
@ PropertyArrowHeadType
Arrow head type.
@ PropertyArrowType
Arrow type.
@ PropertyArrowWidth
Arrow tail width.
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.
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
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
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
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.
Qgis::SymbolType type() const
Returns the symbol's type.
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.
@ RenderMetersInMapUnits
Meters value as Map units.
@ RenderMillimeters
Millimeters.
@ 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
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.