Plugin_QGIS/CenRa_PAGERENDER/canvas_editor.py
2026-01-09 11:16:56 +01:00

558 lines
29 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 qgis.core import QgsSettings
from qgis.PyQt.QtCore import Qt
# from qgis.PyQt.QtPrintSupport import QPrinter
# from qgis.PyQt.QtWebKitWidgets import QWebPage
from qgis.PyQt.QtWidgets import (
QDialog,
QFileDialog,
QTableWidgetItem,
)
from qgis.PyQt import QtGui
from qgis.PyQt.QtWidgets import QApplication
from qgis.PyQt.QtCore import QSettings
# 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
last_select = None
maxV = 210
maxH = 296
EDITOR_CLASS = load_ui('CenRa_PageRender_base.ui')
LOGGER = logging.getLogger('CenRa_PageRender')
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 DHISTOIRE 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 despaces naturels', 'Plan cadastral informatisé - Etalab - juillet 202X', 'Parcellaire Express - IGN - 202X']
class PageRender_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')))
self.varLandscape = {}
self.varPortrait = {}
self.rotate_object = {
'Titre': 0,
'Sous_titre': 0,
'Carte': 0,
'Carte_2': 0,
'Legande': 0,
'Arrow': 0,
'Echelle': 0,
'Logo': 0,
'Credit': 0,
'Source': 0,
'Echelle_2': 0,
'Logo_2': 0}
self.varObject = {}
path = ''
ix = 0
plugin_dir = str(os.path.dirname(os.path.abspath(__file__))).split(os.sep)
for i in plugin_dir:
ix = ix + 1
path = path + '\\' + i
self.path = path[1:] + '\\demoV2.py'
# self.tabWidget.setStyleSheet('background-image: url('+path+'/tools/bg/Capture.png);')
self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'rotate.png')))
self.horizontalSlider.valueChanged.connect(self.horizontal)
self.verticalSlider.valueChanged.connect(self.vertical)
self.tableWidget.itemSelectionChanged.connect(self.setSlider)
self.tableWidget_2.cellChanged.connect(self.setObject)
self.radioButton.toggled.connect(self.setSlider)
self.pushButton.clicked.connect(self.export)
self.spinBox.editingFinished.connect(self.valueSlider)
self.spinBox_2.editingFinished.connect(self.valueSlider)
self.toolButton.clicked.connect(self.rotate)
self.toolButton_2.clicked.connect(self.type_page)
self.pushButton_2.clicked.connect(self.load)
self.verticalScrollBar.valueChanged.connect(self.moveFrame)
# self.setAcceptHoverEvents(True)
self.tableWidget.setTabKeyNavigation(False)
def raise_(self):
self.activateWindow()
self.setNavigator()
self.verticalScrollBar.setValue(self.frame.y())
def mousePressEvent(self, event):
if self.tableWidget.currentItem() is not None:
QApplication.setOverrideCursor(Qt.CursorShape(18))
global lastPos
lastPos = {'x': event.pos().x(), 'y': event.pos().y()}
def moveFrame(self):
self.frame.move(self.frame.x(), self.verticalScrollBar.value())
def keyPressEvent(self, event):
# if event.modifiers() & Qt.ControlModifier:
if event.key() == Qt.Key(0x01000015):
self.verticalSlider.setValue(self.spinBox_2.value() + 1)
if event.key() == Qt.Key(0x01000013):
self.verticalSlider.setValue(self.spinBox_2.value() - 1)
if event.key() == Qt.Key(0x01000014):
self.horizontalSlider.setValue(self.spinBox.value() + 1)
if event.key() == Qt.Key(0x01000012):
self.horizontalSlider.setValue(self.spinBox.value() - 1)
def wheelEvent(self, event):
if (event.angleDelta().y() >= 1):
vsb = self.verticalScrollBar.value() + 50
else:
vsb = self.verticalScrollBar.value() - 50
self.verticalScrollBar.setValue(vsb)
def mouseMoveEvent(self, event):
updated_cursor_position = event.pos()
if self.tableWidget.currentItem() is not None:
selection_name = (self.tableWidget.currentItem()).text()
all_children = self.frame.children()
selection = 0
for children in all_children:
if selection_name == children.objectName():
selection = children
frame_x = self.frame.x()
frame_y = self.frame.y()
frame_w = self.frame.width() + frame_x
frame_h = self.frame.height() + frame_y
global lastPos
orig_position_w = selection.width()
orig_position_h = selection.height()
if (frame_x <= round(updated_cursor_position.x()) <= frame_w and self.radioButton.isChecked() is True):
updated_cursor_position_x = orig_position_w + (round(updated_cursor_position.x() - lastPos['x']))
lastPos['x'] = event.pos().x()
selection.resize(updated_cursor_position_x, orig_position_h)
self.horizontalSlider.setValue(round(updated_cursor_position_x / 3.5))
orig_position_w = selection.width()
orig_position_h = selection.height()
if (frame_y <= round(updated_cursor_position.y()) <= frame_h and self.radioButton.isChecked() is True):
updated_cursor_position_y = orig_position_h + (round(updated_cursor_position.y() - lastPos['y']))
lastPos['y'] = event.pos().y()
selection.resize(orig_position_w, updated_cursor_position_y)
self.verticalSlider.setValue(round(updated_cursor_position_y / 3.5))
orig_position_x = selection.pos().x()
orig_position_y = selection.pos().y()
if (frame_x <= round(updated_cursor_position.x()) <= frame_w and self.radioButton.isChecked() is False):
updated_cursor_position_x = orig_position_x + (round(updated_cursor_position.x() - lastPos['x']))
lastPos['x'] = event.pos().x()
# print(updated_cursor_position_x)
selection.move(updated_cursor_position_x, orig_position_y)
self.horizontalSlider.setValue(round(updated_cursor_position_x / 3.5))
orig_position_x = selection.pos().x()
orig_position_y = selection.pos().y()
if (frame_y <= round(updated_cursor_position.y()) <= frame_h and self.radioButton.isChecked() is False):
updated_cursor_position_y = orig_position_y + (round(updated_cursor_position.y() - lastPos['y']))
lastPos['y'] = event.pos().y()
# print(updated_cursor_position_y)
selection.move(orig_position_x, updated_cursor_position_y)
self.verticalSlider.setValue(round(updated_cursor_position_y / 3.5))
def mouseReleaseEvent(self, event):
# print('x: {0}, y: {1}'.format(event.pos().x(), event.pos().y()))
if self.tableWidget.currentItem() is not None:
QApplication.restoreOverrideCursor()
def select_file(self):
# options = QFileDialog.Options()
# options |= QFileDialog.getExistingDirectory()
folder = QFileDialog.getOpenFileName(self, "Sélection du fichier ", '', 'Python(*.py)')
if folder[0] != '':
return folder[0]
else:
return ''
def load(self):
folder = self.select_file()
logopath = folder
if logopath != '':
# logopath = (os.path.dirname(logopath).split('/'))
sourcefile = open(logopath, 'r')
splitsource = sourcefile.read().splitlines()
all_children = self.frame.children()
all_element = ['_locals', '_size', '_rotate', '_frame', '_background', '_path']
for children in all_children:
flen = 0
for element in all_element:
flen = 0
recherche_element = children.objectName() + element
for find_it in splitsource:
if find_it.find(recherche_element) != -1:
flen = flen + 1
if flen == 1:
if element == '_frame' or element == '_background' or element == '_path':
value_find = (find_it.split('=')[1]).replace('"', '')
if children.objectName() in self.varObject:
if element[1:] in self.varObject[children.objectName()]:
self.varObject[children.objectName()][element[1:]] = value_find
else:
self.varObject[children.objectName()].update({element[1:]: value_find})
else:
self.varObject.update({children.objectName(): {element[1:]: value_find}})
# print(self.varObject)
elif element != '_rotate':
value_find = (find_it[find_it[:].find('(') + 1:-33]).split(',')
if element == '_size':
Psize_h = float(value_find[0]) * 3.5
Psize_w = float(value_find[1]) * 3.5
if element == '_locals':
Plocals_h = float(value_find[0]) * 3.5
Plocals_w = float(value_find[1]) * 3.5
else:
Protate = float((find_it[find_it[:].find('=') + 2:]).split(',')[0])
if flen == 3:
if element != '_rotate':
value_find = (find_it[find_it[:].find('(') + 1:-33]).split(',')
if element == '_size':
Lsize_h = float(value_find[0]) * 3.5
Lsize_w = float(value_find[1]) * 3.5
if element == '_locals':
Llocals_h = float(value_find[0]) * 3.5
Llocals_w = float(value_find[1]) * 3.5
else:
Lrotate = float((find_it[find_it[:].find('=') + 2:]).split(',')[0])
# print('sh',Psize_h,',sw',Psize_w,',lh',Plocals_h,',lw',Plocals_w,',r',Protate)
if Lrotate == 90 or Lrotate == 270:
old = Lsize_w
Lsize_w = Lsize_h
Lsize_h = old
if Protate == 90 or Protate == 270:
old = Psize_w
Psize_w = Psize_h
Psize_h = old
if self.toolButton_2.text() == 'Landscape':
children.resize(round(Lsize_h), round(Lsize_w))
children.move(round(Llocals_h), round(Llocals_w))
self.rotate_object[children.objectName()] = Lrotate
if self.toolButton_2.text() == 'Portrait':
children.resize(round(Psize_h), round(Psize_w))
children.move(round(Plocals_h), round(Plocals_w))
self.rotate_object[children.objectName()] = Protate
def valueSlider(self):
self.horizontalSlider.setValue(self.spinBox.value())
self.verticalSlider.setValue(self.spinBox_2.value())
def setNavigator(self):
all_children = self.frame.children()
xR = 0
baseRow = self.tableWidget.rowCount()
while baseRow >= xR:
self.tableWidget.removeRow(0)
xR = xR + 1
self.tableWidget.clear()
# id = 0
for children in all_children:
position = self.tableWidget.rowCount()
self.tableWidget.insertRow(position)
self.tableWidget.setItem(position, 0, QTableWidgetItem(children.objectName()))
# print(children.objectName())
def export(self):
self.type_page()
self.type_page()
all_children = self.frame.children()
# selection_name = (self.tableWidget.currentItem()).text()
export_str = """
from qgis.core import (
QgsLayoutSize,
QgsUnitTypes,
QgsLayoutPoint,
)
def fletch_canvas(self):
if self.radioButton_6.isChecked():
values_page = 'A4'
else:
values_page = 'A3'
if self.radioButton_7.isChecked():
page_rotate = 'Portrait'
else:
page_rotate = 'Landscape'
"""
type = ["Portrait", "Landscape"]
page = ["A4", "A3"]
for page_type in type:
export_str = export_str + """
if page_rotate == '""" + page_type + """':"""
for page_size in page:
export_str = export_str + """
if values_page == '""" + page_size + """':"""
for children in all_children:
selection = children
if selection.objectName() in self.varObject:
for parametre_object in self.varObject[selection.objectName()]:
if str(selection.objectName()) != "Arrow" and str(parametre_object) != "path":
export_str = export_str + """
self.template_parameters['""" + str(selection.objectName()) + '_' + str(parametre_object) + """'] = """ + str(self.varObject[selection.objectName()][parametre_object])
elif str(selection.objectName()) == "Arrow" and str(parametre_object) == "path":
if str(self.varObject[selection.objectName()][parametre_object]) == "":
self.varObject[selection.objectName()][parametre_object] = "NorthArrow_02.svg"
export_str = export_str + """
self.template_parameters['""" + str(selection.objectName()) + '_' + str(parametre_object) + """'] = '""" + str(self.varObject[selection.objectName()][parametre_object]) + "'"
if page_type == 'Portrait':
item_rotate_object = self.varPortrait[selection.objectName() + '_rotate'][0]
if item_rotate_object == 0 or item_rotate_object == 180:
sw = 0
sh = 1
if item_rotate_object == 90 or item_rotate_object == 270:
sw = 1
sh = 0
if page_size == 'A3':
size_w = (round((self.varPortrait[selection.objectName() + '_size'][sw] / 3.5) * 1.41))
size_h = (round((self.varPortrait[selection.objectName() + '_size'][sh] / 3.5) * 1.41))
locals_w = (round((self.varPortrait[selection.objectName() + '_locals'][1] / 3.5) * 1.41))
locals_h = (round((self.varPortrait[selection.objectName() + '_locals'][0] / 3.5) * 1.41))
else:
size_w = (round(self.varPortrait[selection.objectName() + '_size'][sw]) / 3.5)
size_h = (round(self.varPortrait[selection.objectName() + '_size'][sh] / 3.5))
locals_w = (round(self.varPortrait[selection.objectName() + '_locals'][1] / 3.5))
locals_h = (round(self.varPortrait[selection.objectName() + '_locals'][0] / 3.5))
if page_type == 'Landscape':
item_rotate_object = self.varLandscape[selection.objectName() + '_rotate'][0]
if item_rotate_object == 0 or item_rotate_object == 180:
sw = 0
sh = 1
if item_rotate_object == 90 or item_rotate_object == 270:
sw = 1
sh = 0
if page_size == 'A3':
size_w = (round((self.varLandscape[selection.objectName() + '_size'][sw] / 3.5) * 1.41))
size_h = (round((self.varLandscape[selection.objectName() + '_size'][sh] / 3.5) * 1.41))
locals_w = (round((self.varLandscape[selection.objectName() + '_locals'][1] / 3.5) * 1.41))
locals_h = (round((self.varLandscape[selection.objectName() + '_locals'][0] / 3.5) * 1.41))
else:
size_w = (round(self.varLandscape[selection.objectName() + '_size'][sw]) / 3.5)
size_h = (round(self.varLandscape[selection.objectName() + '_size'][sh] / 3.5))
locals_w = (round(self.varLandscape[selection.objectName() + '_locals'][1] / 3.5))
locals_h = (round(self.varLandscape[selection.objectName() + '_locals'][0] / 3.5))
if item_rotate_object == 270:
locals_h = locals_h + size_w
if item_rotate_object == 180:
locals_h = locals_h + size_h
locals_w = locals_w + size_w
size_w = str(size_w)
size_h = str(size_h)
locals_w = str(locals_w)
locals_h = str(locals_h)
export_str = export_str + """
self.template_parameters['""" + selection.objectName() + """_size'] = QgsLayoutSize(""" + size_w + """, """ + size_h + """, QgsUnitTypes.LayoutMillimeters)
self.template_parameters['""" + selection.objectName() + """_locals'] = QgsLayoutPoint(""" + locals_w + """, """ + locals_h + """, QgsUnitTypes.LayoutMillimeters)
self.template_parameters['""" + selection.objectName() + """_rotate'] = """ + str(item_rotate_object)
export_str = export_str + """
return self.template_parameters"""
sourceFile = open(self.path, 'w')
print(export_str, file=sourceFile)
sourceFile.close()
def type_page(self):
all_children = self.frame.children()
if self.toolButton_2.text() == 'Landscape':
self.horizontalSlider.setMaximum(maxV)
self.verticalSlider.setMaximum(maxH)
last_children = 0
for children in all_children:
selection = children
size_w = selection.size().width()
size_h = selection.size().height()
locals_h = selection.x()
locals_w = selection.y()
item_rotate_object = self.rotate_object[selection.objectName()]
self.varLandscape[selection.objectName() + '_size'] = [size_w, size_h]
self.varLandscape[selection.objectName() + '_locals'] = [locals_w, locals_h]
self.varLandscape[selection.objectName() + '_rotate'] = [item_rotate_object]
if self.varPortrait != {}:
selection.move(self.varPortrait[selection.objectName() + '_locals'][1], self.varPortrait[selection.objectName() + '_locals'][0])
selection.resize(self.varPortrait[selection.objectName() + '_size'][0], self.varPortrait[selection.objectName() + '_size'][1])
self.rotate_object[selection.objectName()] = self.varPortrait[selection.objectName() + '_rotate'][0]
self.rotate_color(selection, last_children)
last_children = selection
self.toolButton_2.setText('Portrait')
elif self.toolButton_2.text() == 'Portrait':
self.horizontalSlider.setMaximum(maxH)
self.verticalSlider.setMaximum(maxV)
last_children = 0
for children in all_children:
selection = children
size_w = selection.size().width()
size_h = selection.size().height()
locals_h = selection.x()
locals_w = selection.y()
item_rotate_object = self.rotate_object[selection.objectName()]
self.varPortrait[selection.objectName() + '_size'] = [size_w, size_h]
self.varPortrait[selection.objectName() + '_locals'] = [locals_w, locals_h]
self.varPortrait[selection.objectName() + '_rotate'] = [item_rotate_object]
if self.varLandscape != {}:
selection.move(self.varLandscape[selection.objectName() + '_locals'][1], self.varLandscape[selection.objectName() + '_locals'][0])
selection.resize(self.varLandscape[selection.objectName() + '_size'][0], self.varLandscape[selection.objectName() + '_size'][1])
self.rotate_object[selection.objectName()] = self.varLandscape[selection.objectName() + '_rotate'][0]
self.rotate_color(selection, last_children)
last_children = selection
self.toolButton_2.setText('Landscape')
frame_w = self.frame.width()
frame_h = self.frame.height()
self.frame.resize(frame_h, frame_w)
frame_x = round(frame_w / 3)
frame_y = self.frame.y()
self.frame.move(frame_x, frame_y)
def setParameter(self, selection_name):
if selection_name in self.varObject:
for table2Range in range(0, self.tableWidget_2.rowCount()):
rowName = self.tableWidget_2.item(table2Range, 0).text()
if rowName in self.varObject[selection_name]:
self.tableWidget_2.setItem(table2Range, 1, QTableWidgetItem(str(self.varObject[selection_name][rowName])))
else:
self.varObject[selection_name].update({rowName: ""})
self.tableWidget_2.setItem(table2Range, 1, QTableWidgetItem(''))
else:
self.varObject.update({selection_name: {"frame": "", "background": "", "path": ""}})
self.tableWidget_2.setItem(1, 1, QTableWidgetItem(''))
self.tableWidget_2.setItem(2, 1, QTableWidgetItem(''))
self.tableWidget_2.setItem(3, 1, QTableWidgetItem(''))
def setObject(self, event):
selection_name = (self.tableWidget.currentItem()).text()
rowName = self.tableWidget_2.item(event, 0).text()
rowValue = self.tableWidget_2.item(event, 1).text()
self.varObject[selection_name][rowName] = rowValue
def setSlider(self):
if self.tableWidget.currentItem() is not None:
selection_name = (self.tableWidget.currentItem()).text()
all_children = self.frame.children()
selection = 0
last_children = 0
for children in all_children:
if last_select == children.objectName():
last_children = children
if selection_name == children.objectName():
selection = children
if selection != 0:
self.rotate_color(selection, last_children)
if self.radioButton.isChecked() is False:
xx = round(selection.x() / 3.5)
yy = round(selection.y() / 3.5)
else:
xx = round(selection.size().width() / 3.5)
yy = round(selection.size().height() / 3.5)
# print(xx,yy)
self.horizontalSlider.setValue(xx)
self.verticalSlider.setValue(yy)
self.spinBox.setValue(xx)
self.spinBox_2.setValue(yy)
self.setParameter(selection_name)
def rotate_color(self, selection, last_children):
global last_select
if self.radioButton.isChecked() is False:
ColorCode = "10, 10, 80, 50"
else:
ColorCode = "249, 238, 148, 50"
if self.rotate_object[selection.objectName()] == 0:
selection.setStyleSheet("border: 2px solid;border-color:red;border-bottom-color: blue;background-color: rgba(" + ColorCode + ")")
elif self.rotate_object[selection.objectName()] == 90:
selection.setStyleSheet("border: 2px solid;border-color:red;border-left-color: blue;background-color: rgba(" + ColorCode + ")")
elif self.rotate_object[selection.objectName()] == 180:
selection.setStyleSheet("border: 2px solid;border-color:red;border-top-color: blue;background-color: rgba(" + ColorCode + ")")
elif self.rotate_object[selection.objectName()] == 270:
selection.setStyleSheet("border: 2px solid;border-color:red;border-right-color: blue;background-color: rgba(" + ColorCode + ")")
if last_children != 0:
if last_select != selection.objectName():
last_children.setStyleSheet("background-color: rgba(10, 10, 10, 50)")
last_select = selection.objectName()
def rotate(self):
if self.tableWidget.currentItem() is not None:
selection_name = (self.tableWidget.currentItem()).text()
all_children = self.frame.children()
selection = 0
last_children = 0
for children in all_children:
if last_select == children.objectName():
last_children = children
if selection_name == children.objectName():
selection = children
if selection != 0:
xx = round(selection.size().width())
yy = round(selection.size().height())
selection.resize(round(yy), round(xx))
if self.radioButton.isChecked() is True:
self.spinBox.setValue(yy)
self.spinBox_2.setValue(xx)
self.horizontalSlider.setValue(round(yy / 3.5))
self.verticalSlider.setValue(round(xx / 3.5))
if self.rotate_object[selection.objectName()] == 270:
self.rotate_object[selection.objectName()] = 0
else:
self.rotate_object[selection.objectName()] = self.rotate_object[selection.objectName()] + 90
self.rotate_color(selection, last_children)
def vertical(self):
if self.tableWidget.currentItem() is not None:
selection_name = (self.tableWidget.currentItem()).text()
all_children = self.frame.children()
selection = 0
for children in all_children:
if selection_name == children.objectName():
selection = children
if selection != 0:
if self.radioButton.isChecked() is False:
selection.move(round(self.horizontalSlider.value() * 3.5), round(self.verticalSlider.value() * 3.5))
else:
selection.resize(round(self.horizontalSlider.value() * 3.5), round(self.verticalSlider.value() * 3.5))
self.spinBox.setValue(round(self.horizontalSlider.value()))
self.spinBox_2.setValue(round(self.verticalSlider.value()))
def horizontal(self):
if self.tableWidget.currentItem() is not None:
selection_name = (self.tableWidget.currentItem()).text()
all_children = self.frame.children()
selection = 0
for children in all_children:
if selection_name == children.objectName():
selection = children
if selection != 0:
if self.radioButton.isChecked() is False:
selection.move(round(self.horizontalSlider.value() * 3.5), round(self.verticalSlider.value() * 3.5))
else:
selection.resize(round(self.horizontalSlider.value() * 3.5), round(self.verticalSlider.value() * 3.5))
self.spinBox.setValue(round(self.horizontalSlider.value()))
self.spinBox_2.setValue(round(self.verticalSlider.value()))