编写 ToolValidator 类

有关 ToolValidator 类的概述和参数方法的使用,请参阅自定义脚本工具行为

参数对象

访问工具参数

每个工具参数都拥有一个包含可用于工具验证的属性和方法的关联参数对象。参数包含在列表中。标准做法是在工具类的 ToolValidator__init__ 方法中创建参数列表,如以下代码所示。

def __init__(self):
    self.params = arcpy.GetParameterInfo()

还可访问脚本(相对于 ToolValidator 类)中的参数,如下所示。只有要设置 symbology 属性时才会访问脚本中的参数列表。

params = arcpy.GetParameterInfo()

参数顺序

工具参数及其顺序在工具属性的参数选项卡中进行定义,如下图所示。

参数及其顺序
注:

参数列表从零开始排序,因此第一个参数位于列表中的零位置上。要访问第三个参数,应输入 p3 = self.params[2]

方法

方法名称用法描述

setErrorMessage(message:string)

通过提供的消息将参数标记为存在错误(红色的 X)。如果其中任何参数存在错误,则不会执行工具。

setWarningMessage(message:string)

通过提供的消息将参数标记为存在警告(黄色三角形)。与存在错误时不同,工具在有警告消息的情况下也会执行。

setIDMessage(messageType: string, messageID: string, {AddArgument1}, {AddArgument2})

用于设置系统消息。参数与 AddIDMessage 函数的参数相同。

clearMessage()

清除所有消息文本并将状态设置为信息性的(无错误或警告)。

hasError()

如果参数包含错误,则返回 true。

hasWarning()

如果参数包含警告,则返回 true。

isInputValueDerived()

如果在模型内部验证工具并且输入值是模型中其他工具的输出,则返回 true。

参数对象方法

属性

属性名称读/写说明

name

只读

字符串

工具属性的参数选项卡上定义的参数名称。

direction

只读

字符串:“Input”、“Output”

工具属性的参数选项卡上定义的参数 Input/Output 方向。

datatype

只读

字符串

工具属性的参数选项卡上定义的数据类型。

parameterType

只读

字符串:“Required”、“Optional”、“Derived”

工具属性的参数选项卡上定义的类型。

parameterDependencies

读/写

列表

各依赖参数的索引列表。

value

读/写

值对象

参数的值。

defaultEnvironmentName

只读

字符串

工具属性的参数选项卡上定义的默认环境设置。

enabled

读/写

布尔型

如果参数为灰色(不可用),则为 False。

altered

只读

布尔型

如果用户对值做出了修改,则为 True。

hasBeenValidated

只读

布尔型

如果内部验证例程已检查参数,则为 True。

category

读/写

字符串

参数的类别。

schema

只读

GP Schema 对象

输出数据集的方案。

filter

只读

GP Filter 对象

要应用于参数中的值的过滤器。

symbology

读/写

字符串

用于绘制输出的图层文件 (.lyrx) 的路径。

message

只读

字符串

要向用户显示的消息。请参阅上述 SetErrorMessageSetWarningMessage

参数对象属性

虽然很多 Parameter 对象属性为读/写属性,但其中大多数属性只能在最初创建或修改对象时进行设置或修改。多个属性(包括 namedisplayNamedatatypedirectionparameterType)可用于建立工具的特征,且在验证方法(例如 updateMessagesupdateParameters)期间无法修改。

下面显示了一些代码示例。有关其他代码示例,请参阅自定义脚本工具行为

ToolValidator 属性与脚本工具属性

参数的默认值、过滤器、符号系统和依赖性既可在脚本工具的属性对话框的参数选项卡上进行设置,也可在 ToolValidator 类中设置。

ToolValidator 中设置的属性会始终覆盖在脚本工具属性对话框中设置的属性。例如,如果在脚本工具属性对话框中将参数的默认值设置为“BLUE”,然后使用 initializeParameters 将它重置为“RED”,则默认值会变为“RED”。调用 initializeParameters 后,脚本工具属性对话框会将“RED”显示为默认值。如果您(或您的用户)遇到在脚本的属性对话框中对这四个参数属性中某一个所作更改未得到保存的情况,则可能是因为属性在 ToolValidator 类内被覆盖。

parameterDependencies

通常会设置参数依赖项以供 Schema 对象使用。在两种情况下可能已经在工具属性的参数选项卡中设置了依赖项。

  • 对于类型为“派生”的输出数据集参数,依赖项为参数的索引,可由此派生输出。
  • 对于特定的输入数据类型,依赖项为含有控件所用信息的参数的索引,如下表所示。

输入数据类型依赖数据类型说明

