Suite

Définir les dépendances des paramètres dans les boîtes à outils python d'ArcGIS ?

Définir les dépendances des paramètres dans les boîtes à outils python d'ArcGIS ?


J'essaie de créer une boîte à outils Python dans laquelle l'utilisateur sélectionne une couche, puis spécifie une colonne dans cette couche. Selon la documentation des paramètres, cela se fait via leparamètreDépendancesattribut d'unarcpy.Paramètreexemple. Cette même documentation indique que vous avez besoin d'une liste d'entiers spécifiant les index des paramètres en aval. Vraisemblablement, ils font référence à la liste des paramètres que vous êtes censé retourner dans legetParameterInfométhode de la classe de votre outil.

Cependant, même les exemples les plus élémentaires échouent :

import arcpy class Flooder(object): def __init__(self): self.label = "1 - Créer des scénarios d'inondation" self.description = "" self.canRunInBackground = True def getParameterInfo(self): polygons = arcpy.Parameter( displayName= "Zones", name="polygons", datatype="DEFeatureClass", parameterType="Required", direction="Input" ) tidegate_column = arcpy.Parameter( displayName="ID colonne", name="tidegate_column", datatype=" Field", parameterType="Required", direction="Input" ) return [polygons, tidegate_column] def updateParameters(self, parameters): polygons = parameters[0] tgcol = parameters[1] polygons.parameterDependencies = [1] f = Flooder() p = f.getParameterInfo() f.updateParameters(p)

Ce qui soulève :

-------------------------------------------------- ------------------------- ValueError Traceback (appel le plus récent en dernier)  dans () 1 f = Flooder() 2 params = f.getParameterInfo() ----> 3 f.updateParameters(params)  dans updateParameters(self, parameters) 11 polygons = parameters[0] 12 tgcol = parameters[1] ---> 13 polygons.parameterDependencies = [1] 14 15 C:Program Files (x86)ArcGISDesktop10.2 arcpyarcpyarcobjects\_base.pyc dans _set(self, val) 87 return val 88 try: ---> 89 return setattr(self._arc_object, attr_name, cval(val)) 90 sauf AttributeError: 91 raise NameError( ValueError : ParameterObject : valeur de la liste de dépendances hors limites

Une idée de ce qui ne va pas ?

J'ai vérifié trois fois mon code et la documentation, et je transmets la liste spécifiée d'entiers dont la propriété a besoin.


La documentation semble être erronée. Il ne veut pas d'une liste d'entiers. Il semble vouloir une liste d'entiers comme chaînes.

Espérons qu'Esri met à jour la documentation, ou mieux encore, vous permette de transmettre des paramètres réels (ou leurs noms) à l'avenir. Remplacez l'exemple ci-dessus par le suivant et cela fonctionnera :

import arcpy class Flooder(object): # [snip] def updateParameters(self, parameters): polygons = parameters[0] tgcol = parameters[1] polygons.parameterDependencies = ["1"] # <-- ints as strings 0_o f = Flooder() p = f.getParameterInfo() f.updateParameters(p)

Selon les commentaires ci-dessous, vous pouvez également transmettre le nom du paramètre. Mais cela semble toujours désordonné et un peu trop codé en dur/numéro magique à mon goût.

Donc, à la place, si vous créez vos paramètres en tant que propriétés de classe, vous pouvez opérer de manière beaucoup plus alphabétisée :

class Flooder(BaseTool_Mixin): def __init__(self): self._polygons = None self._tidegate_column = None @staticmethod def _set_parameter_dependency(downstream, *upstream): """ Définit la dépendance d'un arcpy.Parameter en aval sur le (potentiellement plusieurs ) en amont arcpy.Parameters """ down.parameterDependencies = [u.name pour u en amont] def updateParameters(self, parameters): """ Appelé automatiquement lorsqu'un paramètre est mis à jour dans l'interface graphique. """ # tidegate_columns regarde dans la couche de polygones pour obtenir une liste des champs self._set_parameter_dependency(self.tidegate_column, self.polygons) @property def polygons(self) : si self._polygons est Aucun : self._polygons = arcpy.Parameter( displayName="Zones de marée de Influence", name="polygons", datatype="DEFeatureClass", parameterType="Required", direction="Input" ) return self._polygons @property def tidegate_column(self) : si self._tidegate_column est Aucun : tidegate_column = arcpy. Paramètre( displayName="Column with Tidegate IDs", name="tidegate _column", datatype="Field", parameterType="Required", direction="Input" ) return self._tidegate_column def getParameterInfo(self): """ Renvoie toutes les définitions de paramètres""" return [self.polygons, self.tidegate_column ]