banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 20 June 2016 09:33

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Plugin QGIS - Fonction non définie "global name..."

Version QGIS : 2.8.9 Wien
Version Python : 2.7
Version OS : Windows 10


Bonjour à tous,

Je fais appel à vous car j'ai un problème pour "initialiser" une fonction que j'ai créée dans mon plugin QGIS.

Le code de mon plugin prend la forme suivante :

Code:

class MonPlugin(QDialog):
    """QGIS Plugin Implementation."""

    def __init__(self, iface):
        """Constructor. instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # Save reference to the QGIS interface
        self.iface = iface
        # initialize plugin directory
        self.plugin_dir = os.path.dirname(__file__)
        # initialize locale
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(
            self.plugin_dir,
            'i18n',
            'DistributionStrategy_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)
        
        if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        # Create the dialog (after translation) and keep reference
    self.dlg = MonPluginDialog()

        # Declare instance attributes
    self.actions = []
        self.menu = self.tr(u'&MonPlugin')
        
        # TODO: We are going to let the user set this up in a future iteration
        self.toolbar = self.iface.addToolBar(u'MonPlugin')
        self.toolbar.setObjectName(u'MonPlugin')


        # Initialisation des valeurs par défault
        self.dlg.lineEdit_CoveredProp_Enterprises.setText("30")
        self.dlg.lineEdit_CoveredProp_Public.setText("40")
        
        # Validateurs des paramètres utilisateurs
        self.dlg.lineEdit_CoveredProp_Enterprises.setValidator(QDoubleValidator())
        self.dlg.lineEdit_CoveredProp_Public.setValidator(QDoubleValidator())
        regexp = "^(100|[0-9]{1,2})?$"
        self.dlg.lineEdit_CoveredProp_Enterprises.setValidator(QRegExpValidator(QRegExp(regexp)))
        self.dlg.lineEdit_CoveredProp_Public.setValidator(QRegExpValidator(QRegExp(regexp)))

puis ... plus loin, je rajoute ma fonction à l'intérieur de la classe de mon plugin (en plus des autres fonctions par défaut lorsque l'on génère le plugin), qui prend 2 paramètres ... le layer et le champ sur lequel sera appliqué la symbologie :

Code:

    def applyGraduatedSymbology(self, vectorLayer, targetField):
        colorRamp = QgsVectorGradientColorRampV2.create({'color1' : '242,252,255,255',
                                                         'color2' : '0,19,77,255',
                                                         'stops' : '0.5;80,124,166,255'})
        renderer = QgsGraduatedSymbolRendererV2.createRenderer(vectorLayer, targetField, 5, QgsGraduatedSymbolRendererV2.Jenks, QgsFillSymbolV2(), colorRamp)
        vectorLayer.setRendererV2(renderer)

puis... j'essaie d'appeler ma fonction applyGraduatedSymbology dans la fonction "run" (également à l'intérieur de la classe de mon plugin):

Code:

    def run(self):

        # Récupère le dossier des couches pour les chemins relatifs si le Projet QGS est bien ouvert
    path = os.path.dirname(QgsProject.instance().fileName())
    nameL = "/Data/Ma_couche_1.shp"


    # show the dialog
    self.dlg.show()
    # Run the dialog event loop
    result = self.dlg.exec_()

                      
    # See if OK was pressed
    if result:
            
            if (1+1) == 2: [b]# Oui c'est un test à la con, mais je cherche à vérifier si la checkbox est cliquée, je n'ai pour l'instant pas réussi mais ce n'est pas le sujet du jour :)[/b]
               

                # J'ouvre ma couche

                fileR = path + nameL
                layerR = QgsVectorLayer(fileR, "Layer_1", "ogr")
                pr = layerR.dataProvider()
                
                       for feat in layer.getFeatures():
                       [b]# Ici, je fais un super méga calcul :o (mais je vous passe les détails...)   [/b] 
                
                        writefieldtest = layer.fieldNameIndex("TEST")
                        layer.changeAttributeValue(feat.id(),writefieldtest,mon_attribut)
                        layer.commitChanges()  


            # Aplique la symbologie du B2C

            [b]Et c'est là que, normalement, j'aimerai faire applyGraduatedSymbology(self, Layer_1,"TEST")[/b]
            [b] Mais c'est là que ça bloque....[/b]

            QgsMapLayerRegistry.instance().addMapLayer(Layer_1)

            mc = self.iface.mapCanvas()
            mc.refresh()

L'erreur résultante est : global name 'applyGraduatedSymbology' is not defined


Il doit y avoir un petit quelque chose que j'ai oublié... ou qqc que je n'ai pas bien compris avec le "self" (à vrai dire je ne comprends pas trop bien le principe des classes en python alors c'est sûrement pour cela que ça bloque....). J'ai bien cherché des solutions sur mon ami google mais je n'ai pas trouvé d'exemples s'approchant du mien avec ce type d'erreur alors si qqn ici peu m'aiguiller un petit peu smile

Merci beaucoup,

Hors ligne

 

#2 Tue 21 June 2016 12:16

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: Plugin QGIS - Fonction non définie "global name..."

Eureka !

Alors pour celles et ceux, comme moi, qui ne sont par encore ULTRA à l'aise en python.... voici la solution (trouvé grâce à une lumière qui s'est éclairée d'un coup dans mon cerveau !) :

dans votre fonction run, au moment d'appeler la fonction que vous avez créé "applyGraduatedSymbology" faites simplement :

self.applyGraduatedSymbologyB2C(parametre1,parametre2)

Je savais bien que c'était une histoire de "self".... big_smile

Bon courage à tous ceux qui créent des plugin sur QGIS smile

Dernière modification par Cerise45 (Tue 21 June 2016 12:16)

Hors ligne

 

Pied de page des forums

Powered by FluxBB