字段或 SQL 表达式

Table

含有字段的表。

INFO 项目或 INFO 表达式

INFO 表

含有项目的 INFO 表。

Coverage 要素类

Coverage

包含要素的 coverage。

面积单位或线性单位

地理数据集

用于确定默认单位的地理数据集。

坐标系

工作空间

用于确定默认坐标系的工作空间。

Network Analyst 等级设置

网络数据集

包含等级信息的网络数据集。

地统计值表

地统计图层

包含表的分析图层。

网络出行模式

网络数据源、网络数据集、网络数据集图层

出行模式列表。

获取自数据类型

依赖项通常在 initializeParameters 方法中进行设置:

def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    self.params[2].parameterDependencies = [0, 1]

value

这是由用户输入的或者通过编程方式设置的参数值。可以在 initializeParameters 中设置值,此时它用作参数的初始默认值。还可在 updateParameters 中设置值以响应用户输入,如下所示。

def updateParameters(self):
    # Set the default distance threshold to 1/100 of the larger of the width
    #  or height of the extent of the input features.  Do not set if there is no 
    #  input dataset yet, or the user has set a specific distance (altered is true).
    if self.params[0].valueAsText:
        if not self.params[6].altered:
            extent = arcpy.Describe(self.params[0]).extent
        if extent.width > extent.height:
            self.params[6].value = extent.width / 100
        else:
            self.params[6].value = extent.height / 100
    return

参数的 value 属性会返回一个对象,除非未填充参数,这种情况下 value 将返回 None。要防止未填充参数的情况发生,请在应用参数值前使用 if 条件句执行检查。

下面的代码片段用于测试 value 是否等于字符串“Get Spatial Weights From File”。该测试能够顺利进行是因为参数数据类型是字符串。

# If the option to use a weights file is selected, enable the 
#   parameter for specifying the file, otherwise disable it
if self.params[3].value:  # check that parameter has a value
    if self.params[3].value == "Get Spatial Weights From File":
        self.params[8].enabled = True
    else:
        self.params[8].enabled = False

由于 Value 对象不支持字符串操作,每当操作或解析字符串时都使用 Value 对象的值参数。代码示例使用 os.path.dirname 方法从数据集返回目录。

if self.params[0].value:
    workspace = os.path.dirname(self.params[0].value.value)
警告:

请不要使用采用目录路径的方法,例如验证方法中的 ListFields,但是 Describe 例外。在 ModelBuilder 中验证工具时数据集可能并不存在,因此方法可能会失败或产生意外结果。

Describe 可直接用于 Parameter 对象,而不使用参数的 value 属性。使用 value 属性仍然有效,但是在与图层输入一同使用时速度会相当慢。

对于 ListFields 这种特殊情况,Describe 对象的 fields 属性将提供等效信息。

警告:

请不要在 updateMessages 中设置参数值,否则内部验证例程将不会验证该值。

altered

如果参数值被更改(例如通过输入输出路径进行更改),则 altered 为 true。参数更改之后,它会保持更改状态直到用户将该值清空(删除),这时它就恢复到未更改状态。通过验证代码以编程方式更改值将会改变 altered 的状态。也就是说,如果为参数设置了值,参数的 altered 状态将会更新。

altered 用于确定是否可以更改某个参数的值。例如,假设工具拥有要素类参数和关键字参数。如果要素类包含点或面,则关键字为 RED、GREEN 和 BLUE,如果包含线,则关键字为 ORANGE、YELLOW、PURPLE 和 WHITE。

假设用户输入了一个点要素类。如果关键字参数处于未更改状态,则将值设置为 RED,因为它是默认值。

如果输入了线要素类,则将默认值设置为 ORANGE(只要关键字参数处于未更改状态)。

不过,如果用户已更改关键字参数(即,将关键字设置为 GREEN),则不应重置关键字(用户已做出选择 (GREEN),但您还不知道他们的意图),他们可能更改要素类,以使 GREEN 有效,或者可能更改关键字(例如,改为 PURPLE)。由于 GREEN 不是一种为线创建的关键字设置,所以内部验证将参数标记为错误。此时,用户有两种选择:更改输入要素类或者更改关键字。

if not self.params[2].altered:
        self.params[2].value = "POINT"

hasBeenValidated

如果在最后一次调用 updateParameters 和内部验证之后用户修改了参数值,则 hasBeenValidated 为 false。调用内部验证后,地理处理会自动为每个参数将 hasBeenValidated 设置为 true。

hasBeenValidated 用于确定自上次调用 updateParameters 后用户是否对值进行了更改。您可以根据此信息决定是否执行您自己的参数检查。

