Programar una clase ToolValidator

Para obtener una vista general de la clase ToolValidator y el uso de los métodos de parámetro, consulte Personalizar el comportamiento de las herramientas de secuencia de comandos.

Objeto de parámetro

Acceso a los parámetros de la herramienta

Cada parámetro de la herramienta tiene un objeto de parámetro con propiedades y métodos útiles en la validación de la herramienta. Los parámetros se incluyen en una lista de Python. La práctica estándar es crear la lista de parámetros en el método __init__ de la clase ToolValidator, según se muestra en el código a continuación.

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

También es posible acceder a los parámetros de la secuencia de comandos (a diferencia de la clase ToolValidator) tal como se muestra a continuación. La única razón para acceder a la lista de parámetros de dentro de una secuencia de comandos es para configurar la propiedad symbology.

import arcpy
params = arcpy.GetParameterInfo()

Más información sobre la configuración de simbología en secuencias de comandos

Orden de parámetros

Los parámetros de una herramienta y su orden se definen en la pestaña Parámetros de las propiedades de la herramienta, como se ilustra a continuación.

Los parámetros y su orden
NotaNota:

La lista de parámetros comienza en 0; por lo tanto, el primer parámetro está en la posición cero de la lista. Para obtener acceso al tercer parámetro, introducirá p3 = self.params[2].

Métodos

Nombre del método

Descripción de uso

setErrorMessage(message:string)

Marca un error (una X roja) en el parámetro con el mensaje proporcionado. Las herramientas no se ejecutan si alguno de los parámetros tiene un error.

setWarningMessage(message:string)

Marca una advertencia (un triángulo amarillo) en el parámetro con el mensaje proporcionado. A diferencia de los errores, las herramientas se ejecutan cuando hay mensajes de advertencia.

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

Le permite configurar un mensaje del sistema. Los argumentos son los mismo que en la función AddIDMessage.

clearMessage()

Borra todo el texto del mensaje y configura el estado como informativo (sin errores ni advertencias).

hasError()

Devuelve verdadero si el parámetro contiene un error.

hasWarning()

Devuelve verdadero si el parámetro contiene una advertencia.

isInputValueDerived()

Devuelve verdadero si la herramienta se está validando dentro de un modelo y el valor de entrada es la salida de otra herramienta en el modelo.

Métodos del objeto de parámetro

Propiedades

Nombre de propiedades

Lectura/escritura

Valores

Descripción

name

Solo lectura

Cadena de caracteres

Nombre del parámetro según se define en la pestaña Parámetros de las propiedades de la herramienta.

direction

Solo lectura

Cadena de caracteres: "Input", "Output"

La dirección de entrada o salida del parámetro según se define en la pestaña Parámetros de las propiedades de la herramienta.

datatype

Solo lectura

Cadena de caracteres

Tipo de datos según se define en la pestaña Parámetros de las propiedades de la herramienta.

parameterType

Solo lectura

Cadena de caracteres: "Required", "Optional", "Derived"

Tipo según se define en la pestaña Parámetros de las propiedades de la herramienta.

parameterDependencies

Lectura/escritura

Lista de Python

Una lista de índices de cada parámetro dependiente.

value

Lectura/escritura

Objeto de valor

El valor del parámetro.

defaultEnvironmentName

Solo lectura

Cadena de caracteres

La configuración de entorno predeterminada según se define en la pestaña Parámetros de las propiedades de la herramienta.

enabled

Lectura/escritura

Booleano

Falso si el parámetro está atenuado (no disponible).

altered

Solo lectura

Booleano

Verdadero si el usuario modificó el valor.

hasBeenValidated

Solo lectura

Booleano

Verdadero si la rutina de validación interna verificó el parámetro.

category

Lectura/escritura

Cadena de caracteres

La categoría del parámetro.

schema

Solo lectura

Objeto de esquema de GP

El esquema del dataset de salida.

filter

Solo lectura

Objeto de filtro de GP

El filtro que se aplicará a los valores en el parámetro.

symbology

Lectura/escritura

Cadena de caracteres

La ruta al archivo de capa (.lyr) que se utiliza para dibujar la salida.

message

Solo lectura

Cadena de caracteres

El mensaje que se mostrará al usuario. Vea SetErrorMessage y SetWarningMessage arriba.

Propiedades del objeto de parámetro

Algunos ejemplos de códigos se muestran a continuación. Para otros ejemplos de códigos, consulte Personalizar el comportamiento de las herramientas de secuencia de comandos.

Propiedades de ToolValidator frente a propiedades de la herramienta de secuencia de comandos

