28using namespace Qt::StringLiterals;
56 if ( props.contains( u
"arrow_width"_s ) )
59 if ( props.contains( u
"arrow_width_unit"_s ) )
62 if ( props.contains( u
"arrow_width_unit_scale"_s ) )
65 if ( props.contains( u
"arrow_start_width"_s ) )
68 if ( props.contains( u
"arrow_start_width_unit"_s ) )
71 if ( props.contains( u
"arrow_start_width_unit_scale"_s ) )
74 if ( props.contains( u
"is_curved"_s ) )
75 l->
setIsCurved( props[u
"is_curved"_s].toInt() == 1 );
77 if ( props.contains( u
"is_repeated"_s ) )
80 if ( props.contains( u
"head_length"_s ) )
83 if ( props.contains( u
"head_length_unit"_s ) )
86 if ( props.contains( u
"head_length_unit_scale"_s ) )
89 if ( props.contains( u
"head_thickness"_s ) )
92 if ( props.contains( u
"head_thickness_unit"_s ) )
95 if ( props.contains( u
"head_thickness_unit_scale"_s ) )
98 if ( props.contains( u
"head_type"_s ) )
101 if ( props.contains( u
"arrow_type"_s ) )
104 if ( props.contains( u
"offset"_s ) )
105 l->
setOffset( props[u
"offset"_s].toDouble() );
107 if ( props.contains( u
"offset_unit"_s ) )
110 if ( props.contains( u
"offset_unit_scale"_s ) )
113 if ( props.contains( u
"ring_filter"_s ) )
133 return mSymbol.get();
138 return u
"ArrowLine"_s;
145 map[u
"arrow_width"_s] = QString::number(
arrowWidth() );
153 map[u
"is_curved"_s] = QString::number(
isCurved() ? 1 : 0 );
154 map[u
"is_repeated"_s] = QString::number(
isRepeated() ? 1 : 0 );
156 map[u
"head_length"_s] = QString::number(
headLength() );
160 map[u
"head_thickness"_s] = QString::number(
headThickness() );
164 map[u
"head_type"_s] = QString::number(
headType() );
165 map[u
"arrow_type"_s] = QString::number(
arrowType() );
167 map[u
"offset"_s] = QString::number(
offset() );
171 map[u
"ring_filter"_s] = QString::number(
static_cast< int >(
mRingFilter ) );
180 attributes.unite( mSymbol->usedAttributes( context ) );
189 if ( mSymbol && mSymbol->hasDataDefinedProperties() )
207 mArrowWidthUnit = unit;
208 mArrowStartWidthUnit = unit;
209 mHeadLengthUnit = unit;
210 mHeadThicknessUnit = unit;
215 mExpressionScope = std::make_unique<QgsExpressionContextScope>( );
225 mDefaultScaledArrowWidth = mScaledArrowWidth;
226 mDefaultScaledArrowStartWidth = mScaledArrowStartWidth;
227 mDefaultScaledHeadLength = mScaledHeadLength;
228 mDefaultScaledHeadThickness = mScaledHeadThickness;
229 mDefaultScaledOffset = mScaledOffset;
230 mDefaultComputedHeadType = mComputedHeadType;
231 mDefaultComputedArrowType = mComputedArrowType;
263 qreal startWidth, qreal width,
264 qreal headWidth, qreal headHeight,
277 po = pd - ( pd - po ) / length * headWidth;
282 pd = po + ( pd - po ) / length * headWidth;
287 const QPointF v = ( pd - po ) / length * headWidth;
288 const QPointF npo = ( po + pd ) / 2.0 - v;
289 const QPointF npd = ( po + pd ) / 2.0 + v;
292 length = 2 * headWidth;
295 const qreal bodyLength = length - headWidth;
298 const QPointF unitVec = ( pd - po ) / length;
300 const QPointF perpVec( -unitVec.y(), unitVec.x() );
303 po += perpVec * offset;
304 pd += perpVec * offset;
312 polygon << po + unitVec *headWidth + perpVec *headHeight;
313 polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
315 polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
318 polygon << po + unitVec *bodyLength + perpVec *headHeight;
324 polygon << po + unitVec *bodyLength - perpVec *headHeight;
325 polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
328 polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
329 polygon << po + unitVec *headWidth - perpVec *headHeight;
336 polygon << po + perpVec * ( startWidth * 0.5 );
337 polygon << po + unitVec *bodyLength + perpVec * ( width * 0.5 );
338 polygon << po + unitVec *bodyLength + perpVec *headHeight;
347 polygon << po + unitVec *bodyLength - perpVec *headHeight;
348 polygon << po + unitVec *bodyLength - perpVec * ( width * 0.5 );
349 polygon << po - perpVec * ( startWidth * 0.5 );
361 polygon << po + unitVec *headWidth + perpVec *headHeight;
362 polygon << po + unitVec *headWidth + perpVec * ( width * 0.5 );
364 polygon << pd + perpVec * ( startWidth * 0.5 );
372 polygon << pd - perpVec * ( startWidth * 0.5 );
374 polygon << po + unitVec *headWidth - perpVec * ( width * 0.5 );
375 polygon << po + unitVec *headWidth - perpVec *headHeight;
383 polygon << polygon.first();
407 const QPointF ab = b - a;
408 const QPointF bc =
c - b;
411 const QPointF ab2 = ( a + b ) / 2.0;
412 const QPointF bc2 = ( b +
c ) / 2.0;
415 if ( std::fabs( ab.x() * bc.y() - ab.y() * bc.x() ) < 0.001 )
422 cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
425 else if ( bc.y() == 0 )
428 cy = ab2.y() - ( cx - ab2.x() ) * ab.x() / ab.y();
433 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() );
434 cy = bc2.y() - ( cx - bc2.x() ) * bc.x() / bc.y();
447 return QPointF( std::cos( -angle ) * radius + center.x(), std::sin( -angle ) * radius + center.y() );
450void pathArcTo( QPainterPath &path, QPointF circleCenter, qreal circleRadius, qreal angle_o, qreal angle_d,
int direction )
452 const QRectF circleRect( circleCenter - QPointF( circleRadius, circleRadius ), circleCenter + QPointF( circleRadius, circleRadius ) );
453 if ( direction == 1 )
455 if ( angle_o < angle_d )
456 path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
458 path.arcTo( circleRect, angle_o / M_PI * 180.0, 360.0 - ( angle_o - angle_d ) / M_PI * 180.0 );
462 if ( angle_o < angle_d )
463 path.arcTo( circleRect, angle_o / M_PI * 180.0, - ( 360.0 - ( angle_d - angle_o ) / M_PI * 180.0 ) );
465 path.arcTo( circleRect, angle_o / M_PI * 180.0, ( angle_d - angle_o ) / M_PI * 180.0 );
470void spiralArcTo( QPainterPath &path, QPointF center, qreal startAngle, qreal startRadius, qreal endAngle, qreal endRadius,
int direction )
473 const QPointF A =
circlePoint( center, startRadius, startAngle );
475 const QPointF B =
circlePoint( center, endRadius, endAngle );
479 deltaAngle = endAngle - startAngle;
480 if ( direction * deltaAngle < 0.0 )
481 deltaAngle = deltaAngle + direction * 2 * M_PI;
483 const QPointF I1 =
circlePoint( center, 0.75 * startRadius + 0.25 * endRadius, startAngle + 0.25 * deltaAngle );
484 const QPointF I2 =
circlePoint( center, 0.50 * startRadius + 0.50 * endRadius, startAngle + 0.50 * deltaAngle );
485 const QPointF I3 =
circlePoint( center, 0.25 * startRadius + 0.75 * endRadius, startAngle + 0.75 * deltaAngle );
498 const qreal a1 = std::atan2( cCenter.y() - A.y(), A.x() - cCenter.x() );
499 const qreal a2 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
500 pathArcTo( path, cCenter, cRadius, a1, a2, direction );
512 const qreal a1 = std::atan2( cCenter.y() - I2.y(), I2.x() - cCenter.x() );
513 const qreal a2 = std::atan2( cCenter.y() - B.y(), B.x() - cCenter.x() );
514 pathArcTo( path, cCenter, cRadius, a1, a2, direction );
519 qreal startWidth, qreal width,
520 qreal headWidth, qreal headHeight,
525 QPointF circleCenter;
529 return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
533 const qreal angle_o =
clampAngle( std::atan2( circleCenter.y() - po.y(), po.x() - circleCenter.x() ) );
534 const qreal angle_m =
clampAngle( std::atan2( circleCenter.y() - pm.y(), pm.x() - circleCenter.x() ) );
535 const qreal angle_d =
clampAngle( std::atan2( circleCenter.y() - pd.y(), pd.x() - circleCenter.x() ) );
538 const int direction =
clampAngle( angle_m - angle_o ) <
clampAngle( angle_m - angle_d ) ? 1 : -1;
547 qreal deltaAngle = angle_d - angle_o;
548 if ( direction * deltaAngle < 0.0 )
549 deltaAngle = deltaAngle + direction * 2 * M_PI;
557 return straightArrow( po, pd, startWidth, width, headWidth, headHeight, headType, arrowType, offset );
561 circleRadius += offset;
562 po =
circlePoint( circleCenter, circleRadius, angle_o );
563 pm =
circlePoint( circleCenter, circleRadius, angle_m );
564 pd =
circlePoint( circleCenter, circleRadius, angle_d );
566 const qreal headAngle = direction * std::atan( headWidth / circleRadius );
576 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
578 pathArcTo( path, circleCenter, circleRadius + direction * width / 2, angle_o + headAngle, angle_d - headAngle, direction );
581 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
586 pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
590 path.lineTo(
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
592 pathArcTo( path, circleCenter, circleRadius - direction * width / 2, angle_d - headAngle, angle_o + headAngle, -direction );
595 path.lineTo(
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
600 pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
607 path.moveTo(
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
609 spiralArcTo( path, circleCenter, angle_o, circleRadius + direction * startWidth / 2, angle_d - headAngle, circleRadius + direction * width / 2, direction );
612 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_d - headAngle ) );
618 pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
622 path.lineTo(
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_d - headAngle ) );
624 spiralArcTo( path, circleCenter, angle_d - headAngle, circleRadius - direction * width / 2, angle_o, circleRadius - direction * startWidth / 2, -direction );
626 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
630 pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
631 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * startWidth / 2, angle_o ) );
639 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * headHeight, angle_o + headAngle ) );
640 path.lineTo(
circlePoint( circleCenter, circleRadius + direction * width / 2, angle_o + headAngle ) );
642 spiralArcTo( path, circleCenter, angle_o + headAngle, circleRadius + direction * width / 2, angle_d, circleRadius + direction * startWidth / 2, direction );
646 pathArcTo( path, circleCenter, circleRadius, angle_o, angle_d, direction );
650 path.lineTo(
circlePoint( circleCenter, circleRadius - direction * startWidth / 2, angle_d ) );
652 spiralArcTo( path, circleCenter, angle_d, circleRadius - direction * startWidth / 2, angle_o + headAngle, circleRadius - direction * width / 2, - direction );
654 path.lineTo(
circlePoint( circleCenter, circleRadius - direction * headHeight, angle_o + headAngle ) );
660 pathArcTo( path, circleCenter, circleRadius, angle_d, angle_o, -direction );
664 return path.toSubpathPolygons().at( 0 );
679 const double w = exprVal.toDouble( &ok );
686 mScaledArrowWidth = mDefaultScaledArrowWidth;
691 mScaledArrowWidth = mDefaultScaledArrowWidth;
700 const double w = exprVal.toDouble( &ok );
707 mScaledArrowStartWidth = mDefaultScaledArrowStartWidth;
712 mScaledArrowStartWidth = mDefaultScaledArrowStartWidth;
721 const double w = exprVal.toDouble( &ok );
728 mScaledHeadLength = mDefaultScaledHeadLength;
733 mScaledHeadLength = mDefaultScaledHeadLength;
742 const double w = exprVal.toDouble( &ok );
749 mScaledHeadThickness = mDefaultScaledHeadThickness;
754 mScaledHeadThickness = mDefaultScaledHeadThickness;
763 const double w = exprVal.toDouble( &ok );
770 mScaledOffset = mDefaultScaledOffset;
775 mScaledOffset = mDefaultScaledOffset;
788 mComputedHeadType = h;
792 mComputedHeadType = mDefaultComputedHeadType;
797 mComputedHeadType = mDefaultComputedHeadType;
810 mComputedArrowType = h;
814 mComputedArrowType = mDefaultComputedArrowType;
819 mComputedArrowType = mDefaultComputedArrowType;
838 const double prevOpacity = mSymbol->opacity();
839 mSymbol->setOpacity( prevOpacity * context.
opacity() );
844 _resolveDataDefined( context );
848 if ( points.size() >= 3 )
851 const QPointF po( points.at( 0 ) );
853 const QPointF pm( points.at( points.size() / 2 ) );
855 const QPointF pd( points.back() );
857 const QPolygonF poly =
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
858 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
861 else if ( points.size() == 2 )
864 const QPointF po( points.at( 0 ) );
866 const QPointF pd( points.at( 1 ) );
868 const QPolygonF poly =
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
869 if ( !poly.isEmpty() )
870 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
875 for (
int pIdx = 0; pIdx < points.size() - 1; pIdx += 2 )
881 _resolveDataDefined( context );
883 if ( points.size() - pIdx >= 3 )
886 const QPointF po( points.at( pIdx ) );
888 const QPointF pm( points.at( pIdx + 1 ) );
890 const QPointF pd( points.at( pIdx + 2 ) );
892 const QPolygonF poly =
curvedArrow( po, pm, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
893 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
896 else if ( points.size() - pIdx == 2 )
899 const QPointF po( points.at( pIdx ) );
901 const QPointF pd( points.at( pIdx + 1 ) );
903 const QPolygonF poly =
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
904 if ( !poly.isEmpty() )
905 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
914 _resolveDataDefined( context );
916 if ( !points.isEmpty() )
919 const QPointF po( points.at( 0 ) );
921 const QPointF pd( points.back() );
923 const QPolygonF poly =
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
924 if ( !poly.isEmpty() )
925 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
931 for (
int pIdx = 0; pIdx < points.size() - 1; pIdx++ )
937 _resolveDataDefined( context );
940 const QPointF po( points.at( pIdx ) );
942 const QPointF pd( points.at( pIdx + 1 ) );
944 const QPolygonF poly =
straightArrow( po, pd, mScaledArrowStartWidth, mScaledArrowWidth, mScaledHeadLength, mScaledHeadThickness, mComputedHeadType, mComputedArrowType, mScaledOffset );
946 if ( !poly.isEmpty() )
947 mSymbol->renderPolygon( poly,
nullptr, context.
feature(), context.
renderContext(), -1, useSelectedColor );
954 mSymbol->setOpacity( prevOpacity );
961 mSymbol->setColor(
c );
968 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...
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.
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.
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.
void copyCommonProperties(QgsSymbolLayer *destLayer) const
Copies all common base class properties from this layer to another symbol layer.
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.
@ 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.
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.
QgsSymbolLayer(const QgsSymbolLayer &other)
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
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
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.