27#include <QStyleOptionGraphicsItem> 
   32#define M_DEG2RAD 0.0174532925 
   37  double rotToRad = angle * M_PI / 180.0;
 
   39  xRot = x * std::cos( rotToRad ) - y * std::sin( rotToRad );
 
   40  yRot = x * std::sin( rotToRad ) + y * std::cos( rotToRad );
 
 
   47  double clippedAngle = angle;
 
   48  if ( clippedAngle >= 360.0 || clippedAngle <= -360.0 )
 
   50    clippedAngle = std::fmod( clippedAngle, 360.0 );
 
   52  if ( !allowNegative && clippedAngle < 0.0 )
 
   54    clippedAngle += 360.0;
 
 
   65  if ( clippedAngle >= 22.5 && clippedAngle < 67.5 )
 
   69  else if ( clippedAngle >= 67.5 && clippedAngle < 112.5 )
 
   73  else if ( clippedAngle >= 112.5 && clippedAngle < 157.5 )
 
   77  else if ( clippedAngle >= 157.5 && clippedAngle < 202.5 )
 
   81  else if ( clippedAngle >= 202.5 && clippedAngle < 247.5 )
 
   85  else if ( clippedAngle >= 247.5 && clippedAngle < 292.5 )
 
   89  else if ( clippedAngle >= 292.5 && clippedAngle < 337.5 )
 
 
  105    if ( dpi < 0 && painter && painter->device() )
 
  107      context.
setScaleFactor( painter->device()->logicalDpiX() / 25.4 );
 
  124      dpi = ( painter && painter->device() ) ? painter->device()->logicalDpiX() : 88;
 
  126    double dotsPerMM = dpi / 25.4;
 
  130    QSizeF mapSizeLayoutUnits = map->rect().size();
 
 
  160  const double left = !
qgsDoubleNear( boundsBefore.left(), boundsBefore.right() )
 
  161                      ? 
relativePosition( rectToResize.left(), boundsBefore.left(), boundsBefore.right(), boundsAfter.left(), boundsAfter.right() )
 
  162                      : boundsAfter.left();
 
  163  const double right = !
qgsDoubleNear( boundsBefore.left(), boundsBefore.right() )
 
  164                       ? 
relativePosition( rectToResize.right(), boundsBefore.left(), boundsBefore.right(), boundsAfter.left(), boundsAfter.right() )
 
  165                       : boundsAfter.right();
 
  166  const double top = !
qgsDoubleNear( boundsBefore.top(), boundsBefore.bottom() )
 
  167                     ? 
relativePosition( rectToResize.top(), boundsBefore.top(), boundsBefore.bottom(), boundsAfter.top(), boundsAfter.bottom() )
 
  169  const double bottom = !
qgsDoubleNear( boundsBefore.top(), boundsBefore.bottom() )
 
  170                        ? 
relativePosition( rectToResize.bottom(), boundsBefore.top(), boundsBefore.bottom(), boundsAfter.top(), boundsAfter.bottom() )
 
  171                        : boundsAfter.bottom();
 
  173  rectToResize.setRect( left, top, right - left, bottom - top );
 
 
  179  double m = ( afterMax - afterMin ) / ( beforeMax - beforeMin );
 
  180  double c = afterMin - ( beforeMin * m );
 
  183  return m * position + 
c;
 
 
  189  QFont scaledFont = font;
 
  190  double pixelSize = pointsToMM( scaledFont.pointSizeF() ) * FONT_WORKAROUND_SCALE + 0.5;
 
  191  scaledFont.setPixelSize( pixelSize );
 
 
  200  QFontMetricsF fontMetrics( metricsFont );
 
  201  return ( fontMetrics.ascent() / FONT_WORKAROUND_SCALE );
 
 
  209  QFontMetricsF fontMetrics( metricsFont );
 
  210  return ( fontMetrics.descent() / FONT_WORKAROUND_SCALE );
 
 
  219  QFontMetricsF fontMetrics( metricsFont );
 
  220  return ( fontMetrics.height() / FONT_WORKAROUND_SCALE );
 
 
  229  QFontMetricsF fontMetrics( metricsFont );
 
  230  return ( fontMetrics.boundingRect( character ).height() / FONT_WORKAROUND_SCALE );
 
 
  238  const QStringList multiLineSplit = text.split( 
'\n' );
 
  240  QFontMetricsF fontMetrics( metricsFont );
 
  243  for ( 
const QString &line : multiLineSplit )
 
  245    maxWidth = std::max( maxWidth, ( fontMetrics.horizontalAdvance( line ) / FONT_WORKAROUND_SCALE ) );
 
 
  252  QStringList multiLineSplit = text.split( 
'\n' );
 
  253  int lines = multiLineSplit.size();
 
  258  QFontMetricsF fontMetrics( metricsFont );
 
  260  double fontHeight = fontMetrics.ascent() + fontMetrics.descent(); 
 
  261  double textHeight = fontMetrics.ascent() + 
