24   mPen.setWidthF( 2.0 );
    25   mPen.setColor( QColor( 0, 0, 0 ) );
    26   mPen.setCapStyle( Qt::FlatCap );
    27   mBrush.setStyle( Qt::SolidPattern );
    46     attrVal = expression->
evaluate( &expressionContext );
    54   double val = attrVal.toDouble( &ok );
    66   return std::max( size.width(), size.height() );
    77   Q_UNUSED( attributes );
    92   double w = spu.width();
    93   double h = spu.height();
    95   double baseX = position.x();
    96   double baseY = position.y() - h;
    98   QVector<QPointF> textPositions; 
   100   for ( 
int i = 0; i < nCategories; ++i )
   104       textPositions.push_back( QPointF( baseX + ( w / nCategories ) * i + w / nCategories / 2.0, baseY + h / 2.0 ) );
   108       textPositions.push_back( QPointF( baseX + w / 2.0, baseY + h / nCategories * i + w / nCategories / 2.0 ) );
   116   p->setBrush( mBrush );
   121     p->drawEllipse( baseX, baseY, w, h );
   124     QList<QPointF> intersect; 
   125     QPointF center( baseX + w / 2.0, baseY + h / 2.0 );
   129     for ( 
int i = 1; i < nCategories; ++i )
   133         lineEllipseIntersection( QPointF( baseX + w / nCategories * i, baseY ), QPointF( baseX + w / nCategories * i, baseY + h ), center, r1, r2, intersect );
   137         lineEllipseIntersection( QPointF( baseX, baseY + h / nCategories * i ), QPointF( baseX + w, baseY + h / nCategories * i ), center, r1, r2, intersect );
   139       if ( intersect.size() > 1 )
   141         p->drawLine( intersect.at( 0 ), intersect.at( 1 ) );
   147     p->drawRect( QRectF( baseX, baseY, w, h ) );
   148     for ( 
int i = 1; i < nCategories; ++i )
   152         p->drawLine( QPointF( baseX + w / nCategories * i, baseY ), QPointF( baseX + w / nCategories * i, baseY + h ) );
   156         p->drawLine( QPointF( baseX, baseY + h / nCategories * i ), QPointF( baseX + w, baseY + h / nCategories * i ) );
   163     triangle << QPointF( baseX, baseY + h ) << QPointF( baseX + w, baseY + h ) << QPointF( baseX + w / 2.0, baseY );
   164     p->drawPolygon( triangle );
   166     QLineF triangleEdgeLeft( baseX + w / 2.0, baseY, baseX, baseY + h );
   167     QLineF triangleEdgeRight( baseX + w, baseY + h, baseX + w / 2.0, baseY );
   168     QPointF intersectionPoint1, intersectionPoint2;
   170     for ( 
int i = 1; i < nCategories; ++i )
   174         QLineF verticalLine( baseX + w / nCategories * i, baseY + h, baseX + w / nCategories * i, baseY );
   175         if ( baseX + w / nCategories * i < baseX + w / 2.0 )
   177           verticalLine.intersect( triangleEdgeLeft, &intersectionPoint1 );
   181           verticalLine.intersect( triangleEdgeRight, &intersectionPoint1 );
   183         p->drawLine( QPointF( baseX + w / nCategories * i, baseY + h ), intersectionPoint1 );
   187         QLineF horizontalLine( baseX, baseY + h / nCategories * i, baseX + w, baseY + h / nCategories * i );
   188         horizontalLine.intersect( triangleEdgeLeft, &intersectionPoint1 );
   189         horizontalLine.intersect( triangleEdgeRight, &intersectionPoint2 );
   190         p->drawLine( intersectionPoint1, intersectionPoint2 );
   197   QFontMetricsF fontMetrics( sFont );
   205   for ( 
int i = 0; i < textPositions.size(); ++i )
   208     QString val = expression->
