ArcGIS ToolboxValidatorクラスで変更されたプロパティを使用する

Aug 20 2020

いくつかの動作をArcGISToolboxバリデータークラスにスクリプト化しようとしています。具体的には、ユーザーが事前定義されたオプションを選択できるようにドロップダウンパラメーターを作成しており、2番目のパラメーターがアイテムのリストを更新します。私が抱えている問題は、最初のパラメータのオプションを変更すると、2番目のパラメータで変更するオプションを取得できますが、2番目のパラメータの[すべて選択解除]ボタンを切り替えると、項目のチェックが外れません(それらはチェックされたままでした)。バリデーターのスクリプトと関係があると感じています。

詳細は次のとおりです(下の画像も参照)。

  1. 最初のパラメータは文字列型です。必須です。入力方向。デフォルト値があります。Multivalue = Noであり、値リストを使用するため、3つのオプションから選択できるドロップダウンを使用できます
  2. 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

「arcpyway™」はチェックすることです if parameters[0].altered and not parameters[0].hasBeenValidated:

[ドキュメント] [1]によると:

変更されました

alteredパラメータの値が変更された場合はtrueです...パラメータが変更れると、ユーザーが値を空にする(空白にする)まで変更されたままになります。値が空になると、変更されない状態に戻ります。

hasBeenValidated

hasBeenValidated前回updateParametersおよび内部検証が呼び出されてからユーザーがパラメーターの値を変更した場合はfalseです。内部検証が呼び出されると、ジオプロセシング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...