49#include <QApplication>
53#include <QStyleOptionGraphicsItem>
56#include "moc_qgslayoutitemmap.cpp"
58using namespace Qt::StringLiterals;
68 mBackgroundUpdateTimer =
new QTimer(
this );
69 mBackgroundUpdateTimer->setSingleShot(
true );
70 connect( mBackgroundUpdateTimer, &QTimer::timeout,
this, &QgsLayoutItemMap::recreateCachedImageInBackground );
74 setCacheMode( QGraphicsItem::NoCache );
78 mGridStack = std::make_unique< QgsLayoutItemMapGridStack >(
this );
79 mOverviewStack = std::make_unique< QgsLayoutItemMapOverviewStack >(
this );
87 crs.updateDefinition();
105 mPainterJob->cancel();
130 QList<QgsLayoutItemMap *> mapsList;
131 mLayout->layoutItems( mapsList );
140 if ( map->mMapId == mMapId )
143 maxId = std::max( maxId, map->mMapId );
148 mLayout->itemsModel()->updateItemDisplayName(
this );
160 return tr(
"Map %1" ).arg( mMapId );
172 mCachedLayerStyleOverridesPresetName.clear();
176 updateAtlasFeature();
181 if ( rect().isEmpty() || !
mLayout )
186 calculator.
setDpi( 25.4 );
189 calculator.
setMethod( project->scaleMethod() );
197 double currentScaleDenominator =
scale();
204 double scaleRatio = scaleDenominator / currentScaleDenominator;
205 mExtent.scale( scaleRatio );
207 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
214 calculator.
setDpi( 25.4 );
220 const double newScale = calculator.
calculate( mExtent, rect().width() );
223 scaleRatio = scaleDenominator / newScale;
224 mExtent.scale( scaleRatio );
249 if ( mExtent.isFinite() && !mExtent.isEmpty() )
251 const QRectF currentRect = rect();
252 const double newHeight = mExtent.width() == 0 ? 0 : currentRect.width() * mExtent.height() / mExtent.width();
264 double currentWidthHeightRatio = 1.0;
265 if ( !currentExtent.
isEmpty() )
266 currentWidthHeightRatio = currentExtent.
width() / currentExtent.
height();
268 currentWidthHeightRatio = rect().width() / rect().height();
270 if ( currentWidthHeightRatio != 0 && !std::isnan( currentWidthHeightRatio ) && !newExtent.
isEmpty() )
272 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
274 if ( currentWidthHeightRatio < newWidthHeightRatio )
277 double newHeight = newExtent.
width() / currentWidthHeightRatio;
278 double deltaHeight = newHeight - newExtent.
height();
285 double newWidth = currentWidthHeightRatio * newExtent.
height();
286 double deltaWidth = newWidth - newExtent.
width();
292 if ( mExtent == newExtent )
311QPolygonF QgsLayoutItemMap::calculateVisibleExtentPolygon(
bool includeClipping )
const
314 mapPolygon( mExtent, poly );
316 if ( includeClipping )
323 poly = poly.intersected( geom.asQPolygonF() );
327 if ( mItemClippingSettings->isActive() )
329 const QgsGeometry geom = mItemClippingSettings->clippedMapExtent();
342 return calculateVisibleExtentPolygon(
true );
347 if ( mCrs.isValid() )
350 return mLayout->project()->crs();
365 return _qgis_listRefToRaw( mLayers );
370 mGroupLayers.clear();
372 QList<QgsMapLayer *> layersCopy {
layers };
377 for (
auto it = layersCopy.begin(); it != layersCopy.end(); ++it )
379 if (
const QgsGroupLayer *groupLayer = qobject_cast<QgsGroupLayer *>( *it ) )
381 auto existingIt = mGroupLayers.find( groupLayer->id() );
382 if ( existingIt != mGroupLayers.end() )
384 *it = ( *existingIt ).second.get();
388 std::unique_ptr<QgsGroupLayer> groupLayerClone { groupLayer->clone() };
391 groupLayerClone->setId( groupLayer->id() );
392 mGroupLayers[groupLayer->id()] = std::move( groupLayerClone );
393 *it = mGroupLayers[groupLayer->id()].get();
397 mLayers = _qgis_listRawToRef( layersCopy );
402 if ( overrides == mLayerStyleOverrides )
405 mLayerStyleOverrides = overrides;
411 mLayerStyleOverrides.clear();
418 mLayerStyleOverrides.insert( layer->id(), style.
xmlData() );
425 if ( mFollowVisibilityPreset == follow )
428 mFollowVisibilityPreset = follow;
430 if ( !mFollowVisibilityPresetName.isEmpty() )
431 emit
themeChanged( mFollowVisibilityPreset ? mFollowVisibilityPresetName : QString() );
436 if ( name == mFollowVisibilityPresetName )
439 mFollowVisibilityPresetName = name;
440 if ( mFollowVisibilityPreset )
446 mLastRenderedImageOffsetX -= dx;
447 mLastRenderedImageOffsetY -= dy;
450 transformShift( dx, dy );
451 mExtent.setXMinimum( mExtent.xMinimum() + dx );
452 mExtent.setXMaximum( mExtent.xMaximum() + dx );
453 mExtent.setYMinimum( mExtent.yMinimum() + dy );
454 mExtent.setYMaximum( mExtent.yMaximum() + dy );
473 double mapX = mExtent.xMinimum() + ( point.x() / rect().width() ) * ( mExtent.xMaximum() - mExtent.xMinimum() );
474 double mapY = mExtent.yMinimum() + ( 1 - ( point.y() / rect().height() ) ) * ( mExtent.yMaximum() - mExtent.yMinimum() );
477 double centerX = ( mExtent.xMaximum() + mExtent.xMinimum() ) / 2;
478 double centerY = ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2;
480 centerX = mapX + ( centerX - mapX ) * ( 1.0 / factor );
481 centerY = mapY + ( centerY - mapY ) * ( 1.0 / factor );
483 double newIntervalX, newIntervalY;
487 newIntervalX = ( mExtent.xMaximum() - mExtent.xMinimum() ) / factor;
488 newIntervalY = ( mExtent.yMaximum() - mExtent.yMinimum() ) / factor;
495 mExtent.setXMaximum( centerX + newIntervalX / 2 );
496 mExtent.setXMinimum( centerX - newIntervalX / 2 );
497 mExtent.setYMaximum( centerY + newIntervalY / 2 );
498 mExtent.setYMinimum( centerY - newIntervalY / 2 );
500 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
507 calculator.
setDpi( 25.4 );
512 const double newScale = calculator.
calculate( mExtent, rect().width() );
515 const double scaleRatio =
scale() / newScale;
516 mExtent.scale( scaleRatio );
533 if ( layer->dataProvider() && layer->providerType() ==
"wms"_L1 )
543 if (
blendMode() != QPainter::CompositionMode_SourceOver )
562 auto containsAdvancedEffectsIgnoreItemOpacity = [
this]() ->
bool {
571 if ( mOverviewStack->containsAdvancedEffects() )
579 if ( mGridStack->containsAdvancedEffects() )
592 if ( !containsAdvancedEffectsIgnoreItemOpacity() )
613 if ( mOverviewStack->containsAdvancedEffects() )
621 if ( mGridStack->containsAdvancedEffects() )
636 mMapRotation = rotation;
637 mEvaluatedMapRotation = mMapRotation;
650 mAtlasDriven = enabled;
667 double margin = mAtlasMargin;
675 margin = ddMargin / 100;
687 if ( mGridStack->size() < 1 )
690 mGridStack->addGrid(
grid );
692 return mGridStack->grid( 0 );
697 if ( mOverviewStack->size() < 1 )
700 mOverviewStack->addOverview(
overview );
702 return mOverviewStack->overview( 0 );
712 for (
int i = 0; i < mGridStack->size(); ++i )
715 if (
grid->mEvaluatedEnabled )
718 frameBleed = std::max( frameBleed,
grid->mEvaluatedGridFrameWidth +
grid->mEvaluatedGridFrameMargin +
grid->mEvaluatedGridFrameLineThickness / 2.0 );
733 mapElem.setAttribute( u
"keepLayerSet"_s, u
"true"_s );
737 mapElem.setAttribute( u
"keepLayerSet"_s, u
"false"_s );
740 if ( mDrawAnnotations )
742 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"true"_s );
746 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"false"_s );
750 QDomElement extentElem = doc.createElement( u
"Extent"_s );
755 mapElem.appendChild( extentElem );
757 if ( mCrs.isValid() )
759 QDomElement crsElem = doc.createElement( u
"crs"_s );
760 mCrs.writeXml( crsElem, doc );
761 mapElem.appendChild( crsElem );
765 mapElem.setAttribute( u
"followPreset"_s, mFollowVisibilityPreset ? u
"true"_s : u
"false"_s );
766 mapElem.setAttribute( u
"followPresetName"_s, mFollowVisibilityPresetName );
769 mapElem.setAttribute( u
"mapRotation"_s, QString::number( mMapRotation ) );
772 QDomElement layerSetElem = doc.createElement( u
"LayerSet"_s );
777 QDomElement layerElem = doc.createElement( u
"Layer"_s );
779 const auto it = std::find_if( mGroupLayers.cbegin(), mGroupLayers.cend(), [&layerRef](
const std::pair<
const QString, std::unique_ptr<QgsGroupLayer>> &groupLayer ) ->
bool {
780 return groupLayer.second.get() == layerRef.get();
783 if ( it != mGroupLayers.end() )
789 layerId = layerRef.layerId;
792 QDomText layerIdText = doc.createTextNode( layerId );
793 layerElem.appendChild( layerIdText );
795 layerElem.setAttribute( u
"name"_s, layerRef.name );
796 layerElem.setAttribute( u
"source"_s, layerRef.source );
797 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
799 if ( it != mGroupLayers.end() )
801 const auto childLayers { it->second->childLayers() };
802 QDomElement childLayersElement = doc.createElement( u
"childLayers"_s );
803 for (
const QgsMapLayer *childLayer : std::as_const( childLayers ) )
805 QDomElement childElement = doc.createElement( u
"child"_s );
806 childElement.setAttribute( u
"layerid"_s, childLayer->id() );
807 childLayersElement.appendChild( childElement );
809 layerElem.appendChild( childLayersElement );
811 layerSetElem.appendChild( layerElem );
813 mapElem.appendChild( layerSetElem );
816 if ( mKeepLayerStyles )
818 QDomElement stylesElem = doc.createElement( u
"LayerStyles"_s );
819 for (
auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
821 QDomElement styleElem = doc.createElement( u
"LayerStyle"_s );
826 styleElem.setAttribute( u
"layerid"_s, ref.
layerId );
827 styleElem.setAttribute( u
"name"_s, ref.
name );
828 styleElem.setAttribute( u
"source"_s, ref.
source );
829 styleElem.setAttribute( u
"provider"_s, ref.
provider );
833 stylesElem.appendChild( styleElem );
835 mapElem.appendChild( stylesElem );
839 mGridStack->writeXml( mapElem, doc, context );
842 mOverviewStack->writeXml( mapElem, doc, context );
845 QDomElement atlasElem = doc.createElement( u
"AtlasMap"_s );
846 atlasElem.setAttribute( u
"atlasDriven"_s, mAtlasDriven );
847 atlasElem.setAttribute( u
"scalingMode"_s, mAtlasScalingMode );
849 mapElem.appendChild( atlasElem );
851 mapElem.setAttribute( u
"labelMargin"_s, mLabelMargin.encodeMeasurement() );
852 mapElem.setAttribute( u
"mapFlags"_s,
static_cast< int>( mMapFlags ) );
854 QDomElement labelBlockingItemsElem = doc.createElement( u
"labelBlockingItems"_s );
855 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
860 QDomElement blockingItemElem = doc.createElement( u
"item"_s );
861 blockingItemElem.setAttribute( u
"uuid"_s, item->uuid() );
862 labelBlockingItemsElem.appendChild( blockingItemElem );
864 mapElem.appendChild( labelBlockingItemsElem );
867 mapElem.setAttribute( u
"isTemporal"_s,
isTemporal() ? 1 : 0 );
870 mapElem.setAttribute( u
"temporalRangeBegin"_s,
temporalRange().begin().toString( Qt::ISODate ) );
871 mapElem.setAttribute( u
"temporalRangeEnd"_s,
temporalRange().end().toString( Qt::ISODate ) );
874 mapElem.setAttribute( u
"enableZRange"_s, mZRangeEnabled ? 1 : 0 );
875 if ( mZRange.lower() != std::numeric_limits< double >::lowest() )
877 if ( mZRange.upper() != std::numeric_limits< double >::max() )
880 mAtlasClippingSettings->writeXml( mapElem, doc, context );
881 mItemClippingSettings->writeXml( mapElem, doc, context );
888 mUpdatesEnabled =
false;
891 QDomNodeList extentNodeList = itemElem.elementsByTagName( u
"Extent"_s );
892 if ( !extentNodeList.isEmpty() )
894 QDomElement extentElem = extentNodeList.at( 0 ).toElement();
895 double xmin, xmax, ymin, ymax;
896 xmin = extentElem.attribute( u
"xmin"_s ).toDouble();
897 xmax = extentElem.attribute( u
"xmax"_s ).toDouble();
898 ymin = extentElem.attribute( u
"ymin"_s ).toDouble();
899 ymax = extentElem.attribute( u
"ymax"_s ).toDouble();
903 QDomNodeList crsNodeList = itemElem.elementsByTagName( u
"crs"_s );
905 if ( !crsNodeList.isEmpty() )
907 QDomElement crsElem = crsNodeList.at( 0 ).toElement();
908 crs.readXml( crsElem );
913 mMapRotation = itemElem.attribute( u
"mapRotation"_s, u
"0"_s ).toDouble();
914 mEvaluatedMapRotation = mMapRotation;
917 mFollowVisibilityPreset = itemElem.attribute( u
"followPreset"_s ).compare(
"true"_L1 ) == 0;
918 mFollowVisibilityPresetName = itemElem.attribute( u
"followPresetName"_s );
921 QString keepLayerSetFlag = itemElem.attribute( u
"keepLayerSet"_s );
922 if ( keepLayerSetFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
924 mKeepLayerSet =
true;
928 mKeepLayerSet =
false;
931 QString drawCanvasItemsFlag = itemElem.attribute( u
"drawCanvasItems"_s, u
"true"_s );
932 if ( drawCanvasItemsFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
934 mDrawAnnotations =
true;
938 mDrawAnnotations =
false;
941 mLayerStyleOverrides.clear();
943 QList<QgsMapLayerRef> layerSet;
944 QDomNodeList layerSetNodeList = itemElem.elementsByTagName( u
"LayerSet"_s );
945 if ( !layerSetNodeList.isEmpty() )
947 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
948 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
949 layerSet.reserve( layerIdNodeList.size() );
950 for (
int i = 0; i < layerIdNodeList.size(); ++i )
952 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
953 QString layerId = layerElem.text();
954 QString layerName = layerElem.attribute( u
"name"_s );
955 QString layerSource = layerElem.attribute( u
"source"_s );
956 QString layerProvider = layerElem.attribute( u
"provider"_s );
958 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
966 setLayers( _qgis_listRefToRaw( layerSet ) );
969 if ( !layerSetNodeList.isEmpty() )
971 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
972 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
973 for (
int i = 0; i < layerIdNodeList.size(); ++i )
975 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
976 const QString layerId = layerElem.text();
977 const auto it = mGroupLayers.find( layerId );
978 if ( it != mGroupLayers.cend() )
980 QList<QgsMapLayerRef> childSet;
981 const QDomNodeList childLayersElements = layerElem.elementsByTagName( u
"childLayers"_s );
982 const QDomNodeList children = childLayersElements.at( 0 ).childNodes();
983 for (
int i = 0; i < children.size(); ++i )
985 const QDomElement childElement = children.at( i ).toElement();
986 const QString
id = childElement.attribute( u
"layerid"_s );
990 childSet.push_back( layerRef );
993 it->second->setChildLayers( _qgis_listRefToRaw( childSet ) );
1000 QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( u
"LayerStyles"_s );
1001 mKeepLayerStyles = !layerStylesNodeList.isEmpty();
1002 if ( mKeepLayerStyles )
1004 QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
1005 QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( u
"LayerStyle"_s );
1006 for (
int i = 0; i < layerStyleNodeList.size(); ++i )
1008 const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
1009 QString layerId = layerStyleElement.attribute( u
"layerid"_s );
1010 QString layerName = layerStyleElement.attribute( u
"name"_s );
1011 QString layerSource = layerStyleElement.attribute( u
"source"_s );
1012 QString layerProvider = layerStyleElement.attribute( u
"provider"_s );
1013 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1017 style.
readXml( layerStyleElement );
1023 mNumCachedLayers = 0;
1024 mCacheInvalidated =
true;
1027 mOverviewStack->readXml( itemElem, doc, context );
1030 mGridStack->readXml( itemElem, doc, context );
1033 QDomNodeList atlasNodeList = itemElem.elementsByTagName( u
"AtlasMap"_s );
1034 if ( !atlasNodeList.isEmpty() )
1036 QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
1037 mAtlasDriven = ( atlasElem.attribute( u
"atlasDriven"_s, u
"0"_s ) !=
"0"_L1 );
1038 if ( atlasElem.hasAttribute( u
"fixedScale"_s ) )
1040 mAtlasScalingMode = ( atlasElem.attribute( u
"fixedScale"_s, u
"0"_s ) !=
"0"_L1 ) ?
Fixed :
Auto;
1042 else if ( atlasElem.hasAttribute( u
"scalingMode"_s ) )
1044 mAtlasScalingMode =
static_cast<AtlasScalingMode>( atlasElem.attribute( u
"scalingMode"_s ).toInt() );
1046 mAtlasMargin = atlasElem.attribute( u
"margin"_s, u
"0.1"_s ).toDouble();
1051 mMapFlags =
static_cast< MapItemFlags>( itemElem.attribute( u
"mapFlags"_s,
nullptr ).toInt() );
1054 mBlockingLabelItems.clear();
1055 mBlockingLabelItemUuids.clear();
1056 QDomNodeList labelBlockingNodeList = itemElem.elementsByTagName( u
"labelBlockingItems"_s );
1057 if ( !labelBlockingNodeList.isEmpty() )
1059 QDomElement blockingItems = labelBlockingNodeList.at( 0 ).toElement();
1060 QDomNodeList labelBlockingNodeList = blockingItems.childNodes();
1061 for (
int i = 0; i < labelBlockingNodeList.size(); ++i )
1063 const QDomElement &itemBlockingElement = labelBlockingNodeList.at( i ).toElement();
1064 const QString itemUuid = itemBlockingElement.attribute( u
"uuid"_s );
1065 mBlockingLabelItemUuids << itemUuid;
1069 mAtlasClippingSettings->readXml( itemElem, doc, context );
1070 mItemClippingSettings->readXml( itemElem, doc, context );
1075 setIsTemporal( itemElem.attribute( u
"isTemporal"_s ).toInt() );
1078 const QDateTime begin = QDateTime::fromString( itemElem.attribute( u
"temporalRangeBegin"_s ), Qt::ISODate );
1079 const QDateTime end = QDateTime::fromString( itemElem.attribute( u
"temporalRangeEnd"_s ), Qt::ISODate );
1083 mZRangeEnabled = itemElem.attribute( u
"enableZRange"_s ).toInt();
1085 double zLower = itemElem.attribute( u
"zRangeLower"_s ).toDouble( &ok );
1088 zLower = std::numeric_limits< double >::lowest();
1090 double zUpper = itemElem.attribute( u
"zRangeUpper"_s ).toDouble( &ok );
1093 zUpper = std::numeric_limits< double >::max();
1097 mUpdatesEnabled =
true;
1101bool QgsLayoutItemMap::hasCustomFramePath()
const
1112 return mItemClippingSettings->isActive();
1117 QPainterPath customFramePath;
1118 if ( mAtlasClippingSettings->enabled() && mAtlasClippingSettings->clipItemShape() )
1123 QPolygonF visibleExtent = calculateVisibleExtentPolygon(
false );
1124 QPolygonF rectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
1127 visibleExtent.pop_back();
1128 rectPoly.pop_back();
1131 QTransform transform;
1132 QTransform::quadToQuad( visibleExtent, rectPoly, transform );
1142 if ( mItemClippingSettings->isActive() )
1144 const QgsGeometry g = mItemClippingSettings->clipPathInMapItemCoordinates();
1147 if ( !customFramePath.isEmpty() )
1150 customFramePath.closeSubpath();
1164 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
1173 QRectF thisPaintRect = rect();
1179 if (
mLayout->renderContext().isPreviewRender() )
1181 bool renderInProgress =
false;
1182 mPreviewDevicePixelRatio = painter->device()->devicePixelRatioF();
1185 painter->setClipRect( thisPaintRect );
1186 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
1189 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
1190 painter->drawRect( thisPaintRect );
1191 painter->setBrush( Qt::NoBrush );
1193 messageFont.setPointSize( 12 );
1194 painter->setFont( messageFont );
1195 painter->setPen( QColor( 255, 255, 255, 255 ) );
1196 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering map" ) );
1197 if ( mPainterJob && mCacheInvalidated && !mDrawingPreview )
1201 mBackgroundUpdateTimer->start( 100 );
1203 else if ( !mPainterJob && !mDrawingPreview )
1207 mBackgroundUpdateTimer->start( 100 );
1209 renderInProgress =
true;
1213 if ( mCacheInvalidated && !mDrawingPreview )
1217 mBackgroundUpdateTimer->start( 100 );
1218 renderInProgress =
true;
1223 double imagePixelWidth = mCacheFinalImage->width();
1224 double scale = rect().width() / imagePixelWidth * mCacheFinalImage->devicePixelRatio();
1228 painter->translate( mLastRenderedImageOffsetX + mXOffset, mLastRenderedImageOffsetY + mYOffset );
1229 painter->setCompositionMode( blendModeForRender() );
1231 painter->drawImage( 0, 0, *mCacheFinalImage );
1236 painter->setClipRect( thisPaintRect, Qt::NoClip );
1238 mOverviewStack->drawItems( painter,
false );
1239 mGridStack->drawItems( painter );
1241 drawMapFrame( painter );
1243 if ( renderInProgress )
1254 QPaintDevice *paintDevice = painter->device();
1262 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
1271 int widthInPixels =
static_cast< int >( std::round(
boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
1272 int heightInPixels =
static_cast< int >( std::round(
boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
1273 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
1275 image.fill( Qt::transparent );
1276 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1277 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1278 double dotsPerMM = destinationDpi / 25.4;
1279 QPainter p( &image );
1282 QRect imagePaintRect(
1283 static_cast< int >( std::round( tl.x() * dotsPerMM ) ),
1284 static_cast< int >( std::round( tl.y() * dotsPerMM ) ),
1285 static_cast< int >( std::round( thisPaintRect.width() * dotsPerMM ) ),
1286 static_cast< int >( std::round( thisPaintRect.height() * dotsPerMM ) )
1288 p.setClipRect( imagePaintRect );
1290 p.translate( imagePaintRect.topLeft() );
1294 if ( shouldDrawPart( Background ) )
1296 p.scale( dotsPerMM, dotsPerMM );
1297 drawMapBackground( &p );
1298 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
1301 drawMap( &p, cExtent, imagePaintRect.size(), image.logicalDpiX() );
1306 p.scale( dotsPerMM, dotsPerMM );
1308 if ( shouldDrawPart( OverviewMapExtent ) )
1310 mOverviewStack->drawItems( &p,
false );
1312 if ( shouldDrawPart( Grid ) )
1314 mGridStack->drawItems( &p );
1319 painter->setCompositionMode( blendModeForRender() );
1320 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1321 painter->drawImage( QPointF( -tl.x() * dotsPerMM, -tl.y() * dotsPerMM ), image );
1322 painter->scale( dotsPerMM, dotsPerMM );
1327 if ( shouldDrawPart( Background ) )
1329 drawMapBackground( painter );
1333 painter->setClipRect( thisPaintRect );
1338 painter->translate( mXOffset, mYOffset );
1340 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
1342 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1344 if ( mCurrentExportPart != NotLayered )
1346 if ( !mStagedRendererJob )
1348 createStagedRenderJob( cExtent, size, paintDevice->logicalDpiX() );
1351 mStagedRendererJob->renderCurrentPart( painter );
1355 drawMap( painter, cExtent, size, paintDevice->logicalDpiX() );
1359 painter->setClipRect( thisPaintRect, Qt::NoClip );
1361 if ( shouldDrawPart( OverviewMapExtent ) )
1363 mOverviewStack->drawItems( painter,
false );
1365 if ( shouldDrawPart( Grid ) )
1367 mGridStack->drawItems( painter );
1372 if ( shouldDrawPart( Frame ) )
1374 drawMapFrame( painter );
1385 + ( layerCount + ( layerCount ? 1 : 0 ) )
1386 + ( mGridStack->hasEnabledItems() ? 1 : 0 )
1387 + ( mOverviewStack->hasEnabledItems() ? 1 : 0 )
1393 mCurrentExportPart = Start;
1395 mExportThemes = !mFollowVisibilityPreset ?
mLayout->renderContext().exportThemes() : QStringList();
1396 mExportThemeIt = mExportThemes.begin();
1401 mCurrentExportPart = NotLayered;
1402 mExportThemes.clear();
1403 mExportThemeIt = mExportThemes.begin();
1408 switch ( mCurrentExportPart )
1413 mCurrentExportPart = Background;
1419 mCurrentExportPart = Layer;
1423 if ( mStagedRendererJob )
1425 if ( mStagedRendererJob->nextPart() )
1429 mExportLabelingResults.reset( mStagedRendererJob->takeLabelingResults() );
1430 mStagedRendererJob.reset();
1434 if ( mExportThemeIt != mExportThemes.end() && ++mExportThemeIt != mExportThemes.end() )
1440 if ( mGridStack->hasEnabledItems() )
1442 mCurrentExportPart = Grid;
1448 for (
int i = 0; i < mOverviewStack->size(); ++i )
1453 mCurrentExportPart = OverviewMapExtent;
1459 case OverviewMapExtent:
1462 mCurrentExportPart = Frame;
1469 if ( isSelected() && !
mLayout->renderContext().isPreviewRender() )
1471 mCurrentExportPart = SelectionBoxes;
1476 case SelectionBoxes:
1477 mCurrentExportPart = End;
1498 switch ( mCurrentExportPart )
1508 if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
1511 if ( mStagedRendererJob )
1513 switch ( mStagedRendererJob->currentStage() )
1517 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1518 detail.
compositionMode = mStagedRendererJob->currentLayerCompositionMode();
1519 detail.
opacity = mStagedRendererJob->currentLayerOpacity();
1527 else if (
mLayout->project()->mainAnnotationLayer()->id() == detail.
mapLayerId )
1538 const QList<QgsLayoutItemMapOverview *> res = mOverviewStack->asList();
1544 if ( item->mapLayer() && detail.
mapLayerId == item->mapLayer()->id() )
1549 detail.
name = u
"%1: %2"_s.arg(
displayName(), item->mapLayer()->name() );
1558 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1564 detail.
name = tr(
"%1: %2 (Labels)" ).arg(
displayName(), layer->name() );
1599 case OverviewMapExtent:
1607 case SelectionBoxes:
1622void QgsLayoutItemMap::drawMap( QPainter *painter,
const QgsRectangle &extent, QSizeF size,
double dpi )
1636 if ( shouldDrawPart( OverviewMapExtent ) )
1638 ms.setLayers( mOverviewStack->modifyMapLayerList( ms.layers() ) );
1641 QgsMapRendererCustomPainterJob job( ms, painter );
1642#ifdef HAVE_SERVER_PYTHON_PLUGINS
1643 job.setFeatureFilterProvider(
mLayout->renderContext().featureFilterProvider() );
1646 QgsGroupedFeatureFilterProvider jobFeatureFilter;
1649 jobFeatureFilter.
addProvider( mAtlasFeatureFilterProvider.get() );
1650 if ( job.featureFilterProvider() )
1652 jobFeatureFilter.
addProvider( job.featureFilterProvider() );
1654 job.setFeatureFilterProvider( &jobFeatureFilter );
1660 job.renderSynchronously();
1662 mExportLabelingResults.reset( job.takeLabelingResults() );
1664 mRenderingErrors = job.errors();
1668 mRenderingErrors.append( QgsMapRendererJob::Error( QString(), u
"Invalid layer(s)"_s ) );
1672void QgsLayoutItemMap::recreateCachedImageInBackground()
1677 QgsMapRendererCustomPainterJob *oldJob = mPainterJob.release();
1678 QPainter *oldPainter = mPainter.release();
1679 QImage *oldImage = mCacheRenderingImage.release();
1681 oldJob->deleteLater();
1689 mCacheRenderingImage.reset(
nullptr );
1693 Q_ASSERT( !mPainterJob );
1694 Q_ASSERT( !mPainter );
1695 Q_ASSERT( !mCacheRenderingImage );
1697 QgsRectangle ext =
extent();
1701 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
1702 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
1705 if ( w > 5000 || h > 5000 )
1710 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
1715 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
1719 if ( w <= 0 || h <= 0 )
1722 mCacheRenderingImage = std::make_unique<QImage>( w * mPreviewDevicePixelRatio, h * mPreviewDevicePixelRatio, QImage::Format_ARGB32 );
1725 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
1726 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
1727 mCacheRenderingImage->setDevicePixelRatio( mPreviewDevicePixelRatio );
1730 mCacheRenderingImage->fill( QColor( 255, 255, 255, 0 ).rgba() );
1735 if ( hasCustomFramePath() )
1737 QPainter p( mCacheRenderingImage.get() );
1739 p.setPen( Qt::NoPen );
1741 p.scale( mCacheRenderingImage->width() / widthLayoutUnits, mCacheRenderingImage->height() / heightLayoutUnits );
1751 mCacheInvalidated =
false;
1752 mPainter = std::make_unique<QPainter>( mCacheRenderingImage.get() );
1753 QgsMapSettings settings(
mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX(),
true ) );
1755 if ( shouldDrawPart( OverviewMapExtent ) )
1757 settings.setLayers( mOverviewStack->modifyMapLayerList( settings.layers() ) );
1760 mPainterJob = std::make_unique<QgsMapRendererCustomPainterJob>( settings, mPainter.get() );
1763 mPainterJob->setFeatureFilterProvider( mAtlasFeatureFilterProvider.get() );
1766 mPainterJob->start();
1778 mDrawingPreview =
false;
1801 if (
layout()->renderContext().isPreviewRender() )
1804 jobMapSettings.
setDevicePixelRatio( mPainter ? mPainter->device()->devicePixelRatioF() : 1.0 );
1807 jobMapSettings.
setRotation( mEvaluatedMapRotation );
1815 if ( includeLayerSettings )
1820 if ( !
mLayout->project()->mainAnnotationLayer()->isEmpty() )
1823 layers.insert( 0,
mLayout->project()->mainAnnotationLayer() );
1830 if ( !
mLayout->renderContext().isPreviewRender() )
1879 if ( mEvaluatedLabelMargin.length() > 0 )
1882 visiblePoly.append( visiblePoly.at( 0 ) );
1883 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1884 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1886 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1887 labelBoundary = mapBoundaryGeom;
1890 if ( !mBlockingLabelItems.isEmpty() )
1903 if ( mZRangeEnabled )
1908 if ( mAtlasClippingSettings->enabled() &&
mLayout->reportContext().feature().isValid() )
1912 region.
setFeatureClip( mAtlasClippingSettings->featureClippingType() );
1917 if ( mAtlasClippingSettings->forceLabelsInsideFeature() )
1919 if ( !labelBoundary.
isEmpty() )
1921 labelBoundary = clipGeom.
intersection( labelBoundary );
1925 labelBoundary = clipGeom;
1930 if ( mItemClippingSettings->isActive() )
1932 const QgsGeometry clipGeom = mItemClippingSettings->clippedMapExtent();
1935 jobMapSettings.
addClippingRegion( mItemClippingSettings->toMapClippingRegion() );
1937 if ( mItemClippingSettings->forceLabelsInsideClipPath() )
1939 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1940 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1942 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1943 if ( !labelBoundary.
isEmpty() )
1945 labelBoundary = mapBoundaryGeom.
intersection( labelBoundary );
1949 labelBoundary = mapBoundaryGeom;
1955 if ( !labelBoundary.
isNull() )
1958 return jobMapSettings;
1965 mBlockingLabelItems.clear();
1966 for (
const QString &
uuid : std::as_const( mBlockingLabelItemUuids ) )
1975 mOverviewStack->finalizeRestoreFromXml();
1976 mGridStack->finalizeRestoreFromXml();
1977 mItemClippingSettings->finalizeRestoreFromXml();
1988 return mCurrentRectangle;
2002 const double mapScale =
scale();
2026 QVariantList layersIds;
2036 const QList<QgsMapLayer *> layersInMap =
layersToRender( &context );
2038 layersIds.reserve( layersInMap.count() );
2039 layers.reserve( layersInMap.count() );
2042 layersIds << layer->id();
2048 scope->
addFunction( u
"is_layer_visible"_s,
new QgsExpressionContextUtils::GetLayerVisibility( layersInMap,
scale() ) );
2070 if ( extentWidth <= 0 )
2074 return rect().width() / extentWidth;
2079 double dx = mXOffset;
2080 double dy = mYOffset;
2081 transformShift( dx, dy );
2082 QPolygonF poly = calculateVisibleExtentPolygon(
false );
2083 poly.translate( -dx, -dy );
2089 if ( !mBlockingLabelItems.contains( item ) )
2090 mBlockingLabelItems.append( item );
2097 mBlockingLabelItems.removeAll( item );
2104 return mBlockingLabelItems.contains( item );
2109 return mPreviewLabelingResults.get();
2118 if ( mOverviewStack )
2120 for (
int i = 0; i < mOverviewStack->size(); ++i )
2122 if ( mOverviewStack->item( i )->accept( visitor ) )
2129 for (
int i = 0; i < mGridStack->size(); ++i )
2131 if ( mGridStack->item( i )->accept( visitor ) )
2144 mRenderedFeatureHandlers.append( handler );
2149 mRenderedFeatureHandlers.removeAll( handler );
2155 if ( mapPoly.empty() )
2157 return QPointF( 0, 0 );
2162 double dx = mapCoords.x() - rotationPoint.
x();
2163 double dy = mapCoords.y() - rotationPoint.
y();
2165 QgsPointXY backRotatedCoords( rotationPoint.
x() + dx, rotationPoint.
y() + dy );
2168 double xItem = rect().width() * ( backRotatedCoords.
x() - unrotatedExtent.
xMinimum() ) / unrotatedExtent.
width();
2169 double yItem = rect().height() * ( 1 - ( backRotatedCoords.
y() - unrotatedExtent.
yMinimum() ) / unrotatedExtent.
height() );
2170 return QPointF( xItem, yItem );
2184 mapPolygon( newExtent, poly );
2185 QRectF bRect = poly.boundingRect();
2186 extent.setXMinimum( bRect.left() );
2187 extent.setXMaximum( bRect.right() );
2188 extent.setYMinimum( bRect.top() );
2189 extent.setYMaximum( bRect.bottom() );
2199 mCacheInvalidated =
true;
2205 QRectF rectangle = rect();
2206 double frameExtension =
frameEnabled() ? pen().widthF() / 2.0 : 0.0;
2208 double topExtension = 0.0;
2209 double rightExtension = 0.0;
2210 double bottomExtension = 0.0;
2211 double leftExtension = 0.0;
2214 mGridStack->calculateMaxGridExtension( topExtension, rightExtension, bottomExtension, leftExtension );
2216 topExtension = std::max( topExtension, frameExtension );
2217 rightExtension = std::max( rightExtension, frameExtension );
2218 bottomExtension = std::max( bottomExtension, frameExtension );
2219 leftExtension = std::max( leftExtension, frameExtension );
2221 rectangle.setLeft( rectangle.left() - leftExtension );
2222 rectangle.setRight( rectangle.right() + rightExtension );
2223 rectangle.setTop( rectangle.top() - topExtension );
2224 rectangle.setBottom( rectangle.bottom() + bottomExtension );
2225 if ( rectangle != mCurrentRectangle )
2227 prepareGeometryChange();
2228 mCurrentRectangle = rectangle;
2259 refreshMapExtents( &context );
2261 if ( mExtent != beforeExtent )
2268 refreshLabelMargin(
false );
2272 const QString previousTheme = mLastEvaluatedThemeName.isEmpty() ? mFollowVisibilityPresetName : mLastEvaluatedThemeName;
2274 if ( mLastEvaluatedThemeName != previousTheme )
2295 double zLower = mZRange.lower();
2296 double zUpper = mZRange.upper();
2307 mCacheInvalidated =
true;
2312void QgsLayoutItemMap::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
2314 if ( !mLayers.isEmpty() || mLayerStyleOverrides.isEmpty() )
2318 mLayerStyleOverrides.remove( layer->id() );
2320 _qgis_removeLayers( mLayers,
layers );
2323 for ( QgsMapLayer *layer : std::as_const(
layers ) )
2326 if ( mGroupLayers.erase( layer->id() ) == 0 )
2329 for (
auto it = mGroupLayers.begin(); it != mGroupLayers.end(); ++it )
2331 QgsGroupLayer *groupLayer = it->second.get();
2332 if ( groupLayer->
childLayers().contains( layer ) )
2334 QList<QgsMapLayer *> childLayers { groupLayer->
childLayers() };
2335 childLayers.removeAll( layer );
2343void QgsLayoutItemMap::painterJobFinished()
2346 mPreviewLabelingResults.reset( mPainterJob->takeLabelingResults() );
2347 mPainterJob.reset(
nullptr );
2348 mPainter.reset(
nullptr );
2349 mCacheFinalImage = std::move( mCacheRenderingImage );
2350 mLastRenderedImageOffsetX = 0;
2351 mLastRenderedImageOffsetY = 0;
2357void QgsLayoutItemMap::shapeChanged()
2360 QgsPointXY oldCenter = mExtent.center();
2362 double w = rect().width();
2363 double h = rect().height();
2366 double newWidth = mExtent.width();
2368 double newHeight = newWidth * h / w;
2373 refreshMapExtents();
2380void QgsLayoutItemMap::mapThemeChanged(
const QString &theme )
2382 if ( theme == mCachedLayerStyleOverridesPresetName )
2383 mCachedLayerStyleOverridesPresetName.clear();
2386void QgsLayoutItemMap::currentMapThemeRenamed(
const QString &theme,
const QString &newTheme )
2388 if ( theme == mFollowVisibilityPresetName )
2390 mFollowVisibilityPresetName = newTheme;
2394void QgsLayoutItemMap::connectUpdateSlot()
2397 QgsProject *project =
mLayout->project();
2401 connect( project,
static_cast< void ( QgsProject::* )(
const QList<QgsMapLayer *> &
layers )
>( &
QgsProject::layersWillBeRemoved ),
this, &QgsLayoutItemMap::layersAboutToBeRemoved );
2404 if ( layers().isEmpty() )
2412 if ( !mCrs.isValid() )
2428 if ( mAtlasScalingMode == Predefined )
2429 updateAtlasFeature();
2435 QPolygonF thisExtent = calculateVisibleExtentPolygon(
false );
2436 QTransform mapTransform;
2437 QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
2439 thisRectPoly.pop_back();
2440 thisExtent.pop_back();
2442 QPolygonF thisItemPolyInLayout = mapToScene( thisRectPoly );
2445 QTransform::quadToQuad( thisItemPolyInLayout, thisExtent, mapTransform );
2446 return mapTransform;
2451 mZRangeEnabled = enabled;
2456 return mZRangeEnabled;
2469QList<QgsLabelBlockingRegion> QgsLayoutItemMap::createLabelBlockingRegions(
const QgsMapSettings & )
const
2472 QList< QgsLabelBlockingRegion > blockers;
2473 blockers.reserve( mBlockingLabelItems.count() );
2474 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
2481 if ( item->property(
"wasVisible" ).isValid() )
2483 if ( !item->property(
"wasVisible" ).toBool() )
2486 else if ( !item->isVisible() )
2489 QPolygonF itemRectInMapCoordinates = mapTransform.map( item->mapToScene( item->rect() ) );
2490 itemRectInMapCoordinates.append( itemRectInMapCoordinates.at( 0 ) );
2492 blockers << QgsLabelBlockingRegion( blockingRegion );
2499 return mLabelMargin;
2504 mLabelMargin = margin;
2505 refreshLabelMargin(
false );
2508void QgsLayoutItemMap::updateToolTip()
2517 if ( mFollowVisibilityPreset )
2519 presetName = mFollowVisibilityPresetName;
2523 else if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
2524 presetName = *mExportThemeIt;
2535 QList<QgsMapLayer *> renderLayers;
2537 QString presetName = themeToRender( *evalContext );
2538 if ( !presetName.isEmpty() )
2540 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2541 renderLayers =
mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
2543 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2545 else if ( !
layers().isEmpty() )
2551 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2558 renderLayers.clear();
2560 const QStringList layerNames = ddLayers.split(
'|' );
2562 for (
const QString &name : layerNames )
2564 const QList< QgsMapLayer * > matchingLayers =
mLayout->project()->mapLayersByName( name );
2567 renderLayers << layer;
2576 int removeAt = renderLayers.indexOf(
mLayout->reportContext().layer() );
2577 if ( removeAt != -1 )
2579 renderLayers.removeAt( removeAt );
2584 if ( !includeInvalidLayers )
2586 renderLayers.erase( std::remove_if( renderLayers.begin(), renderLayers.end(), [](
QgsMapLayer *layer ) { return !layer || !layer->isValid(); } ), renderLayers.end() );
2589 return renderLayers;
2592QMap<QString, QString> QgsLayoutItemMap::layerStyleOverridesToRender(
const QgsExpressionContext &context )
const
2594 QString presetName = themeToRender( context );
2595 if ( !presetName.isEmpty() )
2597 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2599 if ( presetName != mCachedLayerStyleOverridesPresetName )
2602 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2603 mCachedLayerStyleOverridesPresetName = presetName;
2606 return mCachedPresetLayerStyleOverrides;
2609 return QMap<QString, QString>();
2611 else if ( mFollowVisibilityPreset )
2613 QString presetName = mFollowVisibilityPresetName;
2616 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2618 if ( presetName.isEmpty() || presetName != mCachedLayerStyleOverridesPresetName )
2621 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2622 mCachedLayerStyleOverridesPresetName = presetName;
2625 return mCachedPresetLayerStyleOverrides;
2628 return QMap<QString, QString>();
2630 else if ( mKeepLayerStyles )
2632 return mLayerStyleOverrides;
2636 return QMap<QString, QString>();
2640QgsRectangle QgsLayoutItemMap::transformedExtent()
const
2642 double dx = mXOffset;
2643 double dy = mYOffset;
2644 transformShift( dx, dy );
2645 return QgsRectangle( mExtent.xMinimum() - dx, mExtent.yMinimum() - dy, mExtent.xMaximum() - dx, mExtent.yMaximum() - dy );
2648void QgsLayoutItemMap::mapPolygon(
const QgsRectangle &extent, QPolygonF &poly )
const
2653 poly << QPointF(
extent.xMinimum(),
extent.yMaximum() );
2654 poly << QPointF(
extent.xMaximum(),
extent.yMaximum() );
2655 poly << QPointF(
extent.xMaximum(),
extent.yMinimum() );
2656 poly << QPointF(
extent.xMinimum(),
extent.yMinimum() );
2658 poly << QPointF( poly.at( 0 ) );
2663 QgsPointXY rotationPoint( (
extent.xMaximum() +
extent.xMinimum() ) / 2.0, (
extent.yMaximum() +
extent.yMinimum() ) / 2.0 );
2667 dx = rotationPoint.x() -
extent.xMinimum();
2668 dy = rotationPoint.y() -
extent.yMaximum();
2670 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2673 dx = rotationPoint.x() -
extent.xMaximum();
2674 dy = rotationPoint.y() -
extent.yMaximum();
2676 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2679 dx = rotationPoint.x() -
extent.xMaximum();
2680 dy = rotationPoint.y() -
extent.yMinimum();
2682 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2685 dx = rotationPoint.x() -
extent.xMinimum();
2686 dy = rotationPoint.y() -
extent.yMinimum();
2688 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2691 poly << QPointF( poly.at( 0 ) );
2694void QgsLayoutItemMap::transformShift(
double &xShift,
double &yShift )
const
2697 double dxScaled = xShift * mmToMapUnits;
2698 double dyScaled = -yShift * mmToMapUnits;
2713 const QList< QgsAnnotation * > annotations =
mLayout->project()->annotationManager()->annotations();
2714 if ( annotations.isEmpty() )
2723 for ( QgsAnnotation *annotation : annotations )
2725 if ( !annotation || !annotation->isVisible() )
2729 if ( annotation->mapLayer() && !
layers.contains( annotation->mapLayer() ) )
2732 drawAnnotation( annotation, rc );
2743 QgsScopedQPainterState painterState( context.
painter() );
2746 double itemX, itemY;
2749 QPointF mapPos = layoutMapPosForItem( annotation );
2758 context.
painter()->translate( itemX, itemY );
2761 double dotsPerMM = context.
painter()->device()->logicalDpiX() / 25.4;
2762 context.
painter()->scale( 1 / dotsPerMM, 1 / dotsPerMM );
2764 annotation->
render( context );
2767QPointF QgsLayoutItemMap::layoutMapPosForItem(
const QgsAnnotation *annotation )
const
2770 return QPointF( 0, 0 );
2777 QgsCoordinateReferenceSystem annotationCrs = annotation->
mapPositionCrs();
2779 if ( annotationCrs !=
crs() )
2782 QgsCoordinateTransform t( annotationCrs,
crs(),
mLayout->project() );
2786 t.transformInPlace( mapX, mapY, z );
2788 catch (
const QgsCsException & )
2795void QgsLayoutItemMap::drawMapFrame( QPainter *p )
2806void QgsLayoutItemMap::drawMapBackground( QPainter *p )
2817bool QgsLayoutItemMap::shouldDrawPart( QgsLayoutItemMap::PartType part )
const
2819 if ( mCurrentExportPart == NotLayered )
2837 return mCurrentExportPart == Layer;
2840 return mCurrentExportPart == Grid && mGridStack->hasEnabledItems();
2842 case OverviewMapExtent:
2843 return mCurrentExportPart == OverviewMapExtent && mOverviewStack->hasEnabledItems();
2848 case SelectionBoxes:
2849 return mCurrentExportPart == SelectionBoxes && isSelected();
2860 QgsExpressionContext scopedContext;
2865 const QgsExpressionContext *evalContext = context ? context : &scopedContext;
2869 QgsRectangle newExtent =
extent();
2870 bool useDdXMin =
false;
2871 bool useDdXMax =
false;
2872 bool useDdYMin =
false;
2873 bool useDdYMax =
false;
2904 if ( newExtent != mExtent )
2910 double currentWidthHeightRatio = mExtent.width() / mExtent.height();
2911 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
2913 if ( currentWidthHeightRatio < newWidthHeightRatio )
2916 double newHeight = newExtent.
width() / currentWidthHeightRatio;
2917 double deltaHeight = newHeight - newExtent.
height();
2924 double newWidth = currentWidthHeightRatio * newExtent.
height();
2925 double deltaWidth = newWidth - newExtent.
width();
2930 mExtent = newExtent;
2940 newExtent = mExtent;
2943 if ( useDdXMax || useDdXMin || useDdYMax || useDdYMin )
2947 if ( useDdXMin && !useDdXMax )
2949 double xMax = mExtent.xMaximum() - ( mExtent.xMinimum() - minXD );
2953 else if ( !useDdXMin && useDdXMax )
2955 double xMin = mExtent.xMinimum() - ( mExtent.xMaximum() - maxXD );
2959 if ( useDdYMin && !useDdYMax )
2961 double yMax = mExtent.yMaximum() - ( mExtent.yMinimum() - minYD );
2965 else if ( !useDdYMin && useDdYMax )
2967 double yMin = mExtent.yMinimum() - ( mExtent.yMaximum() - maxYD );
2972 if ( newExtent != mExtent )
2974 mExtent = newExtent;
2991void QgsLayoutItemMap::refreshLabelMargin(
bool updateItem )
2996 mEvaluatedLabelMargin.setUnits( mLabelMargin.units() );
3004void QgsLayoutItemMap::updateAtlasFeature()
3006 if ( !
mLayout->reportContext().layer() || !
mLayout->reportContext().feature().isValid() )
3009 QgsFeatureExpressionFilterProvider *filter =
new QgsFeatureExpressionFilterProvider();
3010 filter->
setFilter(
mLayout->reportContext().layer()->id(), QgsExpression( u
"@id = %1"_s.arg(
mLayout->reportContext().feature().id() ) ) );
3011 mAtlasFeatureFilterProvider = std::make_unique<QgsGroupedFeatureFilterProvider>();
3012 mAtlasFeatureFilterProvider->addProvider( filter );
3017 QgsRectangle bounds = computeAtlasRectangle();
3025 QgsRectangle newExtent = bounds;
3026 QgsRectangle originalExtent = mExtent;
3031 if ( mAtlasScalingMode ==
Fixed || mAtlasScalingMode ==
Predefined || isPointLayer )
3033 QgsScaleCalculator calc;
3036 if ( QgsProject *project =
mLayout->project() )
3040 double originalScale = calc.
calculate( originalExtent, rect().width() );
3041 double geomCenterX = ( xa1 + xa2 ) / 2.0;
3042 double geomCenterY = ( ya1 + ya2 ) / 2.0;
3043 QVector<qreal> scales;
3045 if ( !
mLayout->reportContext().predefinedScales().empty() )
3046 scales =
mLayout->reportContext().predefinedScales();
3048 scales =
mLayout->renderContext().predefinedScales();
3050 if ( mAtlasScalingMode ==
Fixed || scales.isEmpty() || ( isPointLayer && mAtlasScalingMode !=
Predefined ) )
3053 double xMin = geomCenterX - originalExtent.
width() / 2.0;
3054 double yMin = geomCenterY - originalExtent.
height() / 2.0;
3055 newExtent = QgsRectangle( xMin, yMin, xMin + originalExtent.
width(), yMin + originalExtent.
height() );
3059 double newScale = calc.
calculate( newExtent, rect().width() );
3062 newExtent.
scale( originalScale / newScale );
3068 double newWidth = originalExtent.
width();
3069 double newHeight = originalExtent.
height();
3070 for (
int i = 0; i < scales.size(); i++ )
3072 double ratio = scales[i] / originalScale;
3073 newWidth = originalExtent.
width() * ratio;
3074 newHeight = originalExtent.
height() * ratio;
3077 double xMin = geomCenterX - newWidth / 2.0;
3078 double yMin = geomCenterY - newHeight / 2.0;
3079 newExtent = QgsRectangle( xMin, yMin, xMin + newWidth, yMin + newHeight );
3083 const double newScale = calc.
calculate( newExtent, rect().width() );
3087 newExtent.
scale( scales[i] / newScale );
3097 else if ( mAtlasScalingMode ==
Auto )
3101 double geomRatio = bounds.
width() / bounds.
height();
3102 double mapRatio = originalExtent.
width() / originalExtent.
height();
3105 if ( geomRatio < mapRatio )
3108 double adjWidth = ( mapRatio * bounds.
height() - bounds.
width() ) / 2.0;
3113 else if ( geomRatio > mapRatio )
3116 double adjHeight = ( bounds.
width() / mapRatio - bounds.
height() ) / 2.0;
3120 newExtent = QgsRectangle( xa1, ya1, xa2, ya2 );
3122 const double evaluatedAtlasMargin =
atlasMargin();
3123 if ( evaluatedAtlasMargin > 0.0 )
3125 newExtent.
scale( 1 + evaluatedAtlasMargin );
3139 QgsGeometry g =
mLayout->reportContext().currentGeometry(
crs() );
3151 double dx = std::max( std::abs( prevCenter.
x() - bounds.
xMinimum() ), std::abs( prevCenter.
x() - bounds.
xMaximum() ) );
3152 double dy = std::max( std::abs( prevCenter.
y() - bounds.
yMinimum() ), std::abs( prevCenter.
y() - bounds.
yMaximum() ) );
3154 return QgsRectangle( center.
x() - dx, center.
y() - dy, center.
x() + dx, center.
y() + dy );
3162void QgsLayoutItemMap::createStagedRenderJob(
const QgsRectangle &extent,
const QSizeF size,
double dpi )
3165 settings.
setLayers( mOverviewStack->modifyMapLayerList( settings.
layers() ) );
3167 mStagedRendererJob = std::make_unique<
3169 mStagedRendererJob->start();
3181 if ( mMap->layout() && mMap->layout()->project() )
3183 connect( mMap->layout()->project(), static_cast< void ( QgsProject::* )( const QList<QgsMapLayer *> &layers ) >( &QgsProject::layersWillBeRemoved ), this, &QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved );
3189 return mClipToAtlasFeature;
3194 if (
enabled == mClipToAtlasFeature )
3197 mClipToAtlasFeature =
enabled;
3203 return mFeatureClippingType;
3208 if ( mFeatureClippingType == type )
3211 mFeatureClippingType = type;
3217 return mForceLabelsInsideFeature;
3222 if ( forceInside == mForceLabelsInsideFeature )
3225 mForceLabelsInsideFeature = forceInside;
3231 return mClipItemShape;
3245 return mRestrictToLayers;
3250 if ( mRestrictToLayers ==
enabled )
3259 return _qgis_listRefToRaw( mLayersToClip );
3270 QDomElement settingsElem = document.createElement( u
"atlasClippingSettings"_s );
3271 settingsElem.setAttribute( u
"enabled"_s, mClipToAtlasFeature ? u
"1"_s : u
"0"_s );
3272 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideFeature ? u
"1"_s : u
"0"_s );
3273 if ( mClipItemShape )
3275 settingsElem.setAttribute( u
"clipItemShape"_s, u
"1"_s );
3277 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3278 settingsElem.setAttribute( u
"restrictLayers"_s, mRestrictToLayers ? u
"1"_s : u
"0"_s );
3281 QDomElement layerSetElem = document.createElement( u
"layersToClip"_s );
3286 QDomElement layerElem = document.createElement( u
"Layer"_s );
3287 QDomText layerIdText = document.createTextNode( layerRef.layerId );
3288 layerElem.appendChild( layerIdText );
3290 layerElem.setAttribute( u
"name"_s, layerRef.name );
3291 layerElem.setAttribute( u
"source"_s, layerRef.source );
3292 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
3294 layerSetElem.appendChild( layerElem );
3296 settingsElem.appendChild( layerSetElem );
3298 element.appendChild( settingsElem );
3304 const QDomElement settingsElem = element.firstChildElement( u
"atlasClippingSettings"_s );
3306 mClipToAtlasFeature = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3307 mForceLabelsInsideFeature = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3308 mClipItemShape = settingsElem.attribute( u
"clipItemShape"_s, u
"0"_s ).toInt();
3310 mRestrictToLayers = settingsElem.attribute( u
"restrictLayers"_s, u
"0"_s ).toInt();
3312 mLayersToClip.clear();
3313 QDomNodeList layerSetNodeList = settingsElem.elementsByTagName( u
"layersToClip"_s );
3314 if ( !layerSetNodeList.isEmpty() )
3316 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
3317 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
3318 mLayersToClip.reserve( layerIdNodeList.size() );
3319 for (
int i = 0; i < layerIdNodeList.size(); ++i )
3321 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
3322 QString layerId = layerElem.text();
3323 QString layerName = layerElem.attribute( u
"name"_s );
3324 QString layerSource = layerElem.attribute( u
"source"_s );
3325 QString layerProvider = layerElem.attribute( u
"provider"_s );
3327 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
3328 if ( mMap->layout() && mMap->layout()->project() )
3330 mLayersToClip << ref;
3337void QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
3339 if ( !mLayersToClip.isEmpty() )
3341 _qgis_removeLayers( mLayersToClip, layers );
3355 return mEnabled && mClipPathSource;
3370 if ( mClipPathSource )
3373 mClipPathSource->refresh();
3382 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3383 clipGeom.
transform( mMap->layoutToMapCoordsTransform() );
3393 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3394 clipGeom.
transform( mMap->sceneTransform().inverted() );
3409 if ( mClipPathSource == item )
3412 if ( mClipPathSource )
3421 mClipPathSource = item;
3423 if ( mClipPathSource )
3432 mClipPathSource->refresh();
3446 return mClipPathSource;
3451 return mFeatureClippingType;
3456 if ( mFeatureClippingType == type )
3459 mFeatureClippingType = type;
3465 return mForceLabelsInsideClipPath;
3470 if ( forceInside == mForceLabelsInsideClipPath )
3473 mForceLabelsInsideClipPath = forceInside;
3479 QDomElement settingsElem = document.createElement( u
"itemClippingSettings"_s );
3480 settingsElem.setAttribute( u
"enabled"_s, mEnabled ? u
"1"_s : u
"0"_s );
3481 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideClipPath ? u
"1"_s : u
"0"_s );
3482 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3483 if ( mClipPathSource )
3484 settingsElem.setAttribute( u
"clipSource"_s, mClipPathSource->uuid() );
3486 settingsElem.setAttribute( u
"clipSource"_s, QString() );
3488 element.appendChild( settingsElem );
3494 const QDomElement settingsElem = element.firstChildElement( u
"itemClippingSettings"_s );
3496 mEnabled = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3497 mForceLabelsInsideClipPath = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3499 mClipPathUuid = settingsElem.attribute( u
"clipSource"_s );
3506 if ( !mClipPathUuid.isEmpty() )
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
QFlags< VectorRenderingSimplificationFlag > VectorRenderingSimplificationFlags
Simplification flags for vector feature rendering.
@ Millimeters
Millimeters.
@ NoSimplification
No simplification can be applied.
@ CollectUnplacedLabels
Whether unplaced labels should be collected in the labeling results (regardless of whether they are b...
@ DrawUnplacedLabels
Whether to render unplaced labels as an indicator/warning for users.
@ UsePartialCandidates
Whether to use also label candidates that are partially outside of the map view.
@ Export
Renderer used for printing or exporting to a file.
@ View
Renderer used for displaying on screen.
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
@ ForceRasterMasks
Force symbol masking to be applied using a raster method. This is considerably faster when compared t...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
@ DrawSelection
Whether vector selections should be shown in the rendered map.
@ Antialiasing
Enable anti-aliasing for map rendering.
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
@ DisableTiledRasterLayerRenders
If set, then raster layers will not be drawn as separate tiles. This may improve the appearance in ex...
@ LimitCoverageLayerRenderToCurrentFeature
Limit coverage layer rendering to the current atlas feature.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
@ DrawSelection
Draw selection.
@ Antialiasing
Use antialiasing when drawing items.
@ RenderLabelsByMapLayer
When rendering map items to multi-layered exports, render labels belonging to different layers into s...
@ HideCoverageLayer
Hide coverage layer in outputs.
virtual QPainterPath asQPainterPath() const =0
Returns the geometry represented as a QPainterPath.
Abstract base class for annotation items which are drawn over a map.
QgsCoordinateReferenceSystem mapPositionCrs() const
Returns the CRS of the map position, or an invalid CRS if the annotation does not have a fixed map po...
void render(QgsRenderContext &context) const
Renders the annotation to a target render context.
bool isVisible() const
Returns true if the annotation is visible and should be rendered.
QPointF relativePosition() const
Returns the relative position of the annotation, if it is not attached to a fixed map position.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsCoordinateReferenceSystemRegistry * coordinateReferenceSystemRegistry()
Returns the application's coordinate reference system (CRS) registry, which handles known CRS definit...
void userCrsChanged(const QString &id)
Emitted whenever an existing user CRS definition is changed.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toProj() const
Returns a Proj string representation of this CRS.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
QString projectionAcronym() const
Returns the projection acronym for the projection used by the CRS.
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
QgsProjOperation operation() const
Returns information about the PROJ operation associated with the coordinate reference system,...
Qgis::DistanceUnit mapUnits
QgsRange which stores a range of double values.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addFunction(const QString &name, QgsScopedExpressionFunction *function)
Adds a function to the scope.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setFilter(const QString &layerId, const QgsExpression &expression)
Set a filter for the given layer.
A geometry is the spatial representation of a feature.
QPolygonF asQPolygonF() const
Returns contents of the geometry as a QPolygonF.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
QgsGeometry intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing the points shared by this geometry and other.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
QgsGeometry buffer(double distance, int segments, QgsFeedback *feedback=nullptr) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
A map layer which consists of a set of child layers, where all component layers are rendered as a sin...
QList< QgsMapLayer * > childLayers() const
Returns the child layers contained by the group.
void setChildLayers(const QList< QgsMapLayer * > &layers)
Sets the child layers contained by the group.
QgsGroupedFeatureFilterProvider & addProvider(const QgsFeatureFilterProvider *provider)
Add another filter provider to the group.
A representation of the interval between two datetime values.
Stores global configuration for labeling engine.
void setFlag(Qgis::LabelingFlag f, bool enabled=true)
Sets whether a particual flag is enabled.
Stores computed placement from labeling engine.
void layerOrderChanged()
Emitted when the layer order has changed.
Contains settings relating to clipping a layout map by the current atlas feature.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the current atlas feature.
bool restrictToLayers() const
Returns true if clipping should be restricted to a subset of layers.
QgsLayoutItemMapAtlasClippingSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapAtlasClippingSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
bool clipItemShape() const
Returns true if the map item shape will be clipped to the atlas feature geometry.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
void setLayersToClip(const QList< QgsMapLayer * > &layers)
Sets the list of map layers to clip to the atlas feature.
QList< QgsMapLayer * > layersToClip() const
Returns the list of map layers to clip to the atlas feature.
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the current atlas feature.
void changed()
Emitted when the atlas clipping settings are changed.
void setClipItemShape(bool clipItemShape)
Sets whether the map item shape will be clipped to the atlas feature geometry.
bool forceLabelsInsideFeature() const
Returns true if labels should only be placed inside the atlas feature geometry.
bool enabled() const
Returns true if the map content should be clipped to the current atlas feature.
void setForceLabelsInsideFeature(bool forceInside)
Sets whether labels should only be placed inside the atlas feature geometry.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the current atlas feature.
Contains settings relating to clipping a layout map by another layout item.
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores settings in a DOM element, where element is the DOM element corresponding to a 'LayoutMap' tag...
void setForceLabelsInsideClipPath(bool forceInside)
Sets whether labels should only be placed inside the clip path geometry.
void setSourceItem(QgsLayoutItem *item)
Sets the source item which will provide the clipping path for the map.
QgsLayoutItemMapItemClipPathSettings(QgsLayoutItemMap *map=nullptr)
Constructor for QgsLayoutItemMapItemClipPathSettings, with the specified map parent.
bool readXml(const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context)
Sets the setting's state from a DOM document, where element is the DOM node corresponding to a 'Layou...
QgsGeometry clipPathInMapItemCoordinates() const
Returns the clipping path geometry, in the map item's coordinate space.
QgsGeometry clippedMapExtent() const
Returns the geometry to use for clipping the parent map, in the map item's CRS.
QgsLayoutItem * sourceItem()
Returns the source item which will provide the clipping path for the map, or nullptr if no item is se...
void setEnabled(bool enabled)
Sets whether the map content should be clipped to the associated item.
bool forceLabelsInsideClipPath() const
Returns true if labels should only be placed inside the clip path geometry.
void finalizeRestoreFromXml()
To be called after all pending items have been restored from XML.
QgsMapClippingRegion::FeatureClippingType featureClippingType() const
Returns the feature clipping type to apply when clipping to the associated item.
bool enabled() const
Returns true if the map content should be clipped to the associated item.
QgsMapClippingRegion toMapClippingRegion() const
Returns the clip path as a map clipping region.
void changed()
Emitted when the item clipping settings are changed.
void setFeatureClippingType(QgsMapClippingRegion::FeatureClippingType type)
Sets the feature clipping type to apply when clipping to the associated item.
bool isActive() const
Returns true if the item clipping is enabled and set to a valid source item.
An item which is drawn inside a QgsLayoutItemMap, e.g., a grid or map overview.
@ StackAboveMapLabels
Render above all map layers and labels.
StackingPosition stackingPosition() const
Returns the item's stacking position, which specifies where the in the map's stack the item should be...
bool enabled() const
Returns whether the item will be drawn.
Layout graphical items for displaying a map.
void setFollowVisibilityPreset(bool follow)
Sets whether the map should follow a map theme.
bool nextExportPart() override
Moves to the next export part for a multi-layered export item, during a multi-layered export.
void removeRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Removes a previously added rendered feature handler.
void extentChanged()
Emitted when the map's extent changes.
QPointF mapToItemCoords(QPointF mapCoords) const
Transforms map coordinates to item coordinates (considering rotation and move offset).
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
~QgsLayoutItemMap() override
QIcon icon() const override
Returns the item's icon.
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties) override
void preparedForAtlas()
Emitted when the map has been prepared for atlas rendering, just before actual rendering.
void setFollowVisibilityPresetName(const QString &name)
Sets preset name for map rendering.
QTransform layoutToMapCoordsTransform() const
Creates a transform from layout coordinates to map coordinates.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
QgsMapSettings mapSettings(const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings) const
Returns map settings that will be used for drawing of the map.
bool isLabelBlockingItem(QgsLayoutItem *item) const
Returns true if the specified item is a "label blocking item".
void storeCurrentLayerStyles()
Stores the current project layer styles into style overrides.
void setAtlasDriven(bool enabled)
Sets whether the map extent will follow the current atlas feature.
QgsLayoutMeasurement labelMargin() const
Returns the margin from the map edges in which no labels may be placed.
AtlasScalingMode
Scaling modes used for the serial rendering (atlas).
@ Predefined
A scale is chosen from the predefined scales.
@ Auto
The extent is adjusted so that each feature is fully visible.
@ Fixed
The current scale of the map is used for each feature of the atlas.
bool requiresRasterization() const override
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
Q_DECL_DEPRECATED int numberExportLayers() const override
void layerStyleOverridesChanged()
Emitted when layer style overrides are changed... a means to let associated legend items know they sh...
void updateBoundingRect()
Updates the bounding rect of this item. Call this function before doing any changes related to annota...
void moveContent(double dx, double dy) override
Moves the content of the item, by a specified dx and dy in layout units.
void setZRangeEnabled(bool enabled)
Sets whether the z range is enabled (i.e.
QgsLayoutItemMapGrid * grid()
Returns the map item's first grid.
void mapRotationChanged(double newRotation)
Emitted when the map's rotation changes.
int type() const override
QList< QgsMapLayer * > layersToRender(const QgsExpressionContext *context=nullptr, bool includeInvalidLayers=false) const
Returns a list of the layers which will be rendered within this map item, considering any locked laye...
void previewRefreshed()
Emitted whenever the item's map preview has been refreshed.
friend class QgsLayoutItemMapOverview
void setExtent(const QgsRectangle &extent)
Sets a new extent for the map.
void paint(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget) override
QFlags< MapItemFlag > MapItemFlags
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
QPolygonF visibleExtentPolygon() const
Returns a polygon representing the current visible map extent, considering map extents and rotation.
QgsRectangle requestedExtent() const
Calculates the extent to request and the yShift of the top-left point in case of rotation.
QgsLayoutItemMap(QgsLayout *layout)
Constructor for QgsLayoutItemMap, with the specified parent layout.
void setMapFlags(QgsLayoutItemMap::MapItemFlags flags)
Sets the map item's flags, which control how the map content is drawn.
void zoomContent(double factor, QPointF point) override
Zooms content of item.
void crsChanged()
Emitted when the map's coordinate reference system is changed.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the stored layers set.
QPolygonF transformedMapPolygon() const
Returns extent that considers rotation and shift with mOffsetX / mOffsetY.
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
QRectF boundingRect() const override
QString displayName() const override
Gets item display name.
bool atlasDriven() const
Returns whether the map extent is set to follow the current atlas feature.
void setZRange(const QgsDoubleRange &range)
Sets the map's z range, which is used to filter the map's content to only display features within the...
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the stored overrides of styles for layers.
void stopLayeredExport() override
Stops a multi-layer export operation.
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map.
double estimatedFrameBleed() const override
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
QPainterPath framePath() const override
Returns the path to use when drawing the item's frame or background.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void startLayeredExport() override
Starts a multi-layer export operation.
bool containsWmsLayer() const
Returns true if the map contains a WMS layer.
void setScale(double scale, bool forceUpdate=true)
Sets new map scale and changes only the map extent.
double mapRotation(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue) const
Returns the rotation used for drawing the map within the layout item, in degrees clockwise.
double mapUnitsToLayoutUnits() const
Returns the conversion factor from map units to layout units.
QgsLayoutItemMap::MapItemFlags mapFlags() const
Returns the map item's flags, which control how the map content is drawn.
bool zRangeEnabled() const
Returns whether the z range is enabled (i.e.
void setLabelMargin(const QgsLayoutMeasurement &margin)
Sets the margin from the map edges in which no labels may be placed.
void themeChanged(const QString &theme)
Emitted when the map's associated theme is changed.
QgsLayoutItem::ExportLayerDetail exportLayerDetails() const override
Returns the details for the specified current export layer.
void zoomToExtent(const QgsRectangle &extent)
Zooms the map so that the specified extent is fully visible within the map item.
double scale() const
Returns the map scale.
@ ShowPartialLabels
Whether to draw labels which are partially outside of the map view.
@ ShowUnplacedLabels
Whether to render unplaced labels in the map view.
bool drawAnnotations() const
Returns whether annotations are drawn within the map.
QgsDoubleRange zRange() const
Returns the map's z range, which is used to filter the map's content to only display features within ...
void removeLabelBlockingItem(QgsLayoutItem *item)
Removes the specified layout item from the map's "label blocking items".
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the map's preset crs (coordinate reference system).
void invalidateCache() override
QgsRectangle extent() const
Returns the current map extent.
QgsLayoutItemMapOverview * overview()
Returns the map item's first overview.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
void setFrameStrokeWidth(QgsLayoutMeasurement width) override
Sets the frame stroke width.
bool containsAdvancedEffects() const override
Returns true if the item contains contents with blend modes or transparency effects which can only be...
friend class QgsLayoutItemMapGrid
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
QList< QgsMapLayer * > layers() const
Returns the stored layer set.
void setMoveContentPreviewOffset(double dx, double dy) override
Sets temporary offset for the item, by a specified dx and dy in layout units.
void setMapRotation(double rotation)
Sets the rotation for the map - this does not affect the layout item shape, only the way the map is d...
static const QgsSettingsEntryBool * settingForceRasterMasks
Settings entry - Whether to force rasterized clipping masks, regardless of output format.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
double atlasMargin(QgsLayoutObject::PropertyValueType valueType=QgsLayoutObject::EvaluatedValue)
Returns the margin size (percentage) used when the map is in atlas mode.
void addLabelBlockingItem(QgsLayoutItem *item)
Sets the specified layout item as a "label blocking item" for this map.
void assignFreeId()
Sets the map id() to a number not yet used in the layout.
ExportLayerBehavior exportLayerBehavior() const override
Returns the behavior of this item during exporting to layered exports (e.g.
QgsLabelingResults * previewLabelingResults() const
Returns the labeling results of the most recent preview map render.
Contains settings and helpers relating to a render of a QgsLayoutItem.
Base class for graphical items within a QgsLayout.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
virtual QPainterPath framePath() const
Returns the path to use when drawing the item's frame or background.
QColor backgroundColor(bool useDataDefined=true) const
Returns the background color for this item.
void drawRefreshingOverlay(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle)
Draws a "refreshing" overlay icon on the item.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
void rotationChanged(double newRotation)
Emitted on item rotation change.
friend class QgsLayoutItemMap
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
@ FlagOverridesPaint
Item overrides the default layout item painting method.
@ FlagDisableSceneCaching
Item should not have QGraphicsItem caching enabled.
virtual bool containsAdvancedEffects() const
Returns true if the item contains contents with blend modes or transparency effects which can only be...
void sizePositionChanged()
Emitted when the item's size or position changes.
virtual QString uuid() const
Returns the item identification string.
QString id() const
Returns the item's ID name.
bool frameEnabled() const
Returns true if the item includes a frame.
ExportLayerBehavior
Behavior of item when exporting to layered outputs.
@ ItemContainsSubLayers
Item contains multiple sublayers which must be individually exported.
void clipPathChanged()
Emitted when the item's clipping path has changed.
bool hasBackground() const
Returns true if the item has a background.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
virtual double estimatedFrameBleed() const
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
QPainter::CompositionMode blendMode() const
Returns the item's composition blending mode.
void backgroundTaskCountChanged(int count)
Emitted whenever the number of background tasks an item is executing changes.
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ MapYMin
Map extent y minimum.
@ MapZRangeUpper
Map frame Z-range lower value.
@ StartDateTime
Temporal range's start DateTime.
@ MapLayers
Map layer set.
@ MapZRangeLower
Map frame Z-range lower value.
@ MapRotation
Map rotation.
@ MapXMax
Map extent x maximum.
@ MapStylePreset
Layer and style map theme.
@ MapYMax
Map extent y maximum.
@ MapAtlasMargin
Map atlas margin.
@ EndDateTime
Temporal range's end DateTime.
@ MapXMin
Map extent x minimum.
@ MapLabelMargin
Map label margin.
@ AllProperties
All properties for item.
PropertyValueType
Specifies whether the value returned by a function should be the original, user set value,...
@ EvaluatedValue
Return the current evaluated value for the property.
void predefinedScalesChanged()
Emitted when the list of predefined scales changes.
static QgsRenderContext createRenderContextForMap(QgsLayoutItemMap *map, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout map and painter destination.
static void rotate(double angle, double &x, double &y)
Rotates a point / vector around the origin.
static Q_DECL_DEPRECATED double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or nullptr if a matching item could not...
void refreshed()
Emitted when the layout has been refreshed and items should also be refreshed and updated.
A map clipping region (in map coordinates and CRS).
void setRestrictToLayers(bool enabled)
Sets whether clipping should be restricted to a subset of layers.
FeatureClippingType
Feature clipping behavior, which controls how features from vector layers will be clipped.
void setFeatureClip(FeatureClippingType type)
Sets the feature clipping type.
void setRestrictedLayers(const QList< QgsMapLayer * > &layers)
Sets a list of layers to restrict the clipping region effects to.
Stores style information (renderer, opacity, labeling, diagrams etc.) applicable to a map layer.
void readXml(const QDomElement &styleElement)
Read style configuration (for project file reading).
void readFromLayer(QgsMapLayer *layer)
Store layer's active style information in the instance.
void writeXml(QDomElement &styleElement) const
Write style configuration (for project file writing).
QString xmlData() const
Returns XML content of the style.
Base class for all map layer types.
void cancelWithoutBlocking() override
Triggers cancellation of the rendering job without blocking.
void finished()
emitted when asynchronous rendering is finished (or canceled).
@ RenderLabelsByMapLayer
Labels should be rendered in individual stages by map layer. This allows separation of labels belongi...
@ Finished
Rendering is finished.
@ Symbology
Rendering layer symbology.
@ Labels
Rendering labels.
static QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings, EffectsCheckFlags flags=QgsMapSettingsUtils::EffectsCheckFlags())
Checks whether any of the layers attached to a map settings object contain advanced effects.
Contains configuration for rendering maps.
void setElevationShadingRenderer(const QgsElevationShadingRenderer &renderer)
Sets the shading renderer used to render shading on the entire map.
void addClippingRegion(const QgsMapClippingRegion ®ion)
Adds a new clipping region to the map settings.
QList< QgsMapLayer * > layers(bool expandGroupLayers=false) const
Returns the list of layers which will be rendered in the map.
void setSelectionColor(const QColor &color)
Sets the color that is used for drawing of selected vector features.
void setSimplifyMethod(const QgsVectorSimplifyMethod &method)
Sets the simplification setting to use when rendering vector layers.
QPolygonF visiblePolygon() const
Returns the visible area as a polygon (may be rotated).
void addRenderedFeatureHandler(QgsRenderedFeatureHandlerInterface *handler)
Adds a rendered feature handler to use while rendering the map settings.
void setTextRenderFormat(Qgis::TextRenderFormat format)
Sets the text render format, which dictates how text is rendered (e.g.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to render in the map.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
void setScaleMethod(Qgis::ScaleCalculationMethod method)
Sets the method to use for scale calculations for the map.
void setDpiTarget(double dpi)
Sets the target dpi (dots per inch) to be taken into consideration when rendering.
void setDevicePixelRatio(float dpr)
Sets the device pixel ratio.
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which will be visible in the map.
void setOutputDpi(double dpi)
Sets the dpi (dots per inch) used for conversion between real world units (e.g.
void setRendererUsage(Qgis::RendererUsage rendererUsage)
Sets the rendering usage.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
void setMaskSettings(const QgsMaskRenderSettings &settings)
Sets the mask render settings, which control how masks are drawn and behave during the map render.
void setLayerStyleOverrides(const QMap< QString, QString > &overrides)
Sets the map of map layer style overrides (key: layer ID, value: style name) where a different style ...
void setExtent(const QgsRectangle &rect, bool magnified=true)
Sets the coordinates of the rectangle which should be rendered.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets the global configuration of the labeling engine.
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
void setPathResolver(const QgsPathResolver &resolver)
Sets the path resolver for conversion between relative and absolute paths during rendering operations...
void setLabelBoundaryGeometry(const QgsGeometry &boundary)
Sets the label boundary geometry, which restricts where in the rendered map labels are permitted to b...
void setLabelBlockingRegions(const QList< QgsLabelBlockingRegion > ®ions)
Sets a list of regions to avoid placing labels within.
void setOutputSize(QSize size)
Sets the size of the resulting map image, in pixels.
void setBackgroundColor(const QColor &color)
Sets the background color of the map.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
void setFlag(Qgis::MapSettingsFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
Sets the destination crs (coordinate reference system) for the map render.
void mapThemeRenamed(const QString &name, const QString &newName)
Emitted when a map theme within the collection is renamed.
void mapThemeChanged(const QString &theme)
Emitted when a map theme changes definition.
QString description() const
Description.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the registry.
void crsChanged()
Emitted when the crs() of the project has changed.
QgsMapThemeCollection * mapThemeCollection
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.
Qgis::ScaleCalculationMethod scaleMethod
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
static QgsRectangle fromCenterAndSize(const QgsPointXY ¢er, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsExpressionContext & expressionContext()
Gets the expression context.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
Qgis::RasterizedRenderingPolicy rasterizedRenderingPolicy() const
Returns the policy controlling when rasterisation of content during renders is permitted.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
An interface for classes which provide custom handlers for features rendered as part of a map render ...
Calculates scale for a given combination of canvas size, map extent, and monitor dpi.
double calculate(const QgsRectangle &mapExtent, double canvasWidth) const
Calculate the scale denominator.
void setDpi(double dpi)
Sets the dpi (dots per inch) for the output resolution, to be used in scale calculations.
void setMapUnits(Qgis::DistanceUnit mapUnits)
Set the map units.
void setMethod(Qgis::ScaleCalculationMethod method)
Sets the method to use for map scale calculations.
Scoped object for saving and restoring a QPainter object's state.
A boolean settings entry.
static QgsSettingsTreeNode * sTreeLayout
An interface for classes which can visit style entity (e.g.
@ LayoutItem
Individual item in a print layout.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
T begin() const
Returns the beginning of the range.
T end() const
Returns the upper bound of the range.
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
static double scaleToZoom(double mapScale, double z0Scale=559082264.0287178)
Finds zoom level given map scale denominator.
static int scaleToZoomLevel(double mapScale, int sourceMinZoom, int sourceMaxZoom, double z0Scale=559082264.0287178)
Finds the best fitting zoom level given a map scale denominator and allowed zoom level range.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
_LayerRef< QgsMapLayer > QgsMapLayerRef
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
Single variable definition for use within a QgsExpressionContextScope.
Contains details of a particular export layer relating to a layout item.
QPainter::CompositionMode compositionMode
Associated composition mode if this layer is associated with a map layer.
QString mapLayerId
Associated map layer ID, or an empty string if this export layer is not associated with a map layer.
double opacity
Associated opacity, if this layer is associated with a map layer.
QString name
User-friendly name for the export layer.
QString mapTheme
Associated map theme, or an empty string if this export layer does not need to be associated with a m...
Contains information relating to a node (i.e.
TYPE * resolveWeakly(const QgsProject *project, MatchType matchType=MatchType::All)
Resolves the map layer by attempting to find a matching layer in a project using a weak match.
QString source
Weak reference to layer public source.
QString name
Weak reference to layer name.
QString provider
Weak reference to layer provider.
TYPE * resolve(const QgsProject *project)
Resolves the map layer by attempting to find a layer with matching ID within a project.
QString layerId
Original layer ID.