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() };
389 mGroupLayers[groupLayer->id()] = std::move( groupLayerClone );
390 *it = mGroupLayers[groupLayer->id()].get();
394 mLayers = _qgis_listRawToRef( layersCopy );
399 if ( overrides == mLayerStyleOverrides )
402 mLayerStyleOverrides = overrides;
408 mLayerStyleOverrides.clear();
415 mLayerStyleOverrides.insert( layer->id(), style.
xmlData() );
422 if ( mFollowVisibilityPreset == follow )
425 mFollowVisibilityPreset = follow;
427 if ( !mFollowVisibilityPresetName.isEmpty() )
428 emit
themeChanged( mFollowVisibilityPreset ? mFollowVisibilityPresetName : QString() );
433 if ( name == mFollowVisibilityPresetName )
436 mFollowVisibilityPresetName = name;
437 if ( mFollowVisibilityPreset )
443 mLastRenderedImageOffsetX -= dx;
444 mLastRenderedImageOffsetY -= dy;
447 transformShift( dx, dy );
448 mExtent.setXMinimum( mExtent.xMinimum() + dx );
449 mExtent.setXMaximum( mExtent.xMaximum() + dx );
450 mExtent.setYMinimum( mExtent.yMinimum() + dy );
451 mExtent.setYMaximum( mExtent.yMaximum() + dy );
470 double mapX = mExtent.xMinimum() + ( point.x() / rect().width() ) * ( mExtent.xMaximum() - mExtent.xMinimum() );
471 double mapY = mExtent.yMinimum() + ( 1 - ( point.y() / rect().height() ) ) * ( mExtent.yMaximum() - mExtent.yMinimum() );
474 double centerX = ( mExtent.xMaximum() + mExtent.xMinimum() ) / 2;
475 double centerY = ( mExtent.yMaximum() + mExtent.yMinimum() ) / 2;
477 centerX = mapX + ( centerX - mapX ) * ( 1.0 / factor );
478 centerY = mapY + ( centerY - mapY ) * ( 1.0 / factor );
480 double newIntervalX, newIntervalY;
484 newIntervalX = ( mExtent.xMaximum() - mExtent.xMinimum() ) / factor;
485 newIntervalY = ( mExtent.yMaximum() - mExtent.yMinimum() ) / factor;
492 mExtent.setXMaximum( centerX + newIntervalX / 2 );
493 mExtent.setXMinimum( centerX - newIntervalX / 2 );
494 mExtent.setYMaximum( centerY + newIntervalY / 2 );
495 mExtent.setYMinimum( centerY - newIntervalY / 2 );
497 if ( mAtlasDriven && mAtlasScalingMode ==
Fixed )
504 calculator.
setDpi( 25.4 );
509 const double newScale = calculator.
calculate( mExtent, rect().width() );
512 const double scaleRatio =
scale() / newScale;
513 mExtent.scale( scaleRatio );
530 if ( layer->dataProvider() && layer->providerType() ==
"wms"_L1 )
540 if (
blendMode() != QPainter::CompositionMode_SourceOver )
559 auto containsAdvancedEffectsIgnoreItemOpacity = [
this]() ->
bool {
568 if ( mOverviewStack->containsAdvancedEffects() )
576 if ( mGridStack->containsAdvancedEffects() )
589 if ( !containsAdvancedEffectsIgnoreItemOpacity() )
610 if ( mOverviewStack->containsAdvancedEffects() )
618 if ( mGridStack->containsAdvancedEffects() )
633 mMapRotation = rotation;
634 mEvaluatedMapRotation = mMapRotation;
647 mAtlasDriven = enabled;
664 double margin = mAtlasMargin;
672 margin = ddMargin / 100;
684 if ( mGridStack->size() < 1 )
687 mGridStack->addGrid(
grid );
689 return mGridStack->grid( 0 );
694 if ( mOverviewStack->size() < 1 )
697 mOverviewStack->addOverview(
overview );
699 return mOverviewStack->overview( 0 );
709 for (
int i = 0; i < mGridStack->size(); ++i )
712 if (
grid->mEvaluatedEnabled )
715 frameBleed = std::max( frameBleed,
grid->mEvaluatedGridFrameWidth +
grid->mEvaluatedGridFrameMargin +
grid->mEvaluatedGridFrameLineThickness / 2.0 );
730 mapElem.setAttribute( u
"keepLayerSet"_s, u
"true"_s );
734 mapElem.setAttribute( u
"keepLayerSet"_s, u
"false"_s );
737 if ( mDrawAnnotations )
739 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"true"_s );
743 mapElem.setAttribute( u
"drawCanvasItems"_s, u
"false"_s );
747 QDomElement extentElem = doc.createElement( u
"Extent"_s );
752 mapElem.appendChild( extentElem );
754 if ( mCrs.isValid() )
756 QDomElement crsElem = doc.createElement( u
"crs"_s );
757 mCrs.writeXml( crsElem, doc );
758 mapElem.appendChild( crsElem );
762 mapElem.setAttribute( u
"followPreset"_s, mFollowVisibilityPreset ? u
"true"_s : u
"false"_s );
763 mapElem.setAttribute( u
"followPresetName"_s, mFollowVisibilityPresetName );
766 mapElem.setAttribute( u
"mapRotation"_s, QString::number( mMapRotation ) );
769 QDomElement layerSetElem = doc.createElement( u
"LayerSet"_s );
774 QDomElement layerElem = doc.createElement( u
"Layer"_s );
776 const auto it = std::find_if( mGroupLayers.cbegin(), mGroupLayers.cend(), [&layerRef](
const std::pair<
const QString, std::unique_ptr<QgsGroupLayer>> &groupLayer ) ->
bool {
777 return groupLayer.second.get() == layerRef.get();
780 if ( it != mGroupLayers.end() )
786 layerId = layerRef.layerId;
789 QDomText layerIdText = doc.createTextNode( layerId );
790 layerElem.appendChild( layerIdText );
792 layerElem.setAttribute( u
"name"_s, layerRef.name );
793 layerElem.setAttribute( u
"source"_s, layerRef.source );
794 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
796 if ( it != mGroupLayers.end() )
798 const auto childLayers { it->second->childLayers() };
799 QDomElement childLayersElement = doc.createElement( u
"childLayers"_s );
800 for (
const QgsMapLayer *childLayer : std::as_const( childLayers ) )
802 QDomElement childElement = doc.createElement( u
"child"_s );
803 childElement.setAttribute( u
"layerid"_s, childLayer->id() );
804 childLayersElement.appendChild( childElement );
806 layerElem.appendChild( childLayersElement );
808 layerSetElem.appendChild( layerElem );
810 mapElem.appendChild( layerSetElem );
813 if ( mKeepLayerStyles )
815 QDomElement stylesElem = doc.createElement( u
"LayerStyles"_s );
816 for (
auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
818 QDomElement styleElem = doc.createElement( u
"LayerStyle"_s );
823 styleElem.setAttribute( u
"layerid"_s, ref.
layerId );
824 styleElem.setAttribute( u
"name"_s, ref.
name );
825 styleElem.setAttribute( u
"source"_s, ref.
source );
826 styleElem.setAttribute( u
"provider"_s, ref.
provider );
830 stylesElem.appendChild( styleElem );
832 mapElem.appendChild( stylesElem );
836 mGridStack->writeXml( mapElem, doc, context );
839 mOverviewStack->writeXml( mapElem, doc, context );
842 QDomElement atlasElem = doc.createElement( u
"AtlasMap"_s );
843 atlasElem.setAttribute( u
"atlasDriven"_s, mAtlasDriven );
844 atlasElem.setAttribute( u
"scalingMode"_s, mAtlasScalingMode );
846 mapElem.appendChild( atlasElem );
848 mapElem.setAttribute( u
"labelMargin"_s, mLabelMargin.encodeMeasurement() );
849 mapElem.setAttribute( u
"mapFlags"_s,
static_cast< int>( mMapFlags ) );
851 QDomElement labelBlockingItemsElem = doc.createElement( u
"labelBlockingItems"_s );
852 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
857 QDomElement blockingItemElem = doc.createElement( u
"item"_s );
858 blockingItemElem.setAttribute( u
"uuid"_s, item->uuid() );
859 labelBlockingItemsElem.appendChild( blockingItemElem );
861 mapElem.appendChild( labelBlockingItemsElem );
864 mapElem.setAttribute( u
"isTemporal"_s,
isTemporal() ? 1 : 0 );
867 mapElem.setAttribute( u
"temporalRangeBegin"_s,
temporalRange().begin().toString( Qt::ISODate ) );
868 mapElem.setAttribute( u
"temporalRangeEnd"_s,
temporalRange().end().toString( Qt::ISODate ) );
871 mapElem.setAttribute( u
"enableZRange"_s, mZRangeEnabled ? 1 : 0 );
872 if ( mZRange.lower() != std::numeric_limits< double >::lowest() )
874 if ( mZRange.upper() != std::numeric_limits< double >::max() )
877 mAtlasClippingSettings->writeXml( mapElem, doc, context );
878 mItemClippingSettings->writeXml( mapElem, doc, context );
885 mUpdatesEnabled =
false;
888 QDomNodeList extentNodeList = itemElem.elementsByTagName( u
"Extent"_s );
889 if ( !extentNodeList.isEmpty() )
891 QDomElement extentElem = extentNodeList.at( 0 ).toElement();
892 double xmin, xmax, ymin, ymax;
893 xmin = extentElem.attribute( u
"xmin"_s ).toDouble();
894 xmax = extentElem.attribute( u
"xmax"_s ).toDouble();
895 ymin = extentElem.attribute( u
"ymin"_s ).toDouble();
896 ymax = extentElem.attribute( u
"ymax"_s ).toDouble();
900 QDomNodeList crsNodeList = itemElem.elementsByTagName( u
"crs"_s );
902 if ( !crsNodeList.isEmpty() )
904 QDomElement crsElem = crsNodeList.at( 0 ).toElement();
905 crs.readXml( crsElem );
910 mMapRotation = itemElem.attribute( u
"mapRotation"_s, u
"0"_s ).toDouble();
911 mEvaluatedMapRotation = mMapRotation;
914 mFollowVisibilityPreset = itemElem.attribute( u
"followPreset"_s ).compare(
"true"_L1 ) == 0;
915 mFollowVisibilityPresetName = itemElem.attribute( u
"followPresetName"_s );
918 QString keepLayerSetFlag = itemElem.attribute( u
"keepLayerSet"_s );
919 if ( keepLayerSetFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
921 mKeepLayerSet =
true;
925 mKeepLayerSet =
false;
928 QString drawCanvasItemsFlag = itemElem.attribute( u
"drawCanvasItems"_s, u
"true"_s );
929 if ( drawCanvasItemsFlag.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 )
931 mDrawAnnotations =
true;
935 mDrawAnnotations =
false;
938 mLayerStyleOverrides.clear();
940 QList<QgsMapLayerRef> layerSet;
941 QDomNodeList layerSetNodeList = itemElem.elementsByTagName( u
"LayerSet"_s );
942 if ( !layerSetNodeList.isEmpty() )
944 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
945 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
946 layerSet.reserve( layerIdNodeList.size() );
947 for (
int i = 0; i < layerIdNodeList.size(); ++i )
949 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
950 QString layerId = layerElem.text();
951 QString layerName = layerElem.attribute( u
"name"_s );
952 QString layerSource = layerElem.attribute( u
"source"_s );
953 QString layerProvider = layerElem.attribute( u
"provider"_s );
955 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
963 setLayers( _qgis_listRefToRaw( layerSet ) );
966 if ( !layerSetNodeList.isEmpty() )
968 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
969 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
970 for (
int i = 0; i < layerIdNodeList.size(); ++i )
972 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
973 const QString layerId = layerElem.text();
974 const auto it = mGroupLayers.find( layerId );
975 if ( it != mGroupLayers.cend() )
977 QList<QgsMapLayerRef> childSet;
978 const QDomNodeList childLayersElements = layerElem.elementsByTagName( u
"childLayers"_s );
979 const QDomNodeList children = childLayersElements.at( 0 ).childNodes();
980 for (
int i = 0; i < children.size(); ++i )
982 const QDomElement childElement = children.at( i ).toElement();
983 const QString
id = childElement.attribute( u
"layerid"_s );
987 childSet.push_back( layerRef );
990 it->second->setChildLayers( _qgis_listRefToRaw( childSet ) );
997 QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( u
"LayerStyles"_s );
998 mKeepLayerStyles = !layerStylesNodeList.isEmpty();
999 if ( mKeepLayerStyles )
1001 QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
1002 QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( u
"LayerStyle"_s );
1003 for (
int i = 0; i < layerStyleNodeList.size(); ++i )
1005 const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
1006 QString layerId = layerStyleElement.attribute( u
"layerid"_s );
1007 QString layerName = layerStyleElement.attribute( u
"name"_s );
1008 QString layerSource = layerStyleElement.attribute( u
"source"_s );
1009 QString layerProvider = layerStyleElement.attribute( u
"provider"_s );
1010 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
1014 style.
readXml( layerStyleElement );
1020 mNumCachedLayers = 0;
1021 mCacheInvalidated =
true;
1024 mOverviewStack->readXml( itemElem, doc, context );
1027 mGridStack->readXml( itemElem, doc, context );
1030 QDomNodeList atlasNodeList = itemElem.elementsByTagName( u
"AtlasMap"_s );
1031 if ( !atlasNodeList.isEmpty() )
1033 QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
1034 mAtlasDriven = ( atlasElem.attribute( u
"atlasDriven"_s, u
"0"_s ) !=
"0"_L1 );
1035 if ( atlasElem.hasAttribute( u
"fixedScale"_s ) )
1037 mAtlasScalingMode = ( atlasElem.attribute( u
"fixedScale"_s, u
"0"_s ) !=
"0"_L1 ) ?
Fixed :
Auto;
1039 else if ( atlasElem.hasAttribute( u
"scalingMode"_s ) )
1041 mAtlasScalingMode =
static_cast<AtlasScalingMode>( atlasElem.attribute( u
"scalingMode"_s ).toInt() );
1043 mAtlasMargin = atlasElem.attribute( u
"margin"_s, u
"0.1"_s ).toDouble();
1048 mMapFlags =
static_cast< MapItemFlags>( itemElem.attribute( u
"mapFlags"_s,
nullptr ).toInt() );
1051 mBlockingLabelItems.clear();
1052 mBlockingLabelItemUuids.clear();
1053 QDomNodeList labelBlockingNodeList = itemElem.elementsByTagName( u
"labelBlockingItems"_s );
1054 if ( !labelBlockingNodeList.isEmpty() )
1056 QDomElement blockingItems = labelBlockingNodeList.at( 0 ).toElement();
1057 QDomNodeList labelBlockingNodeList = blockingItems.childNodes();
1058 for (
int i = 0; i < labelBlockingNodeList.size(); ++i )
1060 const QDomElement &itemBlockingElement = labelBlockingNodeList.at( i ).toElement();
1061 const QString itemUuid = itemBlockingElement.attribute( u
"uuid"_s );
1062 mBlockingLabelItemUuids << itemUuid;
1066 mAtlasClippingSettings->readXml( itemElem, doc, context );
1067 mItemClippingSettings->readXml( itemElem, doc, context );
1072 setIsTemporal( itemElem.attribute( u
"isTemporal"_s ).toInt() );
1075 const QDateTime begin = QDateTime::fromString( itemElem.attribute( u
"temporalRangeBegin"_s ), Qt::ISODate );
1076 const QDateTime end = QDateTime::fromString( itemElem.attribute( u
"temporalRangeEnd"_s ), Qt::ISODate );
1080 mZRangeEnabled = itemElem.attribute( u
"enableZRange"_s ).toInt();
1082 double zLower = itemElem.attribute( u
"zRangeLower"_s ).toDouble( &ok );
1085 zLower = std::numeric_limits< double >::lowest();
1087 double zUpper = itemElem.attribute( u
"zRangeUpper"_s ).toDouble( &ok );
1090 zUpper = std::numeric_limits< double >::max();
1094 mUpdatesEnabled =
true;
1098bool QgsLayoutItemMap::hasCustomFramePath()
const
1109 return mItemClippingSettings->isActive();
1114 QPainterPath customFramePath;
1115 if ( mAtlasClippingSettings->enabled() && mAtlasClippingSettings->clipItemShape() )
1120 QPolygonF visibleExtent = calculateVisibleExtentPolygon(
false );
1121 QPolygonF rectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
1124 visibleExtent.pop_back();
1125 rectPoly.pop_back();
1128 QTransform transform;
1129 QTransform::quadToQuad( visibleExtent, rectPoly, transform );
1139 if ( mItemClippingSettings->isActive() )
1141 const QgsGeometry g = mItemClippingSettings->clipPathInMapItemCoordinates();
1144 if ( !customFramePath.isEmpty() )
1147 customFramePath.closeSubpath();
1161 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
1170 QRectF thisPaintRect = rect();
1176 if (
mLayout->renderContext().isPreviewRender() )
1178 bool renderInProgress =
false;
1179 mPreviewDevicePixelRatio = painter->device()->devicePixelRatioF();
1182 painter->setClipRect( thisPaintRect );
1183 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
1186 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
1187 painter->drawRect( thisPaintRect );
1188 painter->setBrush( Qt::NoBrush );
1190 messageFont.setPointSize( 12 );
1191 painter->setFont( messageFont );
1192 painter->setPen( QColor( 255, 255, 255, 255 ) );
1193 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering map" ) );
1194 if ( mPainterJob && mCacheInvalidated && !mDrawingPreview )
1198 mBackgroundUpdateTimer->start( 100 );
1200 else if ( !mPainterJob && !mDrawingPreview )
1204 mBackgroundUpdateTimer->start( 100 );
1206 renderInProgress =
true;
1210 if ( mCacheInvalidated && !mDrawingPreview )
1214 mBackgroundUpdateTimer->start( 100 );
1215 renderInProgress =
true;
1220 double imagePixelWidth = mCacheFinalImage->width();
1221 double scale = rect().width() / imagePixelWidth * mCacheFinalImage->devicePixelRatio();
1225 painter->translate( mLastRenderedImageOffsetX + mXOffset, mLastRenderedImageOffsetY + mYOffset );
1226 painter->setCompositionMode( blendModeForRender() );
1228 painter->drawImage( 0, 0, *mCacheFinalImage );
1233 painter->setClipRect( thisPaintRect, Qt::NoClip );
1235 mOverviewStack->drawItems( painter,
false );
1236 mGridStack->drawItems( painter );
1238 drawMapFrame( painter );
1240 if ( renderInProgress )
1251 QPaintDevice *paintDevice = painter->device();
1259 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
1268 int widthInPixels =
static_cast< int >( std::round(
boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
1269 int heightInPixels =
static_cast< int >( std::round(
boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
1270 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
1272 image.fill( Qt::transparent );
1273 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1274 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
1275 double dotsPerMM = destinationDpi / 25.4;
1276 QPainter p( &image );
1279 QRect imagePaintRect(
1280 static_cast< int >( std::round( tl.x() * dotsPerMM ) ),
1281 static_cast< int >( std::round( tl.y() * dotsPerMM ) ),
1282 static_cast< int >( std::round( thisPaintRect.width() * dotsPerMM ) ),
1283 static_cast< int >( std::round( thisPaintRect.height() * dotsPerMM ) )
1285 p.setClipRect( imagePaintRect );
1287 p.translate( imagePaintRect.topLeft() );
1291 if ( shouldDrawPart( Background ) )
1293 p.scale( dotsPerMM, dotsPerMM );
1294 drawMapBackground( &p );
1295 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
1298 drawMap( &p, cExtent, imagePaintRect.size(), image.logicalDpiX() );
1303 p.scale( dotsPerMM, dotsPerMM );
1305 if ( shouldDrawPart( OverviewMapExtent ) )
1307 mOverviewStack->drawItems( &p,
false );
1309 if ( shouldDrawPart( Grid ) )
1311 mGridStack->drawItems( &p );
1316 painter->setCompositionMode( blendModeForRender() );
1317 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1318 painter->drawImage( QPointF( -tl.x() * dotsPerMM, -tl.y() * dotsPerMM ), image );
1319 painter->scale( dotsPerMM, dotsPerMM );
1324 if ( shouldDrawPart( Background ) )
1326 drawMapBackground( painter );
1330 painter->setClipRect( thisPaintRect );
1335 painter->translate( mXOffset, mYOffset );
1337 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
1339 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
1341 if ( mCurrentExportPart != NotLayered )
1343 if ( !mStagedRendererJob )
1345 createStagedRenderJob( cExtent, size, paintDevice->logicalDpiX() );
1348 mStagedRendererJob->renderCurrentPart( painter );
1352 drawMap( painter, cExtent, size, paintDevice->logicalDpiX() );
1356 painter->setClipRect( thisPaintRect, Qt::NoClip );
1358 if ( shouldDrawPart( OverviewMapExtent ) )
1360 mOverviewStack->drawItems( painter,
false );
1362 if ( shouldDrawPart( Grid ) )
1364 mGridStack->drawItems( painter );
1369 if ( shouldDrawPart( Frame ) )
1371 drawMapFrame( painter );
1382 + ( layerCount + ( layerCount ? 1 : 0 ) )
1383 + ( mGridStack->hasEnabledItems() ? 1 : 0 )
1384 + ( mOverviewStack->hasEnabledItems() ? 1 : 0 )
1390 mCurrentExportPart = Start;
1392 mExportThemes = !mFollowVisibilityPreset ?
mLayout->renderContext().exportThemes() : QStringList();
1393 mExportThemeIt = mExportThemes.begin();
1398 mCurrentExportPart = NotLayered;
1399 mExportThemes.clear();
1400 mExportThemeIt = mExportThemes.begin();
1405 switch ( mCurrentExportPart )
1410 mCurrentExportPart = Background;
1416 mCurrentExportPart = Layer;
1420 if ( mStagedRendererJob )
1422 if ( mStagedRendererJob->nextPart() )
1426 mExportLabelingResults.reset( mStagedRendererJob->takeLabelingResults() );
1427 mStagedRendererJob.reset();
1431 if ( mExportThemeIt != mExportThemes.end() && ++mExportThemeIt != mExportThemes.end() )
1437 if ( mGridStack->hasEnabledItems() )
1439 mCurrentExportPart = Grid;
1445 for (
int i = 0; i < mOverviewStack->size(); ++i )
1450 mCurrentExportPart = OverviewMapExtent;
1456 case OverviewMapExtent:
1459 mCurrentExportPart = Frame;
1466 if ( isSelected() && !
mLayout->renderContext().isPreviewRender() )
1468 mCurrentExportPart = SelectionBoxes;
1473 case SelectionBoxes:
1474 mCurrentExportPart = End;
1495 switch ( mCurrentExportPart )
1505 if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
1508 if ( mStagedRendererJob )
1510 switch ( mStagedRendererJob->currentStage() )
1514 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1515 detail.
compositionMode = mStagedRendererJob->currentLayerCompositionMode();
1516 detail.
opacity = mStagedRendererJob->currentLayerOpacity();
1524 else if (
mLayout->project()->mainAnnotationLayer()->id() == detail.
mapLayerId )
1535 const QList<QgsLayoutItemMapOverview *> res = mOverviewStack->asList();
1541 if ( item->mapLayer() && detail.
mapLayerId == item->mapLayer()->id() )
1546 detail.
name = u
"%1: %2"_s.arg(
displayName(), item->mapLayer()->name() );
1555 detail.
mapLayerId = mStagedRendererJob->currentLayerId();
1561 detail.
name = tr(
"%1: %2 (Labels)" ).arg(
displayName(), layer->name() );
1596 case OverviewMapExtent:
1604 case SelectionBoxes:
1619void QgsLayoutItemMap::drawMap( QPainter *painter,
const QgsRectangle &extent, QSizeF size,
double dpi )
1633 if ( shouldDrawPart( OverviewMapExtent ) )
1635 ms.setLayers( mOverviewStack->modifyMapLayerList( ms.layers() ) );
1638 QgsMapRendererCustomPainterJob job( ms, painter );
1639#ifdef HAVE_SERVER_PYTHON_PLUGINS
1640 job.setFeatureFilterProvider(
mLayout->renderContext().featureFilterProvider() );
1643 QgsGroupedFeatureFilterProvider jobFeatureFilter;
1646 jobFeatureFilter.
addProvider( mAtlasFeatureFilterProvider.get() );
1647 if ( job.featureFilterProvider() )
1649 jobFeatureFilter.
addProvider( job.featureFilterProvider() );
1651 job.setFeatureFilterProvider( &jobFeatureFilter );
1657 job.renderSynchronously();
1659 mExportLabelingResults.reset( job.takeLabelingResults() );
1661 mRenderingErrors = job.errors();
1665 mRenderingErrors.append( QgsMapRendererJob::Error( QString(), u
"Invalid layer(s)"_s ) );
1669void QgsLayoutItemMap::recreateCachedImageInBackground()
1674 QgsMapRendererCustomPainterJob *oldJob = mPainterJob.release();
1675 QPainter *oldPainter = mPainter.release();
1676 QImage *oldImage = mCacheRenderingImage.release();
1678 oldJob->deleteLater();
1686 mCacheRenderingImage.reset(
nullptr );
1690 Q_ASSERT( !mPainterJob );
1691 Q_ASSERT( !mPainter );
1692 Q_ASSERT( !mCacheRenderingImage );
1694 QgsRectangle ext =
extent();
1698 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
1699 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
1702 if ( w > 5000 || h > 5000 )
1707 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
1712 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
1716 if ( w <= 0 || h <= 0 )
1719 mCacheRenderingImage = std::make_unique<QImage>( w * mPreviewDevicePixelRatio, h * mPreviewDevicePixelRatio, QImage::Format_ARGB32 );
1722 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
1723 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
1724 mCacheRenderingImage->setDevicePixelRatio( mPreviewDevicePixelRatio );
1727 mCacheRenderingImage->fill( QColor( 255, 255, 255, 0 ).rgba() );
1732 if ( hasCustomFramePath() )
1734 QPainter p( mCacheRenderingImage.get() );
1736 p.setPen( Qt::NoPen );
1738 p.scale( mCacheRenderingImage->width() / widthLayoutUnits, mCacheRenderingImage->height() / heightLayoutUnits );
1748 mCacheInvalidated =
false;
1749 mPainter = std::make_unique<QPainter>( mCacheRenderingImage.get() );
1750 QgsMapSettings settings(
mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX(),
true ) );
1752 if ( shouldDrawPart( OverviewMapExtent ) )
1754 settings.setLayers( mOverviewStack->modifyMapLayerList( settings.layers() ) );
1757 mPainterJob = std::make_unique<QgsMapRendererCustomPainterJob>( settings, mPainter.get() );
1760 mPainterJob->setFeatureFilterProvider( mAtlasFeatureFilterProvider.get() );
1763 mPainterJob->start();
1775 mDrawingPreview =
false;
1798 if (
layout()->renderContext().isPreviewRender() )
1801 jobMapSettings.
setDevicePixelRatio( mPainter ? mPainter->device()->devicePixelRatioF() : 1.0 );
1804 jobMapSettings.
setRotation( mEvaluatedMapRotation );
1812 if ( includeLayerSettings )
1817 if ( !
mLayout->project()->mainAnnotationLayer()->isEmpty() )
1820 layers.insert( 0,
mLayout->project()->mainAnnotationLayer() );
1827 if ( !
mLayout->renderContext().isPreviewRender() )
1876 if ( mEvaluatedLabelMargin.length() > 0 )
1879 visiblePoly.append( visiblePoly.at( 0 ) );
1880 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1881 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1883 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1884 labelBoundary = mapBoundaryGeom;
1887 if ( !mBlockingLabelItems.isEmpty() )
1900 if ( mZRangeEnabled )
1905 if ( mAtlasClippingSettings->enabled() &&
mLayout->reportContext().feature().isValid() )
1909 region.
setFeatureClip( mAtlasClippingSettings->featureClippingType() );
1914 if ( mAtlasClippingSettings->forceLabelsInsideFeature() )
1916 if ( !labelBoundary.
isEmpty() )
1918 labelBoundary = clipGeom.
intersection( labelBoundary );
1922 labelBoundary = clipGeom;
1927 if ( mItemClippingSettings->isActive() )
1929 const QgsGeometry clipGeom = mItemClippingSettings->clippedMapExtent();
1932 jobMapSettings.
addClippingRegion( mItemClippingSettings->toMapClippingRegion() );
1934 if ( mItemClippingSettings->forceLabelsInsideClipPath() )
1936 const double layoutLabelMargin =
mLayout->convertToLayoutUnits( mEvaluatedLabelMargin );
1937 const double layoutLabelMarginInMapUnits = layoutLabelMargin / rect().width() * jobMapSettings.
extent().
width();
1939 mapBoundaryGeom = mapBoundaryGeom.
buffer( -layoutLabelMarginInMapUnits, 0 );
1940 if ( !labelBoundary.
isEmpty() )
1942 labelBoundary = mapBoundaryGeom.
intersection( labelBoundary );
1946 labelBoundary = mapBoundaryGeom;
1952 if ( !labelBoundary.
isNull() )
1955 return jobMapSettings;
1962 mBlockingLabelItems.clear();
1963 for (
const QString &
uuid : std::as_const( mBlockingLabelItemUuids ) )
1972 mOverviewStack->finalizeRestoreFromXml();
1973 mGridStack->finalizeRestoreFromXml();
1974 mItemClippingSettings->finalizeRestoreFromXml();
1985 return mCurrentRectangle;
1999 const double mapScale =
scale();
2023 QVariantList layersIds;
2033 const QList<QgsMapLayer *> layersInMap =
layersToRender( &context );
2035 layersIds.reserve( layersInMap.count() );
2036 layers.reserve( layersInMap.count() );
2039 layersIds << layer->id();
2045 scope->
addFunction( u
"is_layer_visible"_s,
new QgsExpressionContextUtils::GetLayerVisibility( layersInMap,
scale() ) );
2067 if ( extentWidth <= 0 )
2071 return rect().width() / extentWidth;
2076 double dx = mXOffset;
2077 double dy = mYOffset;
2078 transformShift( dx, dy );
2079 QPolygonF poly = calculateVisibleExtentPolygon(
false );
2080 poly.translate( -dx, -dy );
2086 if ( !mBlockingLabelItems.contains( item ) )
2087 mBlockingLabelItems.append( item );
2094 mBlockingLabelItems.removeAll( item );
2101 return mBlockingLabelItems.contains( item );
2106 return mPreviewLabelingResults.get();
2115 if ( mOverviewStack )
2117 for (
int i = 0; i < mOverviewStack->size(); ++i )
2119 if ( mOverviewStack->item( i )->accept( visitor ) )
2126 for (
int i = 0; i < mGridStack->size(); ++i )
2128 if ( mGridStack->item( i )->accept( visitor ) )
2141 mRenderedFeatureHandlers.append( handler );
2146 mRenderedFeatureHandlers.removeAll( handler );
2152 if ( mapPoly.empty() )
2154 return QPointF( 0, 0 );
2159 double dx = mapCoords.x() - rotationPoint.
x();
2160 double dy = mapCoords.y() - rotationPoint.
y();
2162 QgsPointXY backRotatedCoords( rotationPoint.
x() + dx, rotationPoint.
y() + dy );
2165 double xItem = rect().width() * ( backRotatedCoords.
x() - unrotatedExtent.
xMinimum() ) / unrotatedExtent.
width();
2166 double yItem = rect().height() * ( 1 - ( backRotatedCoords.
y() - unrotatedExtent.
yMinimum() ) / unrotatedExtent.
height() );
2167 return QPointF( xItem, yItem );
2181 mapPolygon( newExtent, poly );
2182 QRectF bRect = poly.boundingRect();
2183 extent.setXMinimum( bRect.left() );
2184 extent.setXMaximum( bRect.right() );
2185 extent.setYMinimum( bRect.top() );
2186 extent.setYMaximum( bRect.bottom() );
2196 mCacheInvalidated =
true;
2202 QRectF rectangle = rect();
2203 double frameExtension =
frameEnabled() ? pen().widthF() / 2.0 : 0.0;
2205 double topExtension = 0.0;
2206 double rightExtension = 0.0;
2207 double bottomExtension = 0.0;
2208 double leftExtension = 0.0;
2211 mGridStack->calculateMaxGridExtension( topExtension, rightExtension, bottomExtension, leftExtension );
2213 topExtension = std::max( topExtension, frameExtension );
2214 rightExtension = std::max( rightExtension, frameExtension );
2215 bottomExtension = std::max( bottomExtension, frameExtension );
2216 leftExtension = std::max( leftExtension, frameExtension );
2218 rectangle.setLeft( rectangle.left() - leftExtension );
2219 rectangle.setRight( rectangle.right() + rightExtension );
2220 rectangle.setTop( rectangle.top() - topExtension );
2221 rectangle.setBottom( rectangle.bottom() + bottomExtension );
2222 if ( rectangle != mCurrentRectangle )
2224 prepareGeometryChange();
2225 mCurrentRectangle = rectangle;
2256 refreshMapExtents( &context );
2258 if ( mExtent != beforeExtent )
2265 refreshLabelMargin(
false );
2269 const QString previousTheme = mLastEvaluatedThemeName.isEmpty() ? mFollowVisibilityPresetName : mLastEvaluatedThemeName;
2271 if ( mLastEvaluatedThemeName != previousTheme )
2292 double zLower = mZRange.lower();
2293 double zUpper = mZRange.upper();
2304 mCacheInvalidated =
true;
2309void QgsLayoutItemMap::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
2311 if ( !mLayers.isEmpty() || mLayerStyleOverrides.isEmpty() )
2315 mLayerStyleOverrides.remove( layer->id() );
2317 _qgis_removeLayers( mLayers,
layers );
2320 for ( QgsMapLayer *layer : std::as_const(
layers ) )
2323 if ( mGroupLayers.erase( layer->id() ) == 0 )
2326 for (
auto it = mGroupLayers.begin(); it != mGroupLayers.end(); ++it )
2328 QgsGroupLayer *groupLayer = it->second.get();
2329 if ( groupLayer->
childLayers().contains( layer ) )
2331 QList<QgsMapLayer *> childLayers { groupLayer->
childLayers() };
2332 childLayers.removeAll( layer );
2340void QgsLayoutItemMap::painterJobFinished()
2343 mPreviewLabelingResults.reset( mPainterJob->takeLabelingResults() );
2344 mPainterJob.reset(
nullptr );
2345 mPainter.reset(
nullptr );
2346 mCacheFinalImage = std::move( mCacheRenderingImage );
2347 mLastRenderedImageOffsetX = 0;
2348 mLastRenderedImageOffsetY = 0;
2354void QgsLayoutItemMap::shapeChanged()
2357 QgsPointXY oldCenter = mExtent.center();
2359 double w = rect().width();
2360 double h = rect().height();
2363 double newWidth = mExtent.width();
2365 double newHeight = newWidth * h / w;
2370 refreshMapExtents();
2377void QgsLayoutItemMap::mapThemeChanged(
const QString &theme )
2379 if ( theme == mCachedLayerStyleOverridesPresetName )
2380 mCachedLayerStyleOverridesPresetName.clear();
2383void QgsLayoutItemMap::currentMapThemeRenamed(
const QString &theme,
const QString &newTheme )
2385 if ( theme == mFollowVisibilityPresetName )
2387 mFollowVisibilityPresetName = newTheme;
2391void QgsLayoutItemMap::connectUpdateSlot()
2394 QgsProject *project =
mLayout->project();
2398 connect( project,
static_cast< void ( QgsProject::* )(
const QList<QgsMapLayer *> &
layers )
>( &
QgsProject::layersWillBeRemoved ),
this, &QgsLayoutItemMap::layersAboutToBeRemoved );
2401 if ( layers().isEmpty() )
2409 if ( !mCrs.isValid() )
2425 if ( mAtlasScalingMode == Predefined )
2426 updateAtlasFeature();
2432 QPolygonF thisExtent = calculateVisibleExtentPolygon(
false );
2433 QTransform mapTransform;
2434 QPolygonF thisRectPoly = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
2436 thisRectPoly.pop_back();
2437 thisExtent.pop_back();
2439 QPolygonF thisItemPolyInLayout = mapToScene( thisRectPoly );
2442 QTransform::quadToQuad( thisItemPolyInLayout, thisExtent, mapTransform );
2443 return mapTransform;
2448 mZRangeEnabled = enabled;
2453 return mZRangeEnabled;
2466QList<QgsLabelBlockingRegion> QgsLayoutItemMap::createLabelBlockingRegions(
const QgsMapSettings & )
const
2469 QList< QgsLabelBlockingRegion > blockers;
2470 blockers.reserve( mBlockingLabelItems.count() );
2471 for (
const auto &item : std::as_const( mBlockingLabelItems ) )
2478 if ( item->property(
"wasVisible" ).isValid() )
2480 if ( !item->property(
"wasVisible" ).toBool() )
2483 else if ( !item->isVisible() )
2486 QPolygonF itemRectInMapCoordinates = mapTransform.map( item->mapToScene( item->rect() ) );
2487 itemRectInMapCoordinates.append( itemRectInMapCoordinates.at( 0 ) );
2489 blockers << QgsLabelBlockingRegion( blockingRegion );
2496 return mLabelMargin;
2501 mLabelMargin = margin;
2502 refreshLabelMargin(
false );
2505void QgsLayoutItemMap::updateToolTip()
2514 if ( mFollowVisibilityPreset )
2516 presetName = mFollowVisibilityPresetName;
2520 else if ( !mExportThemes.empty() && mExportThemeIt != mExportThemes.end() )
2521 presetName = *mExportThemeIt;
2532 QList<QgsMapLayer *> renderLayers;
2534 QString presetName = themeToRender( *evalContext );
2535 if ( !presetName.isEmpty() )
2537 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2538 renderLayers =
mLayout->project()->mapThemeCollection()->mapThemeVisibleLayers( presetName );
2540 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2542 else if ( !
layers().isEmpty() )
2548 renderLayers =
mLayout->project()->mapThemeCollection()->masterVisibleLayers();
2555 renderLayers.clear();
2557 const QStringList layerNames = ddLayers.split(
'|' );
2559 for (
const QString &name : layerNames )
2561 const QList< QgsMapLayer * > matchingLayers =
mLayout->project()->mapLayersByName( name );
2564 renderLayers << layer;
2573 int removeAt = renderLayers.indexOf(
mLayout->reportContext().layer() );
2574 if ( removeAt != -1 )
2576 renderLayers.removeAt( removeAt );
2581 if ( !includeInvalidLayers )
2583 renderLayers.erase( std::remove_if( renderLayers.begin(), renderLayers.end(), [](
QgsMapLayer *layer ) { return !layer || !layer->isValid(); } ), renderLayers.end() );
2586 return renderLayers;
2589QMap<QString, QString> QgsLayoutItemMap::layerStyleOverridesToRender(
const QgsExpressionContext &context )
const
2591 QString presetName = themeToRender( context );
2592 if ( !presetName.isEmpty() )
2594 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2596 if ( presetName != mCachedLayerStyleOverridesPresetName )
2599 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2600 mCachedLayerStyleOverridesPresetName = presetName;
2603 return mCachedPresetLayerStyleOverrides;
2606 return QMap<QString, QString>();
2608 else if ( mFollowVisibilityPreset )
2610 QString presetName = mFollowVisibilityPresetName;
2613 if (
mLayout->project()->mapThemeCollection()->hasMapTheme( presetName ) )
2615 if ( presetName.isEmpty() || presetName != mCachedLayerStyleOverridesPresetName )
2618 mCachedPresetLayerStyleOverrides =
mLayout->project()->mapThemeCollection()->mapThemeStyleOverrides( presetName );
2619 mCachedLayerStyleOverridesPresetName = presetName;
2622 return mCachedPresetLayerStyleOverrides;
2625 return QMap<QString, QString>();
2627 else if ( mKeepLayerStyles )
2629 return mLayerStyleOverrides;
2633 return QMap<QString, QString>();
2637QgsRectangle QgsLayoutItemMap::transformedExtent()
const
2639 double dx = mXOffset;
2640 double dy = mYOffset;
2641 transformShift( dx, dy );
2642 return QgsRectangle( mExtent.xMinimum() - dx, mExtent.yMinimum() - dy, mExtent.xMaximum() - dx, mExtent.yMaximum() - dy );
2645void QgsLayoutItemMap::mapPolygon(
const QgsRectangle &extent, QPolygonF &poly )
const
2650 poly << QPointF(
extent.xMinimum(),
extent.yMaximum() );
2651 poly << QPointF(
extent.xMaximum(),
extent.yMaximum() );
2652 poly << QPointF(
extent.xMaximum(),
extent.yMinimum() );
2653 poly << QPointF(
extent.xMinimum(),
extent.yMinimum() );
2655 poly << QPointF( poly.at( 0 ) );
2660 QgsPointXY rotationPoint( (
extent.xMaximum() +
extent.xMinimum() ) / 2.0, (
extent.yMaximum() +
extent.yMinimum() ) / 2.0 );
2664 dx = rotationPoint.x() -
extent.xMinimum();
2665 dy = rotationPoint.y() -
extent.yMaximum();
2667 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2670 dx = rotationPoint.x() -
extent.xMaximum();
2671 dy = rotationPoint.y() -
extent.yMaximum();
2673 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2676 dx = rotationPoint.x() -
extent.xMaximum();
2677 dy = rotationPoint.y() -
extent.yMinimum();
2679 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2682 dx = rotationPoint.x() -
extent.xMinimum();
2683 dy = rotationPoint.y() -
extent.yMinimum();
2685 poly << QPointF( rotationPoint.x() - dx, rotationPoint.y() - dy );
2688 poly << QPointF( poly.at( 0 ) );
2691void QgsLayoutItemMap::transformShift(
double &xShift,
double &yShift )
const
2694 double dxScaled = xShift * mmToMapUnits;
2695 double dyScaled = -yShift * mmToMapUnits;
2710 const QList< QgsAnnotation * > annotations =
mLayout->project()->annotationManager()->annotations();
2711 if ( annotations.isEmpty() )
2720 for ( QgsAnnotation *annotation : annotations )
2722 if ( !annotation || !annotation->isVisible() )
2726 if ( annotation->mapLayer() && !
layers.contains( annotation->mapLayer() ) )
2729 drawAnnotation( annotation, rc );
2740 QgsScopedQPainterState painterState( context.
painter() );
2743 double itemX, itemY;
2746 QPointF mapPos = layoutMapPosForItem( annotation );
2755 context.
painter()->translate( itemX, itemY );
2758 double dotsPerMM = context.
painter()->device()->logicalDpiX() / 25.4;
2759 context.
painter()->scale( 1 / dotsPerMM, 1 / dotsPerMM );
2761 annotation->
render( context );
2764QPointF QgsLayoutItemMap::layoutMapPosForItem(
const QgsAnnotation *annotation )
const
2767 return QPointF( 0, 0 );
2774 QgsCoordinateReferenceSystem annotationCrs = annotation->
mapPositionCrs();
2776 if ( annotationCrs !=
crs() )
2779 QgsCoordinateTransform t( annotationCrs,
crs(),
mLayout->project() );
2783 t.transformInPlace( mapX, mapY, z );
2785 catch (
const QgsCsException & )
2792void QgsLayoutItemMap::drawMapFrame( QPainter *p )
2803void QgsLayoutItemMap::drawMapBackground( QPainter *p )
2814bool QgsLayoutItemMap::shouldDrawPart( QgsLayoutItemMap::PartType part )
const
2816 if ( mCurrentExportPart == NotLayered )
2834 return mCurrentExportPart == Layer;
2837 return mCurrentExportPart == Grid && mGridStack->hasEnabledItems();
2839 case OverviewMapExtent:
2840 return mCurrentExportPart == OverviewMapExtent && mOverviewStack->hasEnabledItems();
2845 case SelectionBoxes:
2846 return mCurrentExportPart == SelectionBoxes && isSelected();
2857 QgsExpressionContext scopedContext;
2862 const QgsExpressionContext *evalContext = context ? context : &scopedContext;
2866 QgsRectangle newExtent =
extent();
2867 bool useDdXMin =
false;
2868 bool useDdXMax =
false;
2869 bool useDdYMin =
false;
2870 bool useDdYMax =
false;
2901 if ( newExtent != mExtent )
2907 double currentWidthHeightRatio = mExtent.width() / mExtent.height();
2908 double newWidthHeightRatio = newExtent.
width() / newExtent.
height();
2910 if ( currentWidthHeightRatio < newWidthHeightRatio )
2913 double newHeight = newExtent.
width() / currentWidthHeightRatio;
2914 double deltaHeight = newHeight - newExtent.
height();
2921 double newWidth = currentWidthHeightRatio * newExtent.
height();
2922 double deltaWidth = newWidth - newExtent.
width();
2927 mExtent = newExtent;
2937 newExtent = mExtent;
2940 if ( useDdXMax || useDdXMin || useDdYMax || useDdYMin )
2944 if ( useDdXMin && !useDdXMax )
2946 double xMax = mExtent.xMaximum() - ( mExtent.xMinimum() - minXD );
2950 else if ( !useDdXMin && useDdXMax )
2952 double xMin = mExtent.xMinimum() - ( mExtent.xMaximum() - maxXD );
2956 if ( useDdYMin && !useDdYMax )
2958 double yMax = mExtent.yMaximum() - ( mExtent.yMinimum() - minYD );
2962 else if ( !useDdYMin && useDdYMax )
2964 double yMin = mExtent.yMinimum() - ( mExtent.yMaximum() - maxYD );
2969 if ( newExtent != mExtent )
2971 mExtent = newExtent;
2988void QgsLayoutItemMap::refreshLabelMargin(
bool updateItem )
2993 mEvaluatedLabelMargin.setUnits( mLabelMargin.units() );
3001void QgsLayoutItemMap::updateAtlasFeature()
3003 if ( !
mLayout->reportContext().layer() || !
mLayout->reportContext().feature().isValid() )
3006 QgsFeatureExpressionFilterProvider *filter =
new QgsFeatureExpressionFilterProvider();
3007 filter->
setFilter(
mLayout->reportContext().layer()->id(), QgsExpression( u
"@id = %1"_s.arg(
mLayout->reportContext().feature().id() ) ) );
3008 mAtlasFeatureFilterProvider = std::make_unique<QgsGroupedFeatureFilterProvider>();
3009 mAtlasFeatureFilterProvider->addProvider( filter );
3014 QgsRectangle bounds = computeAtlasRectangle();
3022 QgsRectangle newExtent = bounds;
3023 QgsRectangle originalExtent = mExtent;
3028 if ( mAtlasScalingMode ==
Fixed || mAtlasScalingMode ==
Predefined || isPointLayer )
3030 QgsScaleCalculator calc;
3033 if ( QgsProject *project =
mLayout->project() )
3037 double originalScale = calc.
calculate( originalExtent, rect().width() );
3038 double geomCenterX = ( xa1 + xa2 ) / 2.0;
3039 double geomCenterY = ( ya1 + ya2 ) / 2.0;
3040 QVector<qreal> scales;
3042 if ( !
mLayout->reportContext().predefinedScales().empty() )
3043 scales =
mLayout->reportContext().predefinedScales();
3045 scales =
mLayout->renderContext().predefinedScales();
3047 if ( mAtlasScalingMode ==
Fixed || scales.isEmpty() || ( isPointLayer && mAtlasScalingMode !=
Predefined ) )
3050 double xMin = geomCenterX - originalExtent.
width() / 2.0;
3051 double yMin = geomCenterY - originalExtent.
height() / 2.0;
3052 newExtent = QgsRectangle( xMin, yMin, xMin + originalExtent.
width(), yMin + originalExtent.
height() );
3056 double newScale = calc.
calculate( newExtent, rect().width() );
3059 newExtent.
scale( originalScale / newScale );
3065 double newWidth = originalExtent.
width();
3066 double newHeight = originalExtent.
height();
3067 for (
int i = 0; i < scales.size(); i++ )
3069 double ratio = scales[i] / originalScale;
3070 newWidth = originalExtent.
width() * ratio;
3071 newHeight = originalExtent.
height() * ratio;
3074 double xMin = geomCenterX - newWidth / 2.0;
3075 double yMin = geomCenterY - newHeight / 2.0;
3076 newExtent = QgsRectangle( xMin, yMin, xMin + newWidth, yMin + newHeight );
3080 const double newScale = calc.
calculate( newExtent, rect().width() );
3084 newExtent.
scale( scales[i] / newScale );
3094 else if ( mAtlasScalingMode ==
Auto )
3098 double geomRatio = bounds.
width() / bounds.
height();
3099 double mapRatio = originalExtent.
width() / originalExtent.
height();
3102 if ( geomRatio < mapRatio )
3105 double adjWidth = ( mapRatio * bounds.
height() - bounds.
width() ) / 2.0;
3110 else if ( geomRatio > mapRatio )
3113 double adjHeight = ( bounds.
width() / mapRatio - bounds.
height() ) / 2.0;
3117 newExtent = QgsRectangle( xa1, ya1, xa2, ya2 );
3119 const double evaluatedAtlasMargin =
atlasMargin();
3120 if ( evaluatedAtlasMargin > 0.0 )
3122 newExtent.
scale( 1 + evaluatedAtlasMargin );
3136 QgsGeometry g =
mLayout->reportContext().currentGeometry(
crs() );
3148 double dx = std::max( std::abs( prevCenter.
x() - bounds.
xMinimum() ), std::abs( prevCenter.
x() - bounds.
xMaximum() ) );
3149 double dy = std::max( std::abs( prevCenter.
y() - bounds.
yMinimum() ), std::abs( prevCenter.
y() - bounds.
yMaximum() ) );
3151 return QgsRectangle( center.
x() - dx, center.
y() - dy, center.
x() + dx, center.
y() + dy );
3159void QgsLayoutItemMap::createStagedRenderJob(
const QgsRectangle &extent,
const QSizeF size,
double dpi )
3162 settings.
setLayers( mOverviewStack->modifyMapLayerList( settings.
layers() ) );
3164 mStagedRendererJob = std::make_unique<
3166 mStagedRendererJob->start();
3178 if ( mMap->layout() && mMap->layout()->project() )
3180 connect( mMap->layout()->project(), static_cast< void ( QgsProject::* )( const QList<QgsMapLayer *> &layers ) >( &QgsProject::layersWillBeRemoved ), this, &QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved );
3186 return mClipToAtlasFeature;
3191 if (
enabled == mClipToAtlasFeature )
3194 mClipToAtlasFeature =
enabled;
3200 return mFeatureClippingType;
3205 if ( mFeatureClippingType == type )
3208 mFeatureClippingType = type;
3214 return mForceLabelsInsideFeature;
3219 if ( forceInside == mForceLabelsInsideFeature )
3222 mForceLabelsInsideFeature = forceInside;
3228 return mClipItemShape;
3242 return mRestrictToLayers;
3247 if ( mRestrictToLayers ==
enabled )
3256 return _qgis_listRefToRaw( mLayersToClip );
3267 QDomElement settingsElem = document.createElement( u
"atlasClippingSettings"_s );
3268 settingsElem.setAttribute( u
"enabled"_s, mClipToAtlasFeature ? u
"1"_s : u
"0"_s );
3269 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideFeature ? u
"1"_s : u
"0"_s );
3270 if ( mClipItemShape )
3272 settingsElem.setAttribute( u
"clipItemShape"_s, u
"1"_s );
3274 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3275 settingsElem.setAttribute( u
"restrictLayers"_s, mRestrictToLayers ? u
"1"_s : u
"0"_s );
3278 QDomElement layerSetElem = document.createElement( u
"layersToClip"_s );
3283 QDomElement layerElem = document.createElement( u
"Layer"_s );
3284 QDomText layerIdText = document.createTextNode( layerRef.layerId );
3285 layerElem.appendChild( layerIdText );
3287 layerElem.setAttribute( u
"name"_s, layerRef.name );
3288 layerElem.setAttribute( u
"source"_s, layerRef.source );
3289 layerElem.setAttribute( u
"provider"_s, layerRef.provider );
3291 layerSetElem.appendChild( layerElem );
3293 settingsElem.appendChild( layerSetElem );
3295 element.appendChild( settingsElem );
3301 const QDomElement settingsElem = element.firstChildElement( u
"atlasClippingSettings"_s );
3303 mClipToAtlasFeature = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3304 mForceLabelsInsideFeature = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3305 mClipItemShape = settingsElem.attribute( u
"clipItemShape"_s, u
"0"_s ).toInt();
3307 mRestrictToLayers = settingsElem.attribute( u
"restrictLayers"_s, u
"0"_s ).toInt();
3309 mLayersToClip.clear();
3310 QDomNodeList layerSetNodeList = settingsElem.elementsByTagName( u
"layersToClip"_s );
3311 if ( !layerSetNodeList.isEmpty() )
3313 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
3314 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( u
"Layer"_s );
3315 mLayersToClip.reserve( layerIdNodeList.size() );
3316 for (
int i = 0; i < layerIdNodeList.size(); ++i )
3318 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
3319 QString layerId = layerElem.text();
3320 QString layerName = layerElem.attribute( u
"name"_s );
3321 QString layerSource = layerElem.attribute( u
"source"_s );
3322 QString layerProvider = layerElem.attribute( u
"provider"_s );
3324 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
3325 if ( mMap->layout() && mMap->layout()->project() )
3327 mLayersToClip << ref;
3334void QgsLayoutItemMapAtlasClippingSettings::layersAboutToBeRemoved(
const QList<QgsMapLayer *> &layers )
3336 if ( !mLayersToClip.isEmpty() )
3338 _qgis_removeLayers( mLayersToClip, layers );
3352 return mEnabled && mClipPathSource;
3367 if ( mClipPathSource )
3370 mClipPathSource->refresh();
3379 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3380 clipGeom.
transform( mMap->layoutToMapCoordsTransform() );
3390 QgsGeometry clipGeom( mClipPathSource->clipPath() );
3391 clipGeom.
transform( mMap->sceneTransform().inverted() );
3406 if ( mClipPathSource == item )
3409 if ( mClipPathSource )
3418 mClipPathSource = item;
3420 if ( mClipPathSource )
3429 mClipPathSource->refresh();
3443 return mClipPathSource;
3448 return mFeatureClippingType;
3453 if ( mFeatureClippingType == type )
3456 mFeatureClippingType = type;
3462 return mForceLabelsInsideClipPath;
3467 if ( forceInside == mForceLabelsInsideClipPath )
3470 mForceLabelsInsideClipPath = forceInside;
3476 QDomElement settingsElem = document.createElement( u
"itemClippingSettings"_s );
3477 settingsElem.setAttribute( u
"enabled"_s, mEnabled ? u
"1"_s : u
"0"_s );
3478 settingsElem.setAttribute( u
"forceLabelsInside"_s, mForceLabelsInsideClipPath ? u
"1"_s : u
"0"_s );
3479 settingsElem.setAttribute( u
"clippingType"_s, QString::number(
static_cast<int>( mFeatureClippingType ) ) );
3480 if ( mClipPathSource )
3481 settingsElem.setAttribute( u
"clipSource"_s, mClipPathSource->uuid() );
3483 settingsElem.setAttribute( u
"clipSource"_s, QString() );
3485 element.appendChild( settingsElem );
3491 const QDomElement settingsElem = element.firstChildElement( u
"itemClippingSettings"_s );
3493 mEnabled = settingsElem.attribute( u
"enabled"_s, u
"0"_s ).toInt();
3494 mForceLabelsInsideClipPath = settingsElem.attribute( u
"forceLabelsInside"_s, u
"0"_s ).toInt();
3496 mClipPathUuid = settingsElem.attribute( u
"clipSource"_s );
3503 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.
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 intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points shared by this geometry and other.
QgsGeometry buffer(double distance, int segments) 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.