Plugin_QGIS/CenRa_FLUX/flux_editor.py

718 lines
35 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import absolute_import
# Import the PyQt and QGIS libraries
from builtins import str
from qgis.PyQt import QtCore, QtGui
from qgis.PyQt.QtCore import QSettings
from qgis.PyQt import QtWidgets
from qgis.PyQt.QtGui import QIcon
from qgis.core import QgsDataSourceUri, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsSettings, QgsApplication, QgsVectorLayer, QgsRasterLayer, QgsWkbTypes
from qgis.PyQt.QtWidgets import (
QDialog,
QPushButton,
QTableWidgetItem,
QMessageBox,
QVBoxLayout,
)
from .tools.SQLRequet import schemaname_list, schemaname_list_ref, schemaname_distinct
from .tools.resources import (
load_ui,
resources_path,
)
try:
from .tools.PythonSQL import login_base
except NameError:
print('Pas de fichier PythonSQL')
from qgis.utils import iface
import psycopg2
import psycopg2.extras
global DeBUG
DeBUG = 0
itemIconRaster = QTableWidgetItem()
icon = QIcon()
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconRaster.svg')), QIcon.Mode(0), QIcon.State(1))
itemIconRaster.setIcon(icon)
itemIconVecteur = QTableWidgetItem()
icon = QIcon()
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconVecteur.svg')), QIcon.Mode(0), QIcon.State(1))
itemIconVecteur.setIcon(icon)
try:
account = login_base('account')
user = account[0]
mdp = account[1]
host = account[2]
port = account[3]
dbname = account[4]
sigdb = account[5]
refdb = account[6]
except NameError:
print('Fails to login DB for account')
EDITOR_CLASS = load_ui('CenRa_Flux_base.ui')
targetCrs = QgsCoordinateReferenceSystem('EPSG:4326')
layerCrs = QgsCoordinateReferenceSystem('EPSG:2154')
TranformCRS = QgsCoordinateTransform(layerCrs, targetCrs, QgsProject.instance())
class Flux_Editor(QDialog, EDITOR_CLASS):
def __init__(self, parent=None):
_ = parent
super().__init__()
self.setupUi(self)
self.settings = QgsSettings()
self.s = QSettings()
self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png')))
self.first_start = None
self.iface = iface
self.label_3.setPixmap(QtGui.QPixmap(resources_path('ui', 'logo.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.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger(0))
self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'find.png')))
self.toolButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'star.png')))
self.comboBox_2.addItem("SIG")
self.comboBox_2.addItem('REF')
self.commandLinkButton.clicked.connect(self.selection_flux)
self.tableWidget.itemDoubleClicked.connect(self.selection_flux)
self.pushButton_2.clicked.connect(self.limite_flux)
self.commandLinkButton_2.clicked.connect(self.suppression_flux)
self.tableWidget_2.itemDoubleClicked.connect(self.suppression_flux)
self.comboBox_2.currentIndexChanged.connect(self.bd_source)
self.checkBox.hide()
self.toolButton.clicked.connect(self.getCanevas)
self.toolButton_2.clicked.connect(self.filtre_favorit)
layout = QVBoxLayout()
self.lineEdit.textChanged.connect(self.filtre_dynamique)
layout.addWidget(self.lineEdit)
self.viewer.hide()
self.DeBUG.addItem('')
self.DeBUG.addItem('Dev')
self.DeBUG.addItem('01')
self.DeBUG.addItem('0726')
self.DeBUG.addItem('4269')
self.comboBox.currentIndexChanged.connect(self.initialisation_flux)
self.DeBUG.currentIndexChanged.connect(self.SwitchDEBUG)
self.DeBUG.hide()
def raise_(self):
"""Run method that performs all the real work"""
self.bd_source()
def SwitchDEBUG(self):
try:
global user, mdp, host, port, dbname, sigdb, refdb
account = login_base(self.DeBUG.currentText())
user = account[0]
mdp = account[1]
host = account[2]
port = account[3]
dbname = account[4]
sigdb = account[5]
refdb = account[6]
self.bd_source()
except NameError:
print('Fails to switch DB for account')
def ModeDeBUG(self):
self.DeBUG.show()
def mousePressEvent(self, event):
global DeBUG
if 330 <= event.pos().x() <= 560 and 5 <= event.pos().y() <= 75:
DeBUG = DeBUG + 1
if DeBUG == 3:
DeBUG = 0
self.ModeDeBUG()
else:
DeBUG = 0
self.DeBUG.hide()
def bd_source(self):
self.activateWindow()
bd_origine = self.comboBox_2.currentText()
if bd_origine == 'REF':
self.run_ref()
if bd_origine == 'SIG':
self.run_sig()
def run_ref(self):
"""Run method that performs all the real work"""
while self.tableWidget_2.rowCount() > 0:
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
global cur, con, dbtype
dbtype = refdb
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
self.combobox_custom()
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:
self.first_start = False
# show the dialog
self.show()
# Run the dialog event loop
result = self.exec()
if result:
pass
def run_sig(self):
"""Run method that performs all the real work"""
while self.tableWidget_2.rowCount() > 0:
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
global cur, con, dbtype
dbtype = sigdb
con = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + dbtype + " user=" + user + " password=" + mdp)
cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
self.combobox_custom()
self.initialisation_flux()
if self.first_start is True:
self.first_start = False
def suppression_flux(self):
self.tableWidget_2.removeRow(self.tableWidget_2.currentRow())
def AddOrDelToUserFav(self):
selected_items = self.tableWidget.selectedItems()
favorit_statut = selected_items[4].text()
selected_items[4].tableWidget().removeCellWidget(selected_items[4].row(), 4)
schema_name = selected_items[2].text()
table_name = selected_items[3].text()
if favorit_statut == "0":
FAV = "mStarIconDel.png"
selected_items[4].setText("1")
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()
else:
FAV = "mStarIconAdd.png"
selected_items[4].setText("0")
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):
if self.toolButton_2.text() == "1":
self.filtre_favorit(None)
self.tableWidget.clear()
if NoSignals == 0:
if dbtype == sigdb:
if self.comboBox.currentText() == 'toutes les catégories':
custom_list = schemaname_list
elif self.comboBox.currentText() == 'travaux':
custom_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables
where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) order by schemaname,tablename;"""
else:
custom_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables
where schemaname like '\\_""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '\\_""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) order by schemaname,tablename;"""
else:
if self.comboBox.currentText() == 'toutes les catégories':
custom_list = schemaname_list_ref
else:
custom_list = """SELECT schemaname, tablename from pg_catalog.pg_tables WHERE schemaname LIKE '""" + str(self.comboBox.currentText()) + """' AND tablename NOT LIKE 'qgis_projects' order by schemaname, tablename;"""
cur.execute(custom_list)
list_schema = cur.fetchall()
SQLcountRaster = """SELECT schemaname,viewname FROM pg_catalog.pg_views
WHERE schemaname LIKE 'public' AND viewname LIKE 'raster_columns';"""
cur.execute(SQLcountRaster)
RasterIF = len(cur.fetchall())
if RasterIF == 1:
SQLloadRaster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
cur.execute(SQLloadRaster)
list_raster = cur.fetchall()
RasterList = []
for rasterFind in list_raster:
RasterList.append(rasterFind[0])
else:
RasterList = []
SQLprojects = """SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE 'qgis_projects'"""
cur.execute(SQLprojects)
list_projects = cur.fetchall()
list_projects_qgis = []
if len(list_projects) <= 1:
for ProjectName in list_projects:
SQLProjectsQgis = """SELECT name, metadata, content FROM """ + '"' + ProjectName[0] + '"."' + ProjectName[1] + '"'
cur.execute(SQLProjectsQgis)
list_projects_qgis.append(cur.fetchall())
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';"""
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()) + """_%';"""
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)
list_grands = cur.fetchall()
GrandUser = []
for grandsFind in list_grands:
GrandUser.append(grandsFind[0])
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])
self.tableWidget.setRowCount(len(list_schema))
self.tableWidget.setColumnCount(5)
i = 0
for value in list_schema:
if dbtype == sigdb:
type_val = str(value[0])[1:3]
schema_name = str(value[0])[4:]
table_name = str(value[1][len(value[0]) + 1:])
if value[0] == value[1][:len(value[0])]:
table_name = str(value[1][len(value[0]) + 1:])
else:
table_name = str(value[1])
else:
type_val = ''
schema_name = str(value[0])
table_name = str(value[1])
if type_val == 'fo':
type_val = str(value[0])[1:5]
schema_name = str(value[0])[6:]
if value[0] == value[1][:len(value[0])]:
table_name = str(value[1][len(value[0]) + 1:])
else:
table_name = str(value[1])
elif type_val == 'ra':
type_val = 'travaux'
schema_name = str(value[0])
table_name = str(value[1])
elif type_val != '00' and type_val != '01' and type_val != '07' and type_val != '26' and type_val != '42' and type_val != '69' and type_val != 'ra':
type_val = 'agregation'
schema_name = str(value[0])
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:
SVG = 'mIconRaster.svg'
else:
SVG = 'mIconVecteur.svg'
itemIcon = QTableWidgetItem()
icon = QIcon()
icon.addPixmap(QtGui.QPixmap(resources_path('icons', SVG)), QIcon.Mode(0), QIcon.State(1))
itemIcon.setIcon(icon)
self.tableWidget.setItem(i, 0, itemIcon)
item = QTableWidgetItem(type_val)
self.tableWidget.setItem(i, 1, item)
item = QTableWidgetItem(schema_name)
self.tableWidget.setItem(i, 2, item)
item = QTableWidgetItem(table_name)
self.tableWidget.setItem(i, 3, item)
item = QTableWidgetItem(str(FavStatut))
self.tableWidget.setItem(i, 4, item)
self.tableWidget.setCellWidget(i, 4, self.FavButton)
if (str(value[0]) + '.' + str(value[1])) in GrandUser:
pass
else:
for j in range(self.tableWidget.columnCount()):
self.tableWidget.item(i, j).setBackground(QtGui.QColor(187, 134, 192, 50))
self.tableWidget.item(i, j).setToolTip('Droit insuffisant pour ouvrire la couche !')
i = i + 1
if self.comboBox.currentText() == 'toutes les catégories':
SQLprojects = """SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE 'qgis_projects'"""
else:
SQLprojects = """SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE 'qgis_projects' AND schemaname LIKE '""" + str(self.comboBox.currentText()) + """';"""
cur.execute(SQLprojects)
list_projects = cur.fetchall()
list_projects_qgis = []
if len(list_projects) >= 1:
for ProjectName in list_projects:
SQLProjectsQgis = """SELECT name, metadata, content FROM """ + '"' + ProjectName[0] + '"."' + ProjectName[1] + '"'
cur.execute(SQLProjectsQgis)
list_projects_qgis = cur.fetchall()
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)
itemIcon = QTableWidgetItem()
icon = QIcon()
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconQgis.svg')), QIcon.Mode(0), QIcon.State(1))
itemIcon.setIcon(icon)
self.tableWidget.setItem(i, 0, itemIcon)
item = QTableWidgetItem('qgis')
self.tableWidget.setItem(i, 1, item)
item = QTableWidgetItem(ProjectName[0])
self.tableWidget.setItem(i, 2, item)
item = QTableWidgetItem(Project[0])
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
self.tableWidget.setColumnWidth(0, 20)
self.tableWidget.setColumnWidth(1, 70)
self.tableWidget.setColumnWidth(2, 300)
self.tableWidget.setColumnWidth(3, 300)
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):
selected_row = 0
selected_items = self.tableWidget.selectedItems()
new_item_text = selected_items[3].text()
if not self.item_already_exists(new_item_text):
self.tableWidget_2.insertRow(selected_row)
for column in range(self.tableWidget.columnCount()):
cloned_item = selected_items[column].clone()
self.tableWidget_2.setHorizontalHeaderLabels(["Type", "Code", "Schema", "Table", "Favorit"])
self.tableWidget_2.setColumnCount(5)
self.tableWidget_2.setItem(selected_row, column, cloned_item)
self.tableWidget_2.setColumnWidth(0, 20)
self.tableWidget_2.setColumnWidth(1, 70)
self.tableWidget_2.setColumnWidth(2, 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):
# Assuming you want to compare items in the first column for uniqueness
existing_items = self.tableWidget_2.findItems(new_item_text, QtCore.Qt.MatchFlag(0))
# Check if there are any existing items with the same text in the first column
return len(existing_items) > 0
def limite_flux(self):
if self.tableWidget_2.rowCount() > 5:
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(
self.tableWidget_2.rowCount()) + " flux sélectionnés ? (risque de plantage de QGIS)",
QMessageBox.StandardButton(0x00004000) | QMessageBox.StandardButton(0x00010000))
if self.QMBquestion == QMessageBox.StandardButton(0x00004000):
self.chargement_flux()
if self.QMBquestion == QMessageBox.StandardButton(0x00001000):
print("Annulation du chargement des couches")
if self.tableWidget_2.rowCount() <= 5:
self.chargement_flux()
def chargement_flux(self):
managerAU = QgsApplication.authManager()
managerAU.availableAuthMethodConfigs().keys()
def REQUEST(type):
switcher = {
'WFS': "GetFeature",
'WMS': "GetMap",
'WMS+Vecteur': "GetMap",
'WMS+Raster': "GetMap",
'WMTS': "GetMap"
}
return switcher.get(type, "nothing")
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';"""
cur.execute(SQLextension)
count_extension = cur.fetchall()[0][0]
if count_extension == 1:
cur.execute(SQLloadRaster)
list_raster = cur.fetchall()
else:
list_raster = []
RasterList = []
for rasterFind in list_raster:
RasterList.append(rasterFind[0])
for row in range(0, self.tableWidget_2.rowCount()):
color_rgba_db = 855030089
color_rgba_droit = 851150528
print(self.tableWidget_2.item(row, 1).background().color().rgba())
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))
elif self.tableWidget_2.item(row, 1).background().color().rgba() != color_rgba_db:
# supression de la partie de l'url après le point d'interrogation
if dbtype == sigdb:
code = self.tableWidget_2.item(row, 1).text()
schema = '_' + code + '_' + self.tableWidget_2.item(row, 2).text()
if code == 'travaux' or code == 'agregation':
schema = self.tableWidget_2.item(row, 2).text()
table = self.tableWidget_2.item(row, 3).text()
elif code == '00':
table = self.tableWidget_2.item(row, 3).text()
else:
table = self.tableWidget_2.item(row, 3).text()
table = schema + '_' + table
elif dbtype == refdb:
code = self.tableWidget_2.item(row, 1).text()
schema = self.tableWidget_2.item(row, 2).text()
table = self.tableWidget_2.item(row, 3).text()
uri = QgsDataSourceUri()
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
if (schema + '.' + table) in RasterList:
uri.setDataSource(schema, table, "rast")
uri.setKeyColumn('rid')
uri.setSrid('2154')
layer = QgsRasterLayer(uri.uri(), table, "postgresraster")
QgsProject.instance().addMapLayer(layer)
elif code == 'qgis':
schema = self.tableWidget_2.item(row, 2).text()
print(schema)
table = self.tableWidget_2.item(row, 3).text()
uri_project = 'postgresql://' + user + ':' + mdp + '@' + host + ':' + port + '?sslmode=disable&dbname=' + dbtype + "&schema=" + schema + '&project=' + table
QgsProject.instance().read(uri_project)
else:
uri.setDataSource(schema, table, "geom")
uri.setKeyColumn('gid')
# Chargement de la couche PostGIS
geom_type = 'SELECT right(st_geometrytype(geom),-3) as a FROM ' + schema + '.' + table + ' GROUP BY a'
cur.execute(geom_type)
list_typegeom = cur.fetchall()
if len(list_typegeom) > 1:
for typegeom in list_typegeom:
if typegeom[0] == 'MultiPolygon':
uri.setWkbType(QgsWkbTypes.MultiPolygon)
elif typegeom[0] == 'MultiLineString':
uri.setWkbType(QgsWkbTypes.MultiLineString)
elif typegeom[0] == 'Point':
uri.setWkbType(QgsWkbTypes.Point)
if typegeom[0] == 'Polygon':
uri.setWkbType(QgsWkbTypes.Polygon)
elif typegeom[0] == 'LineString':
uri.setWkbType(QgsWkbTypes.LineString)
elif typegeom[0] == 'MultiPoint':
uri.setWkbType(QgsWkbTypes.MultiPoint)
if (typegeom[0] is not None and typegeom[0] != 'Polygon'):
uri.setSrid('2154')
layer = QgsVectorLayer(uri.uri(), table, "postgres")
# Ajout de la couche au canevas QGIS
QgsProject.instance().addMapLayer(layer)
else:
layer = QgsVectorLayer(uri.uri(), table, "postgres")
# Ajout de la couche au canevas QGIS
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()) + "» ne ce trouve pas dans cette BD !", QMessageBox.StandardButton(0x00004000))
def combobox_custom(self):
global NoSignals
NoSignals = 1
if dbtype == sigdb:
self.toolButton.setEnabled(1)
self.comboBox.clear()
self.comboBox.addItem("toutes les catégories")
self.comboBox.addItem('00')
self.comboBox.addItem('01')
self.comboBox.addItem('07')
self.comboBox.addItem('26')
self.comboBox.addItem('42')
self.comboBox.addItem('69')
self.comboBox.addItem('agregation')
self.comboBox.addItem('travaux')
self.comboBox.addItem('qgis')
self.comboBox.addItem('form')
if dbtype == refdb:
self.toolButton.setEnabled(0)
custom_list = schemaname_distinct
cur.execute(custom_list)
list_schema = cur.fetchall()
self.comboBox.clear()
self.comboBox.addItem("toutes les catégories")
for baxval in list_schema:
self.comboBox.addItem(baxval[0])
NoSignals = 0
def filtre_favorit(self, filter_fav):
if self.toolButton_2.text() == "0":
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):
if filter_text.find(' ') >= 0:
filter_text = filter_text.replace(" ", "_")
for i in range(self.tableWidget.rowCount()):
for j in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(i, j)
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)
if not match:
break
def getCanevas(self):
poly = iface.mapCanvas().extent()
geom = (str(poly.xMinimum()) + ',' + str(poly.yMinimum()) + ',' + str(poly.xMaximum()) + ',' + str(poly.yMaximum()))
SQL_GEOM_CONTOUR = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_contour" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
SQL_GEOM_HABITAT = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_habitat" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
SQL_GEOM_EU_HABITAT = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_eu_habitat" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
SQL_GEOM_TRAVAUX_PREVUS_LIGNE = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_travaux_prevus_ligne" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
SQL_GEOM_TRAVAUX_PREVUS_POINT = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_travaux_prevus_point" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
SQL_GEOM_TRAVAUX_PREVUS_POLY = """SELECT DISTINCT tschema,tname FROM "_agregation_ra"."_agreg_travaux_prevus_poly" WHERE st_intersects(geom,ST_MakeEnvelope(""" + geom + ",2154)) ORDER BY tname"
cur.execute(SQL_GEOM_CONTOUR)
TableContour = cur.fetchall()
cur.execute(SQL_GEOM_HABITAT)
TableHabitat = cur.fetchall()
cur.execute(SQL_GEOM_EU_HABITAT)
TableEuHabitat = cur.fetchall()
cur.execute(SQL_GEOM_TRAVAUX_PREVUS_LIGNE)
TableTravauxLigne = cur.fetchall()
cur.execute(SQL_GEOM_TRAVAUX_PREVUS_POINT)
TableTravauxPoint = cur.fetchall()
cur.execute(SQL_GEOM_TRAVAUX_PREVUS_POLY)
TableTravauxPoly = cur.fetchall()
TableHaveGeom = sorted(TableContour + TableHabitat + TableEuHabitat + TableTravauxLigne + TableTravauxPoint + TableTravauxPoly)
row_count = 0
self.tableWidget.setRowCount(0)
for e in TableHaveGeom:
cur.execute("""SELECT DISTINCT count(*) FROM pg_catalog.pg_tables WHERE schemaname LIKE '""" + e[0] + """' AND tablename LIKE '""" + e[1] + """';""")
TableSomme = cur.fetchall()[0][0]
if e[0][1:3] != 'fo':
DepName = QTableWidgetItem(e[0][1:3])
SchemaName = QTableWidgetItem(e[0][4:])
else:
DepName = QTableWidgetItem('form')
SchemaName = QTableWidgetItem(e[0][6:])
TableName = QTableWidgetItem(e[1][len(e[0]) + 1:])
FavoritStatut = QTableWidgetItem('FavIcon')
self.tableWidget.insertRow(row_count)
itemIcon = QTableWidgetItem()
icon = QIcon()
icon.addPixmap(QtGui.QPixmap(resources_path('icons', 'mIconVecteur.svg')), QIcon.Mode(0), QIcon.State(1))
itemIcon.setIcon(icon)
self.tableWidget.setItem(row_count, 0, itemIcon)
self.tableWidget.setItem(row_count, 1, DepName)
self.tableWidget.setItem(row_count, 2, SchemaName)
self.tableWidget.setItem(row_count, 3, TableName)
self.tableWidget.setItem(row_count, 3, FavoritStatut)
if TableSomme == 0:
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).setToolTip('Couche dans une autre BD !')
row_count = row_count + 1
if self.lineEdit.text() != 'Recherche par mots-clés':
self.filtre_dynamique(self.lineEdit.text())
def SwitchGeom(self, vargeom):
new_object = '['
obj = vargeom['coordinates'][0][0]
for obj_X in obj:
new_object = new_object + '[' + str(obj_X[1]) + ',' + str(obj_X[0]) + '],'
new_object = new_object[:-1] + ']'
return (new_object)