Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21a652fdb2 | ||
|
|
799a635edc | ||
|
|
ff2e0f22be | ||
|
|
8c1ee42080 | ||
|
|
a3479085b6 | ||
|
|
1b54026a13 | ||
|
|
670c698b77 | ||
|
|
9b438f5bf1 |
@@ -7,7 +7,7 @@ name=CenRa_AutoMap
|
|||||||
qgisMinimumVersion=3.0
|
qgisMinimumVersion=3.0
|
||||||
supportsQt6=True
|
supportsQt6=True
|
||||||
description=CenRa_AutoMap
|
description=CenRa_AutoMap
|
||||||
version=2.7
|
version=2.8
|
||||||
author=Conservatoire d'Espaces Naturels de Rhône-Alpes
|
author=Conservatoire d'Espaces Naturels de Rhône-Alpes
|
||||||
email=si_besoin@cen-rhonealpes.fr
|
email=si_besoin@cen-rhonealpes.fr
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ tracker=https://gitea.cenra-outils.org/api/v1/repos/CEN-RA/Plugin_QGIS/issues
|
|||||||
|
|
||||||
hasProcessingProvider=no
|
hasProcessingProvider=no
|
||||||
# Uncomment the following line and add your changelog:
|
# Uncomment the following line and add your changelog:
|
||||||
changelog=<h2>CenRa_AUTOMAP:</h2></br><p><h3>18/12/2025 - Version 2.7: </h3> - fix de bug gitea.</p></br><p><h3>18/12/2025 - Version 2.6: </h3> - ajoue du logo n2000 et region.</p></br><p><h3>17/12/2025 - Version 2.5: </h3> - Carte n2000 mise a jour landscape et portrait.</p></br><p><h3>15/12/2025 - Version 2.4: </h3> - Landescape pour n2000.</p></br><p><h3>15/12/2025 - Version 2.3: </h3> - nouvelle mise en page n2000.</p></br><p><h3>12/12/2025 - Version 2.2: </h3> - nouvelle mise en page pour n2000.</p></br><p><h3>30/07/2025 - Version 2.1: </h3> - Correctife de bug.</p></br><p><h3>19/05/2025 - Version 2.0: </h3> - Compatible PyQt5 et PyQt6</p></br><p><h3>11/04/2025 - Version 1.7: </h3> - Correctif d'orthographe.</p></br><p><h3>09/04/2025 - Version 1.6: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 1.5: </h3> - Optimisation pour le TT.</p></br><p><h3>03/04/2025 - Version 1.4: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 1.3: </h3> - Fenêtre redimensionnable avec déplaçable avec la mollette sourit.</p></br><p><h3>25/02/2025 - Version 1.2: </h3> - DockWidget pour ouverture de couche avec theme.</p></br><p><h3>28/01/2025 - Version 1.1: </h3> - Multi-Composeur pris en charge.</p></br><p><h3>27/01/2025 - Version 1.0: </h3> - Version releases.</br> - Ajoute un message d'avertissement au moment d'écraser la mise en page.</br> - Ajoute prénom et nom dans la réalisation.</br> - Utilisation de Calibri.</p></br><p><h3>13/01/2025 - Version 0.1.10: </h3> - Correctif.</p></br><p><h3>07/01/2025 - Version 0.1.9: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>19/12/2024 - Version 0.1.8: </h3> - Nouvelle mise en page.</br> - Incrémentation automatique de nouveau modele de mise en page. </br> - Correctif de bug.</p></br><p><h3>21/10/2024 - Version 0.1.7: </h3> - Epurations du code.</p></br><p><h3>07/10/2024 - Version 0.1.6: </h3> - Option de bibliotheque de logo custome.</p></br><p><h3>03/10/2024 - Version 0.1.5: </h3> - Remonte la fênetre dans la pille.</br> - Gestion du nombre de colonne dans la légend.</br></p></br><p><h3>02/10/2024 - Version 0.1.4: </h3> - Mise en page plein écrant.</br></p></br><p><h3>01/10/2024 - Version 0.1.3: </h3> - Récupération du titre et sous-titre pour mise en page existente.</br> - Integration de bibliotheque de logo.</br> - Integration de gestionaire pour les source de donnée.</br> - Mise en place d'une bar d'echelle adaptative. </br></p></br><p><h3>30/09/2024 - Version 0.1.2: </h3> - Activation du thème. </br> - Ajouter une carte de suivie. </br><p></br><h3>27/09/2024 - Version 0.1.1: </h3> - Ajout d'une liste déroulante pour les sources de données. </br>- Bouton pour ajouter des fonts de carte customisés. </br>- Fonctionnalité de génération d'atlas. </p></br><p><h3>26/09/2024 - Version 0.1.0: </h3> - Lancement du plugin CenRa_AutoMap avec une seul mise en page. </p></br>
|
changelog=<h2>CenRa_AUTOMAP:</h2></br><p><h3>09/01/2026 - Version 2.8: </h3> - deplacement de l'echelle.</p></br><p><h3>18/12/2025 - Version 2.7: </h3> - fix de bug gitea.</p></br><p><h3>18/12/2025 - Version 2.6: </h3> - ajoue du logo n2000 et region.</p></br><p><h3>17/12/2025 - Version 2.5: </h3> - Carte n2000 mise a jour landscape et portrait.</p></br><p><h3>15/12/2025 - Version 2.4: </h3> - Landescape pour n2000.</p></br><p><h3>15/12/2025 - Version 2.3: </h3> - nouvelle mise en page n2000.</p></br><p><h3>12/12/2025 - Version 2.2: </h3> - nouvelle mise en page pour n2000.</p></br><p><h3>30/07/2025 - Version 2.1: </h3> - Correctife de bug.</p></br><p><h3>19/05/2025 - Version 2.0: </h3> - Compatible PyQt5 et PyQt6</p></br><p><h3>11/04/2025 - Version 1.7: </h3> - Correctif d'orthographe.</p></br><p><h3>09/04/2025 - Version 1.6: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 1.5: </h3> - Optimisation pour le TT.</p></br><p><h3>03/04/2025 - Version 1.4: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 1.3: </h3> - Fenêtre redimensionnable avec déplaçable avec la mollette sourit.</p></br><p><h3>25/02/2025 - Version 1.2: </h3> - DockWidget pour ouverture de couche avec theme.</p></br><p><h3>28/01/2025 - Version 1.1: </h3> - Multi-Composeur pris en charge.</p></br><p><h3>27/01/2025 - Version 1.0: </h3> - Version releases.</br> - Ajoute un message d'avertissement au moment d'écraser la mise en page.</br> - Ajoute prénom et nom dans la réalisation.</br> - Utilisation de Calibri.</p></br><p><h3>13/01/2025 - Version 0.1.10: </h3> - Correctif.</p></br><p><h3>07/01/2025 - Version 0.1.9: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>19/12/2024 - Version 0.1.8: </h3> - Nouvelle mise en page.</br> - Incrémentation automatique de nouveau modele de mise en page. </br> - Correctif de bug.</p></br><p><h3>21/10/2024 - Version 0.1.7: </h3> - Epurations du code.</p></br><p><h3>07/10/2024 - Version 0.1.6: </h3> - Option de bibliotheque de logo custome.</p></br><p><h3>03/10/2024 - Version 0.1.5: </h3> - Remonte la fênetre dans la pille.</br> - Gestion du nombre de colonne dans la légend.</br></p></br><p><h3>02/10/2024 - Version 0.1.4: </h3> - Mise en page plein écrant.</br></p></br><p><h3>01/10/2024 - Version 0.1.3: </h3> - Récupération du titre et sous-titre pour mise en page existente.</br> - Integration de bibliotheque de logo.</br> - Integration de gestionaire pour les source de donnée.</br> - Mise en place d'une bar d'echelle adaptative. </br></p></br><p><h3>30/09/2024 - Version 0.1.2: </h3> - Activation du thème. </br> - Ajouter une carte de suivie. </br><p></br><h3>27/09/2024 - Version 0.1.1: </h3> - Ajout d'une liste déroulante pour les sources de données. </br>- Bouton pour ajouter des fonts de carte customisés. </br>- Fonctionnalité de génération d'atlas. </p></br><p><h3>26/09/2024 - Version 0.1.0: </h3> - Lancement du plugin CenRa_AutoMap avec une seul mise en page. </p></br>
|
||||||
|
|
||||||
# Tags are comma separated with spaces allowed
|
# Tags are comma separated with spaces allowed
|
||||||
tags=python
|
tags=python
|
||||||
|
|||||||
+286
-135
@@ -1,30 +1,32 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Module Flux Editor pour le plugin CenRA_FLUX
|
||||||
|
Permet de gérer et charger des couches depuis les bases de données PostGIS (SIG et REF)
|
||||||
|
"""
|
||||||
|
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
# Import the PyQt and QGIS libraries
|
# Import des bibliothèques PyQt et QGIS
|
||||||
# from builtins import next
|
|
||||||
from builtins import str
|
from builtins import str
|
||||||
# from builtins import object
|
|
||||||
|
|
||||||
from qgis.PyQt import QtCore, QtGui
|
from qgis.PyQt import QtCore, QtGui
|
||||||
from qgis.PyQt.QtCore import QSettings
|
from qgis.PyQt.QtCore import QSettings
|
||||||
from qgis.PyQt import QtWidgets
|
from qgis.PyQt import QtWidgets
|
||||||
# from qgis.PyQt.QtWidgets import QDialog
|
|
||||||
from qgis.PyQt.QtGui import QIcon
|
from qgis.PyQt.QtGui import QIcon
|
||||||
|
|
||||||
# from qgis.PyQt.QtCore import *
|
from qgis.core import (
|
||||||
|
QgsDataSourceUri,
|
||||||
# from qgis.core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsSettings
|
QgsCoordinateReferenceSystem,
|
||||||
from qgis.core import QgsDataSourceUri, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsSettings, QgsApplication, QgsVectorLayer, QgsRasterLayer, QgsWkbTypes
|
QgsCoordinateTransform,
|
||||||
|
QgsProject,
|
||||||
|
QgsSettings,
|
||||||
|
QgsApplication,
|
||||||
|
QgsVectorLayer,
|
||||||
|
QgsRasterLayer,
|
||||||
|
QgsWkbTypes
|
||||||
|
)
|
||||||
from qgis.PyQt.QtWidgets import (
|
from qgis.PyQt.QtWidgets import (
|
||||||
QDialog,
|
QDialog,
|
||||||
# QAction,
|
QPushButton,
|
||||||
# QDockWidget,
|
|
||||||
# QFileDialog,
|
|
||||||
# QInputDialog,
|
|
||||||
# QMenu,
|
|
||||||
# QToolButton,
|
|
||||||
# QTableWidget,
|
|
||||||
QTableWidgetItem,
|
QTableWidgetItem,
|
||||||
QMessageBox,
|
QMessageBox,
|
||||||
QVBoxLayout,
|
QVBoxLayout,
|
||||||
@@ -33,28 +35,21 @@ from .tools.SQLRequet import schemaname_list, schemaname_list_ref, schemaname_di
|
|||||||
from .tools.resources import (
|
from .tools.resources import (
|
||||||
load_ui,
|
load_ui,
|
||||||
resources_path,
|
resources_path,
|
||||||
# send_issues,
|
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
from .tools.PythonSQL import login_base
|
from .tools.PythonSQL import login_base
|
||||||
except NameError:
|
except NameError:
|
||||||
print('Pas de fichier PythonSQL')
|
print('Pas de fichier PythonSQL')
|
||||||
|
|
||||||
|
|
||||||
# from .issues import CenRa_Issues
|
|
||||||
|
|
||||||
# from ast import literal_eval
|
|
||||||
from qgis.utils import iface
|
from qgis.utils import iface
|
||||||
# import os.path
|
|
||||||
# import os
|
|
||||||
# import webbrowser
|
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import psycopg2.extras
|
import psycopg2.extras
|
||||||
# import base64
|
|
||||||
|
|
||||||
|
# Variable globale pour le mode debug
|
||||||
global DeBUG
|
global DeBUG
|
||||||
DeBUG = 0
|
DeBUG = 0
|
||||||
|
|
||||||
|
# Création des icônes pour les couches raster et vecteur
|
||||||
itemIconRaster = QTableWidgetItem()
|
itemIconRaster = QTableWidgetItem()
|
||||||
icon = QIcon()
|
icon = QIcon()
|
||||||
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconRaster.svg')), QIcon.Mode(0), QIcon.State(1))
|
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconRaster.svg')), QIcon.Mode(0), QIcon.State(1))
|
||||||
@@ -65,28 +60,36 @@ icon = QIcon()
|
|||||||
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconVecteur.svg')), QIcon.Mode(0), QIcon.State(1))
|
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconVecteur.svg')), QIcon.Mode(0), QIcon.State(1))
|
||||||
itemIconVecteur.setIcon(icon)
|
itemIconVecteur.setIcon(icon)
|
||||||
|
|
||||||
|
# Récupération des informations de connexion à la base de données
|
||||||
try:
|
try:
|
||||||
account = login_base('account')
|
account = login_base('account')
|
||||||
user = account[0]
|
user = account[0] # Nom d'utilisateur
|
||||||
mdp = account[1]
|
mdp = account[1] # Mot de passe
|
||||||
host = account[2]
|
host = account[2] # Hôte de la base de données
|
||||||
port = account[3]
|
port = account[3] # Port de connexion
|
||||||
dbname = account[4]
|
dbname = account[4] # Nom de la base de données
|
||||||
sigdb = account[5]
|
sigdb = account[5] # Base de données SIG
|
||||||
refdb = account[6]
|
refdb = account[6] # Base de données REF
|
||||||
|
|
||||||
except NameError:
|
except NameError:
|
||||||
print('Fails to login DB for account')
|
print('Fails to login DB for account')
|
||||||
|
|
||||||
|
# Chargement de l'interface utilisateur depuis le fichier .ui
|
||||||
EDITOR_CLASS = load_ui('CenRa_Flux_base.ui')
|
EDITOR_CLASS = load_ui('CenRa_Flux_base.ui')
|
||||||
|
|
||||||
targetCrs = QgsCoordinateReferenceSystem('EPSG:4326')
|
# Configuration des systèmes de coordonnées de référence (CRS)
|
||||||
layerCrs = QgsCoordinateReferenceSystem('EPSG:2154')
|
targetCrs = QgsCoordinateReferenceSystem('EPSG:4326') # WGS84 (coordonnées géographiques)
|
||||||
|
layerCrs = QgsCoordinateReferenceSystem('EPSG:2154') # Lambert 93 (projection française)
|
||||||
TranformCRS = QgsCoordinateTransform(layerCrs, targetCrs, QgsProject.instance())
|
TranformCRS = QgsCoordinateTransform(layerCrs, targetCrs, QgsProject.instance())
|
||||||
|
|
||||||
|
|
||||||
class Flux_Editor(QDialog, EDITOR_CLASS):
|
class Flux_Editor(QDialog, EDITOR_CLASS):
|
||||||
|
"""
|
||||||
|
Classe principale de l'éditeur de flux
|
||||||
|
Gère l'interface de sélection et de chargement des couches depuis les bases de données
|
||||||
|
"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
"""Initialisation de l'interface et des composants"""
|
||||||
_ = parent
|
_ = parent
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
@@ -95,29 +98,36 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png')))
|
self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png')))
|
||||||
self.first_start = None
|
self.first_start = None
|
||||||
self.iface = iface
|
self.iface = iface
|
||||||
|
# Configuration des éléments visuels de l'interface
|
||||||
self.label_3.setPixmap(QtGui.QPixmap(resources_path('ui', 'logo.png')))
|
self.label_3.setPixmap(QtGui.QPixmap(resources_path('ui', 'logo.png')))
|
||||||
self.commandLinkButton.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-bottom.png')))
|
self.commandLinkButton.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-bottom.png')))
|
||||||
self.commandLinkButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-up.png')))
|
self.commandLinkButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-up.png')))
|
||||||
|
|
||||||
|
# Configuration du tableau des couches disponibles
|
||||||
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger(0))
|
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger(0))
|
||||||
self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'find.png')))
|
self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'find.png')))
|
||||||
|
self.toolButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'star.png')))
|
||||||
|
# Ajout des options de base de données (SIG ou REF)
|
||||||
self.comboBox_2.addItem("SIG")
|
self.comboBox_2.addItem("SIG")
|
||||||
self.comboBox_2.addItem('REF')
|
self.comboBox_2.addItem('REF')
|
||||||
|
|
||||||
self.commandLinkButton.clicked.connect(self.selection_flux)
|
# Connexion des signaux aux slots (événements de l'interface)
|
||||||
self.tableWidget.itemDoubleClicked.connect(self.selection_flux)
|
self.commandLinkButton.clicked.connect(self.selection_flux) # Bouton de sélection de flux
|
||||||
self.pushButton_2.clicked.connect(self.limite_flux)
|
self.tableWidget.itemDoubleClicked.connect(self.selection_flux) # Double-clic sur une couche
|
||||||
self.commandLinkButton_2.clicked.connect(self.suppression_flux)
|
self.pushButton_2.clicked.connect(self.limite_flux) # Bouton de chargement
|
||||||
self.tableWidget_2.itemDoubleClicked.connect(self.suppression_flux)
|
self.commandLinkButton_2.clicked.connect(self.suppression_flux) # Bouton de suppression
|
||||||
self.comboBox_2.currentIndexChanged.connect(self.bd_source)
|
self.tableWidget_2.itemDoubleClicked.connect(self.suppression_flux) # Double-clic pour supprimer
|
||||||
|
self.comboBox_2.currentIndexChanged.connect(self.bd_source) # Changement de base de données
|
||||||
self.checkBox.hide()
|
self.checkBox.hide()
|
||||||
# self.checkBox.stateChanged.connect(self.modeCarte)
|
self.toolButton.clicked.connect(self.getCanevas) # Filtrer par emprise du canevas
|
||||||
self.toolButton.clicked.connect(self.getCanevas)
|
self.toolButton.setToolTip('Filtrer uniquement les couche Contour/Habitat/Travaux \nqui ce trouve dans le canvas de la carte.')
|
||||||
|
self.toolButton_2.clicked.connect(self.filtre_favorit) # Filtrer par favoris
|
||||||
|
self.toolButton_2.setToolTip('Afficher uniquement les favoris.')
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
self.lineEdit.textChanged.connect(self.filtre_dynamique)
|
self.lineEdit.textChanged.connect(self.filtre_dynamique) # Recherche dynamique
|
||||||
# self.viewer.textChanged.connect(self.NewTitle)
|
|
||||||
layout.addWidget(self.lineEdit)
|
layout.addWidget(self.lineEdit)
|
||||||
self.viewer.hide()
|
self.viewer.hide()
|
||||||
|
# Configuration du menu de debug (caché par défaut)
|
||||||
self.DeBUG.addItem('')
|
self.DeBUG.addItem('')
|
||||||
self.DeBUG.addItem('Dev')
|
self.DeBUG.addItem('Dev')
|
||||||
self.DeBUG.addItem('01')
|
self.DeBUG.addItem('01')
|
||||||
@@ -126,13 +136,14 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.comboBox.currentIndexChanged.connect(self.initialisation_flux)
|
self.comboBox.currentIndexChanged.connect(self.initialisation_flux)
|
||||||
|
|
||||||
self.DeBUG.currentIndexChanged.connect(self.SwitchDEBUG)
|
self.DeBUG.currentIndexChanged.connect(self.SwitchDEBUG)
|
||||||
self.DeBUG.hide()
|
self.DeBUG.hide() # Menu debug caché par défaut
|
||||||
|
|
||||||
def raise_(self):
|
def raise_(self):
|
||||||
"""Run method that performs all the real work"""
|
"""Run method that performs all the real work"""
|
||||||
self.bd_source()
|
self.bd_source()
|
||||||
|
|
||||||
def SwitchDEBUG(self):
|
def SwitchDEBUG(self):
|
||||||
|
"""Change les paramètres de connexion selon le mode debug sélectionné"""
|
||||||
try:
|
try:
|
||||||
global user, mdp, host, port, dbname, sigdb, refdb
|
global user, mdp, host, port, dbname, sigdb, refdb
|
||||||
account = login_base(self.DeBUG.currentText())
|
account = login_base(self.DeBUG.currentText())
|
||||||
@@ -152,43 +163,40 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.DeBUG.show()
|
self.DeBUG.show()
|
||||||
|
|
||||||
def mousePressEvent(self, event):
|
def mousePressEvent(self, event):
|
||||||
|
"""Détecte les clics sur le logo pour activer le mode debug (3 clics consécutifs)"""
|
||||||
global DeBUG
|
global DeBUG
|
||||||
|
# Zone du logo (coordonnées x: 330-560, y: 5-75)
|
||||||
if 330 <= event.pos().x() <= 560 and 5 <= event.pos().y() <= 75:
|
if 330 <= event.pos().x() <= 560 and 5 <= event.pos().y() <= 75:
|
||||||
DeBUG = DeBUG + 1
|
DeBUG = DeBUG + 1
|
||||||
if DeBUG == 3:
|
if DeBUG == 3: # Activation après 3 clics
|
||||||
DeBUG = 0
|
DeBUG = 0
|
||||||
self.ModeDeBUG()
|
self.ModeDeBUG()
|
||||||
else:
|
else:
|
||||||
DeBUG = 0
|
DeBUG = 0
|
||||||
self.DeBUG.hide()
|
self.DeBUG.hide()
|
||||||
|
|
||||||
"""
|
|
||||||
def NewTitle(self):
|
|
||||||
if self.viewer.title() != '':
|
|
||||||
Tsplit = ((self.viewer.title()).split('.'))
|
|
||||||
print(Tsplit[0], Tsplit[1])
|
|
||||||
self.openPostGIS(Tsplit[0], Tsplit[1])
|
|
||||||
"""
|
|
||||||
|
|
||||||
def bd_source(self):
|
def bd_source(self):
|
||||||
|
"""Sélectionne la base de données source (SIG ou REF)"""
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
bd_origine = self.comboBox_2.currentText()
|
bd_origine = self.comboBox_2.currentText()
|
||||||
if bd_origine == 'REF':
|
if bd_origine == 'REF':
|
||||||
self.run_ref()
|
self.run_ref() # Connexion à la base REF
|
||||||
if bd_origine == 'SIG':
|
if bd_origine == 'SIG':
|
||||||
self.run_sig()
|
self.run_sig() # Connexion à la base SIG
|
||||||
|
|
||||||
def run_ref(self):
|
def run_ref(self):
|
||||||
"""Run method that performs all the real work"""
|
"""Initialise la connexion à la base de données REF"""
|
||||||
|
# Vider le tableau des flux sélectionnés
|
||||||
while self.tableWidget_2.rowCount() > 0:
|
while self.tableWidget_2.rowCount() > 0:
|
||||||
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
|
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
|
||||||
# print(self.tableWidget_2.rowCount())
|
|
||||||
global cur, con, dbtype
|
global cur, con, dbtype
|
||||||
dbtype = refdb
|
dbtype = refdb
|
||||||
|
# Connexion à la base de données REF
|
||||||
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
|
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
|
||||||
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
self.combobox_custom()
|
self.combobox_custom()
|
||||||
# self.initialisation_flux()
|
self.initialisation_flux()
|
||||||
# Create the dialog with elements (after translation) and keep reference
|
# Create the dialog with elements (after translation) and keep reference
|
||||||
# Only create GUI ONCE in callback, so that it will only load when the plugin is started
|
# Only create GUI ONCE in callback, so that it will only load when the plugin is started
|
||||||
if self.first_start is True:
|
if self.first_start is True:
|
||||||
@@ -197,43 +205,83 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.show()
|
self.show()
|
||||||
# Run the dialog event loop
|
# Run the dialog event loop
|
||||||
result = self.exec()
|
result = self.exec()
|
||||||
# See if OK was pressed
|
|
||||||
if result:
|
if result:
|
||||||
# Do something useful here - delete the line containing pass and
|
|
||||||
# substitute with your code.
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def run_sig(self):
|
def run_sig(self):
|
||||||
"""Run method that performs all the real work"""
|
"""Initialise la connexion à la base de données SIG"""
|
||||||
|
# Vider le tableau des flux sélectionnés
|
||||||
while self.tableWidget_2.rowCount() > 0:
|
while self.tableWidget_2.rowCount() > 0:
|
||||||
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
|
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
|
||||||
global cur, con, dbtype
|
global cur, con, dbtype
|
||||||
dbtype = sigdb
|
dbtype = sigdb
|
||||||
|
# Connexion à la base de données SIG
|
||||||
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
|
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
|
||||||
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
self.combobox_custom()
|
self.combobox_custom()
|
||||||
# self.initialisation_flux()
|
self.initialisation_flux()
|
||||||
# Create the dialog with elements (after translation) and keep reference
|
|
||||||
# Only create GUI ONCE in callback, so that it will only load when the plugin is started
|
|
||||||
if self.first_start is True:
|
if self.first_start is True:
|
||||||
self.first_start = False
|
self.first_start = False
|
||||||
# show the dialog
|
|
||||||
# self.show()
|
|
||||||
# Run the dialog event loop
|
|
||||||
# result = self.exec()
|
|
||||||
# See if OK was pressed
|
|
||||||
# if result:
|
|
||||||
# Do something useful here - delete the line containing pass and
|
|
||||||
# substitute with your code.
|
|
||||||
# pass
|
|
||||||
|
|
||||||
def suppression_flux(self):
|
def suppression_flux(self):
|
||||||
self.tableWidget_2.removeRow(self.tableWidget_2.currentRow())
|
self.tableWidget_2.removeRow(self.tableWidget_2.currentRow())
|
||||||
|
|
||||||
def initialisation_flux(self):
|
def AddOrDelToUserFav(self):
|
||||||
print('run')
|
"""Ajoute ou supprime une couche des favoris de l'utilisateur"""
|
||||||
|
selected_items = self.tableWidget.selectedItems()
|
||||||
|
favorit_statut = selected_items[4].text() # 0 = non favori, 1 = favori
|
||||||
|
|
||||||
|
selected_items[4].tableWidget().removeCellWidget(selected_items[4].row(), 4)
|
||||||
|
|
||||||
|
schema_name = selected_items[2].text()
|
||||||
|
table_name = selected_items[3].text()
|
||||||
|
|
||||||
|
# Ajout aux favoris
|
||||||
|
if favorit_statut == "0":
|
||||||
|
FAV = "mStarIconDel.png" # Icône étoile pleine
|
||||||
|
selected_items[4].setText("1")
|
||||||
|
# Requête SQL pour ajouter aux favoris
|
||||||
|
SQLAddFav = """INSERT INTO admin_sig.favtable (utilisateur, schema_name, table_name) VALUES ('""" + user + "','" + schema_name + "','" + table_name + """');"""
|
||||||
|
if dbtype == sigdb:
|
||||||
|
cur.execute(SQLAddFav)
|
||||||
|
con.commit()
|
||||||
|
else:
|
||||||
|
conSIG = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + sigdb + " user=" + user + " password=" + mdp)
|
||||||
|
curSIG = conSIG.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
curSIG.execute(SQLAddFav)
|
||||||
|
conSIG.commit()
|
||||||
|
conSIG.close()
|
||||||
|
|
||||||
|
# Suppression des favoris
|
||||||
|
else:
|
||||||
|
FAV = "mStarIconAdd.png" # Icône étoile vide
|
||||||
|
selected_items[4].setText("0")
|
||||||
|
# Requête SQL pour supprimer des favoris
|
||||||
|
SQLDelFav = """DELETE FROM admin_sig.favtable WHERE utilisateur LIKE '""" + user + """' AND schema_name LIKE '""" + schema_name + """' AND table_name LIKE '""" + table_name + """';"""
|
||||||
|
if dbtype == sigdb:
|
||||||
|
cur.execute(SQLDelFav)
|
||||||
|
con.commit()
|
||||||
|
else:
|
||||||
|
conSIG = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + sigdb + " user=" + user + " password=" + mdp)
|
||||||
|
curSIG = conSIG.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
curSIG.execute(SQLDelFav)
|
||||||
|
conSIG.commit()
|
||||||
|
conSIG.close()
|
||||||
|
|
||||||
|
iconFav = QIcon()
|
||||||
|
iconFav.addPixmap(QtGui.QPixmap(resources_path('icons', FAV)), QIcon.Mode(0), QIcon.State(1))
|
||||||
|
self.FavButton = QPushButton(iconFav, "")
|
||||||
|
selected_items[4].tableWidget().setCellWidget(selected_items[4].row(), 4, self.FavButton)
|
||||||
|
self.FavButton.clicked.connect(self.AddOrDelToUserFav)
|
||||||
|
|
||||||
|
def initialisation_flux(self):
|
||||||
|
"""Initialise et remplit le tableau des couches disponibles"""
|
||||||
|
if self.toolButton_2.text() == "1":
|
||||||
|
self.filtre_favorit(None)
|
||||||
|
self.tableWidget.clear()
|
||||||
|
if NoSignals == 0: # Éviter les boucles infinies lors des mises à jour
|
||||||
if dbtype == sigdb:
|
if dbtype == sigdb:
|
||||||
# self.toolButton.setEnabled(1)
|
|
||||||
if self.comboBox.currentText() == 'toutes les catégories':
|
if self.comboBox.currentText() == 'toutes les catégories':
|
||||||
custom_list = schemaname_list
|
custom_list = schemaname_list
|
||||||
elif self.comboBox.currentText() == 'travaux':
|
elif self.comboBox.currentText() == 'travaux':
|
||||||
@@ -250,11 +298,13 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
cur.execute(custom_list)
|
cur.execute(custom_list)
|
||||||
list_schema = cur.fetchall()
|
list_schema = cur.fetchall()
|
||||||
|
|
||||||
|
# Vérification de la présence de couches raster dans la base
|
||||||
SQLcountRaster = """SELECT schemaname,viewname FROM pg_catalog.pg_views
|
SQLcountRaster = """SELECT schemaname,viewname FROM pg_catalog.pg_views
|
||||||
WHERE schemaname LIKE 'public' AND viewname LIKE 'raster_columns';"""
|
WHERE schemaname LIKE 'public' AND viewname LIKE 'raster_columns';"""
|
||||||
cur.execute(SQLcountRaster)
|
cur.execute(SQLcountRaster)
|
||||||
RasterIF = len(cur.fetchall())
|
RasterIF = len(cur.fetchall())
|
||||||
|
|
||||||
|
# Récupération de la liste des couches raster si disponibles
|
||||||
if RasterIF == 1:
|
if RasterIF == 1:
|
||||||
SQLloadRaster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
|
SQLloadRaster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
|
||||||
cur.execute(SQLloadRaster)
|
cur.execute(SQLloadRaster)
|
||||||
@@ -265,6 +315,7 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
else:
|
else:
|
||||||
RasterList = []
|
RasterList = []
|
||||||
|
|
||||||
|
# Récupération des projets QGIS stockés dans la base de données
|
||||||
SQLprojects = """SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE 'qgis_projects'"""
|
SQLprojects = """SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE 'qgis_projects'"""
|
||||||
cur.execute(SQLprojects)
|
cur.execute(SQLprojects)
|
||||||
list_projects = cur.fetchall()
|
list_projects = cur.fetchall()
|
||||||
@@ -275,18 +326,39 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
cur.execute(SQLProjectsQgis)
|
cur.execute(SQLProjectsQgis)
|
||||||
list_projects_qgis.append(cur.fetchall())
|
list_projects_qgis.append(cur.fetchall())
|
||||||
|
|
||||||
|
# Récupération des droits d'accès de l'utilisateur sur les tables
|
||||||
if self.comboBox.currentText() == 'toutes les catégories':
|
if self.comboBox.currentText() == 'toutes les catégories':
|
||||||
SQLGrands = """SELECT concat(table_schema,'.',table_name) FROM information_schema.role_table_grants WHERE grantee in(SELECT rolname FROM pg_catalog.pg_roles WHERE oid in(SELECT roleid FROM pg_auth_members WHERE member = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = '""" + user + """'))) and privilege_type = 'SELECT';"""
|
SQLGrands = """SELECT concat(table_schema,'.',table_name) FROM information_schema.role_table_grants WHERE grantee in(SELECT rolname FROM pg_catalog.pg_roles WHERE oid in(SELECT roleid FROM pg_auth_members WHERE member = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = '""" + user + """'))) and privilege_type = 'SELECT';"""
|
||||||
else:
|
else:
|
||||||
|
if dbtype == sigdb:
|
||||||
SQLGrands = """SELECT concat(table_schema,'.',table_name) FROM information_schema.role_table_grants WHERE grantee in(SELECT rolname FROM pg_catalog.pg_roles WHERE oid in(SELECT roleid FROM pg_auth_members WHERE member = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = '""" + user + """'))) and privilege_type = 'SELECT' AND table_schema LIKE '_""" + str(self.comboBox.currentText()) + """_%';"""
|
SQLGrands = """SELECT concat(table_schema,'.',table_name) FROM information_schema.role_table_grants WHERE grantee in(SELECT rolname FROM pg_catalog.pg_roles WHERE oid in(SELECT roleid FROM pg_auth_members WHERE member = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = '""" + user + """'))) and privilege_type = 'SELECT' AND table_schema LIKE '_""" + str(self.comboBox.currentText()) + """_%';"""
|
||||||
|
elif dbtype == refdb:
|
||||||
|
SQLGrands = """SELECT concat(table_schema,'.',table_name) FROM information_schema.role_table_grants WHERE grantee in(SELECT rolname FROM pg_catalog.pg_roles WHERE oid in(SELECT roleid FROM pg_auth_members WHERE member = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = '""" + user + """'))) and privilege_type = 'SELECT' AND table_schema LIKE '""" + str(self.comboBox.currentText()) + """%';"""
|
||||||
cur.execute(SQLGrands)
|
cur.execute(SQLGrands)
|
||||||
list_grands = cur.fetchall()
|
list_grands = cur.fetchall()
|
||||||
GrandUser = []
|
GrandUser = []
|
||||||
for grandsFind in list_grands:
|
for grandsFind in list_grands:
|
||||||
GrandUser.append(grandsFind[0])
|
GrandUser.append(grandsFind[0])
|
||||||
|
|
||||||
|
# Récupération de la liste des favoris de l'utilisateur
|
||||||
|
SQLFavTable = "SELECT concat(schema_name, '.', table_name) FROM admin_sig.favtable WHERE utilisateur LIKE '" + user + "';"
|
||||||
|
if dbtype == refdb:
|
||||||
|
conSIG = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + sigdb + " user=" + user + " password=" + mdp)
|
||||||
|
curSIG = conSIG.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
curSIG.execute(SQLFavTable)
|
||||||
|
list_fav = curSIG.fetchall()
|
||||||
|
conSIG.close()
|
||||||
|
print('SIG')
|
||||||
|
else:
|
||||||
|
cur.execute(SQLFavTable)
|
||||||
|
list_fav = cur.fetchall()
|
||||||
|
FavList = []
|
||||||
|
for favFind in list_fav:
|
||||||
|
FavList.append(favFind[0])
|
||||||
|
|
||||||
|
# Remplissage du tableau avec les couches disponibles
|
||||||
self.tableWidget.setRowCount(len(list_schema))
|
self.tableWidget.setRowCount(len(list_schema))
|
||||||
self.tableWidget.setColumnCount(4)
|
self.tableWidget.setColumnCount(5)
|
||||||
i = 0
|
i = 0
|
||||||
for value in list_schema:
|
for value in list_schema:
|
||||||
if dbtype == sigdb:
|
if dbtype == sigdb:
|
||||||
@@ -317,6 +389,18 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
schema_name = str(value[0])
|
schema_name = str(value[0])
|
||||||
table_name = str(value[1])
|
table_name = str(value[1])
|
||||||
|
|
||||||
|
FavStatut = 0
|
||||||
|
if (schema_name + '.' + table_name) not in FavList:
|
||||||
|
FAV = "mStarIconAdd.png"
|
||||||
|
FavStatut = 0
|
||||||
|
else:
|
||||||
|
FAV = "mStarIconDel.png"
|
||||||
|
FavStatut = 1
|
||||||
|
iconFav = QIcon()
|
||||||
|
iconFav.addPixmap(QtGui.QPixmap(resources_path('icons', FAV)), QIcon.Mode(0), QIcon.State(1))
|
||||||
|
self.FavButton = QPushButton(iconFav, "")
|
||||||
|
self.FavButton.clicked.connect(self.AddOrDelToUserFav)
|
||||||
|
|
||||||
if (str(value[0]) + '.' + str(value[1])) in RasterList:
|
if (str(value[0]) + '.' + str(value[1])) in RasterList:
|
||||||
SVG = 'mIconRaster.svg'
|
SVG = 'mIconRaster.svg'
|
||||||
else:
|
else:
|
||||||
@@ -334,12 +418,15 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.tableWidget.setItem(i, 2, item)
|
self.tableWidget.setItem(i, 2, item)
|
||||||
item = QTableWidgetItem(table_name)
|
item = QTableWidgetItem(table_name)
|
||||||
self.tableWidget.setItem(i, 3, item)
|
self.tableWidget.setItem(i, 3, item)
|
||||||
|
item = QTableWidgetItem(str(FavStatut))
|
||||||
|
self.tableWidget.setItem(i, 4, item)
|
||||||
|
self.tableWidget.setCellWidget(i, 4, self.FavButton)
|
||||||
|
|
||||||
if True:
|
# Coloration des lignes selon les droits d'accès
|
||||||
if (str(value[0]) + '.' + str(value[1])) in GrandUser:
|
if (str(value[0]) + '.' + str(value[1])) in GrandUser:
|
||||||
pass
|
pass # L'utilisateur a les droits
|
||||||
else:
|
else:
|
||||||
# print(str(value[0]) + '.' + str(value[1]), 'bad')
|
# Coloration en violet si droits insuffisants
|
||||||
for j in range(self.tableWidget.columnCount()):
|
for j in range(self.tableWidget.columnCount()):
|
||||||
self.tableWidget.item(i, j).setBackground(QtGui.QColor(187, 134, 192, 50))
|
self.tableWidget.item(i, j).setBackground(QtGui.QColor(187, 134, 192, 50))
|
||||||
self.tableWidget.item(i, j).setToolTip('Droit insuffisant pour ouvrire la couche !')
|
self.tableWidget.item(i, j).setToolTip('Droit insuffisant pour ouvrire la couche !')
|
||||||
@@ -360,6 +447,20 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
cur.execute(SQLProjectsQgis)
|
cur.execute(SQLProjectsQgis)
|
||||||
list_projects_qgis = cur.fetchall()
|
list_projects_qgis = cur.fetchall()
|
||||||
for Project in list_projects_qgis:
|
for Project in list_projects_qgis:
|
||||||
|
FavStatut = 0
|
||||||
|
if (ProjectName[0] + '.' + Project[0]) not in FavList:
|
||||||
|
FAV = "mStarIconAdd.png"
|
||||||
|
FavStatut = 0
|
||||||
|
else:
|
||||||
|
FAV = "mStarIconDel.png"
|
||||||
|
FavStatut = 1
|
||||||
|
iconFav = QIcon()
|
||||||
|
iconFav.addPixmap(QtGui.QPixmap(resources_path('icons', FAV)), QIcon.Mode(0), QIcon.State(1))
|
||||||
|
self.FavButton = QPushButton(iconFav, "")
|
||||||
|
self.FavButton.clicked.connect(self.AddOrDelToUserFav)
|
||||||
|
if dbtype == refdb:
|
||||||
|
self.FavButton.setEnabled(False)
|
||||||
|
|
||||||
self.tableWidget.setRowCount(i + 1)
|
self.tableWidget.setRowCount(i + 1)
|
||||||
itemIcon = QTableWidgetItem()
|
itemIcon = QTableWidgetItem()
|
||||||
icon = QIcon()
|
icon = QIcon()
|
||||||
@@ -376,20 +477,27 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
item = QTableWidgetItem(Project[0])
|
item = QTableWidgetItem(Project[0])
|
||||||
self.tableWidget.setItem(i, 3, item)
|
self.tableWidget.setItem(i, 3, item)
|
||||||
|
|
||||||
|
item = QTableWidgetItem(str(FavStatut))
|
||||||
|
self.tableWidget.setItem(i, 4, item)
|
||||||
|
self.tableWidget.setCellWidget(i, 4, self.FavButton)
|
||||||
|
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
||||||
self.tableWidget.setColumnWidth(0, 20)
|
self.tableWidget.setColumnWidth(0, 20)
|
||||||
self.tableWidget.setColumnWidth(1, 70)
|
self.tableWidget.setColumnWidth(1, 70)
|
||||||
self.tableWidget.setColumnWidth(2, 300)
|
self.tableWidget.setColumnWidth(2, 300)
|
||||||
self.tableWidget.setColumnWidth(3, 300)
|
self.tableWidget.setColumnWidth(3, 300)
|
||||||
self.tableWidget.setHorizontalHeaderLabels(["Type", "Code", "Schema", "Table"])
|
self.tableWidget.setColumnWidth(4, 20)
|
||||||
|
self.tableWidget.setHorizontalHeaderLabels(["Type", "Code", "Schema", "Table", "Favorit"])
|
||||||
|
|
||||||
|
if self.lineEdit.text() != 'Recherche par mots-clés':
|
||||||
|
self.filtre_dynamique(self.lineEdit.text())
|
||||||
|
|
||||||
def selection_flux(self):
|
def selection_flux(self):
|
||||||
|
"""Ajoute une couche sélectionnée à la liste des flux à charger"""
|
||||||
selected_row = 0
|
selected_row = 0
|
||||||
selected_items = self.tableWidget.selectedItems()
|
selected_items = self.tableWidget.selectedItems()
|
||||||
|
|
||||||
# Assuming you want to compare items in the first column for uniqueness
|
|
||||||
# svgTake = (selected_items[2].tableWidget().cellWidget(0,0))
|
|
||||||
new_item_text = selected_items[3].text()
|
new_item_text = selected_items[3].text()
|
||||||
|
|
||||||
if not self.item_already_exists(new_item_text):
|
if not self.item_already_exists(new_item_text):
|
||||||
@@ -397,14 +505,16 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
|
|
||||||
for column in range(self.tableWidget.columnCount()):
|
for column in range(self.tableWidget.columnCount()):
|
||||||
cloned_item = selected_items[column].clone()
|
cloned_item = selected_items[column].clone()
|
||||||
self.tableWidget_2.setHorizontalHeaderLabels(["Type", "Code", "Schema", "Table"])
|
self.tableWidget_2.setHorizontalHeaderLabels(["Type", "Code", "Schema", "Table", "Favorit"])
|
||||||
self.tableWidget_2.setColumnCount(4)
|
self.tableWidget_2.setColumnCount(5)
|
||||||
self.tableWidget_2.setItem(selected_row, column, cloned_item)
|
self.tableWidget_2.setItem(selected_row, column, cloned_item)
|
||||||
|
|
||||||
self.tableWidget_2.setColumnWidth(0, 20)
|
self.tableWidget_2.setColumnWidth(0, 20)
|
||||||
self.tableWidget_2.setColumnWidth(1, 70)
|
self.tableWidget_2.setColumnWidth(1, 70)
|
||||||
self.tableWidget_2.setColumnWidth(2, 300)
|
self.tableWidget_2.setColumnWidth(2, 300)
|
||||||
self.tableWidget_2.setColumnWidth(3, 300)
|
self.tableWidget_2.setColumnWidth(3, 300)
|
||||||
|
self.tableWidget_2.setColumnWidth(4, 20)
|
||||||
|
self.tableWidget_2.setColumnHidden(4, True)
|
||||||
|
|
||||||
def item_already_exists(self, new_item_text):
|
def item_already_exists(self, new_item_text):
|
||||||
# Assuming you want to compare items in the first column for uniqueness
|
# Assuming you want to compare items in the first column for uniqueness
|
||||||
@@ -413,7 +523,8 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
return len(existing_items) > 0
|
return len(existing_items) > 0
|
||||||
|
|
||||||
def limite_flux(self):
|
def limite_flux(self):
|
||||||
|
"""Vérifie le nombre de flux à charger et affiche un avertissement si > 5"""
|
||||||
|
# Avertissement si plus de 5 couches sélectionnées (risque de performance)
|
||||||
if self.tableWidget_2.rowCount() > 5:
|
if self.tableWidget_2.rowCount() > 5:
|
||||||
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !",
|
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !",
|
||||||
"Le nombre de flux à charger en une seule fois est limité à 5 pour des questions de performances. Souhaitez vous tout de même charger les " + str(
|
"Le nombre de flux à charger en une seule fois est limité à 5 pour des questions de performances. Souhaitez vous tout de même charger les " + str(
|
||||||
@@ -428,26 +539,8 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
if self.tableWidget_2.rowCount() <= 5:
|
if self.tableWidget_2.rowCount() <= 5:
|
||||||
self.chargement_flux()
|
self.chargement_flux()
|
||||||
|
|
||||||
"""
|
|
||||||
def openPostGIS(self, schema, table):
|
|
||||||
uri = QgsDataSourceUri()
|
|
||||||
uri.setConnection(host, port, sigdb, user, mdp)
|
|
||||||
|
|
||||||
if (schema + '.' + table) in LRasterList:
|
|
||||||
uri.setDataSource(schema, table, "rast")
|
|
||||||
uri.setKeyColumn('rid')
|
|
||||||
uri.setSrid('2154')
|
|
||||||
layer = QgsRasterLayer(uri.uri(), table, "postgresraster")
|
|
||||||
else:
|
|
||||||
uri.setDataSource(schema, table, "geom")
|
|
||||||
uri.setKeyColumn('gid')
|
|
||||||
uri.setSrid('2154')
|
|
||||||
layer = QgsVectorLayer(uri.uri(), table, "postgres")
|
|
||||||
# Ajout de la couche au canevas QGIS
|
|
||||||
QgsProject.instance().addMapLayer(layer)
|
|
||||||
"""
|
|
||||||
|
|
||||||
def chargement_flux(self):
|
def chargement_flux(self):
|
||||||
|
"""Charge les couches sélectionnées dans QGIS"""
|
||||||
managerAU = QgsApplication.authManager()
|
managerAU = QgsApplication.authManager()
|
||||||
managerAU.availableAuthMethodConfigs().keys()
|
managerAU.availableAuthMethodConfigs().keys()
|
||||||
|
|
||||||
@@ -461,9 +554,7 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
}
|
}
|
||||||
return switcher.get(type, "nothing")
|
return switcher.get(type, "nothing")
|
||||||
|
|
||||||
# def displayOnWindows(type, uri, name):
|
# Vérification de la présence de l'extension PostGIS Raster
|
||||||
# p = []
|
|
||||||
|
|
||||||
SQLloadRaster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
|
SQLloadRaster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
|
||||||
SQLextension = """SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname LIKE 'postgis_raster';"""
|
SQLextension = """SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname LIKE 'postgis_raster';"""
|
||||||
|
|
||||||
@@ -480,10 +571,11 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
for rasterFind in list_raster:
|
for rasterFind in list_raster:
|
||||||
RasterList.append(rasterFind[0])
|
RasterList.append(rasterFind[0])
|
||||||
|
|
||||||
|
# Chargement de chaque couche sélectionnée
|
||||||
for row in range(0, self.tableWidget_2.rowCount()):
|
for row in range(0, self.tableWidget_2.rowCount()):
|
||||||
color_rgba_db = 855030089
|
color_rgba_db = 855030089 # Code couleur pour couche dans autre BD
|
||||||
color_rgba_droit = 851150528
|
color_rgba_droit = 851150528 # Code couleur pour droits insuffisants
|
||||||
# print(self.tableWidget_2.item(row, 1).background().color().rgba())
|
print(self.tableWidget_2.item(row, 1).background().color().rgba())
|
||||||
if self.tableWidget_2.item(row, 1).background().color().rgba() == color_rgba_droit:
|
if self.tableWidget_2.item(row, 1).background().color().rgba() == color_rgba_droit:
|
||||||
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "Vous ne disposez pas des droit pour la couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» !", QMessageBox.StandardButton(0x00004000))
|
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "Vous ne disposez pas des droit pour la couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» !", QMessageBox.StandardButton(0x00004000))
|
||||||
elif self.tableWidget_2.item(row, 1).background().color().rgba() != color_rgba_db:
|
elif self.tableWidget_2.item(row, 1).background().color().rgba() != color_rgba_db:
|
||||||
@@ -503,36 +595,34 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
code = self.tableWidget_2.item(row, 1).text()
|
code = self.tableWidget_2.item(row, 1).text()
|
||||||
schema = self.tableWidget_2.item(row, 2).text()
|
schema = self.tableWidget_2.item(row, 2).text()
|
||||||
table = self.tableWidget_2.item(row, 3).text()
|
table = self.tableWidget_2.item(row, 3).text()
|
||||||
# .split("?", 1)[0]
|
# Configuration de l'URI de connexion PostGIS
|
||||||
uri = QgsDataSourceUri()
|
uri = QgsDataSourceUri()
|
||||||
uri.setConnection(host, port, dbtype, user, mdp)
|
uri.setConnection(host, port, dbtype, user, mdp)
|
||||||
# nom du schéma à remplacer: "hydrographie" à supprimer et mettre "couches_collaboratives" lorsqu'on aura regroupé les couches à modifier dans un même
|
|
||||||
|
# Chargement selon le type de couche (raster, vecteur ou projet QGIS)
|
||||||
if (schema + '.' + table) in RasterList:
|
if (schema + '.' + table) in RasterList:
|
||||||
|
# Chargement d'une couche raster
|
||||||
uri.setDataSource(schema, table, "rast")
|
uri.setDataSource(schema, table, "rast")
|
||||||
uri.setKeyColumn('rid')
|
uri.setKeyColumn('rid') # Clé primaire pour les rasters
|
||||||
uri.setSrid('2154')
|
uri.setSrid('2154') # Lambert 93
|
||||||
layer = QgsRasterLayer(uri.uri(), table, "postgresraster")
|
layer = QgsRasterLayer(uri.uri(), table, "postgresraster")
|
||||||
QgsProject.instance().addMapLayer(layer)
|
QgsProject.instance().addMapLayer(layer)
|
||||||
elif code == 'qgis':
|
elif code == 'qgis':
|
||||||
|
# Chargement d'un projet QGIS stocké dans la base de données
|
||||||
schema = self.tableWidget_2.item(row, 2).text()
|
schema = self.tableWidget_2.item(row, 2).text()
|
||||||
print(schema)
|
print(schema)
|
||||||
table = self.tableWidget_2.item(row, 3).text()
|
table = self.tableWidget_2.item(row, 3).text()
|
||||||
uri_project = 'postgresql://' + user + ':' + mdp + '@' + host + ':' + port + '?sslmode=disable&dbname=' + dbtype + "&schema=" + schema + '&project=' + table
|
uri_project = 'postgresql://' + user + ':' + mdp + '@' + host + ':' + port + '?sslmode=disable&dbname=' + dbtype + "&schema=" + schema + '&project=' + table
|
||||||
QgsProject.instance().read(uri_project)
|
QgsProject.instance().read(uri_project)
|
||||||
else:
|
else:
|
||||||
uri.setDataSource(schema, table, "geom")
|
# Chargement d'une couche vecteur
|
||||||
uri.setKeyColumn('gid')
|
uri.setDataSource(schema, table, "geom") # Colonne géométrie
|
||||||
|
uri.setKeyColumn('gid') # Clé primaire
|
||||||
|
|
||||||
# Chargement de la couche PostGIS
|
# Détection du type de géométrie
|
||||||
geom_type = 'SELECT right(st_geometrytype(geom),-3) as a FROM ' + schema + '.' + table + ' GROUP BY a'
|
geom_type = 'SELECT right(st_geometrytype(geom),-3) as a FROM ' + schema + '.' + table + ' GROUP BY a'
|
||||||
try:
|
|
||||||
cur.execute(geom_type)
|
cur.execute(geom_type)
|
||||||
list_typegeom = cur.fetchall()
|
list_typegeom = cur.fetchall()
|
||||||
UndefinedTable = True
|
|
||||||
except psycopg2.errors.UndefinedTable:
|
|
||||||
print("Error table name")
|
|
||||||
list_typegeom = ''
|
|
||||||
UndefinedTable = False
|
|
||||||
if len(list_typegeom) > 1:
|
if len(list_typegeom) > 1:
|
||||||
for typegeom in list_typegeom:
|
for typegeom in list_typegeom:
|
||||||
if typegeom[0] == 'MultiPolygon':
|
if typegeom[0] == 'MultiPolygon':
|
||||||
@@ -553,16 +643,16 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
# Ajout de la couche au canevas QGIS
|
# Ajout de la couche au canevas QGIS
|
||||||
QgsProject.instance().addMapLayer(layer)
|
QgsProject.instance().addMapLayer(layer)
|
||||||
else:
|
else:
|
||||||
if UndefinedTable:
|
|
||||||
layer = QgsVectorLayer(uri.uri(), table, "postgres")
|
layer = QgsVectorLayer(uri.uri(), table, "postgres")
|
||||||
# Ajout de la couche au canevas QGIS
|
# Ajout de la couche au canevas QGIS
|
||||||
QgsProject.instance().addMapLayer(layer)
|
QgsProject.instance().addMapLayer(layer)
|
||||||
else:
|
|
||||||
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "La couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» semble ne pas avoir le même nom dans la BD, merci de contacter votre administrateur pour régler le problème !", QMessageBox.StandardButton(0x00004000))
|
|
||||||
else:
|
else:
|
||||||
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "La couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» ne ce trouve pas dans cette BD !", QMessageBox.StandardButton(0x00004000))
|
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "La couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» ne ce trouve pas dans cette BD !", QMessageBox.StandardButton(0x00004000))
|
||||||
|
|
||||||
def combobox_custom(self):
|
def combobox_custom(self):
|
||||||
|
"""Remplit la liste déroulante des catégories selon la base de données sélectionnée"""
|
||||||
|
global NoSignals
|
||||||
|
NoSignals = 1 # Désactive temporairement les signaux pour éviter les boucles
|
||||||
if dbtype == sigdb:
|
if dbtype == sigdb:
|
||||||
self.toolButton.setEnabled(1)
|
self.toolButton.setEnabled(1)
|
||||||
self.comboBox.clear()
|
self.comboBox.clear()
|
||||||
@@ -586,19 +676,65 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.comboBox.addItem("toutes les catégories")
|
self.comboBox.addItem("toutes les catégories")
|
||||||
for baxval in list_schema:
|
for baxval in list_schema:
|
||||||
self.comboBox.addItem(baxval[0])
|
self.comboBox.addItem(baxval[0])
|
||||||
|
NoSignals = 0
|
||||||
|
|
||||||
|
def filtre_favorit(self, filter_fav):
|
||||||
|
"""Active ou désactive le filtre des favoris"""
|
||||||
|
if self.toolButton_2.text() == "0": # Activation du filtre
|
||||||
|
self.toolButton_2.setText("1")
|
||||||
|
self.toolButton_2.setDown(True)
|
||||||
|
if self.lineEdit.text() != 'Recherche par mots-clés':
|
||||||
|
self.filtre_dynamique(self.lineEdit.text())
|
||||||
|
else:
|
||||||
|
for i in range(self.tableWidget.rowCount()):
|
||||||
|
item = self.tableWidget.item(i, 4)
|
||||||
|
match = self.toolButton_2.text() not in item.text().lower()
|
||||||
|
self.tableWidget.setRowHidden(i, match)
|
||||||
|
elif self.toolButton_2.text() == "1":
|
||||||
|
self.toolButton_2.setText("0")
|
||||||
|
self.toolButton_2.setDown(False)
|
||||||
|
if self.lineEdit.text() != 'Recherche par mots-clés':
|
||||||
|
self.filtre_dynamique(self.lineEdit.text())
|
||||||
|
else:
|
||||||
|
for i in range(self.tableWidget.rowCount()):
|
||||||
|
self.tableWidget.setRowHidden(i, False)
|
||||||
|
|
||||||
def filtre_dynamique(self, filter_text):
|
def filtre_dynamique(self, filter_text):
|
||||||
|
"""Filtre dynamique des couches selon le texte saisi"""
|
||||||
|
# Remplacement des espaces par des underscores pour la recherche
|
||||||
if filter_text.find(' ') >= 0:
|
if filter_text.find(' ') >= 0:
|
||||||
filter_text = filter_text.replace(" ", "_")
|
filter_text = filter_text.replace(" ", "_")
|
||||||
for i in range(self.tableWidget.rowCount()):
|
for i in range(self.tableWidget.rowCount()):
|
||||||
for j in range(self.tableWidget.columnCount()):
|
for j in range(self.tableWidget.columnCount()):
|
||||||
item = self.tableWidget.item(i, j)
|
item = self.tableWidget.item(i, j)
|
||||||
match = filter_text.lower() not in item.text().lower()
|
match = filter_text.lower() not in item.text().lower()
|
||||||
|
if match is False:
|
||||||
|
if self.toolButton_2.text() == "1":
|
||||||
|
item = self.tableWidget.item(i, 4)
|
||||||
|
match = self.toolButton_2.text() not in item.text().lower()
|
||||||
self.tableWidget.setRowHidden(i, match)
|
self.tableWidget.setRowHidden(i, match)
|
||||||
if not match:
|
if not match:
|
||||||
break
|
break
|
||||||
|
|
||||||
def getCanevas(self):
|
def getCanevas(self):
|
||||||
|
"""Filtre les couches selon l'emprise du canevas QGIS actuel"""
|
||||||
|
|
||||||
|
# Récupération de la liste des favoris de l'utilisateur
|
||||||
|
SQLFavTable = "SELECT concat(schema_name, '.', table_name) FROM admin_sig.favtable WHERE utilisateur LIKE '" + user + "';"
|
||||||
|
if dbtype == refdb:
|
||||||
|
conSIG = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + sigdb + " user=" + user + " password=" + mdp)
|
||||||
|
curSIG = conSIG.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
curSIG.execute(SQLFavTable)
|
||||||
|
list_fav = curSIG.fetchall()
|
||||||
|
conSIG.close()
|
||||||
|
else:
|
||||||
|
cur.execute(SQLFavTable)
|
||||||
|
list_fav = cur.fetchall()
|
||||||
|
FavList = []
|
||||||
|
for favFind in list_fav:
|
||||||
|
FavList.append(favFind[0])
|
||||||
|
|
||||||
|
# Récupération de l'emprise du canevas
|
||||||
poly = iface.mapCanvas().extent()
|
poly = iface.mapCanvas().extent()
|
||||||
geom = (str(poly.xMinimum()) + ',' + str(poly.yMinimum()) + ',' + str(poly.xMaximum()) + ',' + str(poly.yMaximum()))
|
geom = (str(poly.xMinimum()) + ',' + str(poly.yMinimum()) + ',' + str(poly.xMaximum()) + ',' + str(poly.yMaximum()))
|
||||||
|
|
||||||
@@ -630,12 +766,28 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
TableSomme = cur.fetchall()[0][0]
|
TableSomme = cur.fetchall()[0][0]
|
||||||
|
|
||||||
if e[0][1:3] != 'fo':
|
if e[0][1:3] != 'fo':
|
||||||
|
schema_name = e[0][4:]
|
||||||
DepName = QTableWidgetItem(e[0][1:3])
|
DepName = QTableWidgetItem(e[0][1:3])
|
||||||
SchemaName = QTableWidgetItem(e[0][4:])
|
SchemaName = QTableWidgetItem(schema_name)
|
||||||
else:
|
else:
|
||||||
|
schema_name = e[0][6:]
|
||||||
DepName = QTableWidgetItem('form')
|
DepName = QTableWidgetItem('form')
|
||||||
SchemaName = QTableWidgetItem(e[0][6:])
|
SchemaName = QTableWidgetItem(schema_name)
|
||||||
TableName = QTableWidgetItem(e[1][len(e[0]) + 1:])
|
table_name = e[1][len(e[0]) + 1:]
|
||||||
|
TableName = QTableWidgetItem(table_name)
|
||||||
|
|
||||||
|
FavStatut = 0
|
||||||
|
if (schema_name + '.' + table_name) not in FavList:
|
||||||
|
FAV = "mStarIconAdd.png"
|
||||||
|
FavStatut = 0
|
||||||
|
else:
|
||||||
|
FAV = "mStarIconDel.png"
|
||||||
|
FavStatut = 1
|
||||||
|
iconFav = QIcon()
|
||||||
|
iconFav.addPixmap(QtGui.QPixmap(resources_path('icons', FAV)), QIcon.Mode(0), QIcon.State(1))
|
||||||
|
self.FavButton = QPushButton(iconFav, "")
|
||||||
|
self.FavButton.clicked.connect(self.AddOrDelToUserFav)
|
||||||
|
|
||||||
self.tableWidget.insertRow(row_count)
|
self.tableWidget.insertRow(row_count)
|
||||||
|
|
||||||
itemIcon = QTableWidgetItem()
|
itemIcon = QTableWidgetItem()
|
||||||
@@ -647,6 +799,9 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
self.tableWidget.setItem(row_count, 1, DepName)
|
self.tableWidget.setItem(row_count, 1, DepName)
|
||||||
self.tableWidget.setItem(row_count, 2, SchemaName)
|
self.tableWidget.setItem(row_count, 2, SchemaName)
|
||||||
self.tableWidget.setItem(row_count, 3, TableName)
|
self.tableWidget.setItem(row_count, 3, TableName)
|
||||||
|
item = QTableWidgetItem(str(FavStatut))
|
||||||
|
self.tableWidget.setItem(row_count, 4, item)
|
||||||
|
self.tableWidget.setCellWidget(row_count, 4, self.FavButton)
|
||||||
if TableSomme == 0:
|
if TableSomme == 0:
|
||||||
for j in range(self.tableWidget.columnCount()):
|
for j in range(self.tableWidget.columnCount()):
|
||||||
self.tableWidget.item(row_count, j).setBackground(QtGui.QColor(246, 185, 73, 50))
|
self.tableWidget.item(row_count, j).setBackground(QtGui.QColor(246, 185, 73, 50))
|
||||||
@@ -662,7 +817,3 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
|
|||||||
new_object = new_object + '[' + str(obj_X[1]) + ',' + str(obj_X[0]) + '],'
|
new_object = new_object + '[' + str(obj_X[1]) + ',' + str(obj_X[0]) + '],'
|
||||||
new_object = new_object[:-1] + ']'
|
new_object = new_object[:-1] + ']'
|
||||||
return (new_object)
|
return (new_object)
|
||||||
|
|
||||||
# def popup(self):
|
|
||||||
# self.dialog = Popup() # +++ - self
|
|
||||||
# self.dialog.text_edit.show()
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ name=CenRa_FLUX
|
|||||||
qgisMinimumVersion=3.0
|
qgisMinimumVersion=3.0
|
||||||
supportsQt6=True
|
supportsQt6=True
|
||||||
description=Permet d'ouvrire une table dans la base PostGis
|
description=Permet d'ouvrire une table dans la base PostGis
|
||||||
version=3.15
|
version=3.17
|
||||||
author=Conservatoire d'Espaces Naturels de Rhône-Alpes
|
author=Conservatoire d'Espaces Naturels de Rhône-Alpes
|
||||||
email=si_besoin@cen-rhonealpes.fr
|
email=si_besoin@cen-rhonealpes.fr
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ icon=icon.png
|
|||||||
# experimental flag
|
# experimental flag
|
||||||
experimental=False
|
experimental=False
|
||||||
|
|
||||||
changelog=<h2>CenRa_FLUX:</h2></br><p><h3>15/12/2025 - Version 3.15: </h3> - information visuel des droit d access a la donnee sur tout les base.</p></br><p><h3>08/12/2025 - Version 3.14: </h3> - message d erreur pour les drois de couche sur la DB.</p></br><p><h3>08/12/2025 - Version 3.13: </h3> - Detection des droit utilisateur.</p></br><p><h3>25/09/2025 - Version 3.12: </h3> - version +1.</p></br><p><h3>25/09/2025 - Version 3.11: </h3> - Correctife sur les code 00.</p></br><p><h3>24/09/2025 - Version 3.10: </h3> - Erreur sur l ouverture des couche raster. </p></br><p><h3>24/09/2025 - Version 3.9: </h3> - bugfix lier aux extention pgsql.</p></br><p><h3>09/09/2025 - Version 3.8: </h3> - Bug REF fix.</p></br><p><h3>05/09/2025 - Version 3.7: </h3> - Ouverture de projet QGIS contenue dans la base de donnees.</p></br><p><h3>30/07/2025 - Version 3.6: </h3> - Correctife de bug.</p></br><p><h3>29/07/2025 - Version 3.5: </h3> - Bug fix sur les donnee raster.</p></br><p><h3>23/07/2025 - Version 3.4: </h3> - Ouverture raster dans la base SIG.</p></br><p><h3>23/07/2025 - Version 3.3: </h3> - Optimisation des chargement.</p></br><p><h3>22/07/2025 - Version 3.2: </h3> - Visualisation des format raster et vecteur dans REF.</p></br><p><h3>21/07/2025 - Version 3.1: </h3> - Bug fix pour l'ouverture de plus de 5 couches.</p></br><p><h3>19/05/2025 - Version 3.0: </h3> - Compatible PyQt5 et PyQt6.</p></br><p><h3>09/04/2025 - Version 2.9: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 2.8: </h3> - Optimisation pour le TT.</p></br><p><h3>07/04/2025 - Version 2.7: </h3> - mode debug.</p></br><p><h3>03/04/2025 - Version 2.6: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 2.5: </h3> - Visualisation distincte des couches ne se trouvant pas dans l'antenne.</p></br><p><h3>13/02/2025 - Version 2.4: </h3> - Ajoute redimensionnement et déplacement mollette.</p></br><p><h3>05/02/2025 - Version 2.3: </h3> - Bouton de visualisation des couches se trouvent uniquement dans le canva de la carte.</p></br><p><h3>07/01/2025 - Version 2.2: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>22/10/2024 - Version 2.1:</h3> - Correctif de bug.</br> - Evolution de la limit de 3 à 5. </br></p></br><p><h3>22/10/2024 - Version 2.0:</h3> - Reformatage du code.</br></p></br><p><h3>03/10/2024 - Version 1.14:</h3> - Remonte la fênetre dans la pille.</br></p><p><h3>13/09/2024 - Version 1.13:</h3>- MAJ sur le lien du changelog</br>- Bug-fix: Ouvre MultiPolygone et Polygon séparément.</p></br><p><h3>10/09/2024 - Version 1.11:</h3>- Ouverture de table contenant plusieurs géométries.</p></br><p><h3>26/08/2024 - Version 1.10:</h3>- Ajoute d'un changelog et vérification de mise à jour.</p>
|
changelog=<h2>CenRa_FLUX:</h2></br><p><h3>12/02/2026 - Version 3.17: </h3> - Favorit dans la BD Ref.</p></br><p><h3>11/02/2026 - Version 3.16: </h3> - Creation de favori et visualisation.</p></br><p><h3>10/02/2026 - Version 3.15: </h3> - Sauvegarde la recherche.</p></br><p><h3>08/12/2025 - Version 3.14: </h3> - message d'erreur pour les drois de couche sur la DB.</p></br><p><h3>08/12/2025 - Version 3.13: </h3> - Detection des droit utilisateur.</p></br><p><h3>25/09/2025 - Version 3.12: </h3> - version +1.</p></br><p><h3>25/09/2025 - Version 3.11: </h3> - Correctife sur les code 00.</p></br><p><h3>24/09/2025 - Version 3.10: </h3> - Erreur sur l ouverture des couche raster. </p></br><p><h3>24/09/2025 - Version 3.9: </h3> - bugfix lier aux extention pgsql.</p></br><p><h3>09/09/2025 - Version 3.8: </h3> - Bug REF fix.</p></br><p><h3>05/09/2025 - Version 3.7: </h3> - Ouverture de projet QGIS contenue dans la base de donnees.</p></br><p><h3>30/07/2025 - Version 3.6: </h3> - Correctife de bug.</p></br><p><h3>29/07/2025 - Version 3.5: </h3> - Bug fix sur les donnee raster.</p></br><p><h3>23/07/2025 - Version 3.4: </h3> - Ouverture raster dans la base SIG.</p></br><p><h3>23/07/2025 - Version 3.3: </h3> - Optimisation des chargement.</p></br><p><h3>22/07/2025 - Version 3.2: </h3> - Visualisation des format raster et vecteur dans REF.</p></br><p><h3>21/07/2025 - Version 3.1: </h3> - Bug fix pour l'ouverture de plus de 5 couches.</p></br><p><h3>19/05/2025 - Version 3.0: </h3> - Compatible PyQt5 et PyQt6.</p></br><p><h3>09/04/2025 - Version 2.9: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 2.8: </h3> - Optimisation pour le TT.</p></br><p><h3>07/04/2025 - Version 2.7: </h3> - mode debug.</p></br><p><h3>03/04/2025 - Version 2.6: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 2.5: </h3> - Visualisation distincte des couches ne se trouvant pas dans l'antenne.</p></br><p><h3>13/02/2025 - Version 2.4: </h3> - Ajoute redimensionnement et déplacement mollette.</p></br><p><h3>05/02/2025 - Version 2.3: </h3> - Bouton de visualisation des couches se trouvent uniquement dans le canva de la carte.</p></br><p><h3>07/01/2025 - Version 2.2: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>22/10/2024 - Version 2.1:</h3> - Correctif de bug.</br> - Evolution de la limit de 3 à 5. </br></p></br><p><h3>22/10/2024 - Version 2.0:</h3> - Reformatage du code.</br></p></br><p><h3>03/10/2024 - Version 1.14:</h3> - Remonte la fênetre dans la pille.</br></p><p><h3>13/09/2024 - Version 1.13:</h3>- MAJ sur le lien du changelog</br>- Bug-fix: Ouvre MultiPolygone et Polygon séparément.</p></br><p><h3>10/09/2024 - Version 1.11:</h3>- Ouverture de table contenant plusieurs géométries.</p></br><p><h3>26/08/2024 - Version 1.10:</h3>- Ajoute d'un changelog et vérification de mise à jour.</p>
|
||||||
|
|
||||||
# deprecated flag (applies to the whole plugin, not just a single version)
|
# deprecated flag (applies to the whole plugin, not just a single version)
|
||||||
deprecated=False
|
deprecated=False
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -9,148 +9,95 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>910</width>
|
<width>890</width>
|
||||||
<height>800</height>
|
<height>810</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>910</width>
|
<width>600</width>
|
||||||
<height>800</height>
|
<height>400</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>910</width>
|
<width>890</width>
|
||||||
<height>800</height>
|
<height>810</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>SIG CEN-RA</string>
|
<string>SIG CEN-RA</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QComboBox" name="comboBox">
|
<property name="sizeGripEnabled">
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>260</x>
|
|
||||||
<y>130</y>
|
|
||||||
<width>171</width>
|
|
||||||
<height>22</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="editable">
|
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentText">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<string notr="true"/>
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetMaximumSize</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<property name="leftMargin">
|
||||||
<widget class="QComboBox" name="comboBox_2">
|
<number>0</number>
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>370</x>
|
|
||||||
<y>80</y>
|
|
||||||
<width>171</width>
|
|
||||||
<height>22</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="editable">
|
<property name="topMargin">
|
||||||
<bool>false</bool>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentText">
|
<property name="rightMargin">
|
||||||
<string notr="true"/>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<property name="bottomMargin">
|
||||||
<widget class="QLabel" name="label_3">
|
<number>0</number>
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>345</x>
|
|
||||||
<y>10</y>
|
|
||||||
<width>221</width>
|
|
||||||
<height>71</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="spacing">
|
||||||
<string/>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="pixmap">
|
<item row="0" column="0">
|
||||||
<pixmap>:/plugins/CenRa_FLUX/logo.jpg</pixmap>
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
</property>
|
<property name="maximumSize">
|
||||||
<property name="scaledContents">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QPushButton" name="pushButton_2">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>370</x>
|
|
||||||
<y>750</y>
|
|
||||||
<width>171</width>
|
|
||||||
<height>23</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Charger les couches</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QTableWidget" name="tableWidget">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>30</x>
|
|
||||||
<y>170</y>
|
|
||||||
<width>850</width>
|
|
||||||
<height>281</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="selectionMode">
|
|
||||||
<enum>QAbstractItemView::SingleSelection</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sortingEnabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QTableWidget" name="tableWidget_2">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>30</x>
|
|
||||||
<y>550</y>
|
|
||||||
<width>850</width>
|
|
||||||
<height>181</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="selectionMode">
|
|
||||||
<enum>QAbstractItemView::SingleSelection</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QCommandLinkButton" name="commandLinkButton">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>400</x>
|
|
||||||
<y>470</y>
|
|
||||||
<width>61</width>
|
|
||||||
<height>61</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset>
|
|
||||||
<normaloff>:/plugins/CenRa_FLUX/arrow-bottom.png</normaloff>:/plugins/CenRa_FLUX/arrow-bottom.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
<size>
|
||||||
<width>50</width>
|
<width>890</width>
|
||||||
<height>40</height>
|
<height>810</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="inputMethodHints">
|
||||||
|
<set>Qt::ImhNoEditMenu|Qt::ImhNoTextHandles</set>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::NoFrame</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Sunken</enum>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="midLineWidth">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>890</width>
|
||||||
|
<height>810</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>890</width>
|
||||||
|
<height>810</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
|
||||||
<widget class="QCommandLinkButton" name="commandLinkButton_2">
|
<widget class="QCommandLinkButton" name="commandLinkButton_2">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>460</x>
|
<x>450</x>
|
||||||
<y>470</y>
|
<y>470</y>
|
||||||
<width>61</width>
|
<width>61</width>
|
||||||
<height>61</height>
|
<height>61</height>
|
||||||
@@ -170,13 +117,81 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QPushButton" name="pushButton_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>360</x>
|
||||||
|
<y>750</y>
|
||||||
|
<width>171</width>
|
||||||
|
<height>23</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Charger les couches</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>150</y>
|
||||||
|
<width>161</width>
|
||||||
|
<height>16</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Calibri</family>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<italic>false</italic>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Liste des flux disponibles :</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QTableWidget" name="tableWidget_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>20</x>
|
||||||
|
<y>550</y>
|
||||||
|
<width>851</width>
|
||||||
|
<height>181</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="inputMethodHints">
|
||||||
|
<set>Qt::ImhNoEditMenu|Qt::ImhNoTextHandles</set>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QComboBox" name="comboBox">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>250</x>
|
||||||
|
<y>130</y>
|
||||||
|
<width>171</width>
|
||||||
|
<height>22</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="editable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="currentText">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
<widget class="QLineEdit" name="lineEdit">
|
<widget class="QLineEdit" name="lineEdit">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>480</x>
|
<x>470</x>
|
||||||
<y>130</y>
|
<y>130</y>
|
||||||
<width>171</width>
|
<width>171</width>
|
||||||
<height>21</height>
|
<height>21</height>
|
||||||
@@ -195,30 +210,54 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QToolButton" name="toolButton">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>40</x>
|
<x>660</x>
|
||||||
<y>150</y>
|
<y>130</y>
|
||||||
<width>161</width>
|
<width>21</width>
|
||||||
<height>16</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<family>Calibri</family>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>false</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Liste des flux disponibles :</string>
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QTableWidget" name="tableWidget">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>20</x>
|
||||||
|
<y>170</y>
|
||||||
|
<width>850</width>
|
||||||
|
<height>281</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked</set>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sortingEnabled">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>20</x>
|
||||||
<y>530</y>
|
<y>530</y>
|
||||||
<width>171</width>
|
<width>171</width>
|
||||||
<height>16</height>
|
<height>16</height>
|
||||||
@@ -235,17 +274,122 @@
|
|||||||
<string>Flux sélectionné(s) à charger :</string>
|
<string>Flux sélectionné(s) à charger :</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<zorder>label_3</zorder>
|
<widget class="QLabel" name="label_3">
|
||||||
<zorder>comboBox</zorder>
|
<property name="geometry">
|
||||||
<zorder>comboBox_2</zorder>
|
<rect>
|
||||||
<zorder>pushButton_2</zorder>
|
<x>335</x>
|
||||||
<zorder>tableWidget</zorder>
|
<y>10</y>
|
||||||
<zorder>tableWidget_2</zorder>
|
<width>221</width>
|
||||||
<zorder>commandLinkButton</zorder>
|
<height>71</height>
|
||||||
<zorder>commandLinkButton_2</zorder>
|
</rect>
|
||||||
<zorder>lineEdit</zorder>
|
</property>
|
||||||
<zorder>label</zorder>
|
<property name="text">
|
||||||
<zorder>label_2</zorder>
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="pixmap">
|
||||||
|
<pixmap>:/plugins/CenRa_FLUX/logo.jpg</pixmap>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QComboBox" name="comboBox_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>360</x>
|
||||||
|
<y>80</y>
|
||||||
|
<width>171</width>
|
||||||
|
<height>22</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="editable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="currentText">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QCommandLinkButton" name="commandLinkButton">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>390</x>
|
||||||
|
<y>470</y>
|
||||||
|
<width>61</width>
|
||||||
|
<height>61</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normaloff>:/plugins/CenRa_FLUX/arrow-bottom.png</normaloff>:/plugins/CenRa_FLUX/arrow-bottom.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QCheckBox" name="checkBox">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>830</x>
|
||||||
|
<y>20</y>
|
||||||
|
<width>70</width>
|
||||||
|
<height>17</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QComboBox" name="DeBUG">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>20</y>
|
||||||
|
<width>71</width>
|
||||||
|
<height>22</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="editable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="currentText">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QTextBrowser" name="viewer">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>90</x>
|
||||||
|
<y>10</y>
|
||||||
|
<width>731</width>
|
||||||
|
<height>731</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color: rgba(255, 255, 255,0.50);</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
|
|||||||
@@ -386,6 +386,35 @@
|
|||||||
<string notr="true">background-color: rgba(255, 255, 255,0.50);</string>
|
<string notr="true">background-color: rgba(255, 255, 255,0.50);</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QToolButton" name="toolButton_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>700</x>
|
||||||
|
<y>130</y>
|
||||||
|
<width>21</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>0</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<zorder>commandLinkButton_2</zorder>
|
||||||
|
<zorder>pushButton_2</zorder>
|
||||||
|
<zorder>label</zorder>
|
||||||
|
<zorder>tableWidget_2</zorder>
|
||||||
|
<zorder>comboBox</zorder>
|
||||||
|
<zorder>lineEdit</zorder>
|
||||||
|
<zorder>toolButton</zorder>
|
||||||
|
<zorder>tableWidget</zorder>
|
||||||
|
<zorder>label_2</zorder>
|
||||||
|
<zorder>label_3</zorder>
|
||||||
|
<zorder>comboBox_2</zorder>
|
||||||
|
<zorder>commandLinkButton</zorder>
|
||||||
|
<zorder>checkBox</zorder>
|
||||||
|
<zorder>DeBUG</zorder>
|
||||||
|
<zorder>toolButton_2</zorder>
|
||||||
|
<zorder>viewer</zorder>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
+6
-6
@@ -50,9 +50,9 @@
|
|||||||
<tags>cenra,sicen</tags>
|
<tags>cenra,sicen</tags>
|
||||||
</pyqgis_plugin>
|
</pyqgis_plugin>
|
||||||
|
|
||||||
<pyqgis_plugin name="CenRa_FLUX" version="3.15">
|
<pyqgis_plugin name="CenRa_FLUX" version="3.17">
|
||||||
<description>Depot pour les extensiont QGIS du CEN Rhone-Alpes, sur GitHub.</description>
|
<description>Depot pour les extensiont QGIS du CEN Rhone-Alpes, sur GitHub.</description>
|
||||||
<version>3.15</version>
|
<version>3.17</version>
|
||||||
<qgis_minimum_version>3.16</qgis_minimum_version>
|
<qgis_minimum_version>3.16</qgis_minimum_version>
|
||||||
<homepage>https://plateformesig.cenra-outils.org/</homepage>
|
<homepage>https://plateformesig.cenra-outils.org/</homepage>
|
||||||
<file_name>CenRa_FLUX.zip</file_name>
|
<file_name>CenRa_FLUX.zip</file_name>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<download_url>https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/CenRa_FLUX.zip</download_url>
|
<download_url>https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/CenRa_FLUX.zip</download_url>
|
||||||
<uploaded_by>CEN-Rhone-Alpes</uploaded_by>
|
<uploaded_by>CEN-Rhone-Alpes</uploaded_by>
|
||||||
<create_date>2024-02-06</create_date>
|
<create_date>2024-02-06</create_date>
|
||||||
<update_date>2025-12-15</update_date>
|
<update_date>2026-02-12</update_date>
|
||||||
<experimental>False</experimental>
|
<experimental>False</experimental>
|
||||||
<deprecated>False</deprecated>
|
<deprecated>False</deprecated>
|
||||||
<tags>cenra,flux</tags>
|
<tags>cenra,flux</tags>
|
||||||
@@ -84,9 +84,9 @@
|
|||||||
<tags>cenra,metabase</tags>
|
<tags>cenra,metabase</tags>
|
||||||
</pyqgis_plugin>
|
</pyqgis_plugin>
|
||||||
|
|
||||||
<pyqgis_plugin name="CenRa_AUTOMAP" version="2.7">
|
<pyqgis_plugin name="CenRa_AUTOMAP" version="2.8">
|
||||||
<description>Depot pour les extensiont QGIS du CEN Rhone-Alpes, sur GitHub.</description>
|
<description>Depot pour les extensiont QGIS du CEN Rhone-Alpes, sur GitHub.</description>
|
||||||
<version>2.7</version>
|
<version>2.8</version>
|
||||||
<qgis_minimum_version>3.16</qgis_minimum_version>
|
<qgis_minimum_version>3.16</qgis_minimum_version>
|
||||||
<homepage>https://plateformesig.cenra-outils.org/</homepage>
|
<homepage>https://plateformesig.cenra-outils.org/</homepage>
|
||||||
<file_name>CenRa_AUTOMAP.zip</file_name>
|
<file_name>CenRa_AUTOMAP.zip</file_name>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<download_url>https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/CenRa_AUTOMAP.zip</download_url>
|
<download_url>https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/CenRa_AUTOMAP.zip</download_url>
|
||||||
<uploaded_by>CEN-Rhone-Alpes</uploaded_by>
|
<uploaded_by>CEN-Rhone-Alpes</uploaded_by>
|
||||||
<create_date>2024-09-25</create_date>
|
<create_date>2024-09-25</create_date>
|
||||||
<update_date>2025-12-18</update_date>
|
<update_date>2026-01-09</update_date>
|
||||||
<experimental>False</experimental>
|
<experimental>False</experimental>
|
||||||
<deprecated>False</deprecated>
|
<deprecated>False</deprecated>
|
||||||
<tags>cenra,mise en page,atlas</tags>
|
<tags>cenra,mise en page,atlas</tags>
|
||||||
|
|||||||
Reference in New Issue
Block a user