# Set the default distance threshold to 1/100 of the larger of the width
#  or height of the extent of the input features. Do not set if there is no 
#  input dataset yet, or if the input features have already been validated,
#  or the user has set a specific distance (Altered is true).
if self.params[0].valueAsText and not self.params[0].hasBeenValidated:
    if not self.params[6].altered: 
        extent = arcpy.Describe(self.params[0]).extent
        width = extent.width
        height = extent.height
        if width > height:
            self.params[6].value = width / 100
        else:
            self.params[6].value = height / 100

category

可以将参数分为不同的类别,从而最小化工具对话框的大小或将不常使用的相关参数分为一组。多个 ArcGIS Network Analyst extension 工具使用了各种类别,如下所示。

参数类别

您只能设置一次类别,请在 initializeParameters 中进行设置。在 updateParameters 中设置类别不起任何作用。下面的代码表示,将参数 4 和 5 放入 Options 类别并将参数 6 和 7 放入 Advanced 类别。

def initializeParameters(self):
    self.params[4].category = "Options"
    self.params[5].category = "Options"
    self.params[6].category = "Advanced"
    self.params[7].category = "Advanced"

类别始终显示在非类别化参数之后。请不要将必需参数放入类别中,因为工具对话框上可能不会显示。

symbology

symbology 属性用于将图层文件 (.lyrx) 与输出参数关联在一起。

params[2].symbology = "E:/tools/extraction/ToolData/ClassByDist.lyrx"

了解有关输出符号系统的详细信息

schema 对象

类型为要素类、表、栅格或工作空间的每个输出参数都具有 schema 对象。只有输出要素类、表、栅格和工作空间具有 schema,其他类型则没有。schema 对象通过地理处理进行创建。可以通过参数对象访问此方案,或者设置规则以便描述工具的输出。在设置方案规则并从 ToolValidator 类获得返回值之后,地理处理内部验证代码会检查设置的规则并更新输出的描述。

回顾一下,控制流程如下:

  1. 在首次打开工具对话框时,调用 initializeParameters。设置静态规则(不会因用户输入而发生改变的规则)以描述输出。此时不会创建任何输出描述,因为用户尚未指定任何参数的值(除非已提供默认值)。
  2. 无论用户以何种方式与工具对话框进行交互,都会调用 updateParameters
  3. 考虑到无法根据参数依存关系确定的动态行为(如使用添加字段来添加新字段),updateParameters 可以对 schema 对象进行修改。
  4. updateParameters 获得返回值后,会调用内部验证例程并通过应用 schema 对象中的规则来更新输出数据的描述。
  5. 然后调用 updateMessages。您可以检查内部验证可能已创建的警告消息和错误消息,然后修改它们或者添加您自己的自定义警告消息和错误消息。

type 是只读属性以外,其他所有 schema 属性均是可读写的。

属性名称

type

字符串:“Feature”、“Table”、“Raster”、“Container”(对于工作空间和要素数据集)(只读属性)

clone

布尔型

featureTypeRule

字符串:“AsSpecified”、“FirstDependency”

featureType

字符串:“Simple”、“Annotation”、“Dimension”

geometryTypeRule

字符串:“Unknown”、“FirstDependency”、“Min”、“Max”、“AsSpecified”

geometryType

字符串:“Point”、“Multipoint”、“Polyline”、“Polygon”

extentRule

字符串:“AsSpecified”、“FirstDependency”、“Intersection”、“Union”、“Environment”

extent

Extent 对象

fieldsRule

字符串:“None”、“FirstDependency”、“FirstDependencyFIDs”、“All”、“AllNoFIDs”、“AllFIDsOnly”

additionalFields

字段对象列表

cellSizeRule

字符串:“AsSpecified”、“FirstDependency”、“Min”、“Max”、“Environment”

cellsize

双精度型

rasterRule

字符串:“FirstDependency”、“Min”、“Max”、“Integer”、“Float”

rasterFormatRule

字符串:“Img”、“Grid”

additionalChildren

要添加到工作空间方案的数据集列表

schema 对象属性

使用 FirstDependency

许多规则都可设置为“FirstDependency”,这表示将使用通过 parameter.parameterDependencies 设置的参数依赖项数组中的第一个参数值。在以下代码示例中,参数 2 具有两个依存参数:参数 0 和参数 1,第一个依赖项是参数 0。

# Set the dependencies for the output and its schema properties
self.params[2].parameterDependencies = [0, 1]

如果任一依存参数为多值(值列表),则会使用多值列表中的第一个值。

type