static_cast< double >( ( lines - 1 ) * fontHeight * multiLineHeight );
 
  263  return textHeight / FONT_WORKAROUND_SCALE;
 
 
  278  painter->setFont( textFont );
 
  279  if ( color.isValid() )
 
  281    painter->setPen( color );
 
  283  double scaleFactor = 1.0 / FONT_WORKAROUND_SCALE;
 
  284  painter->scale( scaleFactor, scaleFactor );
 
  285  painter->drawText( position * FONT_WORKAROUND_SCALE, text );
 
 
  288void QgsLayoutUtils::drawText( QPainter *painter, 
const QRectF &rect, 
const QString &text, 
const QFont &font, 
const QColor &color, 
const Qt::AlignmentFlag halignment, 
const Qt::AlignmentFlag valignment, 
const int flags )
 
  299  QRectF scaledRect( rect.x() * FONT_WORKAROUND_SCALE, rect.y() * FONT_WORKAROUND_SCALE,
 
  300                     rect.width() * FONT_WORKAROUND_SCALE, rect.height() * FONT_WORKAROUND_SCALE );
 
  303  painter->setFont( textFont );
 
  304  if ( color.isValid() )
 
  306    painter->setPen( color );
 
  308  double scaleFactor = 1.0 / FONT_WORKAROUND_SCALE;
 
  309  painter->scale( scaleFactor, scaleFactor );
 
  310  painter->drawText( scaledRect, halignment | valignment | flags, text );
 
 
  315  double originalWidth = originalRect.width();
 
  316  double originalHeight = originalRect.height();
 
  317  double boundsWidth = boundsRect.width();
 
  318  double boundsHeight = boundsRect.height();
 
  319  double ratioBoundsRect = boundsWidth / boundsHeight;
 
  329      rectScale = ( ( originalWidth / originalHeight ) > ratioBoundsRect ) ? boundsWidth / originalWidth : boundsHeight / originalHeight;
 
  333      rectScale = ( ( originalHeight / originalWidth ) > ratioBoundsRect ) ? boundsWidth / originalHeight : boundsHeight / originalWidth;
 
  335    double rectScaledWidth = rectScale * originalWidth;
 
  336    double rectScaledHeight = rectScale * originalHeight;
 
  340      return QRectF( ( boundsWidth - rectScaledWidth ) / 2.0, ( boundsHeight - rectScaledHeight ) / 2.0, rectScaledWidth, rectScaledHeight );
 
  344      return QRectF( ( boundsWidth - rectScaledHeight ) / 2.0, ( boundsHeight - rectScaledWidth ) / 2.0, rectScaledWidth, rectScaledHeight );
 
  349  double angleRad = -clippedRotation * 