Un valor predeterminado, un filtro, una simbología y unas dependencias del parámetro pueden configurarse tanto en la pestaña Parámetros del cuadro de diálogo de las propiedades de la herramienta de secuencia de comandos como en la clase ToolValidator.

Las propiedades que se establecen en ToolValidator siempre invalidan las configuradas en el cuadro de diálogo de las propiedades de la herramienta de secuencia de comandos. Por ejemplo, si se configura el valor predeterminado de un parámetro como "AZUL" en el cuadro de diálogo de las propiedades de la herramienta de secuencia de comandos y se restablece a "ROJO" en initializeParameters(), el valor predeterminado pasa a ser "ROJO". En cuanto se invoque initializeParameters(), el cuadro de diálogo de las propiedades de la herramienta de secuencia de comandos mostrará "ROJO" como valor predeterminado. Si usted (o los usuarios) se encuentran en la situación en la cual no se consigue guardar los cambios que se realizan en una de estas cuatro propiedades de parámetros en el cuadro de diálogo de propiedades de la secuencia de comandos, es posible que la propiedad esté invalidada dentro de la clase ToolValidator.

parameterDependencies

Por lo general, configura las dependencias del parámetro para que las utilice el objeto de esquema. Existen dos casos donde las dependencias ya puede estar configuradas en la pestaña Parámetros de las propiedades de la herramienta.

  • Para un parámetro de dataset de salida cuyo tipo es Derivado, la dependencia es el índice del parámetro desde el cual se deriva la salida.
  • Para determinados tipos de datos de entrada, la dependencia es el índice del parámetro que contiene la información utilizada por el control, según se muestra en la tabla a continuación.

Tipo de datos de entrada

Tipo de datos dependientes

Descripción

Campo o expresión de SQL

Tabla

La tabla que contiene los campos.

Elemento de INFO o expresión de INFO

Tabla INFO

La tabla INFO que contiene los elementos.

Clase de entidad de cobertura

Cobertura

La cobertura que contiene las entidades.

Unidades de área o unidades lineales

GeoDataset

Un dataset geográfico utilizado para determinar las unidades por defecto.

Sistema de coordenadas

Espacio de trabajo

Un espacio de trabajo utilizado para determinar el sistema de coordenadas predeterminado.

Configuración de jerarquía de Network Analyst

Dataset de red

El dataset de red que contiene la información de jerarquía.

Tabla de valores de estadísticas geográficas

Capa de estadísticas geográficas

La capa de análisis que contiene las tablas.

Tipos de datos de Obtenido de

Por lo general, las dependencias se establecen en el método initializeParameters().

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

value

Este valor es del parámetro que el usuario introdujo o usted configuró de forma programada. Puede configurar el valor en initializeParameters(), en cuyo caso sirve como valor predeterminado inicial del parámetro. También se pueden configurar valores en updateParameters() en respuesta a datos introducidos por el usuario tal como se muestra a continuación.

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].value:
        if not self.params[6].altered:
            extent = arcpy.Describe(self.params[0].value).extent
        if extent.width > extent.height:
            self.params[6].value = extent.width / 100
        else:
            self.params[6].value = extent.height / 100

    return

La propiedad value de un parámetro devuelve un objeto a menos que no se haya asignado ningún valor al parámetro, en cuyo caso value devuelve None. Para protegerse frente a la posibilidad de que un parámetro esté vacío, utilice una comprobación con if antes de utilizar su valor.

El fragmento de código a continuación evalúa si el valor es igual a la cadena de texto "Get Spatial Weights From File". Esta prueba funciona porque el tipo de datos del parámetro es una cadena de texto.

# 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

Puesto que un objeto Value no admite la manipulación de la cadena de caracteres, utilice la propiedad value del objeto Value cuando necesite manipular o analizar una cadena de caracteres. La muestra de código utiliza el método os.path.dirname para devolver el directorio de un dataset.

if self.params[0].value:
  workspace = os.path.dirname(self.params[0].value.value)
PrecauciónPrecaución:

A excepción de Describe, no utilice métodos que empleen una ruta de catálogo, como ListFields, para validaciones. Podría suceder que el dataset no existiese al validar la herramienta en ModelBuilder y el método fallase o diese resultados inesperados.

En el caso particular de ListFields, la propiedad fields del objeto Describe proporcionará la información equivalente.

PrecauciónPrecaución:

No configure un valor de parámetro en updateMessages() dado que el valor no se validará mediante la rutina de validación interna.

altered

