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.
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. |
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. |
Lectura/escritura |
Lista de Python |
Una lista de índices de cada parámetro dependiente. |
|
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). |
Solo lectura |
Booleano |
Verdadero si el usuario modificó el valor. |
|
Solo lectura |
Booleano |
Verdadero si la rutina de validación interna verificó el parámetro. |
|
Lectura/escritura |
Cadena de caracteres |
La categoría del parámetro. |
|
Solo lectura |
Objeto de esquema de GP |
El esquema del dataset de salida. |
|
Solo lectura |
Objeto de filtro de GP |
El filtro que se aplicará a los valores en el parámetro. |
|
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. |
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. |
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)
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.
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.
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"
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:
- 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).
- Una vez que el usuario interactúa con el cuadro de diálogo de la herramienta de algún modo, se invoca updateParameters().
- 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.
- 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.
- 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 |
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
- 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.
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
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. |
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. |
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:
|
"AsSpecified" |
El tipo de geometría se determina mediante el valor de la propiedad geometryType. |
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. |
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. |
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.
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. |
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). |
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.
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. |
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. |
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. |
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.
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:
- Un filtro sólo presenta opciones válidas para el usuario cuando busca datos. Si establece el filtro para clases de entidad de punto, sólo se muestran las clases de entidad de puntos cuando el usuario busca datos. Si establece el filtro para campos de texto, la lista desplegable de campos sólo muestra los campos de texto.
- Si un usuario escribe en un valor de parámetro (en vez de elegir un valor de la lista o navegador de archivos), el valor se verifica con el filtro. Si el usuario introduce un valor no válido (un campo numérico en vez de un campo de texto, por ejemplo), se proporciona una advertencia o error automáticamente.
- Debido a que los valores se verifican contra los filtros por validación interna, un filtro lo libera de tener que programar la validación propia en la clase ToolValidator.
Hay dos formas de especificar los filtros:
- En la pestaña Parámetros del cuadro de diálogo de las propiedades de la herramienta, haga clic en el parámetro, a continuación haga clic en la celda junto a Filtro y elija el tipo de filtro desde la lista desplegable. Después de elegir el tipo de filtro, se abre un cuadro de diálogo donde usted especifica los valores para el filtro.
- Puede configurar los valores mediante programación en una clase ToolValidator (puede consultar ejemplos a continuación). El geoprocesamiento crea filtros automáticamente para los parámetros de tipo cadena de caracteres, largo, doble, clase de entidad, archivo, campo y espacio de trabajo. Aún si no elige un filtro en el cuadro de diálogo de las propiedades de la herramienta, todavía hay un filtro relacionado con el parámetro pero está vacío. Un filtro vacío es lo mismo que no tener filtro. Al agregar valores a un filtro vacío, activa el filtro y las opciones del usuario se limitan por los contenidos del filtro.
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. |
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. |
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.
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 |
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
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 |