Краткая информация
Объект Filter позволяет указать варианты значений параметра.
Обсуждение
Объект Filter позволяет указать варианты значений параметра, доступные пользователю. Например, можно установить фильтр поля, ограничивающий варианты текстовыми полями. Фильтр выполняет три задания:
- Фильтр только представляет возможного пользователя с доступными вариантами выбора при обзоре данных. Если вы установите фильтр на точечный класс объектов, только точечные классы объектов будут показаны при обзоре данных пользователем. Если вы установите фильтр на текстовые поля, ниспадающий список полей покажет только текстовые поля.
- Если пользователь вводит значение параметра (вместо выбора значения из списка или обзора файлов), значение будет проверено фильтром. Если пользователь вводит некорректное значение (например, числовое поле вместо текстового поля), выводится предупреждение или ошибка.
- Поскольку значения проверяются фильтром с помощью внутренней проверки, вам не придется программировать пользовательскую проверку в классе ToolValidator.
Есть два способа их определения фильтров:
- На вкладке Параметры диалогового окна свойств инструмента, выберите параметр, затем щелкните ячейку рядом с Фильтром и выберите тип фильтра из ниспадающего списка. После того, как вы выбрали тип фильтра, появится диалоговое окно, где вы сможете задать значения для фильтра.
- Вы можете задать значения программно в классе ToolValidator (примеры приведены ниже). Это предоставляет ряд возможностей настройки, которые невозможно использовать в диалоговом окне свойств инструмента, включая задание динамических фильтров на основе значений других параметров, фильтров для составных типов данных и нескольких типов фильтров для одного и того же параметра. Геообработка автоматически создает фильтры для параметров, имеющих тип string, long, double, класс пространственных объектов, файл, поле и рабочая область. Если вы не хотите выбрать фильтр в диалоговом окне свойств инструмента, все равно существует фильтр, который связан с параметром – просто он является пустым. Пустой фильтр равнозначен отсутствию фильтра. Добавляя значения в пустой фильтр, вы активизируйте фильтр, и варианты, из которых может выбирать пользователь, ограничены установками фильтра.
Свойства
Свойство | Описание | Тип данных |
list (чтение и запись) | Если вы не хотите фильтровать значения, установите свойство списка на пустой список (empty list). Задаваемый тип данных зависит от типа фильтра (ValueList, Range, FeatureClass, File, Field и Workspace). | String |
type (чтение и запись) | Тип фильтра (ValueList, Range, FeatureClass, File, Field и Workspace). Вы можете задать тип фильтра при использовании параметров Long, Double, Linear Unit, Areal Unit и Time Unit. Для других типов параметров существует только один корректный тип фильтра, поэтому задание типа для этих параметров игнорируется. Если вы не хотите фильтровать значения, задайте для свойства list пустой список. | String |
Пример кода
Ниже приведен пример динамического обновления фильтра списка значений, содержащего список выбора ключевых слов. Если пользователь вводит "OLD_FORMAT" в качестве значения второго параметра, третий параметр содержит "POINT", "LINE", "POLYGON". Если введено "NEW_FORMAT", третий параметр содержит три дополнительных варианта выбора.
import arcpy
class ToolValidator:
def __init__(self):
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
return
def updateParameters(self):
# Provide default values for "file format type" and
# "feature type in file"
if not self.params[1].altered:
self.params[1].value = "OLD_FORMAT"
if not self.params[2].altered:
self.params[2].value = "POINT"
# Update the value list filter of the "feature type in file"
# parameter depending on the type of file (old vs. new format)
# input
if self.params[1].value == "OLD_FORMAT":
self.params[2].filter.list = ["POINT", "LINE", "POLYGON"]
elif self.params[1].value == "NEW_FORMAT":
self.params[2].filter.list = ["POINT", "LINE", "POLYGON",
"POINT_WITH_ANNO",
"LINE_WITH_ANNO",
"POLYGON_WITH_ANNO"]
return
def updateMessages(self):
return
В этом примере фильтр списка значений во втором параметре изменяет основанный на типе геометрии класс пространственных объектов, находящийся в первом параметре:
def updateParameters(self):
# Update the value list filter in the second parameter based
# on the shape type in the first parameter
string_filter = self.params[1].filter
feature_class = self.params[0].value
if feature_class:
shape_type = arcpy.Describe(feature_class).shapeType
if shape_type in ["Point", "Multipoint"]:
string_filter.list = ["RED", "GREEN", "BLUE"]
elif shape_type == "Polygon":
string_filter.list = ["WHITE", "GRAY", "BLACK"]
else:
string_filter.list = ["ORANGE", "INDIGO", "VIOLET"]
else:
string_filter.list = ["RED", "GREEN", "BLUE"]
# If the user hasn't changed the keyword value, set it to the
# default value (first value in the value list filter).
if not self.params[1].altered:
self.params[1].value = string_filter.list[0]
return
В этом примере фильтр списка значений в третьем параметре заполняется атрибутами из поля, выбранного во втором параметре.
def updateParameters(self):
# Update the value list filter in the third parameter based on the
# attributes of the field selected in the second parameter
if self.params[1].value:
fc = self.params[0].value
field = self.params[1].valueAsText
values = self.params[2].filter
attribute_values = [row[0] for row in arcpy.da.SearchCursor(fc, [field])]
unique_attributes = set(attribute_values)
values.list = [int(value) for value in unique_attributes]
return