altered es verdadero si el usuario cambió el valor de un parámetro, por ejemplo al introducir una ruta de salida. Una vez que el parámetro se ha alterado, permanece así hasta que el usuario vacía (borra) el valor, en cuyo caso vuelve a estar no alterado. Cambiar un valor de forma programada con un código de validación no cambia el estado alterado. Es decir, si configura un valor para un parámetro, el estado alterado del parámetro no cambia.

altered se utiliza para determinar si se puede cambiar el valor de un parámetro. A modo de ejemplo, suponga que una herramienta tiene un parámetro de clase de entidad y un parámetro de palabra clave. Si la clase de entidad contiene puntos o polígonos, las palabras clave son ROJO, VERDE y AZUL, y si contiene líneas, NARANJA, AMARILLO, PÚRPURA y BLANCO.

Suponga que el usuario introduce una clase de entidad de punto. Si el parámetro de palabra clave no está alterado, configura el valor como ROJO, dado que es el valor por defecto.

Si se introduce una clase de entidad de línea, configura el valor predeterminado como NARANJA siempre que el parámetro de palabra clave esté no alterado.

No obstante, si el usuario ha alterado el parámetro de palabra clave (es decir, la palabra clave se configura como VERDE), no debe restablecer la palabra clave; el usuario ha realizado su elección (VERDE) y no conoce la intención; es posible que cambien la clase de entidad para que VERDE sea válido o pueden cambiar la palabra clave (por ejemplo, a PÚRPURA). Puesto que VERDE no es un miembro del conjunto que creó para las líneas, la validación interna indica un error del parámetro. El usuario tiene dos opciones en este punto: cambiar la clase de entidad de entrada o cambiar la palabra clave.

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

hasBeenValidated

hasBeenValidated es falso si el usuario ha modificado un valor de un parámetro desde la última vez que se llamó a updateParameters() y a la validación interna. Una vez que se invoca la validación interna, el geoprocesamiento establece automáticamente hasBeenValidated como verdadero para cada parámetro.

hasBeenValidated se utiliza para determinar si el usuario ha cambiado un valor desde la última invocación de updateParameters(). Puede utilizar esta información al decidir si hará su verificación propia del parámetro.

# 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

Puede colocar parámetros en categorías diferentes para minimizar el tamaño del cuadro de diálogo de la herramienta. Las herramientas de Extensión ArcGIS Network Analyst utilizan categorías como se indica a continuación.

Categorías de parámetro

Dado que sólo puede configurar la categoría una vez, configúrela en initializeParameters(). La configuración de categorías en updateParameters() no surte ningún efecto. El código a continuación muestra cómo colocar los parámetros 4 y 5 en la categoría "Opciones" y los parámetros 6 y 7 en la categoría "Avanzada".

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

Las categorías siempre se muestran después de los parámetros no categorizados. No coloque los parámetros requeridos en categorías, dado que el usuario puede no verlos en el cuadro de diálogo de la herramienta.

symbology

La propiedad symbology relaciona un archivo de capa (.lyr) con un parámetro de salida.

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

Más información sobre la simbología de salida

Objeto schema

Cada parámetro de salida de tipo clase de entidad, tabla, ráster o espacio de trabajo tiene un objeto de esquema. Solo las clases de entidad de salida, las tablas, los rásteres y los espacios de trabajo tienen esquema; otros tipos, no. El objeto de esquema se crea mediante el geoprocesamiento. Accede a este esquema por medio del objeto de parámetro y configura las reglas para describir la salida de su herramienta. Después de configurar las reglas del esquema y como resultado desde la clase ToolValidator, el código de validación interna de geoprocesamiento examina las reglas configuradas y actualiza la descripción de la salida.

A modo de revisión, el flujo de control es el siguiente:

  1. Al abrir el cuadro de diálogo de la herramienta por primera vez, se invoca initializeParameters(). Usted configura las reglas estáticas (reglas que no cambian según la entrada del usuario) para describir la salida. No se genera ninguna descripción de salida en este momento, dado que el usuario no tiene valores especificados para ninguno de los parámetros (a menos que haya proporcionado valores predeterminados).
  2. Una vez que el usuario interactúa con el cuadro de diálogo de la herramienta de algún modo, se invoca updateParameters().
  3. updateParameters() puede modificar el esquema para asumir el comportamiento dinámico que no puede determinarse a partir de las dependencias entre parámetros, como agregar un campo nuevo con Agregar campo.
  4. Después de regresar de updateParameters(), se invocan las rutinas de validación internas y se aplican las reglas que se encuentran en el objeto de esquema para actualizar la descripción de los datos de salida.
  5. A continuación se invoca updateMessages(). Puede examinar los mensajes de advertencia y de error que la validación interna puede haber creado y modificarlos o agregar mensajes de advertencias y errores propios.

