Usar propiedad alterada en la clase de validación de ArcGIS Toolbox

Aug 20 2020

Estoy intentando escribir algún comportamiento en la clase de validación de ArcGIS Toolbox. Específicamente, estoy creando un parámetro desplegable para que el usuario pueda elegir una opción predefinida y luego un segundo parámetro actualizará una lista de elementos. El problema que tengo es que, cuando cambio la opción en el primer parámetro, puedo hacer que las opciones cambien en el segundo parámetro, pero cuando alterno el botón 'Deseleccionar todo' en el segundo parámetro, los elementos no se desmarcarán ( permanecieron controlados). Tengo la sensación de que tiene que ver con mi guión en el Validator.

Aquí están los detalles (vea la imagen a continuación también):

  1. El primer parámetro es un tipo de cadena. Se requiere, Dirección de entrada, Tiene un valor predeterminado. Multivalor = No y usa una lista de valores para que pueda tener un menú desplegable con 3 opciones para elegir
  2. El segundo parámetro es un tipo de cadena. Es requerido. Contiene valores predeterminados. Multivalor = Sí y utiliza una lista de valores para que los elementos rellenados en este parámetro (una lista de elementos) se puedan activar o desactivar.

Entonces, en el Validator, mi script es el siguiente. ¿Alguien puede ver algo obvio que me puede faltar aquí para que funcionen los botones 'Seleccionar todo' y 'Deseleccionar todo'?

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

Respuestas

1 user2856 Aug 21 2020 at 04:30

El "arcpy way ™" es comprobar if parameters[0].altered and not parameters[0].hasBeenValidated:

Según la [documentación] [1]:

alterado

alteredes verdadero si se cambia el valor de un parámetro ... Una vez que un parámetro ha sido alterado, permanece alterado hasta que el usuario vacía (borra) el valor, en cuyo caso vuelve a estar inalterado.

hasBeenValidated

hasBeenValidatedes falso si el valor de un parámetro ha sido modificado por el usuario desde la última vez que updateParametersse llamó a la validación interna. Una vez que se ha llamado a la validación interna, el geoprocesamiento se establece automáticamente hasBeenValidateden verdadero para cada parámetro.

hasBeenValidated se utiliza para determinar si el usuario ha cambiado un valor desde la última llamada a updateParameters .

Así que cambia tu updateParametersa:

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