Я намагаюся адаптувати комбінацію моделі та сценаріїв, знайдені на сайті блогу ESRI під назвою "Створення багатоцінного списку вибору".
Однак я зробив висновок, що частина перевірки, яка використовується у вбудованому скрипті, належить до інструмента "Частота" для того, щоб нормально функціонувати, але це доступно лише з ліцензією розширеного доступу (кульгавий). У публікації блогу пояснюється робочий процес та куди завантажувати моделі та сценарії (але я із задоволенням опублікую їх тут за запитом). Наскільки я можу сказати, ядро функціоналу, за яким я працюю, генерує багатозначний список вибору:
..визначається, що сценарій перевірки працює належним чином. Без перевірки я не можу отримати значення з поля, які відображатимуться як список. Чи є щось, що я можу видалити з цього скрипту перевірки, щоб отримати функціонал, який я шукаю, або чи є спосіб вирішення? Мені незнайомий процес перевірки. Ось код для перевірки (я збирався опублікувати як зразок коду, але це виглядає так, що це може бути простіше)
[ Примітка редактора: ось фактичний код перевірки, зображення невірне]
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."""
return
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parmater
has been changed."""
if self.params[1].altered: #Set condition - if the input field value changes
if self.params[1].value: #if the field parameter has a value
for field in arcpy.Describe(self.params[0].value).fields: #iterate through fields in the input dataset
if field.name.lower() == self.params[1].value.value.lower(): #find the field object with the same name as field parameter
try:
if self.params[2].values: #if this parameter has seleted values
oldValues = self.params[2].values #set old values to the selected values
except Exception:
pass
values = set() #create an empty set
fieldname = self.params[1].value.value #set the value of variable fieldname equal to the input field value
FrequencyTable = arcpy.Frequency_analysis (self.params[0].value, "in_memory\Frequency", self.params[1].value.value, "") #for large tables create a frequency table
cursor = arcpy.SearchCursor(FrequencyTable, "", "", self.params[1].value.value, "{0} A".format(self.params[1].value.value)) #open a search cursor on the frequency table
for row in cursor: #loop through each value
values.add(row.getValue(fieldname)) #add the value to the set
self.params[2].filter.list = sorted(values) #set the filter list equal to the sorted values
newValues = self.params[2].filter.list
try:
if len(oldValues): # if some values are selected
self.params[2].values = [v for v in oldValues if v in newValues] # check if seleted values in new list,
# if yes, retain the seletion.
except Exception:
pass
def updateMessages(self):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
Чи можливо, що моє припущення (за допомогою тестування) про те, що валідація є ключовим фрагментом, помилкове, і що щось інше не дозволяє показникам виставляти значення як список, який можна вибрати? Заздалегідь дякую. Наявність такого типу функціональності по-справжньому перейде до прийняття декількох ключових робочих процесів, які я намагаюся розповсюдити в нашій компанії!
arcpy.da.SearchCursor
це набагато швидше і підходить для цього завдання, ніж старшіarcpy.SearchCursor
.