diff --git a/orientation/orientation.py b/orientation/orientation.py index f20f1a9..2326839 100644 --- a/orientation/orientation.py +++ b/orientation/orientation.py @@ -26,6 +26,8 @@ from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QAction, qApp, QFileDialog, QProgressBar, QMessageBox from qgis.core import QgsCoordinateReferenceSystem, QgsProject, QgsVectorFileWriter, QgsVectorLayer, QgsFeatureRequest +from qgis.utils import OverrideCursor + from processing import QgsProcessingException @@ -70,7 +72,7 @@ class Orientation: # Declare instance attributes self.actions = [] - self.menu = self.tr(u'&CaLiÉc') + self.menu = self.tr('CaLiEc') # Check if plugin was started the first time in current QGIS session # Must be set in initGui() to survive plugin reloads @@ -272,15 +274,35 @@ class Orientation: # On explose les champs layer = processing.run("native:explodehstorefield", parameters={"INPUT": layers[osm_name], - "FIELD": "other_tags", "OUTPUT": "memory:"}, + "FIELD": "other_tags", + "OUTPUT": "memory:"}, + context=context)["OUTPUT"] + + # On enlève les champs en doublons en gardant celui des doublons qui est écrit tout en minuscule + field_names = [a.name() for a in layer.fields()] + field_names_lower = [a.lower() for a in field_names] + expected_fields, deleted_fields = [], [] + for field_name, field_name_lower in zip(field_names, field_names_lower): + if field_names_lower.count(field_name_lower) == 1 or field_name.lower() == field_name: + expected_fields.append(field_name) + else: + deleted_fields.append(field_name) + + # On réexplose les champs sans doublons + layer = processing.run("native:explodehstorefield", + parameters={"INPUT": layers[osm_name], + "FIELD": "other_tags", + "OUTPUT": "memory:", + "EXPECTED_FIELDS": ",".join(expected_fields)}, context=context)["OUTPUT"] # On enregistre le layer dans le gpkg options.layerName = layer_name code, error = QgsVectorFileWriter.writeAsVectorFormat(layer, str(workDir / "data.gpkg"), options) if code != 0: - QMessageBox.warning(None, 'Erreur', f"Erreur à l'export de la couche {layer_name} : \n\n{error}") - return + with OverrideCursor(Qt.ArrowCursor): + QMessageBox.warning(self.iface.mainWindow(), 'Erreur', f"Erreur à l'export de la couche {layer_name} : \n\n{error[:2000]}") + return new_layer = QgsVectorLayer(str(workDir / f"data.gpkg|layername={layer_name}"), layer_name) # Les layers suivants seront enregistrés dans le gpkg déjà existant @@ -303,3 +325,9 @@ class Orientation: self.iface.mapCanvas().refreshAllLayers() project.write(str(workDir / 'orient.qgs')) + if len(deleted_fields) > 0: + with OverrideCursor(Qt.ArrowCursor): + QMessageBox.warning(self.iface.mainWindow(), "Attention", + "Les champs suivants sont en doublons et ont été supprimés au profit de leur doublon en minuscule :\n- " + + "\n - ".join(deleted_fields)) +