Filter

摘要

Filter 对象限制参数的可用选择。

说明

Filter 对象允许为参数指定用户可用的选择。 例如,可设置字段过滤器将选择限制为文本字段。 过滤器执行以下工作:

  • 用户浏览数据时,过滤器提供有效的选择。 如果将过滤器设置为点要素类,则用户浏览数据时仅显示点要素类。 如果将过滤器设置为文本字段,则字段下拉列表仅显示文本字段。
  • 如果用户提供了参数值(而不是从列表或文件浏览器中选择值),则系统会将该值与过滤器进行比较。 如果用户提供的值无效(例如数值字段而不是文本字段),将出现警告或错误。
  • 由于将通过内部验证将值与过滤器进行比较,因此无需对 ToolValidator 类中的自定义验证进行编程。

通过执行以下任一操作来指定过滤器:

  • 在工具的属性对话框的参数选项卡上,单击参数,然后单击过滤器旁的单元格,再从下拉列表中选择过滤器类型。 选择过滤器类型之后,将显示一个对话框,可在其中指定过滤器的值。
  • 以编程的方式在 ToolValidator 类中设置值(示例如下所示)。 这将提供使用工具的属性对话框无法实现的自定义选项,包括定义基于其他参数值的动态过滤器、复合数据类型的过滤器以及同一参数上的多个过滤器类型。 地理处理将自动为字符串、长整型、双精度型、要素类、文件、字段和工作空间类型的参数创建过滤器。 如果您未在工具的属性对话框中选择过滤器,过滤器仍与参数相关联 - 但它是空的。 空过滤器等同于没有过滤器。 通过向空过滤器添加值,可以激活过滤器,并且用户的选择仅限于过滤器内容。

属性

属性说明数据类型
list
(可读写)

指定过滤器的值或约束。

值的类型取决于 type 属性。

String
type
(可读写)

指定过滤器的类型。

  • ValueList - 与字符串、长整型、双精度、布尔型、线性单位、面积单位和时间单位数据类型一起使用的字符串或数值列表。

    对于字符串或数字过滤器,请提供值列表,只有这些值将被视为有效并显示在工具对话框的下拉列表中。

    对于线性单位、面积单位和时间单位数据类型,请提供单位关键字字符串列表,只有使用这些单位的值才会被视为有效并显示在工具对话框的单位下拉列表中。

  • Range - 用于长整型、双精度、线性单位、面积单位和时间单位数据类型的最小值和最大值。

    对于长整型和双精度过滤器,请提供包含两项的列表:最小值和最大值。 只有在最小值和最大值之间指定的数字才会被视为有效。

    对于线性单位、面积单位和时间单位范围过滤器,请提供包含两项的列表:包含单位的最小值和最大值,例如,["1 Meters", "100 Meters"]

  • FeatureClass - 可以使用的要素类类型列表。 有效值为 PointMultipointPolylinePolygonMultiPatchAnnotationDimension

    可以向过滤器提供多个值。

  • File - 文件后缀的列表,例如 [".txt", ".xml"]
  • Field - 通过 ShortLongSingleDoubleTextDateOIDGeometryBlobRasterGUIDGlobalIDXML 值指定的许用字段类型列表。 可以向过滤器提供多个值。
  • Workspace - 通过 FileSystemLocalDatabaseRemoteDatabase 值指定的许用工作空间类型列表。 可以向过滤器提供多个值。

String

代码示例

Filter 示例 1

以下是动态更新包含关键字选择列表的值列表过滤器的一个示例。 如果用户在第二个参数中输入 "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
Filter 示例 2

以下是另一个示例,其中,第二个参数中的值列表过滤器会根据第一个参数中的形状类型“要素类”发生变化。

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
Filter 示例 3

以下是另一个示例,其中,第三个参数中的值列表过滤器会根据第二个参数中所选字段的属性填充。

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

相关主题