编写 ToolValidator 类
有关 ToolValidator 类的概述和参数方法的使用,请参阅自定义脚本工具行为。
参数对象
访问工具参数
每个工具参数都拥有一个具有可用于工具验证的属性和方法的关联参数对象。参数包含在 Python 列表中。标准做法是在 ToolValidator 类的 __init__ 方法中创建参数列表,如以下代码所示。
def __init__(self): import arcpy self.params = arcpy.GetParameterInfo()
还可访问脚本(相对于 ToolValidator 类)中的参数,如下所示。只有要设置符号系统属性时才会访问脚本中的参数列表。
import arcpy params = arcpy.GetParameterInfo()
参数顺序
工具参数及其顺序在工具属性的参数选项卡中进行定义,如下图所示。
参数列表从 0 开始排序,因此第一个参数位于列表中的零位置上。所以,如果要访问第三个参数,则应输入 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” |
工具属性的参数选项卡上定义的类型。 |
读/写 |
Python 列表 |
各依存参数的索引列表。 | |
读/写 |
Value 对象 |
参数的值。 | |
defaultEnvironmentName |
只读 |
字符串 |
工具属性的参数选项卡上定义的默认环境设置。 |
enabled |
读/写 |
布尔 |
如果参数为灰色(不可用),则为 False。 |
只读 |
布尔 |
如果用户对值做出了修改,则为 True。 | |
只读 |
布尔 |
如果内部验证例程已检查参数,则为 True。 | |
读/写 |
字符串 |
参数的类别。 | |
只读 |
GP Schema 对象 |
输出数据集的方案。 | |
只读 |
GP Filter 对象 |
要应用于参数中的值的过滤器。 | |
读/写 |
字符串 |
用于绘制输出的图层文件 (.lyr) 的路径名。 | |
message |
只读 |
字符串 |
要向用户显示的消息。请参阅上文的 SetErrorMessage 和 SetWarningMessage。 |
下面显示了一些代码示例。有关其他代码示例,请参阅自定义脚本工具行为。
ToolValidator 属性与脚本工具属性
参数的默认值、过滤器、符号系统和依赖性既可在脚本工具的属性对话框的参数选项卡上进行设置,也可在 ToolValidator 类中设置。
ToolValidator 中设置的属性会始终覆盖在脚本工具属性对话框中设置的属性。例如,如果在脚本工具属性对话框中将参数的默认值设置为“BLUE”,然后使用 initializeParameters() 将它重置为“RED”,则默认值会变为“RED”。调用 initializeParameters() 后,脚本工具属性对话框会将“RED”显示为默认值。如果您(或您的用户)遇到在脚本的属性对话框中对这四个参数属性中某一个所作更改未得到保存的情况,则可能是因为属性在 ToolValidator 类内被覆盖。
parameterDependencies
通常会设置参数依赖性以供 Schema 对象使用。在两种情况下可能已经在工具属性的参数选项卡中设置了依赖项。
- 对于类型为“派生”的输出数据集参数,依赖项为参数的索引,可由此派生输出。
- 对于特定的输入数据类型,依赖项为含有控件所用信息的参数的索引,如下表所示。
输入数据类型 |
依赖数据类型 |
描述 |
---|---|---|
字段或 SQL 表达式 |
表 |
含有字段的表。 |
INFO 项目或 INFO 表达式 |
INFO 表 |
含有项目的 INFO 表。 |
Coverage 要素类 |
Coverage |
包含要素的 coverage。 |
面积单位或线性单位 |
地理数据集 |
用于确定默认单位的地理数据集。 |
坐标系 |
工作空间 |
用于确定默认坐标系的工作空间。 |
网络分析等级设置 |
网络数据集 |
包含等级信息的网络数据集。 |
地统计值表 |
地统计图层 |
包含表的分析图层。 |
依赖项通常在 initializeParameters() 方法中进行设置:
def initializeParameters(self): # Set the dependencies for the output and its schema properties # self.params[2].parameterDependencies = [0, 1]
value
这是由用户输入的或者通过编程方式设置的参数值。可以在 initializeParameters() 中设置 value,此时它用作参数的初始默认值。还可在 updateParameters() 中设置 value 以响应用户输入(查看示例)。
请不要在 updateMessages() 中设置参数值,否则内部验证例程将不会验证该值。
value 是具有字符串表达形式的对象。下面的代码片段用于测试 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 == "Get Spatial Weights From File": self.params[8].enabled = True else: self.params[8].enabled = False
如果参数数据类型为要素类或者任何表示数据集的值,则采用上述代码的测试将无法正常进行。表示磁盘中数据的值(例如要素类和栅格)需要在执行字符串操作之前转换为字符串。内置 Python 函数 str 可将 value 对象转换为字符串,如下所示:
if str(self.params[0].value) == "E:/data/example.gdb/roads":
只需将 str 函数用于具有表示数据集的数据类型的值。对于这些类型的值,str 函数会将目录路径返回至数据集。不需要为其他数据类型(例如长整型或线性单位)使用该函数,因为这些数据类型并不表示数据集,并且会自动转换为字符串。
使用 ToolValidator 中的地理处理 Describe() 方法时,切勿使用值的字符串表达形式。
不正确(使用了 str 函数):
desc = arcpy.Describe(str(self.params[0].value))
正确:(未使用 str)
desc = arcpy.Describe(self.params[0].value)
不应使用字符串表示数据集(该数据集生成数据集的目录路径),因为数据集可能不存在 - 它可能是模型派生变量,因而必须先运行模型,然后才会在磁盘中存在数据集。如果使用字符串表示数据集,Describe 会失败,因为在磁盘上可能尚未存在数据集。
请不要使用采用目录路径的地理处理对象方法,例如 ToolValidator 中的 ListFields。在模型构建器中验证工具时数据集可能并不存在,因此方法可能会失败。(在采用 ListFields 时,可以使用 Describe 对象的 fields 属性。)
如果要测试字符串是否相等,在比较时应区分大小写。下列代码说明了使用 Python lower 函数将要素类的形状类型转换为小写并比较小写字符串的过程。(此外,可使用 upper 函数比较大写字符串。)
fc = self.params[0].value shapetype = arcpy.Describe(fc).shapeType.lower() if shapetype == "point" or shapetype == "multipoint":
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). # import string if self.params[0].value and not self.params[0].hasBeenValidated: if not self.params[6].altered: extent = arcpy.Describe(self.params[0].value).extent width = extent.width height = extent.height if width > height: self.params[6].value = width / 100 else: self.params[6].value = height / 100
category
您可以通过将参数放入不同类别来最小化工具对话框的大小。Network Analyst 工具使用了各种类别,如下所示。
您仅可设置类别一次,请在 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 属性用于将图层文件 (.lyr) 与输出参数关联在一起。
params[2].symbology = "E:/tools/extraction/ToolData/ClassByDist.lyr"
schema 对象
类型为要素类、表、栅格或工作空间的每个输出参数都具有 schema 对象。只有输出要素类、表、栅格和工作空间具有 schema,其他类型则没有。schema 对象通过地理处理进行创建。可以通过参数对象访问此方案,或者设置规则以便描述工具的输出。在设置方案规则并从 ToolValidator 类获得返回值之后,地理处理内部验证代码会检查设置的规则并更新输出的描述。
回顾一下,控制流程如下:
- 在首次打开工具对话框时调用 initializeParameters()。设置静态规则(不会因用户输入而发生改变的规则)以描述输出。此时不会创建任何输出描述,因为用户尚未指定任何参数的值(除非已提供默认值)。
- 一旦用户与工具对话框通过任何方式发生交互,就会调用 updateParameters()。
- updateParameters() 可通过修改 schema 对象来解释无法根据参数依赖项确定的动态行为(例如像“添加字段”工具一样添加新字段)。
- 从 updateParameters() 获得返回值后,调用内部验证例程并通过应用 schema 对象中的规则更新输出数据的描述。
- 然后调用 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”、“FirstDependencyFIDsOnly”、“All”、“AllNoFIDs”、“AllFIDsOnly” |
additionalFields |
字段对象的 Python 列表 |
cellSizeRule |
字符串:“AsSpecified”、“FirstDependency”、“Min”、“Max”、“Environment” |
cellsize |
双精度型 |
rasterRule |
字符串:“FirstDependency”、“Min”、“Max”、“Integer”、“Float” |
rasterFormatRule |
字符串:“Img”、“Grid” |
additionalChildren |
要添加到工作空间方案的数据集的 Python 列表 |
使用 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 后,所有基于规则的方法(例如 featureTypeRule、geometryTypeRule 和 extentRule)均设置为“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” |
要素类型将与依赖项中的第一个参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
featureType
当 featureTypeRule 为“AsSpecified”时,featureType 中的值用于指定输出的要素类型。
值 |
描述 |
---|---|
“Simple” |
输出将包含简单要素。要素的几何类型通过 geometryTypeRule 指定。 |
“Annotation” |
输出将包含注记要素。 |
“Dimension” |
输出将包含尺寸要素。 |
geometryTypeRule
该设置用于确定输出要素类的几何类型(例如点或面)。
值 |
描述 |
---|---|
“Unknown” |
这是默认设置。通常,应该能够根据其他参数值确定 updateParameters() 中的几何类型。如果没有足够的信息用于确定几何类型(例如在 initializeParameters() 中),只需将规则设置为“Unknown”即可。 |
“FirstDependency” |
几何类型与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
“Min”、“Max” |
检查所有依存参数的几何,并将输出几何类型设置为找到的最小类型或最大类型。“Min”和“Max”定义如下:
|
“AsSpecified” |
几何类型将通过 geometryType 属性的值确定。 |
geometryType
当 geometryTypeRule 为“AsSpecified”时,将该属性设置为要使用的几何类型(“Point”、“Multipoint”、“Polyline”或“Polygon”)。
extentRule
值 |
描述 |
---|---|
“AsSpecified” |
输出范围将在 extent 属性中指定。 |
“FirstDependency” |
输出范围与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
“Intersection” |
输出范围将是所有依存参数的几何交集。(这是裁剪工具使用的输出范围,如下所示。) |
“Union” |
输出范围将是所有依存参数的几何并集。 |
“Environment” |
输出范围将基于输出范围环境设置进行计算。 |
示例
# 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”时,将该属性设置为要使用的范围。可使用以空格分隔的字符串或者使用含有四个值的 Python 列表对象来设置范围。顺序为 xmin、ymin、xmax、ymax。
示例
self.params[2].schema.extentRule = "AsSpecified" self.params[2].schema.extent = "123.32 435.8 987.3 567.9"
或者使用 Python 列表
xmin = 123.32 ymin = 435.8 xmax = 987.3 ext = [xmin, ymin, xmax, 567.9] self.params[2].schema.extent = ext
fieldsRule
fieldsRule 用于确定将在输出要素类或输出表上存在的字段。
在下表中,FID 代表“要素 ID”,但实际上是指每个要素类或表中的 ObjectID 字段。
值 |
描述 |
---|---|
“None” |
除对象 ID 以外,将不输出任何字段。 |
“FirstDependency” |
输出字段将与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
“FirstDependencyFIDsOnly” |
只有第一个依存输入的 ObjectID 会写入到输出中。 |
“All” |
将输出依存参数列表中的所有字段。 |
“AllNoFIDs” |
除 ObjectID 以外的所有字段都将写入到输出中。 |
“AllFIDsOnly” |
所有 ObjectID 字段都将写入到输出中,但是输入中的其他字段不会写入。 |
使用 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 将采用字段对象的 Python 列表。
cellSizeRule
此属性用于确定输出栅格或输出格网的像元大小。
值 |
描述 |
---|---|
“AsSpecified” |
输出像元大小在 cellSize 属性中指定。 |
“FirstDependency” |
像元大小由第一个依存参数进行计算。如果依存参数是栅格,就会使用它的像元大小。对于其他类型的依存参数,例如要素类或要素数据集,数据范围用于计算像元大小。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
“Min”、“Max” |
“Min”表示输出像元大小是依存参数的最小像元大小。“Max”表示它是依存参数的最大像元大小。 |
“Environment” |
输出像元大小基于 cellsize 环境设置进行计算。 |
cellSize
当 cellSizeRule 为“AsSpecified”时,将该属性设置为要使用的像元大小。
rasterRule
该属性将确定输出栅格中包含的数据类型(整型或浮点型)。
值 |
描述 |
---|---|
“FirstDependency” |
数据类型(整型或浮点型)与第一个依存参数相同。如果第一个依存参数为多值(值列表),则会使用多值列表中的第一个值。 |
“Min”、“Max” |
整数被视为小于浮点数。例如,如果有两个依存参数,一个包含整数,另一个包含浮点数,则“Min”创建整型输出,“Max”创建浮点型输出。 |
“Integer” |
输出栅格包含整型数(整数)。 |
“Float” |
输出栅格包含浮点数(小数)。 |
rasterFormatRule
该属性确定输出栅格格式,“Grid”或“Img”。默认值为“Img”,它是 ERDAS IMAGINE 格式。“Grid”是 ESRI 的格式。
additionalChildren
工作空间是保存数据集(要素、表和栅格)的容器。这些数据集相当于工作空间的子辈(如果将工作空间看作父辈的话)。如果工具将数据集添加到新的或者现有的工作空间中,那么可通过添加对子辈的描述来更新工作空间的描述。例如,工具可采用要素类列表(多值),以某种方式进行修改,然后将修改后的要素类写入现有工作空间。在模型构建器中使用此工具时,工作空间就是派生的工具输出,可能会需要将该工作空间用作选择数据工具的输入。通过选择数据可以选择容器中的某个子数据集,并将它用作其他工具的输入。
additionalChildren 的输入是对子辈的一个或多个描述。对子辈的描述分为两种形式:
形式 |
描述 |
---|---|
value 对象 |
value 属性可返回要素类、表、栅格、尺寸或注记值。示例: inFeatures = self.params[0].value |
[类型, 名称, 字段, 范围, 空间参考] 形式的 Python 列表对象 |
含有要添加的子辈描述的 Python 列表。列表中只有前两个条目“类型”和“名称”是必需的。其余参数均为可选。 |
添加多个子辈时,可以提供子辈描述的列表。如果使用 Python 列表对象形式添加子辈,将会为 additionalChildren 创建列表的列表。
Python 列表形式具有五个参数,如下表中所述。
参数 |
类型 |
描述 |
---|---|---|
类型 |
必选项 |
可用值包括:“Point”、“Multipoint”、“Polyline”、“Polygon”、“Table”、“Raster”、“Annotation”、“Dimension” |
名称 |
必选项 |
数据集的名称。可以是数据集的基本名称(“streets”)或完整目录路径(“E:\mydata\test.gdb\infrastructure\streets”)。在给定完整目录路径的情况下,基本名称(“streets”)以外的内容都将被忽略。 |
字段 |
可选 |
Python 字段对象列表。这包含子辈中出现的字段(如果已知)。 |
范围 |
可选 |
包含子辈空间范围的字符串或 Python 列表。 |
空间参考 |
可选 |
空间参考对象。 |
这些参数必须按照下列顺序提供。要跳过可选参数,可使用 Python 关键字 None 或“#”。
以下是设置工作空间方案的一些示例。这些示例基于具有下列参数的脚本工具:
参数名称 |
属性 | |
---|---|---|
0 |
输入要素类 |
要素类 — 输入。 |
1 |
输入表 |
表 — 输入。 |
2 |
输入工作空间 |
工作空间 — 输入(包含工具结果的现有工作空间)。 |
3 |
派生工作空间 |
工作空间 — 派生输出,获取自 Input_workspace。该工作空间的方案经修改可包含其他子辈。 |
此工具获取输入要素类和表,将它们复制到工作空间,向要素类添加新字段,然后在工作空间中创建新的面要素类。(此工具的实际作用并不是很重要,因为它仅仅是用于举例说明工作空间方案的设置。)以下代码示例基于另一个代码示例,从 additionalChildren 的简单用法开始。如果选择实施和测试以下代码示例中的某些代码,可使用下面的模型测试代码。
在 initializeParameters() 中,输出工作空间通过其依存参数(参数 2)进行克隆。此依赖项不仅可在工具属性中设置,还可在 initializeParameters() 中设置,以防止用户移除工具属性中的依赖项。
class ToolValidator: def __init__(self): import arcpy 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
示例:此工具可创建一个新的面要素类。与该新要素类有关的已知属性(验证时)仅有名称(“SummaryPoly”)和类型(“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 Python 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 class ToolValidator: def __init__(self): import arcpy 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 类中设置值(示例如下所示)。地理处理将自动为字符串、长整型、双精度型、要素类、文件、字段和工作空间类型的参数创建过滤器。即使不在工具的属性对话框中选择过滤器,参数仍会关联一个过滤器 - 只不过它是空的。空过滤器等同于没有过滤器。通过向空过滤器添加值以激活过滤器,而用户的选择会受到过滤器内容的限制。
过滤器分为六种类型,如下表所示:
过滤类型 |
值 |
---|---|
ValueList |
字符串或数值的列表。采用字符串型、长整型、双精度型和布尔型数据类型。 |
范围 |
最小值和最大值。采用长整型和双精度型数据类型。 |
要素类 |
允许的要素类类型列表,使用值“点”、“多点”、“折线 (Polyline)”、“面”、“多面体 (MultiPatch)”、“球体”、“注记”和“维度”进行指定。可为过滤器提供多个值。 |
文件 |
文件后缀列表,例如“.txt”、“.e00”、“.ditamap”。 |
字段 |
允许的字段类型列表,使用值“短整型”、“长整型”、“单精度”、“双精度”、“文本”、“日期”、“OID”、“几何”、“Blob”、“栅格”、“GUID”、“GlobalID”、“XML”进行指定。可为过滤器提供多个值。 |
工作空间 |
允许的工作空间类型列表,使用值“文件系统”、“本地数据库”和“远程数据库”进行指定。可提供多个类型值。 |
属性
属性 |
描述 |
---|---|
类型 |
过滤器的类型(ValueList、范围、要素类、文件、字段和工作空间)。在处理长整型参数和双精度型参数时,可设置过滤器的类型(请参阅下面的注释)。对于其他类型的参数,仅有一种有效的过滤器类型,所以可以忽略这些参数的类型设置。如果不想过滤值,可将列表属性设置为空列表。 |
列表 |
过滤器的 Python 值列表。如果不想过滤值,可将列表属性设置为空列表。 |
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]
仅可为长整型和双精度型参数设置过滤器类型。
要素类
以下示例显示了如何根据另一个输入参数的要素类型设置某个输入参数的要素类型。
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].value: desc = arcpy.Describe(self.params[0].value) 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 == "point" or \ feature_type == "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”。
显示名称与内部名称
具有内部名称的字段类型有四种,如下表所示。
显示名称 |
内部名称 |
---|---|
短整型 |
SmallInteger |
长整型 |
Integer |
浮动 |
Single |
文本 |
String |
在指定字段过滤器时,可以使用显示名称,也可以使用内部名称。也就是说,下列两行代码是等效的:
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].value and not self.params[1].altered: self.params[1].value = "" desc = arcpy.Describe(self.params[0].value) fields = desc.fields # Set default to the first field that matches our filter # for field in fields: fType = field.type.lower() if fType == "smallinteger" or \ fType == "integer" or \ fType == "single" or \ fType == "double": self.params[1].value = field.name break return
请不要使用 ToolValidator 中的地理处理 ListFields 函数。应使用 Describe 函数,如上所示。
工作空间
工作空间过滤器用于指定允许的输入工作空间的类型。共有三个值:
- “文件系统”
系统文件夹,用于存储 shapefile、ArcInfo coverage、INFO 表和格网
- “本地数据库”
个人地理数据库或文件地理数据库
- “远程数据库”
ArcSDE 数据库连接