Использование измененного свойства в классе валидатора ArcGIS Toolbox

Aug 20 2020

Я пытаюсь записать какое-то поведение в класс валидатора ArcGIS Toolbox. В частности, я создаю раскрывающийся параметр, чтобы пользователь мог выбрать предопределенный вариант, а затем второй параметр обновит список элементов. Проблема, с которой я сталкиваюсь, заключается в том, что когда я меняю параметр в первом параметре, я могу получить параметры для изменения во втором параметре, но когда я переключаю кнопку `` Отменить выбор всех '' во втором параметре, элементы не будут сниматься ( они остались проверенными). У меня такое чувство, что это связано с моим скриптом в Валидаторе.

Вот подробности (также см. Изображение ниже):

  1. Первый параметр - это строковый тип. Требуется, Направление ввода, Имеет значение по умолчанию. Multivalue = Нет и использует список значений, так что у меня есть раскрывающийся список с 3 вариантами на выбор
  2. Второй параметр - это строковый тип. Требуется. Содержит значения по умолчанию. Multivalue = Yes и использует список значений, чтобы элементы, указанные в этом параметре (список элементов), можно было включать или выключать.

Итак, в Валидаторе мой сценарий выглядит следующим образом. Может ли кто-нибудь увидеть что-то очевидное, чего мне здесь не хватает, чтобы заставить работать кнопки «Выбрать все» и «Снять выделение»?

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

Ответы

1 user2856 Aug 21 2020 at 04:30

«Путь arcpy ™» - это проверить if parameters[0].altered and not parameters[0].hasBeenValidated:

Согласно [документации] [1]:

изменен

alteredистинно, если значение параметра изменено ... После изменения параметра он остается измененным до тех пор, пока пользователь не опустошит (вычеркнет) значение, и в этом случае оно вернется в неизменное состояние.

hasBeenValidated

hasBeenValidatedимеет значение false, если значение параметра было изменено пользователем с момента последнего вызова updateParametersвнутренней проверки. После вызова внутренней проверки геообработка автоматически устанавливает hasBeenValidatedзначение true для каждого параметра.

hasBeenValidated используется, чтобы определить, изменил ли пользователь значение с момента последнего обращения к updateParameters .

Так что измените свой updateParametersна:

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