Todas las propiedades del schema se leen y escriben a excepción del type, que es de solo lectura.

Nombre de propiedades

Valores

type

Cadena de caracteres: "Feature", "Table", "Raster", "Container" (para espacios de trabajo y datasets de entidad) (Propiedad de solo lectura)

clone

Booleano

featureTypeRule

Cadena de caracteres: "AsSpecified", "FirstDependency"

featureType

Cadena de caracteres: "Simple", "Annotation", "Dimension"

geometryTypeRule

Cadena de caracteres: "Unknown", "FirstDependency", "Min", "Max", "AsSpecified"

geometryType

Cadena de caracteres: "Point", "Multipoint", "Polyline", "Polygon"

extentRule

Cadena de caracteres: "AsSpecified", "FirstDependency", "Intersection", "Union", "Environment"

extent

Objeto de extensión

fieldsRule

Cadena de caracteres: "None", "FirstDependency", "FirstDependencyFIDs", "All", "AllNoFIDs", "AllFIDsOnly"

additionalFields

Lista de Python de objetos de campo

cellSizeRule

Cadena de caracteres: "AsSpecified", "FirstDependency", "Min", "Max", "Environment"

cellsize

Doble

rasterRule

Cadena de caracteres: "FirstDependency", "Min", "Max", "Integer", "Float"

rasterFormatRule

Cadena de caracteres: "Img", "Grid"

additionalChildren

Lista de Python de datasets para agregar un esquema de espacio de trabajo

Propiedades del objeto del esquema

Uso de FirstDependency

Se pueden establecer varias reglas en "FirstDependency", lo que significa que se desea utilizar el valor del primer parámetro que se encuentre en el conjunto de dependencias del parámetro establecido con parameter.parameterDependencies. En el ejemplo de código a continuación, el parámetro 2 tiene dos parámetros dependientes, 0 y 1 y la primera dependencia es el parámetro 0.

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

Si todo parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

type

La propiedad type es de solo lectura y se establece mediante geoprocesamiento.

clon

Si es verdadero, instruye el geoprocesamiento para realizar una copia exacta (clon) de la descripción en el primer parámetro dependiente de la lista de dependencia de parámetros en la lista de dependencia del parámetro. El valor predeterminado es falso. Por lo general, clone se establece como verdadero en el método initializeParameters(). Si el primer parámetro dependencia es un valor múltiple (una lista de valores), se clona el primer valor en la lista de valores múltiples.

  • Si parameter.parameterType es "Derived" (Derivado), se hace una copia exacta. Este es el comportamiento de la herramienta Agregar campo.
  • Si parameter.parameterType es "Required" (Requerido), también se realiza una copia exacta, pero cambia la ruta del catálogo al dataset. Las rutas de catálogo constan de dos partes: el espacio de trabajo y el nombre base. Por ejemplo:

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

    • Espacio de trabajo = E:/Data/TestData/netcity.gdb/infrastructure
    • Nombre base = carreteras
    Las reglas que se utilizan para construir nombres de salida nuevos son las siguientes:
    • El nombre base es el mismo que el nombre base del primer parámetro de entrada que contiene un dataset (no la primera dependencia sino el primer parámetro) adjunto con el nombre de la herramienta de secuencia de comandos (por ejemplo, roads_MyTool).
    • El espacio de trabajo se establece como la configuración del entorno del espacio de trabajo temporal. Si éste está vacío, se utiliza la configuración del entorno del espacio de trabajo actual. Si está vacío, se utiliza el espacio de trabajo del primer parámetro de entrada que contiene un dataset. Si este espacio de trabajo es de sólo lectura, entonces se utiliza el directorio temporal del sistema.

Después de establecer clone como verdadero, todos los métodos basados en reglas, como featureTypeRule, geometryTypeRule y extentRule se establecen con "FirstDependency".

Los dos ejemplos de código a continuación realizan el trabajo equivalente. Los dos ejemplos se basan en cómo la herramienta Recortar crea el esquema de salida.

Ejemplo 1: establezca todas las reglas explícitamente
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
Ejemplo 2: Uso de clone para establecer las reglas en FirstDependency y, a continuación, invalidar la regla de extensión:
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

Esta configuración determina el tipo de entidad de la clase de entidad de salida. Esta regla no tiene efecto sobre los rásteres o las tablas de salida.

Valor

Descripción

"AsSpecified"

