Я пытаюсь адаптировать комбинацию модели и сценария, найденную на блог-сайте 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
.Ответы:
Я думал, что некоторые люди могут найти это ценным. ESRI был достаточно любезен, чтобы помочь разобраться с этим и найти альтернативу валидации, используемой в блоге, которая не требует расширенной лицензии. Хотя мне, конечно, пришлось выяснить некоторые дополнительные элементы, я не могу взять кредит на код проверки. Но цели оправдывают средства, и это считается ответом на мой вопрос. Ну вот:
Использование arcpy.da.SearchCursor очень быстро возвращает значения из выбранного поля, учитывая количество записей, которые он ищет (по крайней мере, в моих данных). Я могу начать новую тему, чтобы узнать, есть ли у кого-нибудь идеи о том, как применить фильтр к проверке на основе запроса. Я надеюсь, что это кому-то поможет, но я рад, что у нас есть ответ!
источник
Я сделал это по-другому: используя базу данных, состоящую из пяти уровней, не выбирая шейп-файл или поля, просто выбирая элементы первого уровня, скрипт проверки генерирует значения для второго уровня в соответствии с вашим выбором на первом уровне, а ее сценарий:
источник
источник
{ }
кнопку, чтобы правильно отформатировать ваш код.