Template
forked from CEN-RA/Plugin_QGIS
Nouveau plugin de creation de code de mise en page
This commit is contained in:
@@ -0,0 +1,473 @@
|
||||
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 PyQt5 import QtGui
|
||||
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 .issues import CenRa_Issues
|
||||
from datetime import date
|
||||
last_select = None
|
||||
|
||||
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 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 PageRender_Editor(QDialog, EDITOR_CLASS):
|
||||
|
||||
def __init__(self, parent=None):
|
||||
_ = parent
|
||||
super().__init__()
|
||||
self.setupUi(self)
|
||||
self.settings = QgsSettings()
|
||||
self.s = QSettings()
|
||||
|
||||
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,}
|
||||
|
||||
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.horizontalSlider.valueChanged.connect(self.horizontal)
|
||||
self.verticalSlider.valueChanged.connect(self.vertical)
|
||||
self.tableWidget.itemSelectionChanged.connect(self.setSlider)
|
||||
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)
|
||||
|
||||
def raise_(self):
|
||||
self.activateWindow()
|
||||
self.setNavigator()
|
||||
|
||||
def select_file(self):
|
||||
options = QFileDialog.Options()
|
||||
options |= QFileDialog.ShowDirsOnly
|
||||
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']
|
||||
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 != '_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)
|
||||
match Lrotate:
|
||||
case 90|270:
|
||||
old = Lsize_w
|
||||
Lsize_w = Lsize_h
|
||||
Lsize_h = old
|
||||
match Protate:
|
||||
case 90|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 page_type == 'Portrait':
|
||||
item_rotate_object=self.varPortrait[selection.objectName()+'_rotate'][0]
|
||||
match item_rotate_object:
|
||||
case 0|180:
|
||||
sw = 0
|
||||
sh = 1
|
||||
case 90|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]
|
||||
match item_rotate_object:
|
||||
case 0|180:
|
||||
sw = 0
|
||||
sh = 1
|
||||
case 90|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':
|
||||
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':
|
||||
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 setSlider(self):
|
||||
if self.tableWidget.currentItem() != 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() == 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)
|
||||
|
||||
def rotate_color(self,selection,last_children):
|
||||
global last_select
|
||||
if self.rotate_object[selection.objectName()] == 0:
|
||||
selection.setStyleSheet("border: 2px solid;border-color:red;border-bottom-color: blue;background-color: rgb(10, 10, 80, 50)")
|
||||
elif self.rotate_object[selection.objectName()] == 90:
|
||||
selection.setStyleSheet("border: 2px solid;border-color:red;border-left-color: blue;background-color: rgb(10, 10, 80, 50)")
|
||||
elif self.rotate_object[selection.objectName()] == 180:
|
||||
selection.setStyleSheet("border: 2px solid;border-color:red;border-top-color: blue;background-color: rgb(10, 10, 80, 50)")
|
||||
elif self.rotate_object[selection.objectName()] == 270:
|
||||
selection.setStyleSheet("border: 2px solid;border-color:red;border-right-color: blue;background-color: rgb(10, 10, 80, 50)")
|
||||
if last_children != 0:
|
||||
if last_select != selection.objectName():
|
||||
last_children.setStyleSheet("background-color: rgb(10, 10, 10, 50)")
|
||||
|
||||
last_select = selection.objectName()
|
||||
|
||||
def rotate(self):
|
||||
if self.tableWidget.currentItem() != 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() == 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() != 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() == 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() != 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() == 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()))
|
||||
|
||||
Reference in New Issue
Block a user