864 lines
39 KiB
Python
864 lines
39 KiB
Python
import logging
|
||
import os
|
||
|
||
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 qgis.PyQt.QtCore import QSettings
|
||
from qgis.PyQt import QtGui, 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 NameError:
|
||
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']
|
||
# os.path.basename(filename) == "1. Modèle carto standard (consolidé).qpt":
|
||
if True:
|
||
|
||
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, False))
|
||
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.AlignmentFlag(0x0004))
|
||
title.setVAlign(Qt.AlignmentFlag(0x0080))
|
||
|
||
# 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.AlignmentFlag(0x0004))
|
||
subtitle.setVAlign(Qt.AlignmentFlag(0x0080))
|
||
|
||
# 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 is not 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.AlignmentFlag(0x0002))
|
||
credit_text.setVAlign(Qt.AlignmentFlag(0x0080))
|
||
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.AlignmentFlag(0x0002))
|
||
credit_text2.setVAlign(Qt.AlignmentFlag(0x0080))
|
||
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'])
|
||
print(logo_credit.pictureAnchor())
|
||
# 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.Icon.Warning)
|
||
self.QMBquestion.setText("Mise en page existante, la mise en page va être écrasée !")
|
||
self.QMBquestion.setStandardButtons(QMessageBox.StandardButton(0x00004000) | QMessageBox.StandardButton(0x00010000))
|
||
self.QMBquestion.addButton(QPushButton('Autre mise en page'), QMessageBox.ButtonRole(0))
|
||
self.QMBquestion = self.QMBquestion.exec()
|
||
|
||
# if self.radioButton_12.isChecked() != 1:
|
||
if self.QMBquestion == QMessageBox.StandardButton(0x00004000):
|
||
project.layoutManager().removeLayout(existing_layout)
|
||
result = project.layoutManager().addLayout(self.layout)
|
||
elif self.QMBquestion != QMessageBox.StandardButton(0x00010000):
|
||
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 is 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()
|