This example emulates the Add Field tool validation. Since Add Field is a built-in tool, it doesn't have a ToolValidator class. But if it did, it would look something like this.
For review, here are the parameters for Add Field and their data types:
- 0 - Input Table: Composite data type, includes all tables
- 1 - Field Name: String
- 2 - Field Type: String (LONG, SHORT, DOUBLE, and so on)
- 3 - Field Precision: Long
- 4 - Field Scale: Long
- 5 - Field Length: Long
- 6 - Field Alias: String
- 7 - Field IsNullable: Boolean
- 8 - Field IsRequired: Boolean
- 9 - Field Domain: String
- 0 - Output Table: Derived output, obtained from parameter 0
This example emulates the Add Field tool validation
class ToolValidator:
def __init__(self):
import arcpy
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
# The derived output is a clone (copy) of the input
#
self.params[10].parameterDependencies = [0]
self.params[10].schema.clone = True
# Set up the field type list
#
self.params[2].filter.list = ["TEXT", "FLOAT", "DOUBLE",
"SHORT", "LONG", "DATE",
"BLOB", "RASTER"]
# The default field type is LONG
#
self.params[2].value = "LONG"
# Field scale & Length are disabled for LONG types
#
self.params[4].enabled = False
self.params[5].enabled = False
# Set the Boolean filters for IsNullable and IsRequired and
# their default values
#
self.params[7].filter.list = ["NULLABLE", "NON_NULLABLE"]
self.params[7].value = "NULLABLE"
self.params[8].filter.list = ["REQUIRED", "NON_REQUIRED"]
self.params[8].value = "NON_REQUIRED"
return
def updateParameters(self):
# Set the default field type value unless the user altered it
#
if not self.params[2].altered:
self.params[2].value = "LONG"
# Enable/Disable parameters based on field type
#
fieldType = self.params[2].value.upper()
if fieldType in ["TEXT", "BLOB"]:
self.params[3].enabled = False
self.params[4].enabled = False
self.params[5].enabled = True
elif fieldType in ["FLOAT", "DOUBLE"]:
self.params[3].enabled = True
self.params[4].enabled = True
self.params[5].enabled = False
elif fieldType in ["SHORT", "LONG"]:
self.params[3].enabled = True
self.params[4].enabled = False
self.params[5].enabled = False
elif fieldType in ["DATE", "RASTER"]:
self.params[3].enabled = False
self.params[4].enabled = False
self.params[5].enabled = False
else:
# Unknown field type. Internal validation will catch this
# and show an error. We might as well return here and let
# internal validation do its work.
#
return
# Update the output schema with the new field. Don't do anything
# unless we have an input value and a field name
#
if self.params[0].value and self.params[1].value:
newField = arcpy.Field()
newField.name = self.params[1].value
newField.type = self.params[2].value
# Set up the field properties based on type of field
#
if self.params[3].value and self.params[3].enabled:
newField.precision = self.params[3].value
if self.params[4].value and self.params[4].enabled:
newField.scale = self.params[4].value
if self.params[5].value and self.params[5].enabled:
newField.length = self.params[5].value
if self.params[6].value:
newField.aliasName = self.params[6].value
newField.isNullable = self.params[7].value
# Note: IsRequired is not a property on a field object -- it's
# handled internally by the Add Field system tool.
#
if self.params[9].value:
newField.domain = self.params[9].value
# Set the additional field on the output schema
#
self.params[10].schema.additionalFields = [newField]
def updateMessages(self):
return