El tipo de entidad se determinará mediante la propiedad featureType.

"FirstDependency"

El tipo de entidad será el mismo que el primer parámetro en las dependencias. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

Valores de featureTypeRule

featureType

Cuando featureTypeRule es "AsSpecified", el valor de featureType se utiliza para especificar el tipo de entidad de la salida.

Valor

Descripción

"Simple"

La salida incluirá entidades simples. El tipo de geometría de las entidades se especifica con geometryTypeRule.

"Annotation"

La salida incluirá entidades de anotación.

"Dimension"

La salida incluirá entidades de dimensión.

Valores de featureType

geometryTypeRule

Esta configuración determina el tipo de geometría (como punto o polígono) de la clase de entidad de salida.

Valor

Descripción

"Unknown"

es la configuración predeterminada. Por lo general, se debe poder determinar el tipo de geometría en updateParameters() en función de los valores de otros parámetros. Solo establece la regla en "Unknown" si no tiene información suficiente para determinar el tipo de geometría.

"FirstDependency"

El tipo de geometría es el mismo que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

Examina las geometrías de todos los parámetros dependientes y establece el tipo de geometría de salida en el tipo máximo o mínimo encontrado. "Min" y "Max" se definen de la manera siguiente:

  • Punto y multipunto = 0
  • Polilínea = 1
  • Polígono = 2
Por lo tanto, si los parámetros dependientes fueran una clase de entidad de punto y polígono, el mínimo sería punto y el máximo sería polígono.

"AsSpecified"

El tipo de geometría se determina mediante el valor de la propiedad geometryType.

Valores de geometryTypeRule

geometryType

Establezca esto con el tipo de geometría a utilizar (ya sea "Point", "Multipoint", "Polyline" o "Polygon") cuando geometryTypeRule sea "AsSpecified".

extentRule

Valor

Descripción

"AsSpecified"

La extensión de salida se especifica en la propiedad extent.

"FirstDependency"

La extensión de salida es la misma que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Intersection"

La extensión de salida será la intersección geométrica de todos los parámetros dependientes. (Esto es lo que utiliza la herramienta Recortar, como se muestra a continuación).

"Union"

La extensión de salida será la combinación geométrica de todos los parámetros dependientes.

"Environment"

La extensión de salida se calculará según la configuración del entorno de la extensión de salida.

Valores de extentRule

Ejemplo

# 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

Establezca esto en la extensión que desee utilizar cuando extentRule sea "AsSpecified". Puede establecer la extensión con una cadena de texto delimitada por espacios o un objeto de lista de Python con cuatro valores. La secuencia es xmin, ymin, xmax, ymax.

Ejemplo

self.params[2].schema.extentRule = "AsSpecified"
self.params[2].schema.extent = "123.32 435.8 987.3 567.9"

o con una lista de Python

xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
self.params[2].schema.extent = ext

fieldsRule

fieldsRule determina qué campos existirán en la clase de entidad o tabla de salida.

En la tabla a continuación, FID representa Id. de entidad pero, en realidad, se refiere al campo ObjectID que se encuentra en cada clase o tabla de entidad.

Valor

Descripción

"None"

Ningún campo será de salida a excepción de Id. de objeto.

"FirstDependency"

Los campos de salida serán los mismos que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"FirstDependencyFIDs"

Sólo el ObjectID de la primera entrada dependiente se escribirá en la salida.

"All"

Todos los campos en la lista de parámetros dependientes serán de salida.

"AllNoFIDs"

Todos los campos excepto los ObjectID se escribirán en la salida.

"AllFIDsOnly"

Todos los campos del ObjectID se escriben en la salida pero no se escribirá ningún otro campo desde las entradas.

Valores de fieldsRule

Ejemplo de Recortar utilizando fieldsRule con "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

Además de los campos que se agregan mediante la aplicación de fieldsRule, puede agregar campos adicionales a la salida. additionalFields toma una lista de Python de objetos de tipo campo.

Vea un ejemplo del uso de AdditionalFields

cellSizeRule

Esto determina el tamaño de la celda de los rásteres o las cuadrículas de salida.

Valor

Descripción

"AsSpecified"

El tamaño de la celda de salida se especifica en la propiedad cellSize.

"FirstDependency"

El tamaño de la celda se calcula desde el primer parámetro dependiente. Si el parámetro dependiente es un ráster, entonces se utiliza su tamaño de celda. Para otros tipos de parámetros dependientes, como clases de entidad o datasets de entidad, la extensión de los datos se utiliza para calcular el tamaño de la celda. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

