Utilisation d'une propriété modifiée dans la classe de validation d'ArcGIS Toolbox

Aug 20 2020

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):

  1. 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
  2. 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

1 user2856 Aug 21 2020 at 04:30

Le "arcpy way ™" consiste à vérifier if parameters[0].altered and not parameters[0].hasBeenValidated:

Selon la [documentation] [1]:

altéré

alteredest 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

hasBeenValidatedest faux si la valeur d'un paramètre a été modifiée par l'utilisateur depuis la dernière fois updateParameterset que la validation interne a été appelée. Une fois que la validation interne a été appelée, le géotraitement est automatiquement défini hasBeenValidatedsur 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 updateParametersen:

  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...