Menggunakan properti yang diubah di Kelas Validator Kotak Alat ArcGIS

Aug 20 2020

Saya mencoba untuk membuat skrip beberapa perilaku ke dalam kelas validator ArcGIS Toolbox. Secara khusus, saya membuat parameter tarik-turun sehingga pengguna dapat memilih opsi yang telah ditentukan dan kemudian parameter kedua akan memperbarui daftar item. Masalah yang saya alami adalah, ketika saya mengubah opsi di parameter pertama, saya bisa mendapatkan opsi untuk mengubah di parameter kedua, tetapi ketika saya mengaktifkan tombol 'Batalkan Pilihan Semua' di parameter kedua, item tidak akan dihapus centang ( mereka tetap diperiksa). Saya merasa itu ada hubungannya dengan skrip saya di Validator.

Berikut detailnya (lihat gambar di bawah juga):

  1. Parameter pertama adalah tipe string. Diperlukan, Arah Input, Memiliki nilai default. Multivalue = Tidak dan menggunakan daftar nilai sehingga saya dapat memiliki dropdown dengan 3 opsi untuk dipilih
  2. Parameter kedua adalah tipe string. Itu diperlukan. Berisi nilai default. Multivalue = Ya dan menggunakan daftar nilai sehingga item yang diisi dalam parameter ini (daftar item) dapat diaktifkan atau dinonaktifkan.

Jadi, di Validator, script saya adalah sebagai berikut. Adakah yang bisa melihat sesuatu yang jelas saya mungkin hilang di sini untuk mengaktifkan tombol 'Pilih Semua' dan 'Batalkan Semua'?

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

Jawaban

1 user2856 Aug 21 2020 at 04:30

The "arcpy way ™" adalah memeriksa if parameters[0].altered and not parameters[0].hasBeenValidated:

Menurut [dokumentasi] [1]:

diubah

alteredbenar jika nilai parameter diubah ... Setelah parameter diubah, ia tetap diubah sampai pengguna mengosongkan (mengosongkan) nilai, dalam hal ini ia kembali ke tidak diubah.

hasBeenValidated

hasBeenValidatedfalse jika nilai parameter telah dimodifikasi oleh pengguna sejak terakhir kali updateParametersdan validasi internal dipanggil. Setelah validasi internal dipanggil, geoprocessing secara otomatis disetel hasBeenValidatedke true untuk setiap parameter.

hasBeenValidated digunakan untuk menentukan apakah pengguna telah mengubah nilai sejak panggilan terakhir ke updateParameters .

Jadi ubah Anda updateParametersmenjadi:

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