type 属性是只读的,并通过地理处理进行设置。

clone

如果为 true,则指示地理处理以精确复制(克隆)第一个依存参数中的描述。默认值为 false。通常,在 initializeParameters 方法中将 clone 设置为 true。如果第一个依存参数为多值(值列表),则会克隆多值列表中的第一个值。

  • 如果 parameter.parameterType 为“Derived”,则会进行精确复制。这是添加字段工具的行为。
  • 如果 parameter.parameterType 为“Required”,仍会进行精确复制,但是会更改数据集的目录路径。目录路径包括两部分:工作空间和基本名称。例如

    E:/Data/TestData/netcity.gdb/infrastructure/roads

    • 工作空间 = E:/Data/TestData/netcity.gdb/infrastructure
    • 基本名称 = roads
    用于构造新输出名称的规则如下:
    • 基本名称与含有数据集的第一个输入参数(不是第一个依赖项而是第一个参数)的基本名称相同,还会附加脚本工具名称(例如,roads_MyTool)。
    • 将工作空间设置为临时工作空间环境设置。如果未设置临时工作空间环境,则使用当前工作空间环境设置。如果当前工作空间环境也未设置,则使用包含数据集的第一个输入参数的工作空间。如果该工作空间为只读,那么就使用系统临时目录。

clone 设置为 true 后,所有基于规则的方法(例如 featureTypeRulegeometryTypeRuleextentRule)均设置为“FirstDependency”。

下面的两个代码示例有着相同作用。两个示例均基于使用裁剪工具创建输出方案的过程。

示例 1:显式设置所有规则
def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]
    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"
    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"
    return
示例 2:使用 clone 将规则设置为 FirstDependency,然后覆盖范围规则:
def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]
    self.params[2].schema.clone = True
    return
    
def updateParameters(self):
    # The only property of the clone that changes is that the extent 
    #  of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"
    return

featureTypeRule

该设置用于确定输出要素类的要素类型。此规则对输出栅格或输出表不起作用。

说明

“AsSpecified”

要素类型将通过 featureType 属性确定。

“FirstDependency”

要素类型将与依赖项中的第一个参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

featureTypeRule

featureType

featureTypeRule 为“AsSpecified”时,featureType 中的值用于指定输出的要素类型。

说明

“Simple”

输出将包含简单要素。要素的几何类型通过 geometryTypeRule 指定。

“Annotation”

输出将包含注记要素。

“Dimension”

输出将包含尺寸要素。

featureType

geometryTypeRule

该设置用于确定输出要素类的几何类型(例如点或面)。

说明

“Unknown”

这是默认设置。通常,应该能够根据其他参数值确定 updateParameters 中的几何类型。如果没有足够的信息用于确定几何类型,只需将规则设置为“Unknown”即可。

“FirstDependency”

几何类型与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

“Min”、“Max”

检查所有依存参数的几何,并将输出几何类型设置为找到的最小类型或最大类型。“Min”和“Max”定义如下:

  • 点和多点 = 0
  • 折线 = 1
  • 面 = 2
所以,如果依存参数是点要素类或面要素类,则最小类型将是点,最大类型将是面。

“AsSpecified”

几何类型将通过 geometryType 属性的值确定。

geometryTypeRule

geometryType

geometryTypeRule 为“AsSpecified”时,将该属性设置为要使用的几何类型(“Point”、“Multipoint”、“Polyline”或“Polygon”)。

extentRule

说明

“AsSpecified”

输出范围将在 extent 属性中指定。

“FirstDependency”

输出范围与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

“Intersection”

输出范围将是所有依存参数的几何交集。(这是裁剪工具使用的输出范围,如下所示。)

“Union”

输出范围将是所有依存参数的几何并集。

“Environment”

输出范围将基于输出范围环境设置进行计算。

extentRule

示例

# The extent of the output is the intersection of the input features 
#  and the clip features (the dependent parameters)
self.params[2].schema.extentRule = "Intersection"

extent

extentRule 为“AsSpecified”时,将该属性设置为要使用的范围。可使用以空格分隔的字符串或者使用含有四个值的列表对象来设置范围。顺序为 xmin、ymin、xmax、ymax。

示例

self.params[2].schema.extentRule = "AsSpecified"
self.params[2].schema.extent = "123.32 435.8 987.3 567.9"
# Alternatively use a list, as follows:
# self.params[2].schema.extent = [123.32, 435.8, 987.3, 567.9]

fieldsRule

fieldsRule 用于确定将在输出要素类或输出表上存在的字段。

在下表中,FID 代表“要素 ID”,但实际上是指每个要素类或表中的 ObjectID 字段。