"Min" significa el tamaño de celda de salida más pequeño de los parámetros dependientes. "Max" significa el tamaño de celda más grande de los parámetros dependientes.

"Environment"

El tamaño de celda de salida se calcula según la configuración del entorno del tamaño de celda.

Valores de cellSizeRule

cellSize

Establezca esto al tamaño de celda que desee utilizar cuando cellSizeRule sea "AsSpecified".

rasterRule

Esto determina el tipo de datos, entero o flotante, incluido en el ráster de salida.

Valor

Descripción

"FirstDependency"

El tipo de datos (entero o flotante) es el mismo que el primer parámetro dependiente. Si el primer parámetro dependiente es un valor múltiple (una lista de valores), se utiliza el primer valor en la lista de valores múltiples.

"Min", "Max"

Entero se considera más pequeño que flotante. Por ejemplo, si hay dos parámetros dependientes, uno contiene enteros y el otro flotantes, "Min" crea una salida de entero y "Max" crea una salida de flotante.

"Integer"

El ráster de salida contiene enteros (números completos).

"Float"

El ráster de salida contiene flotantes (números fraccionarios).

Valores de rasterRule

rasterFormatRule

Esto determina el formato ráster de salida, ya sea "Grid" o "Img". La opción predeterminada es "Img", que es formato de ERDAS IMAGINE. "Grid" es el formato de Esri.

Más información acerca de los formatos de datos ráster

additionalChildren

Un espacio de trabajo es un contenedor para datasets (entidades, tablas y rásteres). Estos datasets son elementos secundarios del espacio de trabajo (considere el espacio de trabajo como el elemento principal). Si la herramienta agrega datasets a un espacio de trabajo existente o nuevo, puede actualizar la descripción del espacio de trabajo al agregar descripciones de los elementos secundarios. Por ejemplo, usted puede tener una herramienta que toma una lista de clases de entidad (un valor múltiple), las modifica de algún modo y después escribe las clases de entidad modificadas en un espacio de trabajo existente. Cuando se utiliza la herramienta en ModelBuilder, el espacio de trabajo es la salida derivada de la herramienta y es posible que quiera utilizar este espacio de trabajo como entrada a la herramienta Seleccionar datos. Seleccionar datos le permite seleccionar un dataset de elemento secundario que se encuentra en un contenedor y usarlo como entrada para otra herramienta.

El valor de entrada de additionalChildren es una o más descripciones de los elementos secundarios. Existen dos formas de descripciones de los elementos secundarios:

Forma

Descripción

Objeto value

Una clase de entidad, tabla, ráster, dimensión o valor de anotación, según lo que devuelva la propiedad value.

Objeto de lista de Python de la forma [tipo, nombre, campos, extensión, referencia espacial]

Una lista de Python que contiene una descripción del elemento secundario que se agregará. Sólo se requieren las primeras dos entradas en la lista, tipo y nombre. Los argumentos restantes son opcionales.

Listas de miembros de additionalChildren

Cuando agrega más de un elemento secundario, proporciona una lista de descripciones de los elementos secundarios. Si va a agregar los elementos secundarios mediante el objeto de tipo lista de Python, creará una lista de listas para additionalChildren.

La forma de la lista de Python tiene cinco argumentos, como se describe en la siguiente tabla.

Argumento

Tipo

Descripción

type

requerido

Una de las siguientes: "Point", "Multipoint", "Polyline", "Polygon", "Table", "Raster", "Annotation", "Dimension"

name

requerido

El nombre del dataset. Solo puede ser el nombre base del dataset ("calles") o la ruta del catálogo completa ("E:\mydata\test.gdb\infrastructure\streets"). Cuando se proporciona toda la ruta del catálogo, se ignora todo excepto el nombre base ("calles").

campos

opcional

Una lista de Python de objetos de campo. Contiene los campos que aparecen en el elemento secundario, si se conocen.

extent

opcional

Una cadena de texto o lista de Python que contiene la extensión espacial del elemento secundario.

referencia espacial

opcional

Un objeto de referencia espacial.

Contenidos de la lista de elemento secundario

Estos argumentos deben proporcionarse en el orden que se visualizan. Para omitir un argumento opcional, utilice la palabra clave de Python None o "#".

A continuación, algunos ejemplos de la configuración de un esquema de espacio de trabajo. Los ejemplos se basan en una herramienta de secuencia de comandos que tiene los argumentos siguientes:

Nombre del parámetro

Propiedades

0

Clase de entidad de entrada

Clase de entidad—entrada.

1

Tabla de entrada

Tabla—entrada.

