# (c) Didier LECLERC 2017 # créé mars 2017 version 1.0 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QDialogButtonBox import qgis.utils def formOpen(dialog, layer_avis, feature): # On donne les noms des tables à interroger , les champs à recuperer et les champs du formulaires à alimenter #--------- Table 1 --------------------------------- loQueryLayer1 = "DivisionParcellaire_BDP_072" loQueryField1 = "SECTION" loFormField1 = "Section" #--------- Table 2 ------------------------------------- loQueryLayer2 = "N_TRI_MANS_COMMUNE_S_072" loQueryField2 = "NOM_COM" loFormField2 = "Commune" #--------- Table 3 ------------------------------------- loQueryLayer3 = "N_TRI_MANS_COMMUNE_S_072" loQueryField3 = "CODE_INSEE" loFormField3 = "Code_INSEE" # Variables pour les objets QGIS loLayer = None # objet couche loLayers = None # ensemble des couches #Affectation de l'ensemble des couches loLayers = qgis.utils.iface.mapCanvas().layers() for loLayer in loLayers: if loLayer.name() == loQueryLayer1: findChildChAttrib(dialog, feature.geometry(), loLayer, loQueryField1, loFormField1) if loLayer.name() == loQueryLayer2: findChildChAttrib(dialog, feature.geometry(), loLayer, loQueryField2, loFormField2) if loLayer.name() == loQueryLayer3: findChildChAttrib(dialog, feature.geometry(), loLayer, loQueryField3, loFormField3) #Intercepter la fermeture du formulaire pour gérer le rafraîssissement de la fenêtre carte global goDialog goDialog = dialog buttonBox= dialog.findChild(QDialogButtonBox, "buttonBox") buttonBox.accepted.connect(ValideFormulaire) # =================================================================================== # Fonction findClildHyperLink qui affecte une valuer à la source # d'un objet "ressource externe" avec hyperlien # Mise à jour : 2018-01-28 Didier LECLERC / Nicolas PETITOT == CPII/DON # Attention : pour objet "ressource externe" avec hyperlien et mode "éditable" #=================================================================================== def findChildChAttrib(dialog, loGeom, loLayer,loQuery,loForm): objValue = AffecteValeur(loGeom, loLayer,loQuery) if (objValue == None or objValue == "" or len(objValue) < 1) : pass else: if ((objValue[-1:] == '\\') or (objValue[-1:] == '/')) : objValue = objValue[0:len(objValue)-1] dialog.changeAttribute(loForm,objValue) # =================================================================================== # Fonction AffecteValeur qui balaie les objets de la couche loLayer passée en paramétre pour retrouver l'objet géographique loGeom # et retourner la valeur du champ loField # Entrée: l'objet recherché, la couche contenant l'objet, le champ de l'objet # Sortie: la valeur du champ de l'objet #=================================================================================== def AffecteValeur(loGeom, loLayer,loField): #Variable loObjet = None # objet géographique de la table loValeur = "" # variable qui prendra la valeur recherchee try: #on parcourt les objets de la couche et on compare avec celui recherche for loObjet in loLayer.getFeatures(): if loObjet.geometry().contains(loGeom): if loObjet[loField] is None: loValeur ="" loValeur = loObjet[loField] return loValeur else : pass except AttributeError: # cas se produisant quand on ouvre directement la fenêtre de données (QGIS 2.10) pass return loValeur # =================================================================== # Procedure ValideFormulaire appelée lors du click sur le bouton Valider. Elle rafraîchit les couches du canvas #=================================================================== def ValideFormulaire(): loLayers = qgis.utils.iface.mapCanvas().layers() loLayer = None for loLayer in loLayers: loLayer.triggerRepaint()