说明

“None”

除对象 ID 以外,将不输出任何字段。

“FirstDependency”

输出字段将与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

“FirstDependencyFIDs”

只有第一个依存输入的 ObjectID 会写入到输出中。

“All”

将输出依存参数列表中的所有字段。

“AllNoFIDs”

除 ObjectID 以外的所有字段都将写入到输出中。

“AllFIDsOnly”

所有 ObjectID 字段都将写入到输出中,但是输入中的其他字段不会写入。

fieldsRule

使用 fieldsRule 为“FirstDependency”的裁剪工具示例

def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]
    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"
    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"
    return

additionalFields

除了通过应用 fieldsRule 添加的字段以外,还可向输出添加其他字段。additionalFields 将采用字段对象列表。

cellSizeRule

此属性用于确定输出栅格或输出格网的像元大小。

说明

“AsSpecified”

输出像元大小在 cellSize 属性中指定。

“FirstDependency”

像元大小根据第一个依存参数进行计算。如果依存参数是栅格,就会使用它的像元大小。对于其他类型的依存参数,例如要素类或要素数据集,数据范围用于计算像元大小。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

“Min”、“Max”

“Min”表示输出像元大小是依存参数的最小像元大小。“Max”表示它是依存参数的最大像元大小。

“Environment”

输出像元大小基于 cellsize 环境设置进行计算。

cellSizeRule

cellSize

cellSizeRule 为“AsSpecified”时,将该属性设置为要使用的像元大小。

rasterRule

该属性将确定输出栅格中包含的数据类型(整型或浮点型)。

说明

“FirstDependency”

数据类型(整型或浮点型)与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。

“Min”、“Max”

整数被视为小于浮点数。例如,如果有两个依存参数,一个包含整数,另一个包含浮点数,则“Min”创建整型输出,“Max”创建浮点型输出。

“Integer”

输出栅格包含整型数(整数)。

“Float”

输出栅格包含浮点数(小数)。

rasterRule

rasterFormatRule

该属性确定输出栅格格式,“Grid”或“Img”。默认值为“Img”,它是 ERDAS IMAGINE 格式。“Grid”是 Esri 的格式。

additionalChildren

工作空间是保存数据集(要素、表和栅格)的容器。这些数据集相当于工作空间的子辈(如果将工作空间看作父辈的话)。如果工具将数据集添加到新的或者现有的工作空间中,那么可通过添加对子辈的描述来更新工作空间的描述。例如,工具可采用要素类列表(多值),以某种方式进行修改,然后将修改后的要素类写入现有工作空间。在 ModelBuilder 中使用此工具时,工作空间就是派生的工具输出,可能会需要将该工作空间用作选择数据工具的输入。通过选择数据可以选择容器中的某个子数据集,并将它用作其他工具的输入。

additionalChildren 的输入是对子辈的一个或多个描述。对子辈的描述分为两种形式:

形式说明

value 对象

value 属性可返回要素类、表、栅格、尺寸或注记值。

[type, name, fields, extent, spatial reference] 形式的列表对象

含有要添加的子辈描述的列表。列表中只有前两个条目 typename 是必需的。其余参数均为可选。

additionalChildren 的成员列表

添加多个子辈时,可以提供子辈描述的列表。如果以列表形式添加子辈,将会为 additionalChildren 创建列表的列表。

列表形式具有五个参数,如下表中所述。

参数类型说明

type

必需项

可用值包括:“Point”、“Multipoint”、“Polyline”、“Polygon”、“Table”、“Raster”、“Annotation”、“Dimension”

name

必需项

数据集的名称。可以是数据集的基本名称 (streets) 或完整目录路径 (E:\mydata\test.gdb\infrastructure\streets)。在给定完整目录路径的情况下,基本名称 (streets) 以外的内容都将被忽略。

fields

可选项

字段对象列表。这包含子辈中出现的字段(如果已知)。

extent

可选项

包含子辈空间范围的字符串或列表。

spatial reference

可选项

空间参考对象。

子辈列表的内容

这些参数必须按照下列顺序提供。要跳过可选参数,可使用 None'#'

以下是设置工作空间方案的一些示例。这些示例基于具有下列参数的脚本工具:

参数名称属性

0

输入要素类

要素类 - 输入。

1

输入表

表 - 输入。

2

输入工作空间

工作空间 - 输入(包含工具结果的现有工作空间)。

3

派生工作空间

工作空间 - 派生输出,获取自 Input_workspace。该工作空间的方案经修改可包含其他子辈。

示例工具参数

