When I am running the code in QGIS python console, I am getting an error -
RuntimeError: wrapped C/C++ object of type QgsPrintLayout has been deleted
from PyQt5.QtCore import QTimer
fileName = 'D:\\UCC\\exported' # exported is a prefix for the file names
boundaryLayer = QgsProject.instance().mapLayersByName('Cooling_Towers')[0]
QgsProject.instance().layerTreeRoot().findLayer(boundaryLayer.id()).setItemVisibilityChecked(True)
otherLayers = []
for layer in QgsProject.instance().mapLayers().values():
if layer.name().startswith("M_"):
otherLayers.append(layer.name())
count = 0
def prepareMap(): # Arrange layers
for layer in QgsProject.instance().mapLayers().values():
if layer.name().startswith("M_"):
QgsProject.instance().layerTreeRoot().findLayer(layer).setItemVisibilityChecked(False)
for layer in QgsProject.instance().mapLayers().values():
if layer.name().startswith(otherLayers[count]):
QgsProject.instance().layerTreeRoot().findLayer(layer).setItemVisibilityChecked(True)
qgis.utils.iface.setActiveLayer(layer)
qgis.utils.iface.zoomToActiveLayer()
project = QgsProject.instance()
manager = project.layoutManager()
layout = QgsPrintLayout(project)
layoutName = 'Layout'
#initializes default settings for blank print layout canvas
layout.initializeDefaults()
layout.setName(layoutName)
manager.addLayout(layout)
#layoutName = "PrintLayout"
layouts_list = manager.printLayouts()
# remove any duplicate layouts
for layout in layouts_list:
if layout.name() == layoutName:
manager.removeLayout(layout)
page_size =QgsLayoutSize(5000, 5000, QgsUnitTypes.LayoutPixels)
pc = layout.pageCollection()
page = pc.pages()[0]
page.setPageSize(page_size)
# create map item in the layout
map = QgsLayoutItemMap(layout)
map.setKeepLayerSet(True)
map.setLayers([layer, boundaryLayer])
map.setRect(20, 20, 20, 20)
#rect = QgsRectangle(ms.fullExtent())
rect = QgsRectangle(-8232312.3, 4993694.4, -8231302.8, 4994703.9)
map.setExtent(rect)
map.attemptResize(QgsLayoutSize(423.333, 423.333, QgsUnitTypes.LayoutMillimeters))
layout.addLayoutItem(map)
layout = manager.layoutByName(layoutName)
exporter = QgsLayoutExporter(layout)
fn = 'D:\\layout_export' + str(count) + '.png'
exporter.exportToImage(fn, QgsLayoutExporter.ImageExportSettings())
#map.refresh()
QTimer.singleShot(30000, exportMap) # Wait a second and export the map
# Save the map as a PNG
def exportMap():
global count # We need this because we'll modify its value
if count < len(otherLayers)-1:
QTimer.singleShot(10000, prepareMap) # Wait a second and prepare next map
count += 1
prepareMap()
Reference - Iterating over layers and exporting them as PNG images with PyQGIS in standalone script
https://data.library.virginia.edu/how-to-create-and-export-print-layouts-in-python-for-qgis-3/