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 importlib import import_module 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, QMessageBox, QPushButton, QDockWidget, QFileDialog, QInputDialog, QMenu, QToolButton, QTableWidget, QTableWidgetItem, QVBoxLayout, ) from PyQt5 import QtGui from PyQt5 import QtWidgets from qgis.PyQt.QtXml import QDomDocument from qgis.utils import iface import glob from .tools.resources import ( load_ui, resources_path, send_issues, ) 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', ] 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}} class AutoMap_Editor(QDialog, EDITOR_CLASS): def __init__(self, parent=None): _ = parent super().__init__() self.setupUi(self) self.settings = QgsSettings() self.s = QSettings() self.setWindowIcon(QtGui.QIcon(resources_path('icons','icon.png'))) 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.verticalScrollBar.hide() 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) self.verticalScrollBar.valueChanged.connect(self.moveFrame) ## 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","*.py")): 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 = { 'Carte_size': None, 'Carte_locals' : None, 'Carte_rotate':None, 'Carte_2_size' : None, 'Carte_2_locals' : None, 'Carte_2_rotate':None, 'Legande_size': None, 'Legande_locals': None, 'Legande_rotate':None, 'Arrow_size': None, 'Arrow_locals': None, 'Arrow_rotate':None, 'Echelle_size': None, 'Echelle_locals': None, 'Echelle_rotate':None, 'Logo_size': None, 'Logo_locals': None, 'Logo_rotate':None, 'Titre_size':None, 'Titre_locals':None, 'Titre_rotate':None, 'Sous_titre_size':None, 'Sous_titre_locals':None, 'Sous_titre_rotate':None, 'Credit_size': None, 'Credit_locals': None, 'Credit_rotate':None, 'Source_size': None, 'Source_locals': None, 'Source_rotate':None, 'Logo_2_size': None, 'Logo_2_locals': None, 'Logo_2_rotate': None, 'Echelle_2_size': None, 'Echelle_2_locals': None, 'Echelle_2_rotate': 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 wheelEvent(self,event): if (event.angleDelta().y() >= 1): vsb = self.verticalScrollBar.value()+20 else: vsb = self.verticalScrollBar.value()-20 self.verticalScrollBar.setValue(vsb) def moveFrame(self): self.frame.move(self.frame.x(),self.verticalScrollBar.value()) 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() if (self.s.value("automap/prenom_nom", "1", type=str) != "1"): self.lineEdit_5.setText(self.s.value("automap/prenom_nom", 1, type=str)) 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) try: cutLayout = layout_name.index("¶") except: cutLayout = 0 if cutLayout >= 1: self.layout.setName(layout_name) titre_layout_name=layout_name[:cutLayout] else: self.layout.setName(layout_name) titre_layout_name = layout_name if self.radioButton_6.isChecked() and self.radioButton_7.isChecked(): logo_div = A4_size['Portrait']['RIGHT'] if self.radioButton_6.isChecked() and self.radioButton_8.isChecked(): logo_div = A4_size['Portrait']['BOTTOM'] if self.radioButton_5.isChecked() and self.radioButton_7.isChecked(): logo_div = A3_size['Portrait']['RIGHT'] if self.radioButton_5.isChecked() and self.radioButton_8.isChecked(): logo_div = A3_size['Portrait']['BOTTOM'] 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.setItemRotation(self.template_parameters['Carte_rotate']) self.map_modele_test.attemptResize(self.template_parameters['Carte_size']) self.map_modele_test.attemptMove(self.template_parameters['Carte_locals']) # 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.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.setItemRotation(self.template_parameters['Carte_2_rotate']) self.position_map.attemptResize(self.template_parameters['Carte_2_size']) self.position_map.attemptMove(self.template_parameters['Carte_2_locals']) self.position_map.overview().setLinkedMap(self.map_modele_test) #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_locals") 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 = titre_layout_name title.setText(titre) title.setFont(QFont("Calibri", 15, QFont.Bold)) title.setItemRotation(self.template_parameters['Titre_rotate']) title.attemptResize(self.template_parameters['Titre_size']) title.attemptMove(self.template_parameters['Titre_locals']) 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("Calibri", 10)) subtitle.setItemRotation(self.template_parameters['Sous_titre_rotate']) subtitle.attemptResize(self.template_parameters['Sous_titre_size']) subtitle.attemptMove(self.template_parameters['Sous_titre_locals']) 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.setItemRotation(self.template_parameters['Logo_rotate']) logo.setFixedSize(self.template_parameters['Logo_size']) logo.attemptMove(self.template_parameters['Logo_locals']) 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) if layertreelayer != None: 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['Legande_locals']) ## 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.setFont(QFont("Calibri", 12)) self.scalebarnumeric_qpt.attemptMove(self.template_parameters['Echelle_locals']) self.scalebarnumeric_qpt.attemptResize(self.template_parameters['Echelle_size']) self.scalebarnumeric_qpt.setItemRotation(self.template_parameters['Echelle_rotate']) 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.setFont(QFont("Calibri", 12)) self.scalebar_qpt.attemptMove(self.template_parameters['Echelle_2_locals']) self.scalebar_qpt.attemptResize(self.template_parameters['Echelle_2_size']) self.scalebar_qpt.setItemRotation(self.template_parameters['Echelle_2_rotate']) 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['Arrow_locals']) north.attemptResize(self.template_parameters['Arrow_size']) north.setItemRotation(self.template_parameters['Arrow_rotate']) north.setBackgroundEnabled(True) north.setBackgroundColor(QColor(255, 255, 255, 130)) if self.radioButton_10.isChecked() == 1: text_source = ' ' for Item_mComboBox_3 in self.mComboBox_3.checkedItems(): text_source = text_source+Item_mComboBox_3+',' text_source = text_source[:-1] info_text = ["Source :" + text_source][0] else: info_text = ["Source : " + self.lineEdit_4.text()][0] # ajout note info: if self.radioButton_14.isChecked() == 1: self.s.setValue("automap/prenom_nom",self.lineEdit_5.text()) prenom_nom = self.s.value("automap/prenom_nom", 1, type=str) info = ["Réalisation : " + "CEN Rhône-Alpes (" + date.today().strftime("%d/%m/%Y") + ") par "+prenom_nom] else: 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.setBackgroundEnabled(True) credit_text.setBackgroundColor(QColor(255, 255, 255, 130)) 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.setItemRotation(self.template_parameters['Credit_rotate']) credit_text.attemptResize(self.template_parameters['Credit_size']) credit_text.attemptMove(self.template_parameters['Credit_locals']) credit_text2.setItemRotation(self.template_parameters['Source_rotate']) credit_text2.attemptResize(self.template_parameters['Source_size']) credit_text2.attemptMove(self.template_parameters['Source_locals']) credit_text2.setBackgroundEnabled(True) credit_text2.setBackgroundColor(QColor(255, 255, 255, 130)) self.layout.addLayoutItem(credit_text) self.layout.addLayoutItem(credit_text2) ## Ajout du logo credit en bas à droit de la page len_item = (len(self.mComboBox_4.checkedItems())) 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_2_locals'].x() logo_credit.attemptMove(self.template_parameters['Logo_2_locals']) logo_credit.setPictureAnchor(4) self.template_parameters['Logo_2_locals'].setX(cur_x+(logo_div/len_item)) logo_credit.setFixedSize(self.template_parameters['Logo_2_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: self.QMBquestion = QMessageBox() self.QMBquestion.setWindowTitle(u"Attention !") self.QMBquestion.setIcon(QMessageBox.Warning) self.QMBquestion.setText("Mise en page existante, la mise en page va être écrasée !") self.QMBquestion.setStandardButtons(QMessageBox.Yes|QMessageBox.No) self.QMBquestion.addButton(QPushButton('Autre mise en page'),QMessageBox.AcceptRole) self.QMBquestion = self.QMBquestion.exec() #if self.radioButton_12.isChecked() != 1: if self.QMBquestion == QMessageBox.Yes: project.layoutManager().removeLayout(existing_layout) result = project.layoutManager().addLayout(self.layout) if self.QMBquestion == QMessageBox.AcceptRole: LayoutCOUNT=0 arrayManager = [] for AddArrayManager in project.layoutManager().layouts(): arrayManager.append(AddArrayManager.name()) arrayManager.sort() for LayoutNAME in arrayManager: if LayoutNAME == layout_name: LayoutCOUNT = LayoutCOUNT+1 if LayoutNAME == layout_name+"¶"+str(LayoutCOUNT): LayoutCOUNT=LayoutCOUNT+1 layout_name = (layout_name+"¶"+str(LayoutCOUNT)) self.layout.setName(layout_name) else: existing_layout = True 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) try: if (self.QMBquestion == QMessageBox.AcceptRole): TryMessage = (self.QMBquestion == QMessageBox.AcceptRole) elif (self.QMBquestion == QMessageBox.Yes): TryMessage = (self.QMBquestion == QMessageBox.Yes) else: TryMessage = False del self.QMBquestion except: TryMessage = True if TryMessage == True: iface.openLayoutDesigner(layout_modifie) self.close() else: self.activateWindow() def actualisation_mise_en_page(self): 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) values_page_import = values_page[:-3] eval("exec('from .tools.mises_en_pages import '+values_page_import)") eval("exec('self.template_parameters = '+ values_page_import + '.fletch_canvas(self)')") def bar_echelle_auto(self, echelle, bar_echelle): if True: if echelle.scale() >= 40000: bar_echelle.setUnits(QgsUnitTypes.DistanceKilometers) bar_echelle.setUnitLabel("km") bar_echelle.setUnitsPerSegment(round((echelle.scale()*0.04)/1000)) else: bar_echelle.setUnits(QgsUnitTypes.DistanceMeters) bar_echelle.setUnitLabel("m") bar_echelle.setUnitsPerSegment(round(echelle.scale()*0.04)) bar_echelle.update()