此工具获取输入要素类和表,将它们复制到工作空间,向要素类添加新字段,然后在工作空间中创建新的面要素类。(此工具的实际作用并不是很重要,因为它仅仅是用于举例说明工作空间方案的设置。) 这些代码示例彼此关联,从 additionalChildren 的简单用法开始。

initializeParameters 中,输出工作空间通过其依存参数(参数 2)克隆。此依赖项不仅可在工具属性中设置,还可在 initializeParameters 中设置,以防止用户移除工具属性中的依赖项。

class ToolValidator:
    def __init__(self):
        self.params = arcpy.GetParameterInfo()
    def initializeParameters(self):
        self.params[3].parameterDependencies = [2]  # input workspace
        self.params[3].schema.clone = True  # Copy all existing contents to output
        return

示例:将两个输入(未修改)复制到输出工作空间:

def updateParameters(self):
    inFC = self.params[0].value  # input feature class
    inTable = self.params[1].value  # input table
    inWS = self.params[2].value  # input workspace
    if inFC and inTable and inWS:
        self.params[3].schema.additionalChildren = [inFC, inTable]
    return

示例:此工具可创建一个新的面要素类。与该新要素类有关的已知属性(验证时)仅有名称(“SummaryPolygon”)和类型(“polygon”)。

children = []    # New empty list
children.append(inFC)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children

示例:向输入要素类添加一个字段。

# Create a field object with the name "Category" and type "Long"
newField = arcpy.Field()
newField.name = "Category"
newField.type = "Long"
# Describe the input feature class in order to get its list of fields. The 9.3
#  version of the geoprocessing object returns fields in a list, unlike previous 
#  versions, which returned fields in an enumerator.
desc = arcpy.Describe(inFC)
fieldList = desc.fields
# Add the new field to the list
fieldList.append(newField)
# Create a new child based on the input feature class, but with the 
#  additional field added
newChild = [desc.shapeType, desc.catalogPath, fieldList,
            desc.extent, desc.spatialReference]
# Now create our list of children and add to the schema
#
children = []
children.append(newChild)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children

要为 SummaryPolygon(新的面要素类)创建字段,请创建与上面示例中所示模式相似的字段对象的列表。

示例:多值输入

在该示例中,第一个参数是由要素类构成的多值。多值中的每个要素类均复制到派生工作空间中。新字段 ProjectID 将添加到每个复制的要素类中。

# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace
import arcpy 
class ToolValidator:
    def __init__(self):
        self.params = arcpy.GetParameterInfo()
    def initializeParameters(self):
        self.params[2].parameterDependencies = [1]
        self.params[2].schema.clone = True
        return
    def updateParameters(self):
        inVT = self.params[0].value  # multivalue ValueTable
        inWS = self.params[1].value  # WorkSpace
        # Add each feature class to the output workspace. In addition,
        #  add a new field "ProjectID" to each feature class
        if inVT and inWS:
            rowCount = inVT.rowCount  # Number of rows in the MultiValue table
            children = []
            newField = arcpy.Field()
            newField.name = "ProjectID"
            newField.type = "Long"
            for row in range(0, rowCount):
                value = inVT.getValue(row, 0)
                if value:
                    d = arcpy.Describe(value)
                    fieldList = d.fields
                    # Note -- not checking if field already exists
                    fieldList.append(newField)
                    # Create new child with additional ProjectID field and
                    #  add child to list of children
                    child = [d.shapeType, d.catalogPath, fieldList]
                    children.append(child)            
                      
            self.params[2].schema.additionalChildren = children
        return
    def updateMessages(self):
        return

filter 对象

filter 对象允许为参数指定用户可用的选择。例如,可设置仅限选择文本字段的字段过滤器。过滤器执行三项工作:

  • 用户浏览数据时,过滤器仅提供有效的选择。如果设置的过滤器是针对点要素类的,那么用户浏览数据时仅会显示点要素类。如果设置的过滤器是针对文本字段的,则字段的下拉列表仅显示文本字段。
  • 如果由用户输入参数值(而不是从列表或文件浏览器中选择值),则会根据过滤器对值进行检查。如果用户输入无效值(例如不是文本字段,而是数值字段),则会自动给出警告或提示错误。
  • 因为值是由内部验证根据过滤器进行检查,所以过滤器使您无需在 ToolValidator 类中编写自定义验证。

