Utilizzo della proprietà modificata nella classe ArcGIS Toolbox Validator
Sto cercando di inserire in script alcuni comportamenti nella classe di convalida di ArcGIS Toolbox. In particolare, sto creando un parametro a discesa in modo che l'utente possa scegliere un'opzione predefinita e quindi un secondo parametro aggiornerà un elenco di elementi. Il problema che sto riscontrando è che quando cambio l'opzione nel primo parametro, posso ottenere le opzioni da modificare nel secondo parametro, ma quando sposto il pulsante "Deseleziona tutto" nel secondo parametro, gli elementi non deselezioneranno ( sono rimasti controllati). Ho la sensazione che abbia a che fare con la mia sceneggiatura nel Validator.
Ecco i dettagli (vedi anche l'immagine sotto):
- Il primo parametro è un tipo stringa. È richiesto, Input Direction, Ha un valore predefinito. Multivalore = No e utilizza un elenco di valori in modo da poter avere un menu a discesa con 3 opzioni tra cui scegliere
- Il secondo parametro è un tipo di stringa. È richiesto. Contiene valori predefiniti. Multivalore = Sì e utilizza un elenco di valori in modo che gli elementi popolati in questo parametro (un elenco di elementi) possano essere attivati o disattivati.

Quindi, nel Validator, il mio script è il seguente. Qualcuno può vedere qualcosa di ovvio che potrebbe mancare qui per far funzionare i pulsanti "Seleziona tutto" e "Deseleziona tutto"?
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
Risposte
Il "modo arcpy ™" è controllare if parameters[0].altered and not parameters[0].hasBeenValidated:
Secondo la [documentazione] [1]:
alterato
altered
è vero se il valore di un parametro viene cambiato ... Una volta che un parametro è stato modificato, rimane alterato fino a quando l'utente non svuota (cancella) il valore, nel qual caso torna ad essere inalterato.
hasBeenValidated
hasBeenValidated
è falso se il valore di un parametro è stato modificato dall'utente dall'ultima voltaupdateParameters
che è stata chiamata la convalida interna. Una volta chiamata la convalida interna, il geoprocessing viene impostato automaticamentehasBeenValidated
su true per ogni parametro.
hasBeenValidated
viene utilizzato per determinare se l'utente ha modificato un valore dall'ultima chiamata aupdateParameters
.
Quindi cambia il tuo updateParameters
in:
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...