2

Espacio de trabajo de entrada

Espacio de trabajo—entrada (un espacio de trabajo actual que contiene los resultados de la herramienta).

3

Espacio de trabajo derivado

Espacio de trabajo—Salida derivada, obtenida de Input_workspace. El esquema de este espacio de trabajo se modifica para incluir elementos secundarios adicionales.

Parámetros de la herramienta de ejemplo

La herramienta toma la clase y la tabla de entidad de entrada, las copia en el espacio de trabajo, agrega un campo nuevo a la clase de entidad, después crea una clase de entidad de polígono nueva en el espacio de trabajo. (El trabajo actual de la herramienta no es importante ya que sólo sirve para ilustrar la configuración de un esquema del espacio de trabajo). Los ejemplos de código siguientes se construyen uno sobre otro, comenzando con un uso sencillo de additionalChildren. Si elige implementar y probar algunos de los ejemplos de código a continuación, puede probar el código por medio del modelo que se ilustra a continuación.

Modelo utilizado para ver los resultados de la validación

En initializeParameters(), el espacio de trabajo de salida se clona a partir de su parámetro dependiente (parámetro 2). Esta dependencia se establece en las propiedades de la herramienta pero también pueden establecerse en initializeParameters() para protegerse de la posibilidad de que alguien elimine la dependencia en las propiedades de la herramienta.

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

Ejemplo: copie las dos entradas (sin modificaciones) al espacio de trabajo de salida:

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

Ejemplo: la herramienta crea una nueva clase de entidad poligonal. Las propiedades únicas conocidas sobre esta clase de entidad nueva (cuando se valida) son el nombre ("SummaryPolygon") y tipo ("polygon").

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

Ejemplo: agregue un campo a la clase de entidad de entrada.

# 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

Para crear campos para SummaryPolygon (la clase de entidad de polígono nueva), cree una lista de objetos de campo similar al patrón que se muestra en el ejemplo de arriba.

Ejemplo: entrada de valor múltiple

En este ejemplo, el primer parámetro es un valor múltiple de las clases entidad. Cada clase de entidad en el valor múltiple se copia al espacio de trabajo derivado. Se agrega un campo nuevo, "ProjectID", para cada una de las clases de entidad copiadas.

# 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

Objeto filter

El objeto filter permite especificar las opciones relacionadas con un parámetro que pueden estar disponibles para el usuario. Por ejemplo, puede configurar un filtro de campo que limita las opciones a solo campos de texto. Un filtro realiza tres trabajos:

Hay dos formas de especificar los filtros:

Hay seis clases de filtros, como se muestra en la tabla a continuación:

Tipo de filtro

Valores

ValueList

Una lista de valores de cadena de caracteres o numéricos. Utilizada con tipos de datos de cadena de texto, largos, dobles y booleanos.

Rango

Un valor mínimo y máximo. Utilizado con los tipos de datos largos y dobles.

FeatureClass

Un lista de tipos de clase de entidad permitidos, especificados con los valores "Point", "Multipoint", "Polyline", "Polygon", "MultiPatch", "Sphere", "Annotation", "Dimension". Se puede proporcionar más de un valor al filtro.

Archivo

Una lista de sufijos de archivo, por ejemplo, ".txt", ".e00", ".ditamap".

Campo

Una lista de tipos de campos permitidos, especificados por valores "Short", "Long", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID", "XML". Se puede proporcionar más de un valor al filtro.

Espacio de trabajo

Una lista de tipos de espacio de trabajos permitidos, especificados por los valores "FileSystem", "LocalDatabase" y "RemoteDatabase". Se puede proporcionar más de un valor.

Tipo y valores de filtro

Propiedades

Propiedad

Descripción

type

El tipo de filtro (ValueList, Range, FeatureClass, File, Field y Workspace). Puede establecer el tipo de filtro cuando lidie con parámetros largos y dobles (consulte la nota a continuación). Para otros tipos de parámetros, hay sólo un tipo de filtro válido, de modo que se ignora la configuración del tipo de estos parámetros. Si no desea filtrar los valores, establezca la propiedad de lista a una lista vacía.

list

Un lista de Python de valores del filtro. Si no desea filtrar los valores, establezca la propiedad de lista a una lista vacía.

Propiedades de filter

ValueList

ValueList para parámetros de cadena de caracteres

Para un parámetro de cadena de caracteres, la lista puede incluir cualquier cantidad de cadenas de caracteres. A continuación encontrará un ejemplo de la configuración de la lista de valores de cadena de caracteres en initializeParameters(). El parámetro contiene dos opciones: "NEW_FORMAT" y "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