可通过两种方式指定过滤器:

  • 在工具的属性对话框的参数选项卡上,单击参数,然后单击“过滤器”旁的像元,再从下拉列表中选择过滤器类型。选择过滤器类型之后,将打开一个对话框,用于指定过滤器的值。
  • 可通过编程方式在 ToolValidator 类中设置值(示例如下所示)。地理处理将自动为字符串、长整型、双精度型、要素类、文件、字段和工作空间类型的参数创建过滤器。即使不在工具的属性对话框中选择过滤器,参数仍会关联一个过滤器 - 只不过它是空的。空过滤器等同于没有过滤器。通过向空过滤器添加值以激活过滤器,而用户的选择会受到过滤器内容的限制。

过滤器分为 7 种类型,如下表所示:

过滤器类型

ValueList

字符串或数值的列表。采用字符串型、长整型、双精度型和布尔型数据类型。

范围

最小值和最大值。采用长整型和双精度型数据类型。

FeatureClass

允许的要素类类型列表,使用值“点”、“多点”、“折线”、“面”、“多面体”、“球体”、“注记”和“尺寸”进行指定。可为过滤器提供多个值。

文件

文件后缀列表,例如“.txt”、“.e00”、“.ditamap”。

字段

允许的字段类型列表,使用值“短整型”、“长整型”、“单精度”、“双精度”、“文本”、“日期”、“OID”、“几何”、“Blob”、“栅格”、“GUID”、“GlobalID”、“XML”进行指定。可为过滤器提供多个值。

工作空间

允许的工作空间类型列表,使用值“文件系统”、“本地数据库”和“远程数据库”进行指定。可提供多个类型值。

出行模式单位类型

允许的出行模式阻抗属性列表:时间、距离、其他。

过滤器类型和值

属性

属性说明

type

过滤器的类型(ValueList、范围、要素类、文件、字段和工作空间)。在处理长整型参数和双精度型参数时,可设置过滤器的类型(请参阅下面的注释)。对于其他类型的参数,仅有一种有效的过滤器类型,所以可以忽略这些参数的类型设置。如果不想过滤值,可将列表属性设置为空列表。

list

过滤器的值列表。如果不想过滤值,可将列表属性设置为空列表。

filter 属性

ValueList

用于字符串参数的 ValueList

对于字符串参数,列表可包含任意数量的字符串。下面是在 initializeParameters 中设置字符串值列表的示例。参数包含两种选择:“NEW_FORMAT”和“OLD_FORMAT”。

def initializeParameters(self):
    # Set the fixed list of "file format type" parameter choices and its
    #  default value
    #
    self.params[1].filter.list = ["OLD_FORMAT", "NEW_FORMAT"]
    self.params[1].value = "OLD_FORMAT"
    return

在上面的示例中,设置值列表像在工具的属性对话框的参数选项卡中进行设置一样轻松。事实上,如果之前在工具的属性对话框中已将值列表设置为其他值(例如“OLD”和“NEW”),则在调用 initializeParameters 时会使用“OLD_FORMAT”和“NEW_FORMAT”进行替换。对于默认值来说也是这样 - 它可在工具的“属性”对话框中进行设置,然后在 ToolValidator 中重置。

注:

ToolValidator 中提供的值列表会始终替换工具的属性对话框中设置的值。这样便可以基于其他参数更新值。

继续讲述该示例,以下代码显示了 updateParameters 根据用户选择“OLD_FORMAT”还是“NEW_FORMAT”来更改另一个参数中的值列表:

def updateParameters(self):
    # Update the value list filter of the "feature type in file" parameter 
    #   depending on the "file format type" parameter.
    #
    if self.params[1].value.upper() == "OLD_FORMAT":
        self.params[2].filter.list = ["POINT", "LINE", "POLYGON"]
    elif self.params[1].value.upper() == "NEW_FORMAT":
        self.params[2].filter.list = ["POINT", "LINE", "POLYGON", 
                                      "POINT_WITH_ANNO", 
                                      "LINE_WITH_ANNO", 
                                      "POLYGON_WITH_ANNO"]
    # Provide default value for "feature type in file" parameter
    #
    if not self.params[2].altered:
        self.params[2].value = "POINT"

用于长整型参数和双精度型参数的 ValueList

长整型参数或双精度型参数可具有数值列表。用户仅可选择或输入列表中的值。

# Set filter for a Long parameter
#
self.params[7].filter.list = [10, 20, 30, 40, 50]
# Set filter for a Double parameter
#
self.params[8].filter.list = [10.0, 12.5, 15.0]

用于布尔型参数的 ValueList

对于布尔型参数,存在两个值:值 true 和值 false。值 true 始终是列表中的最初值。

def initializeParameters(self):
    # Set the Boolean choice for including or excluding angles
    #
    self.params[6].filter.list = ["ANGLE", "NO_ANGLE"]
    # Set the default value to false (no angle)
    #
    self.params[6].value = "NO_ANGLE"
    return