M_DEG2RAD;
 
  350  double cosAngle = std::cos( angleRad );
 
  351  double sinAngle = std::sin( angleRad );
 
  354  double widthBoundsRotatedRect = originalWidth * std::fabs( cosAngle ) + originalHeight * std::fabs( sinAngle );
 
  355  double heightBoundsRotatedRect = originalHeight * std::fabs( cosAngle ) + originalWidth * std::fabs( sinAngle );
 
  359  double ratioBoundsRotatedRect = widthBoundsRotatedRect / heightBoundsRotatedRect;
 
  360  double rectScale = ratioBoundsRotatedRect > ratioBoundsRect ? boundsWidth / widthBoundsRotatedRect : boundsHeight / heightBoundsRotatedRect;
 
  361  double rectScaledWidth = rectScale * originalWidth;
 
  362  double rectScaledHeight = rectScale * originalHeight;
 
  366  double currentCornerX = 0;
 
  368  currentCornerX += rectScaledWidth * cosAngle;
 
  369  minX = minX < currentCornerX ? minX : currentCornerX;
 
  370  currentCornerX += rectScaledHeight * sinAngle;
 
  371  minX = minX < currentCornerX ? minX : currentCornerX;
 
  372  currentCornerX -= rectScaledWidth * cosAngle;
 
  373  minX = minX < currentCornerX ? minX : currentCornerX;
 
  375  double currentCornerY = 0;
 
  377  currentCornerY -= rectScaledWidth * sinAngle;
 
  378  minY = minY < currentCornerY ? minY : currentCornerY;
 
  379  currentCornerY += rectScaledHeight * cosAngle;
 
  380  minY = minY < currentCornerY ? minY : currentCornerY;
 
  381  currentCornerY += rectScaledWidth * sinAngle;
 
  382  minY = minY < currentCornerY ? minY : currentCornerY;
 
  385  double offsetX = ratioBoundsRotatedRect > ratioBoundsRect ? 0 : ( boundsWidth - rectScale * widthBoundsRotatedRect ) / 2.0;
 
  386  offsetX += std::fabs( minX );
 
  387  double offsetY = ratioBoundsRotatedRect > ratioBoundsRect ? ( boundsHeight - rectScale * heightBoundsRotatedRect ) / 2.0 : 0;
 
  388  offsetY += std::fabs( minY );
 
  390  return QRectF( offsetX, offsetY, rectScaledWidth, rectScaledHeight );
 
 
  395  QString s = 
string.trimmed();
 
  396  if ( s.compare( QLatin1String( 
"Portrait" ), Qt::CaseInsensitive ) == 0 )
 
  401  else if ( s.compare( QLatin1String( 
"Landscape" ), Qt::CaseInsensitive ) == 0 )
 
 
  412#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 
  421  return !
qgsDoubleNear( style->matrix.m11(), 0.0 ) ? style->matrix.m11() : style->matrix.m12();
 
 
  431  return QStyleOptionGraphicsItem::levelOfDetailFromTransform( painter->worldTransform() );
 
 
  445  const auto layers = project->
mapLayers();
 
  446  for ( 
auto it = layers.constBegin(); it != layers.constEnd(); ++it )
 
  448    if ( it.value()->name().compare( 
string, Qt::CaseInsensitive ) == 0 )
 
 
  458  double s = std::pow( 10.0, std::floor( std::log10( a ) ) ) / d;
 
  459  return std::ceil( a / s ) * s;
 
 
  465  double s = std::pow( 10.0, std::floor( std::log10( a ) ) ) / d;
 
  466  return std::floor( a / s ) * s;
 
 
  471  if ( maximumSize < minimumSize )
 
  485    while ( lowerNiceUnitsPerSeg > maximumSize && upperNiceUnitsPerSeg < minimumSize )
 
  493    return upperNiceUnitsPerSeg < minimumSize ? lowerNiceUnitsPerSeg : upperNiceUnitsPerSeg;
 
 
  503  QList< QgsLayoutItemMap * > maps;
 
  507    if ( map->itemClippingSettings()->isActive() && map->itemClippingSettings()->sourceItem() == item )
 
 
  513double QgsLayoutUtils::pointsToMM( 
const double pointSize )
 
  516  return ( pointSize * 0.3527 );
 
  519double QgsLayoutUtils::mmToPoints( 
const double mmSize )
 
  522  return ( mmSize / 0.3527 );
 
  528  QVector< double > mapScales;
 
  533  if ( !hasProjectScales || mapScales.isEmpty() )
 
  538    for ( 
const QString &scale : scales )
 
  540      QStringList parts( scale.split( 
':' ) );
 
  541      if ( parts.size() == 2 )
 
  543        mapScales.push_back( parts[1].toDouble() );
 
 
@ Millimeters
Millimeters.
 
Layout graphical items for displaying a map.
 
QgsMapSettings mapSettings(const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings) const
Returns map settings that will be used for drawing of the map.
 
QgsRectangle extent() const
Returns the current map extent.
 
Orientation
Page orientation.
 
@ Landscape
Landscape orientation.
 
@ Portrait
Portrait orientation.
 
Base class for graphical items within a QgsLayout.
 
@ FlagProvidesClipPath
Item can act as a clipping path provider (see clipPath())
 
virtual Flags itemFlags() const
Returns the item's flags, which indicate how the item behaves.
 
const QgsLayout * layout() const
Returns the layout the object is attached to.
 
