Select to view content in your preferred language

in ToolValidator, how to update dependencies?

593
1
04-09-2012 10:41 AM
JamieKass
Regular Contributor
I want to have a Field type parameter draw values from one of two other Feature Class parameters in my custom tool. When the user selects option 1, FC 1 is enabled and FC 2 is greyed out, and vice versa for option 2. When option 1 is selected, the Field parameter finds the values and populates the dropdown, but when option 2 is selected the dropdown is blank. I need to add code into the ToolValidator class to change the dependency of the Field parameter from FC 1 to FC 2, depending on which is enabled. Here is my code:

# param[1] is the "option", param[2] and param[4] are FC1 and FC2, and param[9] is the Field

class ToolValidator:
  """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."""
    import arcpy
    self.params = arcpy.GetParameterInfo()

  def initializeParameters(self):
    """Refine the properties of a tool's parameters.  This method is
    called when the tool is opened."""
    if self.params[1].value == "Use Existing Intersect":
      self.params[9].parameterDependencies = [2]
    elif self.params[1].value == "Build New Intersect":
      self.params[9].parameterDependencies = [4]
    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[1].value == "Use Existing Intersect":
      self.params[2].enabled = True
      self.params[3].enabled = False
      self.params[4].enabled = False
      self.params[5].enabled = False


    elif self.params[1].value == "Build New Intersect":
      self.params[2].enabled = False
      self.params[3].enabled = True
      self.params[4].enabled = True
      self.params[5].enabled = True

    else:
      self.params[2].enabled = False
      self.params[3].enabled = False
      self.params[4].enabled = False
      self.params[5].enabled = False




Also, a side question: can the ToolValidator class code be added to my script code, or must it be edited within the tool properties?

Any help on this would be much appreciated.
Tags (2)
0 Kudos
1 Reply
JamieKass
Regular Contributor
Figured it out. You need to define the filter types of the field variables as "ValueList" instead of "FieldList" so that they can be used as string lists. The code creates a function that returns field values as a list for a feature class parameter. Param 2 is one fc option, Params 3,5,7 are the other option (user can choose either Param 2 or Params 3,5,7). Params 4,6,8 are field lists either pulled from Param 2 or Params 3,5,7.

class ToolValidator:
  """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."""
    import arcpy
    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[4].filter.type = "ValueList"
    self.params[6].filter.type = "ValueList"
    self.params[8].filter.type = "ValueList"
    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."""

    # Define function that returns field values for a fc parameter (par) to the field parameter (field); 
    # i.e. changeFilter(2,4) takes the fields from (2) and returns them as a list to (4)
    def changeFilter(par,field):
      if self.params[par].value:
        list = []
        fc = arcpy.Describe(self.params[par].value)
        for x in fc.fields:
          list.append(x.name)
        self.params[field].filter.list = list
    #if self.params[1].altered = True:
    if self.params[1].value == "Use Existing Intersect":
      self.params[4].filter.list = []
      self.params[6].filter.list = []
      self.params[8].filter.list = []
      changeFilter(2,4)
      changeFilter(2,6)
      changeFilter(2,8)
      self.params[2].enabled = True
      self.params[3].enabled = False
      self.params[5].enabled = False
      self.params[7].enabled = False

    elif self.params[1].value == "Build New Intersect":
      self.params[4].filter.list = []
      self.params[6].filter.list = []
      self.params[8].filter.list = []
      changeFilter(3,4)
      changeFilter(5,6)
      changeFilter(7,8)
      self.params[2].enabled = False
      self.params[3].enabled = True
      self.params[5].enabled = True
      self.params[7].enabled = True

    else:
      self.params[2].enabled = False
      self.params[3].enabled = False
      self.params[5].enabled = False
      self.params[7].enabled = False

  def updateMessages(self):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return
0 Kudos