evaluate( &expressionContext ).toString();
   211     double textWidth = fontMetrics.width( val );
   212     double textHeight = fontMetrics.height();
   216     QPointF position = textPositions.at( i );
   224         xOffset = textHeight / 2.0;
   228         xOffset = fontMetrics.xHeight();
   231     p->drawText( QPointF( position.x() - textWidth / 2.0, position.y() + xOffset ), val );
   235 void QgsTextDiagram::lineEllipseIntersection( QPointF lineStart, QPointF lineEnd, QPointF ellipseMid, 
double r1, 
double r2, QList<QPointF> &result )
 const   239   double rrx = r1 * r1;
   240   double rry = r2 * r2;
   241   double x21 = lineEnd.x() - lineStart.x();
   242   double y21 = lineEnd.y() - lineStart.y();
   243   double x10 = lineStart.x() - ellipseMid.x();
   244   double y10 = lineStart.y() - ellipseMid.y();
   245   double a = x21 * x21 / rrx + y21 * y21 / rry;
   246   double b = x21 * x10 / rrx + y21 * y10 / rry;
   247   double c = x10 * x10 / rrx + y10 * y10 / rry;
   248   double d = b * b - a * ( c - 1 );
   251     double e = std::sqrt( d );
   252     double u1 = ( -b - e ) / a;
   253     double u2 = ( -b + e ) / a;
   255     if ( -0.00001 <= u1 && u1 < 1.00001 )
   257       result.push_back( QPointF( lineStart.x() + x21 * u1, lineStart.y() + y21 * u1 ) );
   259     if ( -0.00001 <= u2 && u2 <= 1.00001 )
   261       result.push_back( QPointF( lineStart.x() + x21 * u2, lineStart.y() + y21 * u2 ) );
 QSizeF sizePainterUnits(QSizeF size, const QgsDiagramSettings &s, const QgsRenderContext &c)
Calculates a size to match the current settings and rendering context. 
 
Class for parsing and evaluation of expressions (formerly called "search strings"). 
 
QList< QString > categoryAttributes
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context. 
 
bool classificationAttributeIsExpression
 
QVariant evaluate()
Evaluate the feature and return the result. 
 
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
 
void renderDiagram(const QgsFeature &feature, QgsRenderContext &c, const QgsDiagramSettings &s, QPointF position) override
Draws the diagram at the given position (in pixel coordinates) 
 
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
 
QString classificationAttributeExpression
 
QgsExpression * getExpression(const QString &expression, const QgsExpressionContext &context)
Returns a prepared expression for the specified context. 
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
QgsTextDiagram * clone() const override
Returns an instance that is equivalent to this one. 
 
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context. 
 
QSizeF sizeForValue(double value, const QgsDiagramSettings &s, const QgsDiagramInterpolationSettings &is) const
Returns the scaled size of a diagram for a value, respecting the specified diagram interpolation sett...
 
double legendSize(double value, const QgsDiagramSettings &s, const QgsDiagramInterpolationSettings &is) const override
Returns the size of the legend item for the diagram corresponding to a specified value. 
 
QgsExpressionContext & expressionContext()
Gets the expression context. 
 
QString diagramName() const override
Gets a descriptive name for this diagram type. 
 
Additional diagram settings for interpolated size rendering. 
 
Contains information about the context of a rendering operation. 
 
QFont scaledFont(const QgsDiagramSettings &s, const QgsRenderContext &c)
Calculates a size to match the current settings and rendering context. 
 
QPainter * painter()
Returns the destination QPainter for the render operation. 
 
QSizeF diagramSize(const QgsAttributes &attributes, const QgsRenderContext &c, const QgsDiagramSettings &s) override
Returns the size in map units the diagram will use to render. 
 
QString classificationField
Name of the field for classification. 
 
bool isEmpty() const
Checks whether the container is empty. 
 
#define DIAGRAM_NAME_TEXT
 
void setPenWidth(QPen &pen, const QgsDiagramSettings &s, const QgsRenderContext &c)
Changes the pen width to match the current settings and rendering context. 
 
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name. 
 
QList< QColor > categoryColors
 
Stores the settings for rendering a single diagram. 
 
LabelPlacementMethod labelPlacementMethod