Utilizzo della proprietà modificata nella classe ArcGIS Toolbox Validator

Aug 20 2020

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

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

1 user2856 Aug 21 2020 at 04:30

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 volta updateParametersche è stata chiamata la convalida interna. Una volta chiamata la convalida interna, il geoprocessing viene impostato automaticamente hasBeenValidatedsu true per ogni parametro.

hasBeenValidated viene utilizzato per determinare se l'utente ha modificato un valore dall'ultima chiamata a updateParameters .

Quindi cambia il tuo updateParametersin:

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