def updateParameters(self):
    # Enable angle format parameter if user wants angles
    #
    if self.params[6].value.upper() == "ANGLE":
        self.params[7].enabled = True

范围

“长整型”或“双精度”参数可具有范围过滤器。范围过滤器有两个值:最小值和最大值。列表中的第一个值是最小值。包括范围边界值,这表示最小值和最大值也是有效数据。

def initializeParameters(self):
    # Utility values must be between -10 and 10.
    #
    self.params[7].filter.list = [-10, 10]

为长整型参数和双精度型参数设置过滤器类型

对于长整型参数和双精度型参数,默认过滤器类型为 ValueList。如果要将其更改为范围过滤器,可在 initializeParameters 中设置过滤器类型,如下所示:

def initializeParameters(self):
  # Set the 'score' value parameters to a range filter
  #
  self.params[7].filter.type = "Range"
  self.params[7].filter.list = [-10, 10]

仅可为长整型和双精度型参数设置过滤器类型。

FeatureClass

以下示例显示了如何根据另一个输入参数的要素类型设置某个输入参数的要素类型。

def updateParameters(self):
    # Set the input feature type of the second parameter based
    #  on the feature type of the first parameter.
    #
    if self.params[0].valueAsText:
        desc = arcpy.Describe(self.params[0])
        feature_type = desc.shapeType.lower()
        if feature_type == "polygon":
            self.params[1].filter.list = ["point", "multipoint"]
        elif feature_type == "polyline":
            self.params[1].filter.list = ["polygon"]
      
        elif feature_type in ["point", "multipoint"]:
            self.params[1].filter.list = ["polyline"]
        else:
            self.params[1].filter.list = []
      
    return

文件

文件过滤器包含文件可具有的文件后缀的列表,如 .txt(简单文本文件)和 .csv(逗号分隔值)。您可以提供任何后缀的文本,不必是 ArcGIS 可识别的后缀。后缀可为任意长度,且不包含句点。以下示例显示了如何为输入的“文件”类型参数设置过滤器。

def initializeParameters(self):
    # Set the input file type to our recognized options file suffixes
    #
    self.params[0].filter.list = ["opt56", "opt57", "globalopt"]
    return

字段

字段过滤器用于定义允许的字段类型: 可用的值包括“短整型”、“长整型”、“浮点型”、“单精度”、“双精度”、“文本”、“日期”、“OID”、“几何”、“Blob”、“栅格”、“GUID”、“GlobalID”和“XML”。

显示名称与内部名称

具有内部名称的字段类型有四种,如下表所示。

显示名称内部名称

短整型

小整型

长整型

整数

浮点型

单精度

文本型

字符串

字段过滤器别名

在指定字段过滤器时,可以使用显示名称,也可以使用内部名称;也就是说,下列两行代码是等效的:

self.params[1].filter.list = ["short", "long", "float", "text"]
self.params[1].filter.list = ["smallinteger", "integer", "single", "string"]

如果提供了显示名称,例如“短整型”,在过滤器中就会转换并存储为“SmallInteger”。您基本上不需要访问字段过滤器中的值,但是如果需要,请注意存储的是内部名称。下面的代码片段对这一点做出解释:

self.params[1].filter.list = ["short", "long"]
# 
if self.params[1].filter.list[0].lower() == "smallinteger":
    # do something

设置默认字段值

您可能需要为字段参数提供默认值。实现方法就是在整个输入表的字段中循环查找,然后挑选满足过滤器条件的第一个字段,如下所示:

def initializeParameters(self):
    self.params[1].filter.list = ["short", "long", "float", "double"]
    return
def updateParameters(self):
    if self.params[0].valueAsText and not self.params[1].altered:
        self.params[1].value = ""
        desc = arcpy.Describe(self.params[0])
        fields = desc.fields
        # Set default to the first field that matches our filter
        #
        for field in fields:
            fType = field.type.lower()
            if fType in ["smallinteger", "integer", "single", "double"]:
                self.params[1].value = field.name
                break
    return
警告:

请不要使用 ToolValidator 中的地理处理 ListFields 函数。应使用 Describe 函数,如上所示。

工作空间

工作空间过滤器用于指定允许的输入工作空间的类型。共有三个值:

工作空间过滤器说明

FileSystem

系统文件夹,用于存储 shapefile、coverage、INFO 表和格网

LocalDatabase

个人地理数据库或文件地理数据库

RemoteDatabase

ArcSDE 数据库连接

相关主题