Usar propiedad alterada en la clase de validación de ArcGIS Toolbox
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):
- 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
- 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
El "arcpy way ™" es comprobar if parameters[0].altered and not parameters[0].hasBeenValidated:
Según la [documentación] [1]:
alterado
altered
es 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
hasBeenValidated
es falso si el valor de un parámetro ha sido modificado por el usuario desde la última vez queupdateParameters
se llamó a la validación interna. Una vez que se ha llamado a la validación interna, el geoprocesamiento se establece automáticamentehasBeenValidated
en verdadero para cada parámetro.
hasBeenValidated
se utiliza para determinar si el usuario ha cambiado un valor desde la última llamada aupdateParameters
.
Así que cambia tu updateParameters
a:
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...