import logging import os from PyQt5.QtCore import QSettings from collections import namedtuple from enum import Enum from functools import partial from pathlib import Path from xml.dom.minidom import parseString from qgis.gui import * import qgis from qgis.core import ( NULL, QgsApplication, QgsScaleBarSettings, QgsDataSourceUri, QgsProject, QgsProviderConnectionException, QgsProviderRegistry, QgsRasterLayer, QgsSettings, QgsVectorLayer, QgsGeometry, QgsPrintLayout, QgsReadWriteContext, QgsLayoutItemMap, QgsLayoutItemPage, QgsLayoutSize, QgsUnitTypes, QgsLayoutPoint, QgsLayoutItemLabel, QgsLayoutItemPicture, QgsLayoutItemLegend, QgsLegendStyle, QgsLayoutItemScaleBar, QgsLayerTreeGroup, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsLayerTree, QgsLayoutTableColumn, QgsRectangle, QgsLayoutItemMapOverviewStack, ) from qgis.PyQt.QtCore import QLocale, QUrl, QDateTime, Qt from qgis.PyQt.QtGui import QDesktopServices, QIcon, QColor, QFont, QMovie from qgis.PyQt.QtPrintSupport import QPrinter from qgis.PyQt.QtWebKitWidgets import QWebPage from qgis.PyQt.QtWidgets import ( QDialog, QAction, QDockWidget, QFileDialog, QInputDialog, QMenu, QToolButton, QTableWidget, QTableWidgetItem, QVBoxLayout, ) from qgis.PyQt.QtXml import QDomDocument from qgis.utils import iface import glob from .tools.resources import ( load_ui, resources_path, login_base, send_issues, ) from .tools.mises_en_pages.canvas import (fletch_canvas) from .issues import CenRa_Issues from datetime import date EDITOR_CLASS = load_ui('CenRa_AutoMap_base.ui') LOGGER = logging.getLogger('CenRa_AutoMap') url_osm = 'https://osm.datagrandest.fr/mapcache/?crs=EPSG:2154&featureCount=10&format=image/png&layers=pure&maxHeight=256&maxWidth=256&styles=&url=https://osm.datagrandest.fr/mapcache' url_ortho = 'http://tiles.craig.fr/ortho/service/?crs=EPSG:2154&featureCount=10&format=image/jpeg&layers=ortho&maxHeight=256&maxWidth=256&styles=&url=http://tiles.craig.fr/ortho/service' url_mnt = 'http://tiles.craig.fr/mnt/crs=EPSG:2154&featureCount=10&format=image/png&layers=relief&maxHeight=256&maxWidth=256&styles=&url=http://tiles.craig.fr/mnt' url_pente = 'http://tiles.craig.fr/mnt/crs=EPSG:2154&featureCount=10&format=image/png&layers=pente&maxHeight=256&maxWidth=256&styles=&url=http://tiles.craig.fr/mnt' data_source = [ 'CENRA', 'IGN', 'CRAIG', 'OpenStreetMap', 'Sandre', 'BRGM', 'MUSÉUM NATIONAL D’HISTOIRE NATURELLE', "Muséum national d'Histoire naturelle", 'ONF', '20xx LPO', 'ofb.gouv.fr', 'Stamen Design', 'MTES', 'MTES', 'FEDER', 'DREAL Auvergne-Rhône-Alpes', 'INSEE', 'DGFiP', 'Fédération des Conservatoires d’espaces naturels', 'Plan cadastral informatisé - Etalab - juillet 202X', 'Parcellaire Express - IGN - 202X', ] class AutoMap_Editor(QDialog, EDITOR_CLASS): def __init__(self, parent=None): _ = parent super().__init__() self.setupUi(self) self.settings = QgsSettings() self.s = QSettings() path = '' ix = 0 plugin_dir = str(os.path.dirname(os.path.abspath(__file__))).split(os.sep) for i in plugin_dir[1:]: ix = ix+1 path = path+'/'+i self.tabWidget.setStyleSheet('background-image: url('+path+'/tools/bg/Capture.png);') self.commandLinkButton.clicked.connect(self.chargement_qpt) self.radioButton_9.clicked.connect(self.statu_atlas) self.radioButton_10.clicked.connect(self.statu_source) self.radioButton_11.clicked.connect(self.statu_map) self.radioButton_13.clicked.connect(self.statu_titre) self.comboBox_2.currentIndexChanged.connect(self.field_list) self.comboBox_7.currentIndexChanged.connect(self.update_subtitle) self.commandLinkButton_2.clicked.connect(self.load_ortho) self.commandLinkButton_3.clicked.connect(self.load_osm) self.CustomeLogo.clicked.connect(self.deflogoteck) ## On ajoute le nom des templates à la liste déroulante de l'onglet "mises en page" : mises_en_page = [] for filename in glob.glob(resources_path("mises_en_pages","*.qpt")): mises_en_page.append(filename) for i, filename in enumerate(mises_en_page): nom_fichier = os.path.basename(filename) self.comboBox.addItem(nom_fichier) self.comboBox.setCurrentIndex(1) self.template_parameters = { 'map_size': None, 'map_position' : None, 'position_map_size' : None, 'position_map_position' : None, 'title_position': None, 'title_size': None, 'subtitle_position': None, 'subtitle_size': None, 'logo_position': None, 'logo_size': None, 'legend_position': None, 'legend_size': None, 'scalebarnumeric_position':None, 'scalebarnumeric_size':None, 'scalebar_position': None, 'scalebar_size': None, 'north_position': None, 'north_size': None, 'credit_text_position': None, 'credit_text_size': None, 'credit_text2_position': None, 'credit_text2_size': None, # Add more variables as needed } self.update_logo_library() self.mComboBox_3.addItems(sorted(data_source)) self.hide_map() self.hide_titre() self.hide_source() self.hide_atlas() def update_logo_library(self): self.mComboBox_4.clear() logo_library = [] custome_bibliotech = glob.glob(self.s.value("automap/logoteck", 1, type=str)+'*.*') for l,logo_x in enumerate(custome_bibliotech): logo_library.append(' '+os.path.basename(logo_x)) bibliotech = glob.glob(resources_path("logo_library","*.png")) for l,logo_x in enumerate(bibliotech): logo_library.append(os.path.basename(logo_x)) self.mComboBox_4.addItems(sorted(logo_library)) def select_file(self): options = QFileDialog.Options() options |= QFileDialog.ShowDirsOnly folder = QFileDialog.getExistingDirectory(self, "Sélection du dossier parent", options=options) return folder+'/' def deflogoteck(self): folder = self.select_file() logopath = folder self.s.setValue("automap/logoteck", str(logopath)) self.update_logo_library() def update_subtitle(self): project_subtitle = QgsProject.instance() if self.radioButton_13.isChecked() == 1: if self.comboBox_7.currentText() != "": try: layout_subtitle = project_subtitle.layoutManager().layoutByName(self.comboBox_7.currentText()) self.lineEdit_3.setText(layout_subtitle.itemById("SubTitle").text()) except: print("") def load_ortho(self): global myGroup,last_group runing = False try: myGroup except NameError: runing = True try: last_group except NameError: last_group = '' if runing or (last_group != '' and last_group != 'ortho'): layername = False layerAll = QgsProject.instance().layerTreeRoot().children() xl = 0 for layeritem in layerAll: if layeritem.name() == 'SuperFont': myGroup = layerAll[xl] layername = True xl = xl+1 if layername: (QgsProject.instance().layerTreeRoot()).removeChildNode(myGroup) runing = True if runing or last_group != 'ortho': myGroup = (QgsProject.instance().layerTreeRoot()).addGroup("SuperFont") last_group = 'ortho' #OSM_RASTER = QgsRasterLayer(url_osm, 'OpenStreetMap Backgound', 'wms') ORTHO_RASTER = QgsRasterLayer(url_ortho, 'Orthophoto AURA', 'wms') MNT_RASTER = QgsRasterLayer(url_mnt, 'MNT RGE Alti (<= 1:100000)', 'wms') PENTE_RASTER = QgsRasterLayer(url_pente, 'Pente RGE Alti 0 à 90°(<= 1:100000)', 'wms') #OSM_RASTER.loadNamedStyle(resources_path("font","osm_background.qml")) ORTHO_RASTER.loadNamedStyle(resources_path("font","ortho_aura.qml")) MNT_RASTER.loadNamedStyle(resources_path("font","mnt_alti.qml")) #QgsProject.instance().addMapLayer(OSM_RASTER,False) QgsProject.instance().addMapLayer(ORTHO_RASTER,False) QgsProject.instance().addMapLayer(MNT_RASTER,False) QgsProject.instance().addMapLayer(PENTE_RASTER,False) #myGroup.addLayer(OSM_RASTER) myGroup.addLayer(ORTHO_RASTER) myGroup.addLayer(MNT_RASTER) myGroup.addLayer(PENTE_RASTER) def load_osm(self): global myGroup,last_group runing = False try: myGroup except NameError: runing = True try: last_group except NameError: last_group = '' if runing or (last_group != '' and last_group != 'osm'): layername = False layerAll = QgsProject.instance().layerTreeRoot().children() xl = 0 for layeritem in layerAll: if layeritem.name() == 'SuperFont': myGroup = layerAll[xl] layername = True xl = xl+1 if layername: (QgsProject.instance().layerTreeRoot()).removeChildNode(myGroup) runing = True if runing or last_group != 'osm': myGroup = (QgsProject.instance().layerTreeRoot()).addGroup("SuperFont") last_group = 'osm' OSM_RASTER = QgsRasterLayer(url_osm, 'OpenStreetMap Backgound', 'wms') #ORTHO_RASTER = QgsRasterLayer(url_ortho, 'Orthophoto AURA', 'wms') MNT_RASTER = QgsRasterLayer(url_mnt, 'MNT RGE Alti (<= 1:100000)', 'wms') PENTE_RASTER = QgsRasterLayer(url_pente, 'Pente RGE Alti 0 à 90°(<= 1:100000)', 'wms') OSM_RASTER.loadNamedStyle(resources_path("font","osm_background.qml")) #ORTHO_RASTER.loadNamedStyle(resources_path("font","ortho_aura.qml")) MNT_RASTER.loadNamedStyle(resources_path("font","mnt_alti.qml")) QgsProject.instance().addMapLayer(OSM_RASTER,False) #QgsProject.instance().addMapLayer(ORTHO_RASTER,False) QgsProject.instance().addMapLayer(MNT_RASTER,False) QgsProject.instance().addMapLayer(PENTE_RASTER,False) myGroup.addLayer(OSM_RASTER) #myGroup.addLayer(ORTHO_RASTER) myGroup.addLayer(MNT_RASTER) myGroup.addLayer(PENTE_RASTER) def raise_(self): self.activateWindow() self.mComboBox_2.clear() self.comboBox_2.clear() self.comboBox_3.clear() self.comboBox_4.clear() self.comboBox_5.clear() self.comboBox_6.clear() self.comboBox_7.clear() couches = [] couche_vecteur = [''] mapThemes = [''] titrePage = [''] for lyr in QgsProject.instance().mapLayers().values(): if isinstance(lyr, QgsVectorLayer): couche_vecteur.append(lyr.name()) couches.append(lyr.name()) for mapThemesCollection in (QgsProject.instance().mapThemeCollection()).mapThemes(): mapThemes.append(mapThemesCollection) for layoutTitre in (QgsProject.instance().layoutManager().layouts()): titrePage.append(layoutTitre.name()) self.comboBox_2.addItems(sorted(couche_vecteur)) self.mComboBox_2.addItems(sorted(couches)) self.comboBox_5.addItems(sorted(mapThemes)) self.comboBox_6.addItems(sorted(mapThemes)) self.comboBox_7.addItems(sorted(titrePage)) def statu_map(self): if self.radioButton_11.isChecked() == 1: self.show_map() else: self.hide_map() def show_map(self): self.groupBox_3.setEnabled(True) self.groupBox_3.show() def hide_map(self): self.groupBox_3.setEnabled(False) self.groupBox_3.hide() def statu_titre(self): if self.radioButton_13.isChecked() == 1: self.show_titre() else: self.hide_titre() def show_titre(self): self.lineEdit_2.setEnabled(False) self.lineEdit_2.hide() self.comboBox_7.setEnabled(True) self.comboBox_7.show() def hide_titre(self): self.lineEdit_2.setEnabled(True) self.lineEdit_2.show() self.comboBox_7.setEnabled(False) self.comboBox_7.hide() def statu_source(self): if self.radioButton_10.isChecked() == 1: self.show_source() else: self.hide_source() def show_source(self): self.lineEdit_4.setEnabled(False) self.lineEdit_4.hide() self.mComboBox_3.setEnabled(True) self.mComboBox_3.show() def hide_source(self): self.lineEdit_4.setEnabled(True) self.lineEdit_4.show() self.mComboBox_3.setEnabled(False) self.mComboBox_3.hide() def statu_atlas(self): if self.radioButton_9.isChecked() == 1: self.show_atlas() else: self.hide_atlas() def show_atlas(self): self.groupBox.setEnabled(True) self.groupBox.show() def hide_atlas(self): self.groupBox.setEnabled(False) self.groupBox.hide() def field_list(self): fields = [] self.comboBox_3.clear() self.comboBox_4.clear() if self.comboBox_2.currentText() != '': layer = QgsProject.instance().mapLayersByName(self.comboBox_2.currentText())[0] #BUG sur layer.fields() pas défini sur ce qui est pas vecteur for vfields in layer.fields(): fields.append(vfields.name()) self.comboBox_3.addItems(sorted(fields)) self.comboBox_4.addItems(sorted(fields)) def chargement_qpt(self): project = QgsProject.instance() self.manager = project.layoutManager() if self.radioButton_13.isChecked() == 1: layout_name = self.comboBox_7.currentText() else: layout_name = self.lineEdit_2.text() layouts_list = self.manager.printLayouts() for filename in glob.glob(resources_path("mises_en_pages","*.qpt")): with open(os.path.join(os.getcwd(), filename), 'r') as f: self.layout = QgsPrintLayout(project) self.layout.initializeDefaults() myAtlas=self.layout.atlas() template_content = f.read() doc = QDomDocument() doc.setContent(template_content) self.layout.loadFromTemplate(doc, QgsReadWriteContext(), True) self.layout.setName(layout_name) if True:#os.path.basename(filename) == "1. Modèle carto standard (consolidé).qpt": self.actualisation_mise_en_page() ## Add map to layout self.map_modele_test = QgsLayoutItemMap(self.layout) # Charger une carte vide self.map_modele_test.setRect(20, 20, 20, 20) # Mettre le canvas courant comme emprise self.map_modele_test.setExtent(iface.mapCanvas().extent()) # Position de la carte dans le composeur self.map_modele_test.attemptMove(self.template_parameters['map_position']) # on dimensionne le rendu de la carte (pour référence la page totale est une page A4 donc 297*210) self.map_modele_test.attemptResize(self.template_parameters['map_size']) self.map_modele_test.setKeepLayerSet(True) self.map_modele_test.setKeepLayerStyles(True) if self.radioButton_11.isChecked() == 1: self.map_modele_test.setKeepLayerSet(False) self.map_modele_test.setKeepLayerStyles(False) self.map_modele_test.setFollowVisibilityPreset(True) self.map_modele_test.setFollowVisibilityPresetName(self.comboBox_5.currentText()) if self.radioButton_12.isChecked() == 1: self.position_map = QgsLayoutItemMap(self.layout) self.position_map.setRect(20, 20, 20, 20) self.position_map.setExtent(QgsRectangle(641552,6647386, 995856,6331104)) self.position_map.setFollowVisibilityPreset(True) self.position_map.setFollowVisibilityPresetName(self.comboBox_6.currentText()) self.position_map.attemptMove(self.template_parameters['position_map_position']) self.position_map.attemptResize(self.template_parameters['position_map_size']) overviewitem = QgsLayoutItemMapOverviewStack(self.position_map) map_overview = self.position_map.overview() map_overview.setLinkedMap(self.map_modele_test) map_overview.setCentered(True) overviewitem.addOverview(map_overview) self.position_map.refresh() self.map_modele_test.setFrameEnabled(True) self.layout.addLayoutItem(self.position_map) self.position_map.setId("carte_position") self.map_modele_test.refresh() self.map_modele_test.setBackgroundColor(QColor(255, 255, 255, 255)) self.map_modele_test.setFrameEnabled(True) if self.radioButton_9.isChecked() == 1: self.map_modele_test.setAtlasDriven(True) self.layout.addLayoutItem(self.map_modele_test) self.map_modele_test.setId("carte_principale") ## Ajout d'un titre à la mise en page title = QgsLayoutItemLabel(self.layout) self.layout.addLayoutItem(title) titre = layout_name title.setText(titre) title.setFont(QFont("Calibri", 15, QFont.Bold)) title.attemptMove(self.template_parameters['title_position']) title.attemptResize(self.template_parameters['title_size']) title.setBackgroundEnabled(True) title.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addItem(title) # title.adjustSizeToText() on n'utilise plutot setFixedSize pour pouvoir centrer le titre de manière plus optimale ici title.setHAlign(Qt.AlignHCenter) title.setVAlign(Qt.AlignVCenter) ## Ajout d'un sous titre à la mise en page subtitle = QgsLayoutItemLabel(self.layout) self.layout.addLayoutItem(subtitle) titre = self.lineEdit_3.text() if self.radioButton_9.isChecked() == 1: titre = titre + ' [%' + self.comboBox_4.currentText() + '%]' subtitle.setText(titre) subtitle.setFont(QFont("MS Shell Dlg 2", 10)) subtitle.attemptMove(self.template_parameters['subtitle_position']) subtitle.attemptResize(self.template_parameters['subtitle_size']) subtitle.setId("SubTitle") subtitle.setBackgroundEnabled(True) subtitle.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addItem(subtitle) subtitle.setHAlign(Qt.AlignHCenter) subtitle.setVAlign(Qt.AlignVCenter) ## Ajout du logo CEN NA en haut à gauche de la page logo = QgsLayoutItemPicture(self.layout) logo.setResizeMode(QgsLayoutItemPicture.Zoom) logo.setMode(QgsLayoutItemPicture.FormatRaster) logo.attemptMove(self.template_parameters['logo_position']) logo.setFixedSize(self.template_parameters['logo_size']) logo.setPicturePath(resources_path("icons","CEN_RA.png")) logo.setId('logo') self.layout.addLayoutItem(logo) ## Ajout de la legende : legend = QgsLayoutItemLegend(self.layout) legend.setId('legende_model1') # legend.setTitle('Legende') legend.adjustBoxSize() legend.setFrameEnabled(False) legend.setAutoUpdateModel(False) legend.setLinkedMap(self.map_modele_test) checked_items = self.mComboBox_2.checkedItems() self.layout.addItem(legend) # group_name = 'Périmètres écologiques' # Name of a group in your legend layers_to_remove = [] for lyr in project.mapLayers().values(): if lyr.name() not in checked_items: layers_to_remove.append(lyr.name()) # the layer tree root = project.layerTreeRoot() # get legend legend = [i for i in self.layout.items() if isinstance(i, QgsLayoutItemLegend)][0] # disable auto-update legend.setAutoUpdateModel(False) legend.setLegendFilterByMapEnabled(True) # legend model model = legend.model() # the root legend group root_group = model.rootGroup() # loop through layer names for layer_name in layers_to_remove: # find layer in project layer = project.mapLayersByName(layer_name)[0] # get layer tree layer instance of layer layertreelayer = root.findLayer(layer.id()) # get the parent of the layer tree layer (layer tree root, or group) parent = layertreelayer.parent() # if the parent is a group and has a name, find it and remove the layer if isinstance(parent, QgsLayerTreeGroup) and parent.name(): group = root_group.findGroup(parent.name()) group.removeLayer(layer) # remove layers that are not in a group else: root_group.removeLayer(layer) legend.setEqualColumnWidth(True) legend.setSplitLayer(True) legend.setColumnSpace(5) legend.rstyle(QgsLegendStyle.Title).setMargin(1.5) # 1 mm legend.rstyle(QgsLegendStyle.Group).setMargin(QgsLegendStyle.Top, 3) legend.rstyle(QgsLegendStyle.Subgroup).setMargin(QgsLegendStyle.Top, 3) legend.setColumnCount(self.spinBox.value()) legend.adjustBoxSize() legend.setBackgroundEnabled(True) legend.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.refresh() legend.updateLegend() legend.attemptMove(self.template_parameters['legend_position']) ## Ajout de l'échelle numeric à la mise en page self.scalebarnumeric_qpt = QgsLayoutItemScaleBar(self.layout) self.scalebarnumeric_qpt.setStyle('Numeric') self.scalebarnumeric_qpt.setLinkedMap(self.map_modele_test) self.scalebarnumeric_qpt.applyDefaultSize() # self.scalebarnumeric_qpt.applyDefaultSettings() self.scalebarnumeric_qpt.setNumberOfSegments(2) self.scalebarnumeric_qpt.setNumberOfSegmentsLeft(0) self.scalebarnumeric_qpt.attemptMove(self.template_parameters['scalebarnumeric_position']) self.scalebarnumeric_qpt.attemptResize(self.template_parameters['scalebarnumeric_size']) self.scalebarnumeric_qpt.setAlignment(QgsScaleBarSettings.Alignment(1)) self.scalebarnumeric_qpt.setBackgroundEnabled(True) self.scalebarnumeric_qpt.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addLayoutItem(self.scalebarnumeric_qpt) ## Ajout de l'échelle à la mise en page self.scalebar_qpt = QgsLayoutItemScaleBar(self.layout) self.scalebar_qpt.setStyle('Single Box') self.scalebar_qpt.setLinkedMap(self.map_modele_test) self.scalebar_qpt.applyDefaultSize() self.scalebar_qpt.applyDefaultSettings() self.scalebar_qpt.setNumberOfSegments(2) self.scalebar_qpt.setNumberOfSegmentsLeft(0) self.scalebar_qpt.attemptMove(self.template_parameters['scalebar_position']) self.scalebar_qpt.attemptResize(self.template_parameters['scalebar_size']) self.scalebar_qpt.setAlignment(QgsScaleBarSettings.Alignment(1)) self.scalebar_qpt.setBackgroundEnabled(True) self.scalebar_qpt.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addLayoutItem(self.scalebar_qpt) # self.scalebar_qpt.setFixedSize(QgsLayoutSize(55, 15)) # ajout de la fleche du Nord north = QgsLayoutItemPicture(self.layout) north.setPicturePath(resources_path("mises_en_pages","NorthArrow_02.svg")) self.layout.addLayoutItem(north) north.attemptMove(self.template_parameters['north_position']) north.attemptResize(self.template_parameters['north_size']) if self.radioButton_10.isChecked() == 1: info_text = ["Source : " + self.mComboBox_3.currentText()][0] else: info_text = ["Source : " + self.lineEdit_4.text()][0] # ajout note info: info = ["Réalisation : " + "CEN Rhône-Alpes (" + date.today().strftime( "%d/%m/%Y") + ")"] credit_text = QgsLayoutItemLabel(self.layout) credit_text.setText(info[0]) credit_text.setFont(QFont("Calibri", 9)) credit_text.setHAlign(Qt.AlignRight) credit_text.setVAlign(Qt.AlignVCenter) credit_text.setItemRotation(-90) credit_text2 = QgsLayoutItemLabel(self.layout) credit_text2.setText(info_text) credit_text2.setFont(QFont("Calibri", 9)) credit_text2.setHAlign(Qt.AlignRight) credit_text2.setVAlign(Qt.AlignVCenter) credit_text.attemptMove(self.template_parameters['credit_text_position']) credit_text.attemptResize(self.template_parameters['credit_text_size']) credit_text2.attemptMove(self.template_parameters['credit_text2_position']) credit_text2.attemptResize(self.template_parameters['credit_text2_size']) self.layout.addLayoutItem(credit_text) self.layout.addLayoutItem(credit_text2) ## Ajout du logo credit en bas à droit de la page for logo_run in self.mComboBox_4.checkedItems(): logo_credit = QgsLayoutItemPicture(self.layout) logo_credit.setResizeMode(QgsLayoutItemPicture.Zoom) logo_credit.setMode(QgsLayoutItemPicture.FormatRaster) cur_x = self.template_parameters['logo_credit_position'].x() logo_credit.attemptMove(self.template_parameters['logo_credit_position']) logo_credit.setPictureAnchor(4) self.template_parameters['logo_credit_position'].setX(cur_x+51) logo_credit.setFixedSize(self.template_parameters['logo_credit_size']) if logo_run[0] == ' ': logo_credit.setPicturePath(self.s.value("automap/logoteck", 1, type=str)+logo_run[1:]) else: logo_credit.setPicturePath(resources_path("logo_library",logo_run)) logo_credit.setId('logo_'+logo_run) logo_credit.setBackgroundEnabled(True) logo_credit.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addLayoutItem(logo_credit) # credit_text.attemptResize(QgsLayoutSize(95, 5, QgsUnitTypes.LayoutMillimeters)) self.bar_echelle_auto(iface.mapCanvas(), self.scalebar_qpt) existing_layout = project.layoutManager().layoutByName(self.layout.name()) if existing_layout: if self.radioButton_12.isChecked() != 1: project.layoutManager().removeLayout(existing_layout) result = project.layoutManager().addLayout(self.layout) self.manager.addLayout(self.layout) if self.radioButton_9.isChecked() == 1: self.layout.atlas().setEnabled(True) cover_layer = QgsProject.instance().mapLayersByName(self.comboBox_2.currentText())[0] self.layout.atlas().setCoverageLayer(cover_layer) self.layout.atlas().setPageNameExpression(self.comboBox_4.currentText()) fichier_mise_en_page = layout_name layout_modifie = QgsProject.instance().layoutManager().layoutByName(fichier_mise_en_page) iface.openLayoutDesigner(layout_modifie) self.close() def actualisation_mise_en_page(self): A4_size = {'Portrait':{'RIGHT':210,'LEFT':0,'TOP':0,'BOTTOM':297},'Landscape':{'RIGHT':297,'LEFT':0,'TOP':0,'BOTTOM':210}} A3_size = {'Portrait':{'RIGHT':298,'LEFT':0,'TOP':0,'BOTTOM':420},'Landscape':{'RIGHT':420,'LEFT':0,'TOP':0,'BOTTOM':298}} values_page = self.comboBox.currentText() if self.radioButton_6.isChecked() and self.radioButton_7.isChecked(): pc = self.layout.pageCollection() pc.pages()[0].setPageSize('A4', QgsLayoutItemPage.Portrait) if self.radioButton_6.isChecked() and self.radioButton_8.isChecked(): pc = self.layout.pageCollection() pc.pages()[0].setPageSize('A4', QgsLayoutItemPage.Landscape) if self.radioButton_5.isChecked() and self.radioButton_7.isChecked(): pc = self.layout.pageCollection() pc.pages()[0].setPageSize('A3', QgsLayoutItemPage.Portrait) if self.radioButton_5.isChecked() and self.radioButton_8.isChecked(): pc = self.layout.pageCollection() pc.pages()[0].setPageSize('A3', QgsLayoutItemPage.Landscape) self.template_parameters = fletch_canvas(self,values_page) def bar_echelle_auto(self, echelle, bar_echelle): if True: if echelle.scale() >= 20000: bar_echelle.setUnits(QgsUnitTypes.DistanceKilometers) bar_echelle.setUnitLabel("km") bar_echelle.setUnitsPerSegment(round((echelle.scale()*0.02)/1000)) else: bar_echelle.setUnits(QgsUnitTypes.DistanceMeters) bar_echelle.setUnitLabel("m") bar_echelle.setUnitsPerSegment(round(echelle.scale()*0.02)) bar_echelle.update()