En el ejemplo anterior, podría haber establecido fácilmente la lista de valores en la pestaña Parámetro del cuadro de diálogo Propiedades de la herramienta. De hecho, si hubiera establecido la lista de valores con algo distinto (como "OLD" y "NEW") en las propiedades de la herramienta, estos valores se reemplazarían por "OLD_FORMAT" y "NEW_FORMAT" al invocar initializeParameters(). Lo mismo es verdad para el valor predeterminado: puede establecerse en el cuadro de diálogo Propiedades de la herramienta y después reiniciar en ToolValidator.

NotaNota:

La lista de valores que proporciona en ToolValidator siempre reemplaza los valores establecidos en el cuadro de diálogo Propiedades de la herramienta. Este comportamiento le permite actualizar los valores según otros parámetros.

Como continuación de este ejemplo, el código siguiente muestra cómo updateParameters() cambia una lista de valores en otro parámetro según si el usuario selecciona "OLD_FORMAT" o "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 para parámetros largos y dobles

Un parámetro largo o doble puede tener una lista de valores numéricos. El usuario sólo puede elegir o introducir valores que están en la lista.

# 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 para parámetros booleanos

Existen dos valores para un parámetro booleano: el valor verdadero y el valor falso. El valor verdadero es siempre el primer valor de la lista.

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

Rango

Un parámetro largo o doble puede tener un filtro de rango. Los filtros de rango tienen dos valores, el mínimo y el máximo. El primer valor de la lista es el mínimo. El rango es inclusivo, lo que significa que tanto el mínimo como el máximo son opciones válidas.

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

Configuración de tipo de filtro en parámetros largo y doble

Para los parámetros largos y dobles, el tipo de filtro predeterminado es ValueList. Si desea que sea un filtro de rango, establezca el tipo de filtro en initializeParameters(), de la manera siguiente:

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]

Sólo puede establecer el tipo de filtro para los parámetros largos y dobles.

FeatureClass

El ejemplo a continuación muestra la configuración del tipo de entidad de un parámetro de entrada según el tipo de entidad de otro parámetro de entrada.

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

Archivo

El filtro de archivo contiene una lista de sufijos de archivo que un archivo puede tener, como ".txt" (archivo de texto simple) y ".csv" (valor separado por coma). Puede proporcionar cualquier texto como sufijo, no tiene que ser necesariamente un sufijo que ArcGIS reconozca. El sufijo puede tener cualquier longitud y no incluye el punto. El ejemplo a continuación muestra la configuración del filtro para un parámetro de Archivo de entrada.

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

Campo

El filtro del campo define los tipos de campos permisibles. Los valores pueden ser "Short", "Long", "Float", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID" y "XML".

Nombre de visualización frente a nombre interno

Existen cuatro tipos de campos que tienen un nombre interno, se muestran en la tabla a continuación.

Nombre de visualización

Nombre interno

Short

SmallInteger

Largo

Entero

Flotante

Simple

Texto

Cadena de caracteres

Alias del filtro del campo

Cuando especifica un filtro de campo, puede utilizar el nombre de visualización o el nombre interno. Es decir, las dos líneas de códigos siguientes son equivalentes:

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

Si proporciona el nombre de visualización como "short", se convierte y almacena en el filtro como "SmallInteger". Rara vez, necesita acceder a valores en el filtro del campo, pero si lo hace, preste atención a que se almacena el nombre interno. El fragmento de código a continuación muestra cómo elegir esto:

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

Configuración de un valor de campo predeterminado

Es posible que quiera proporcionar un valor predeterminado para un parámetro de campo. La forma de hacer esto es repetir los campos en la tabla de entrada y elegir el primer campo que satisface el filtro, de la manera siguiente:

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 in ["smallinteger", "integer", "single", "double"]:
        self.params[1].value = field.name
        break
  return
PrecauciónPrecaución:

No utilice la función de geoprocesamiento ListFields en ToolValidator. En su lugar, utilice la función Describe como se muestra anteriormente.

Espacio de trabajo

El filtro del espacio de trabajo especifica los tipos de espacios de trabajo de entrada que se permiten. Hay tres valores:

Filtro de espacio de trabajo

Descripción

"FileSystem"

Una carpeta del sistema, que se utiliza para almacenar shapefiles, coberturas de ArcInfo, tablas INFO y cuadrículas

"LocalDatabase"

Una geodatabase de archivos o personal

"RemoteDatabase"

Una conexión de base de datos de ArcSDE

Temas relacionados

5/9/2014