From 8bfa4a557ae6e2e0d31e59ade114bd6a04eed1ee Mon Sep 17 00:00:00 2001
From: Tom LAVEILLE
Date: Mon, 21 Oct 2024 12:46:11 +0200
Subject: [PATCH] Nouveau plugin de creation de code de mise en page
---
.gitignore | 1 +
CenRa_PAGERENDER/CenRa_PageRender.py | 142 ++++
CenRa_PAGERENDER/README.md | 1 +
CenRa_PAGERENDER/__init__.py | 10 +
CenRa_PAGERENDER/about_form.py | 46 ++
CenRa_PAGERENDER/canvas_editor.py | 473 +++++++++++++
CenRa_PAGERENDER/demoV2.py | 167 +++++
CenRa_PAGERENDER/icon.png | Bin 0 -> 4977 bytes
CenRa_PAGERENDER/issues.py | 89 +++
CenRa_PAGERENDER/metadata.txt | 48 ++
CenRa_PAGERENDER/tools/PythonSQL.py | 34 +
CenRa_PAGERENDER/tools/icons/CEN_RA.png | Bin 0 -> 8893 bytes
CenRa_PAGERENDER/tools/icons/icon.png | Bin 0 -> 292634 bytes
CenRa_PAGERENDER/tools/lecture_sql.py | Bin 0 -> 1024 bytes
CenRa_PAGERENDER/tools/resources.py | 187 +++++
CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui | 332 +++++++++
.../tools/ui/CenRa_PageRender_about_form.ui | 96 +++
.../tools/ui/CenRa_PageRender_base.ui | 652 ++++++++++++++++++
plugins.xml | 22 +-
19 files changed, 2297 insertions(+), 3 deletions(-)
create mode 100644 CenRa_PAGERENDER/CenRa_PageRender.py
create mode 100644 CenRa_PAGERENDER/README.md
create mode 100644 CenRa_PAGERENDER/__init__.py
create mode 100644 CenRa_PAGERENDER/about_form.py
create mode 100644 CenRa_PAGERENDER/canvas_editor.py
create mode 100644 CenRa_PAGERENDER/demoV2.py
create mode 100644 CenRa_PAGERENDER/icon.png
create mode 100644 CenRa_PAGERENDER/issues.py
create mode 100644 CenRa_PAGERENDER/metadata.txt
create mode 100644 CenRa_PAGERENDER/tools/PythonSQL.py
create mode 100644 CenRa_PAGERENDER/tools/icons/CEN_RA.png
create mode 100644 CenRa_PAGERENDER/tools/icons/icon.png
create mode 100644 CenRa_PAGERENDER/tools/lecture_sql.py
create mode 100644 CenRa_PAGERENDER/tools/resources.py
create mode 100644 CenRa_PAGERENDER/tools/ui/CenRa_IssuesSend.ui
create mode 100644 CenRa_PAGERENDER/tools/ui/CenRa_PageRender_about_form.ui
create mode 100644 CenRa_PAGERENDER/tools/ui/CenRa_PageRender_base.ui
diff --git a/.gitignore b/.gitignore
index da4e3f2c..443e01e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@
!CenRa_METABASE/
!CenRa_POSTGIS/
!CenRa_SICEN/
+!CenRa_PAGERENDER/
#ReIgnore
**/__pycache__
diff --git a/CenRa_PAGERENDER/CenRa_PageRender.py b/CenRa_PAGERENDER/CenRa_PageRender.py
new file mode 100644
index 00000000..6b49c3f7
--- /dev/null
+++ b/CenRa_PAGERENDER/CenRa_PageRender.py
@@ -0,0 +1,142 @@
+__copyright__ = "Copyright 2021, 3Liz"
+__license__ = "GPL version 3"
+__email__ = "info@3liz.org"
+
+
+from qgis.core import QgsApplication
+from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator, QUrl
+from qgis.PyQt.QtGui import QDesktopServices, QIcon
+from qgis.PyQt.QtWidgets import QAction, QMessageBox
+from qgis.utils import iface
+import qgis
+
+
+#include
+'''
+from pg_metadata.connection_manager import (
+ store_connections,
+ validate_connections_names,
+)
+
+
+from pg_metadata.locator import LocatorFilter
+from pg_metadata.processing.provider import PgMetadataProvider
+from pg_metadata.qgis_plugin_tools.tools.custom_logging import setup_logger
+'''
+import os
+from .tools.resources import (
+ plugin_path,
+ resources_path,
+ maj_verif,
+)
+from .canvas_editor import PageRender_Editor
+from .about_form import PageRenderAboutDialog
+
+from PyQt5.QtCore import *
+
+class PgPageRender:
+ def __init__(self):
+ """ Constructor. """
+ self.canvas_editor = None
+# self.issues = None
+ self.provider = None
+ self.locator_filter = None
+ self.dock_action = None
+ self.help_action = None
+ plugin_dir = os.path.dirname(__file__)
+ end_find = plugin_dir.rfind('\\')+1
+ global NAME
+ NAME = plugin_dir[end_find:]
+ maj_verif(NAME)
+
+ # Display About window on first use
+ version = qgis.utils.pluginMetadata('CenRa_PAGERENDER','version')
+ s = QSettings()
+ versionUse = s.value("pagerender/version", 1, type=str)
+ if str(versionUse) != str(version) :
+ s.setValue("pagerender/version", str(version))
+ print(versionUse,version)
+ self.open_about_dialog()
+
+ def initGui(self):
+ """ Build the plugin GUI. """
+
+ self.toolBar = iface.addToolBar("CenRa_PAGERENDER")
+ self.toolBar.setObjectName("CenRa_PAGERENDER")
+
+ icon = QIcon(resources_path('icons', 'icon.png'))
+
+ # Open the online help
+ self.help_action = QAction(icon, 'CenRa_PAGERENDER', iface.mainWindow())
+ iface.pluginHelpMenu().addAction(self.help_action)
+ self.help_action.triggered.connect(self.open_help)
+ if not self.canvas_editor:
+ self.canvas_editor = PageRender_Editor()
+
+
+ self.pagerender_action = QAction(icon, 'CenRa_PAGERENDER',None)
+ self.toolBar.addAction(self.pagerender_action)
+ self.pagerender_action.triggered.connect(self.open_editor)
+ '''
+ if not self.locator_filter:
+ self.locator_filter = LocatorFilter(iface)
+ iface.registerLocatorFilter(self.locator_filter)
+
+ @staticmethod
+ def check_invalid_connection_names():
+ """ Check for invalid connection names in the QgsSettings. """
+ valid, invalid = validate_connections_names()
+ n_invalid = len(invalid)
+
+ if n_invalid == 0:
+ return
+
+ invalid_text = ', '.join(invalid)
+ msg = QMessageBox()
+ msg.setIcon(QMessageBox.Warning)
+ msg.setWindowTitle(tr('PgMetadata: Database connection(s) not available'))
+ msg.setText(tr(
+ f'{n_invalid} connection(s) listed in PgMetadata’s settings are invalid or '
+ f'no longer available: {invalid_text}'))
+ msg.setInformativeText(tr(
+ 'Do you want to remove these connection(s) from the PgMetadata settings? '
+ '(You can also do this later with the “Set Connections” tool.)'))
+ msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+ clicked = msg.exec()
+
+ if clicked == QMessageBox.Yes:
+ iface.messageBar().pushSuccess('PgMetadata', tr(f'{n_invalid} invalid connection(s) removed.'))
+ store_connections(valid)
+ if clicked == QMessageBox.No:
+ iface.messageBar().pushInfo('PgMetadata', tr(f'Keeping {n_invalid} invalid connections.'))
+ '''
+ def open_about_dialog(self):
+ """
+ About dialog
+ """
+ dialog = PageRenderAboutDialog(iface)
+ dialog.exec_()
+ def open_help():
+ """ Open the online help. """
+ QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/'))
+
+ def open_editor(self):
+ self.canvas_editor.show()
+ self.canvas_editor.raise_()
+
+ def unload(self):
+ """ Unload the plugin. """
+ if self.canvas_editor:
+ iface.removePluginMenu('CenRa_PAGERENDER',self.pagerender_action)
+
+ if self.provider:
+ QgsApplication.processingRegistry().removeProvider(self.provider)
+ del self.provider
+
+ if self.locator_filter:
+ iface.deregisterLocatorFilter(self.locator_filter)
+ del self.locator_filter
+
+ if self.help_action:
+ iface.pluginHelpMenu().removeAction(self.help_action)
+ del self.help_action
diff --git a/CenRa_PAGERENDER/README.md b/CenRa_PAGERENDER/README.md
new file mode 100644
index 00000000..80ccffeb
--- /dev/null
+++ b/CenRa_PAGERENDER/README.md
@@ -0,0 +1 @@
+# CenRa_AutoMap
\ No newline at end of file
diff --git a/CenRa_PAGERENDER/__init__.py b/CenRa_PAGERENDER/__init__.py
new file mode 100644
index 00000000..365e0900
--- /dev/null
+++ b/CenRa_PAGERENDER/__init__.py
@@ -0,0 +1,10 @@
+__copyright__ = "Copyright 2021, 3Liz"
+__license__ = "GPL version 3"
+__email__ = "info@3liz.org"
+
+
+# noinspection PyPep8Naming
+def classFactory(iface): # pylint: disable=invalid-name
+ _ = iface
+ from CenRa_PAGERENDER.CenRa_PageRender import PgPageRender
+ return PgPageRender()
diff --git a/CenRa_PAGERENDER/about_form.py b/CenRa_PAGERENDER/about_form.py
new file mode 100644
index 00000000..57827e54
--- /dev/null
+++ b/CenRa_PAGERENDER/about_form.py
@@ -0,0 +1,46 @@
+import os.path
+
+from pathlib import Path
+
+from qgis.PyQt import uic
+from qgis.PyQt.QtGui import QPixmap
+from qgis.PyQt.QtWidgets import QDialog
+
+from .tools.resources import devlog
+
+ABOUT_FORM_CLASS, _ = uic.loadUiType(
+ os.path.join(
+ str(Path(__file__).resolve().parent),
+ 'tools/ui',
+ 'CenRa_PageRender_about_form.ui'
+ )
+)
+
+
+class PageRenderAboutDialog(QDialog, ABOUT_FORM_CLASS):
+
+ """ About - Let the user display the about dialog. """
+
+ def __init__(self, iface, parent=None):
+ super().__init__(parent)
+ self.iface = iface
+ self.setupUi(self)
+
+ self.viewer.setHtml(devlog('CenRa_PAGERENDER'))
+
+ self.rejected.connect(self.onReject)
+ self.buttonBox.rejected.connect(self.onReject)
+ self.buttonBox.accepted.connect(self.onAccept)
+
+ def onAccept(self):
+ """
+ Save options when pressing OK button
+ """
+ self.accept()
+
+ def onReject(self):
+ """
+ Run some actions when
+ the user closes the dialog
+ """
+ self.close()
\ No newline at end of file
diff --git a/CenRa_PAGERENDER/canvas_editor.py b/CenRa_PAGERENDER/canvas_editor.py
new file mode 100644
index 00000000..929131ec
--- /dev/null
+++ b/CenRa_PAGERENDER/canvas_editor.py
@@ -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()))
+
diff --git a/CenRa_PAGERENDER/demoV2.py b/CenRa_PAGERENDER/demoV2.py
new file mode 100644
index 00000000..6cafdd29
--- /dev/null
+++ b/CenRa_PAGERENDER/demoV2.py
@@ -0,0 +1,167 @@
+
+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'
+
+ if page_rotate == 'Portrait':
+ if values_page == 'A4':
+ self.template_parameters['Carte_size'] = QgsLayoutSize(200.0,200, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_locals'] = QgsLayoutPoint(6, 6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_rotate'] = 0
+ self.template_parameters['Carte_2_size'] = QgsLayoutSize(85.71428571428571,69, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(209, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_rotate'] = 0
+ self.template_parameters['Legande_size'] = QgsLayoutSize(85.71428571428571,131, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_locals'] = QgsLayoutPoint(209, 74, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_rotate'] = 0
+ self.template_parameters['Arrow_size'] = QgsLayoutSize(14.285714285714286,14, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_locals'] = QgsLayoutPoint(189, 20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_rotate'] = 0
+ self.template_parameters['Echelle_size'] = QgsLayoutSize(51.42857142857143,7, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_locals'] = QgsLayoutPoint(9, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_rotate'] = 0
+ self.template_parameters['Logo_size'] = QgsLayoutSize(45.714285714285715,11, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_locals'] = QgsLayoutPoint(3, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_rotate'] = 0
+ self.template_parameters['Titre_size'] = QgsLayoutSize(154.28571428571428,11, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_locals'] = QgsLayoutPoint(51, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_rotate'] = 0
+ self.template_parameters['Credit_size'] = QgsLayoutSize(51.42857142857143,6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_locals'] = QgsLayoutPoint(151, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_rotate'] = 0
+ self.template_parameters['Source_size'] = QgsLayoutSize(51.42857142857143,6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_locals'] = QgsLayoutPoint(229, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_rotate'] = 0
+ self.template_parameters['Sous_titre_size'] = QgsLayoutSize(125.71428571428571,14, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(60, 20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_rotate'] = 0
+ self.template_parameters['Echelle_2_size'] = QgsLayoutSize(51.42857142857143,13, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(9, 184, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_rotate'] = 0
+ self.template_parameters['Logo_2_size'] = QgsLayoutSize(28.571428571428573,29, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(9, 151, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_rotate'] = 0
+ if values_page == 'A3':
+ self.template_parameters['Carte_size'] = QgsLayoutSize(282,282, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_locals'] = QgsLayoutPoint(8, 8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_rotate'] = 0
+ self.template_parameters['Carte_2_size'] = QgsLayoutSize(121,97, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(294, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_rotate'] = 0
+ self.template_parameters['Legande_size'] = QgsLayoutSize(121,185, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_locals'] = QgsLayoutPoint(294, 105, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_rotate'] = 0
+ self.template_parameters['Arrow_size'] = QgsLayoutSize(20,20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_locals'] = QgsLayoutPoint(266, 28, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_rotate'] = 0
+ self.template_parameters['Echelle_size'] = QgsLayoutSize(73,10, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_locals'] = QgsLayoutPoint(12, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_rotate'] = 0
+ self.template_parameters['Logo_size'] = QgsLayoutSize(64,16, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_locals'] = QgsLayoutPoint(4, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_rotate'] = 0
+ self.template_parameters['Titre_size'] = QgsLayoutSize(218,16, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_locals'] = QgsLayoutPoint(73, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_rotate'] = 0
+ self.template_parameters['Credit_size'] = QgsLayoutSize(73,8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_locals'] = QgsLayoutPoint(214, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_rotate'] = 0
+ self.template_parameters['Source_size'] = QgsLayoutSize(73,8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_locals'] = QgsLayoutPoint(322, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_rotate'] = 0
+ self.template_parameters['Sous_titre_size'] = QgsLayoutSize(177,20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(85, 28, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_rotate'] = 0
+ self.template_parameters['Echelle_2_size'] = QgsLayoutSize(73,18, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(12, 260, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_rotate'] = 0
+ self.template_parameters['Logo_2_size'] = QgsLayoutSize(40,40, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(12, 214, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_rotate'] = 0
+ if page_rotate == 'Landscape':
+ if values_page == 'A4':
+ self.template_parameters['Carte_size'] = QgsLayoutSize(200.0,200, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_locals'] = QgsLayoutPoint(6, 6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_rotate'] = 0
+ self.template_parameters['Carte_2_size'] = QgsLayoutSize(85.71428571428571,69, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(209, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_rotate'] = 0
+ self.template_parameters['Legande_size'] = QgsLayoutSize(85.71428571428571,131, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_locals'] = QgsLayoutPoint(209, 74, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_rotate'] = 0
+ self.template_parameters['Arrow_size'] = QgsLayoutSize(14.285714285714286,14, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_locals'] = QgsLayoutPoint(189, 20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_rotate'] = 0
+ self.template_parameters['Echelle_size'] = QgsLayoutSize(51.42857142857143,7, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_locals'] = QgsLayoutPoint(9, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_rotate'] = 0
+ self.template_parameters['Logo_size'] = QgsLayoutSize(45.714285714285715,11, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_locals'] = QgsLayoutPoint(3, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_rotate'] = 0
+ self.template_parameters['Titre_size'] = QgsLayoutSize(154.28571428571428,11, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_locals'] = QgsLayoutPoint(51, 3, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_rotate'] = 0
+ self.template_parameters['Credit_size'] = QgsLayoutSize(51.42857142857143,6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_locals'] = QgsLayoutPoint(151, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_rotate'] = 0
+ self.template_parameters['Source_size'] = QgsLayoutSize(51.42857142857143,6, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_locals'] = QgsLayoutPoint(229, 197, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_rotate'] = 0
+ self.template_parameters['Sous_titre_size'] = QgsLayoutSize(125.71428571428571,14, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(60, 20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_rotate'] = 0
+ self.template_parameters['Echelle_2_size'] = QgsLayoutSize(51.42857142857143,13, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(9, 184, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_rotate'] = 0
+ self.template_parameters['Logo_2_size'] = QgsLayoutSize(28.571428571428573,29, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(9, 151, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_rotate'] = 0
+ if values_page == 'A3':
+ self.template_parameters['Carte_size'] = QgsLayoutSize(282,282, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_locals'] = QgsLayoutPoint(8, 8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_rotate'] = 0
+ self.template_parameters['Carte_2_size'] = QgsLayoutSize(121,97, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_locals'] = QgsLayoutPoint(294, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Carte_2_rotate'] = 0
+ self.template_parameters['Legande_size'] = QgsLayoutSize(121,185, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_locals'] = QgsLayoutPoint(294, 105, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Legande_rotate'] = 0
+ self.template_parameters['Arrow_size'] = QgsLayoutSize(20,20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_locals'] = QgsLayoutPoint(266, 28, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Arrow_rotate'] = 0
+ self.template_parameters['Echelle_size'] = QgsLayoutSize(73,10, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_locals'] = QgsLayoutPoint(12, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_rotate'] = 0
+ self.template_parameters['Logo_size'] = QgsLayoutSize(64,16, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_locals'] = QgsLayoutPoint(4, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_rotate'] = 0
+ self.template_parameters['Titre_size'] = QgsLayoutSize(218,16, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_locals'] = QgsLayoutPoint(73, 4, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Titre_rotate'] = 0
+ self.template_parameters['Credit_size'] = QgsLayoutSize(73,8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_locals'] = QgsLayoutPoint(214, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Credit_rotate'] = 0
+ self.template_parameters['Source_size'] = QgsLayoutSize(73,8, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_locals'] = QgsLayoutPoint(322, 278, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Source_rotate'] = 0
+ self.template_parameters['Sous_titre_size'] = QgsLayoutSize(177,20, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_locals'] = QgsLayoutPoint(85, 28, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Sous_titre_rotate'] = 0
+ self.template_parameters['Echelle_2_size'] = QgsLayoutSize(73,18, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_locals'] = QgsLayoutPoint(12, 260, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Echelle_2_rotate'] = 0
+ self.template_parameters['Logo_2_size'] = QgsLayoutSize(40,40, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_locals'] = QgsLayoutPoint(12, 214, QgsUnitTypes.LayoutMillimeters)
+ self.template_parameters['Logo_2_rotate'] = 0
+ return self.template_parameters
diff --git a/CenRa_PAGERENDER/icon.png b/CenRa_PAGERENDER/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d53a910fea37e4930c40122d285e6ea9fdc75ba7
GIT binary patch
literal 4977
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
literal 0
HcmV?d00001
diff --git a/CenRa_PAGERENDER/issues.py b/CenRa_PAGERENDER/issues.py
new file mode 100644
index 00000000..0d6416a6
--- /dev/null
+++ b/CenRa_PAGERENDER/issues.py
@@ -0,0 +1,89 @@
+import os
+plugin_dir = os.path.dirname(__file__)
+end_find = plugin_dir.rfind('\\')+1
+
+NAME = plugin_dir[end_find:]
+#print(NAME)
+
+from qgis.gui import *
+
+from qgis.core import (
+ NULL,
+ QgsApplication,
+ QgsDataSourceUri,
+ QgsProject,
+ QgsProviderConnectionException,
+ QgsProviderRegistry,
+ QgsRasterLayer,
+ QgsSettings,
+ QgsVectorLayer,
+ QgsGeometry,
+)
+from qgis.PyQt.QtWidgets import (
+ QDialog,
+ QAction,
+ QDockWidget,
+ QFileDialog,
+ QInputDialog,
+ QMenu,
+ QToolButton,
+ QTableWidget,
+ QTableWidgetItem,
+)
+from qgis.utils import iface
+
+
+from .tools.resources import (
+ load_ui,
+ resources_path,
+ send_issues,
+)
+
+EDITOR_CLASS = load_ui('CenRa_IssuesSend.ui')
+
+class CenRa_Issues(QDialog, EDITOR_CLASS):
+
+ def __init__(self, parent=None):
+ _ = parent
+ super().__init__()
+ self.setupUi(self)
+ self.settings = QgsSettings()
+
+ #place connect here
+ self.annuler_button.clicked.connect(self.close)
+ self.ok_button.clicked.connect(self.run_sendissues)
+
+ def run_sendissues(self):
+ text_titre = self.titre_line.text()
+ text_message = self.messages_plain.toPlainText()
+ statu_bug = self.check_bug.isChecked()
+ statu_aide = self.check_aide.isChecked()
+ statu_question = self.check_question.isChecked()
+ statu_amelioration = self.check_amelioration.isChecked()
+ statu_autre = self.check_autre.isChecked()
+
+ statu = []
+ if statu_bug == True : statu = statu + [1]
+ if statu_aide == True : statu = statu + [3]
+ if statu_question == True : statu = statu + [5]
+ if statu_amelioration == True : statu = statu + [2]
+ if statu_autre == True : statu = statu + [6]
+
+ if len(statu) >= 1:
+ import qgis
+ url = qgis.utils.pluginMetadata(NAME,'tracker')
+ print(text_message)
+ send_info = send_issues(url,text_titre,text_message,statu)
+ code = send_info.status_code
+ print(code)
+ else:
+ code = 423
+ if code == 201:
+ iface.messageBar().pushMessage("Envoyer :", "Votre messages à bien été envoyer.", level=Qgis.Success, duration=20)
+ self.close()
+ elif code == 422:
+ iface.messageBar().pushMessage("Erreur :", "Erreur dans le contenu du messages.", level=Qgis.Critical, duration=20)
+ elif code == 423:
+ iface.messageBar().pushMessage("Erreur :", "Pas de sujet sélectionné.", level=Qgis.Critical, duration=20)
+ elif code == 404:
+ iface.messageBar().pushMessage("Missing :", "Le serveur de messagerie est injoignable.", level=Qgis.Warning, duration=20)
diff --git a/CenRa_PAGERENDER/metadata.txt b/CenRa_PAGERENDER/metadata.txt
new file mode 100644
index 00000000..6ecec244
--- /dev/null
+++ b/CenRa_PAGERENDER/metadata.txt
@@ -0,0 +1,48 @@
+# This file contains metadata for your plugin.
+
+# This file should be included when you package your plugin.# Mandatory items:
+
+[general]
+name=CenRa_PageRender
+qgisMinimumVersion=3.0
+description=CenRa_PageRender
+version=1.1
+author=Conservatoire d'Espaces Naturels de Rhône-Alpes
+email=si_besoin@cen-rhonealpes.fr
+
+about=Outils de création de mise en page prédéfinis pour simplifier et organiser cette étape.
+
+repository=https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS
+homepage=https://plateformesig.cenra-outils.org/
+tracker=https://gitea.cenra-outils.org/api/v1/repos/CEN-RA/Plugin_QGIS/issues
+# End of mandatory metadata
+
+# Recommended items:
+
+hasProcessingProvider=no
+# Uncomment the following line and add your changelog:
+changelog=CenRa_PageRender:
21/10/2024 - Version 1.1:
- Enfin fonctionnel.
09/10/2024 - Version 1.0:
- Création.
+
+# Tags are comma separated with spaces allowed
+tags=python
+
+
+category=Plugins
+icon=icon.png
+# experimental flag
+experimental=False
+
+# deprecated flag (applies to the whole plugin, not just a single version)
+deprecated=False
+
+# Since QGIS 3.8, a comma separated list of plugins to be installed
+# (or upgraded) can be specified.
+# Check the documentation for more information.
+# plugin_dependencies=
+
+Category of the plugin: Raster, Vector, Database or Web
+# category=cenra,mise en page,atlas
+
+# If the plugin can run on QGIS Server.
+server=False
+
diff --git a/CenRa_PAGERENDER/tools/PythonSQL.py b/CenRa_PAGERENDER/tools/PythonSQL.py
new file mode 100644
index 00000000..f6c28865
--- /dev/null
+++ b/CenRa_PAGERENDER/tools/PythonSQL.py
@@ -0,0 +1,34 @@
+import sys
+import socket
+import os
+IPAddr=socket.gethostbyname(socket.gethostname())
+#print(IPAddr)
+if IPAddr[0:11] == "100.100.100": #4269
+ host = "100.100.100.81"
+ port = "5432"
+ dbname = "sig4269"
+ sigdb="sig4269"
+ refdb="ref_geo4269"
+ password = "McVities"
+if IPAddr[0:9] == "192.168.0": #01
+ host = "192.168.0.201"
+ port = "5432"
+ dbname = "sig01"
+ sigdb="sig01"
+ refdb="ref_geo01"
+ password = "McVities"
+if IPAddr[0:9] == "192.168.1": #0726
+ host = "192.168.1.201"
+ port = "5432"
+ dbname = "sig0726"
+ sigdb="sig0726"
+ refdb="ref_geo0726"
+ password = "McVities"
+if sys.platform == 'linux':
+ os_user = os.environ['USER']
+else:
+ os_user = os.environ['USERNAME']
+if os_user == 'STAGE':
+ os_user='stage'
+if os_user == 'Administrateur':
+ os_user='stage'
\ No newline at end of file
diff --git a/CenRa_PAGERENDER/tools/icons/CEN_RA.png b/CenRa_PAGERENDER/tools/icons/CEN_RA.png
new file mode 100644
index 0000000000000000000000000000000000000000..95ead1cf7313bc03e4637c9bb20945373f27ddca
GIT binary patch
literal 8893
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
LNkvXXu0mjfe10PI
literal 0
HcmV?d00001
diff --git a/CenRa_PAGERENDER/tools/icons/icon.png b/CenRa_PAGERENDER/tools/icons/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0b6c4a9e4a83fa58cb9fbb4cc6c8e16069e715c
GIT binary patch
literal 292634
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