Utilisation d'une propriété modifiée dans la classe de validation d'ArcGIS Toolbox
J'essaie de créer un script de comportement dans la classe de validation d'ArcGIS Toolbox. Plus précisément, je crée un paramètre de liste déroulante afin que l'utilisateur puisse choisir une option prédéfinie, puis un deuxième paramètre mettra à jour une liste d'éléments. Le problème que je rencontre est que lorsque je change l'option dans le premier paramètre, je peux obtenir les options à changer dans le deuxième paramètre, mais lorsque je bascule le bouton `` Tout désélectionner '' dans le deuxième paramètre, les éléments ne décochent pas ( ils sont restés contrôlés). J'ai le sentiment que cela a à voir avec mon script dans le validateur.
Voici les détails (voir également l'image ci-dessous):
- Le premier paramètre est un type de chaîne. Il est obligatoire, Direction d'entrée, A une valeur par défaut. Multivaleur = Non et utilise une liste de valeurs pour que je puisse avoir une liste déroulante avec 3 options au choix
- Le deuxième paramètre est un type de chaîne. C'est requis. Contient les valeurs par défaut. Multivaleur = Oui et utilise une liste de valeurs afin que les éléments renseignés dans ce paramètre (une liste d'éléments) puissent être activés ou désactivés.

Donc, dans le validateur, mon script est le suivant. Quelqu'un peut-il voir quelque chose d'évident qui me manque peut-être ici pour que les boutons «Sélectionner tout» et «Tout désélectionner» fonctionnent?
import arcpy
class ToolValidator(object):
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
"""Refine the properties of a tool's parameters. This method is
called when the tool is opened."""
self.params[1].filter.list = [1,2,3,4]
self.params[1].values = self.params[1].filter.list
return
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
if self.params[0].altered == True:
if self.params[0].value == 'Option 1':
self.params[1].filter.list = [1,2,3,4]
self.params[1].values = self.params[1].filter.list
elif self.params[0].value == 'Option 2':
self.params[1].filter.list = ['a', 'b', 'c']
self.params[1].values = self.params[1].filter.list
elif self.params[0].value == 'Option 3':
self.params[1].filter.list = ['dr', 'bht', 'cjjjyy']
self.params[1].values = self.params[1].filter.list
return
def updateMessages(self):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
Réponses
Le "arcpy way ™" consiste à vérifier if parameters[0].altered and not parameters[0].hasBeenValidated:
Selon la [documentation] [1]:
altéré
altered
est vrai si la valeur d'un paramètre est modifiée ... Une fois qu'un paramètre a été modifié, il reste modifié jusqu'à ce que l'utilisateur vide (supprime) la valeur, auquel cas il redevient inchangé.
hasBeenValidated
hasBeenValidated
est faux si la valeur d'un paramètre a été modifiée par l'utilisateur depuis la dernière foisupdateParameters
et que la validation interne a été appelée. Une fois que la validation interne a été appelée, le géotraitement est automatiquement définihasBeenValidated
sur true pour chaque paramètre.
hasBeenValidated
est utilisé pour déterminer si l'utilisateur a changé une valeur depuis le dernier appel àupdateParameters
.
Alors changez votre updateParameters
en:
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
if self.params[0].altered and not self.params[0].hasBeenValidated:
etc...