Menggunakan properti yang diubah di Kelas Validator Kotak Alat ArcGIS
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):
- 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
- 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
The "arcpy way ™" adalah memeriksa if parameters[0].altered and not parameters[0].hasBeenValidated:
Menurut [dokumentasi] [1]:
diubah
altered
benar jika nilai parameter diubah ... Setelah parameter diubah, ia tetap diubah sampai pengguna mengosongkan (mengosongkan) nilai, dalam hal ini ia kembali ke tidak diubah.
hasBeenValidated
hasBeenValidated
false jika nilai parameter telah dimodifikasi oleh pengguna sejak terakhir kaliupdateParameters
dan validasi internal dipanggil. Setelah validasi internal dipanggil, geoprocessing secara otomatis disetelhasBeenValidated
ke true untuk setiap parameter.
hasBeenValidated
digunakan untuk menentukan apakah pengguna telah mengubah nilai sejak panggilan terakhir keupdateParameters
.
Jadi ubah Anda updateParameters
menjadi:
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...