摘要
Filter 对象允许为参数指定用户可用的选择。
说明
Filter 对象允许为参数指定用户可用的选择。 例如,可设置字段过滤器将选择限制为文本字段。 过滤器执行三项工作:
- 用户浏览数据时,过滤器仅提供有效的选择。 如果将过滤器设置为点要素类,则用户浏览数据时仅显示点要素类。 如果将过滤器设置为文本字段,则字段下拉列表仅显示文本字段。
- 如果用户键入了参数值(而不是从列表或文件浏览器中选择值),则系统会将该值与过滤器进行比较。 如果用户输入的值无效(例如数值字段而不是文本字段),将出现警告或错误。
- 由于将通过内部验证将值与其过滤器进行比较,因此无需对 ToolValidator 类中的自定义验证进行编程。
可通过两种方式指定过滤器:
- 在工具的属性对话框的参数选项卡上,单击参数,然后单击“过滤器”旁的单元格,再从下拉列表中选择过滤器类型。 选择过滤器类型之后,将显示一个对话框,可在其中指定过滤器的值。
- 可以编程的方式在 ToolValidator 类中设置值(示例如下所示)。 这将提供一些使用工具的属性对话框无法实现的自定义选项,包括定义基于其他参数值的动态过滤器、复合数据类型的过滤器以及同一参数上的多个过滤器类型。 地理处理将自动为字符串、长整型、双精度型、要素类、文件、字段和工作空间类型的参数创建过滤器。 如果您未在工具的属性对话框中选择过滤器,过滤器仍与参数相关联 - 只不过它是空的。 空过滤器等同于没有过滤器。 通过向空过滤器添加值,可以激活过滤器,并且用户的选择仅限于过滤器内容。
属性
属性 | 说明 | 数据类型 |
list (可读写) | 如果不想过滤值,可将列表属性设置为空列表。 指定的数据类型取决于过滤器类型(ValueList、Range、FeatureClass、File、Field 和 Workspace)。 | String |
type (可读写) | 过滤器类型(ValueList、Range、FeatureClass、File、Field 和 Workspace)。 使用长整型、双精度型、线性单位、面积单位和时间单位参数时,可设置过滤器类型。 对于其他类型的参数,仅有一种有效的过滤器类型,所以可以忽略这些参数的类型设置。 如果不想过滤值,可将 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