Qgis::TextRenderFormat textRenderFormat() const
Returns the text render format, which dictates how text is rendered (e.g.
 
Qgis::RenderContextFlags renderContextFlags() const
Returns the combination of render context flags matched to the layout context's settings.
 
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
 
static QVector< double > predefinedScales(const QgsLayout *layout)
Returns a list of predefined scales associated with a layout.
 
static double fontHeightMM(const QFont &font)
Calculate a font height in millimeters, including workarounds for QT font rendering issues.
 
static double relativePosition(double position, double beforeMin, double beforeMax, double afterMin, double afterMax)
Returns a scaled position given a before and after range.
 
static double fontDescentMM(const QFont &font)
Calculate a font descent in millimeters, including workarounds for QT font rendering issues.
 
static double fontAscentMM(const QFont &font)
Calculates a font ascent in millimeters, including workarounds for QT font rendering issues.
 
static QRectF largestRotatedRectWithinBounds(const QRectF &originalRect, const QRectF &boundsRect, double rotation)
Calculates the largest scaled version of originalRect which fits within boundsRect,...
 
static QFont scaledFontPixelSize(const QFont &font)
Returns a font where size is set in points and the size has been upscaled with FONT_WORKAROUND_SCALE ...
 
static QgsRenderContext createRenderContextForMap(QgsLayoutItemMap *map, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout map and painter destination.
 
static bool itemIsAClippingSource(const QgsLayoutItem *item)
Returns true if an item is a clipping item for another layout item.
 
static double snappedAngle(double angle)
Snaps an angle (in degrees) to its closest 45 degree angle.
 
static double textHeightMM(const QFont &font, const QString &text, double multiLineHeight=1.0)
Calculate a font height in millimeters for a text string, including workarounds for QT font rendering...
 
static QgsLayoutItemPage::Orientation decodePaperOrientation(const QString &string, bool &ok)
Decodes a string representing a paper orientation and returns the decoded orientation.
 
static void rotate(double angle, double &x, double &y)
Rotates a point / vector around the origin.
 
static double fontHeightCharacterMM(const QFont &font, QChar character)
Calculate a font height in millimeters of a single character, including workarounds for QT font rende...
 
static double normalizedAngle(double angle, bool allowNegative=false)
Ensures that an angle (in degrees) is in the range 0 <= angle < 360.
 
static void drawText(QPainter *painter, QPointF position, const QString &text, const QFont &font, const QColor &color=QColor())
Draws text on a painter at a specific position, taking care of layout specific issues (calculation to...
 
static double textWidthMM(const QFont &font, const QString &text)
Calculate a font width in millimeters for a text string, including workarounds for QT font rendering ...
 
static double calculatePrettySize(double minimumSize, double maximumSize)
Calculates a "pretty" size which falls between the range [minimumSize, maximumSize].
 
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProject *project)
Resolves a string into a map layer from a given project.
 
static Q_DECL_DEPRECATED double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
 
static void relativeResizeRect(QRectF &rectToResize, const QRectF &boundsBefore, const QRectF &boundsAfter)
Resizes a QRectF relative to a resized bounding rectangle.
 
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
 
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout's render context, which stores information relating to the current ...
 
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
 
QgsLayoutItemMap * referenceMap() const
Returns the map item which will be used to generate corresponding world files when the layout is expo...
 
QgsLayoutMeasurement convertFromLayoutUnits(double length, Qgis::LayoutUnit unit) const
Converts a length measurement from the layout's native units to a specified target unit.
 
QgsProject * project() const
The project associated with the layout.
 
Base class for all map layer types.
 
Contains configuration for rendering maps.
 
bool useProjectScales() const
Returns true if project mapScales() are enabled.
 
QVector< double > mapScales() const
Returns the list of custom project map scales.
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
 
Q_INVOKABLE QList< QgsMapLayer * > mapLayersByName(const QString &layerName) const
Retrieve a list of matching registered layers by layer name.
 
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
 
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
 
A rectangle specified with double values.
 
Contains information about the context of a rendering operation.
 
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
 
void setTextRenderFormat(Qgis::TextRenderFormat format)
Sets the text render format, which dictates how text is rendered (e.g.
 
void setFlags(Qgis::RenderContextFlags flags)
Set combination of flags that will be used for rendering.
 
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
 
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
 
Scoped object for saving and restoring a QPainter object's state.
 
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
 
static const QgsSettingsEntryStringList * settingsMapScales
 
Stores settings for use within QGIS.
 
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)
 
double prevNiceNumber(double a, double d=1)
 
double nextNiceNumber(double a, double d=1)