Personalizar el comportamiento de la herramienta en una caja de herramientas Python
La validación es todo lo que ocurre antes de pulsar el botón Aceptar de una herramienta. Cuando cree sus propias herramientas personalizadas, la validación le permitirá personalizar el modo en que los parámetros responden e interaccionan con los valores y entre ellos. La validación se efectúa con un bloque de código de Python que se usa para controlar el comportamiento de la herramienta.
Para obtener más información sobre la validación, consulte Comprender la validación en las herramientas de secuencia de comandos.
En una caja de herramientas de Python, cada parámetro de la herramienta tiene un objeto de parámetro asociado con propiedades y métodos que resultan útiles en la validación de la herramienta. En una caja de herramientas Python, los parámetros se definen en el método getParameterInfo de la clase de herramienta. El comportamiento de esos parámetros y cómo interactúan entre ellos y con las entradas son aspectos que se validan según el método updateParameters de la clase de herramienta.
Acceso a los parámetros de la herramienta
Los objetos de parámetro forman la base de cómo se definen e interactúan los parámetros en una caja de herramientas Python. La práctica estándar es crear la lista de parámetros en el método getParameterInfo de la clase de herramienta, según se muestra en el código a continuación.
def getParameterInfo(self):
#Define parameter definitions
# First parameter
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
return [param0]
Para obtener más información sobre la definición de parámetros en una caja de herramientas de Python, consulte Definición de parámetros en una caja de herramientas Python.
Objeto de parámetro
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 |
El nombre del parámetro. |
dirección |
Solo lectura |
Cadena de caracteres: "Input", "Output" |
Dirección de entrada/salida del parámetro. |
datatype |
Solo lectura |
Cadena de caracteres |
Para obtener una lista de tipos de datos de parámetro, consulte Definir los tipos de datos de parámetro en una caja de herramientas de Python. |
parameterType |
Solo lectura |
Cadena de caracteres: "Required", "Optional", "Derived" |
El tipo de parámetro. |
parameterDependencies |
Lectura/escritura |
Lista de Python |
Una lista de índices de cada parámetro dependiente. |
valor |
Lectura/escritura |
Objeto de valor |
El valor del parámetro. |
defaultEnvironmentName |
Solo lectura |
Cadena de caracteres |
La configuración del entorno predeterminada. |
habilitado |
Lectura/escritura |
Booleano |
Falso si el parámetro no está 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. |
categoría |
Lectura/escritura |
Cadena de caracteres |
La categoría del parámetro. |
esquema |
Solo lectura |
Objeto de esquema |
El esquema del dataset de salida. |
filtro |
Solo lectura |
Objeto de filtro |
El filtro que se aplicará a los valores en el parámetro. |
simbología |
Lectura/escritura |
Cadena de caracteres |
La ruta al archivo de capa (.lyr) que se utiliza para dibujar la salida. |
mensaje |
Solo lectura |
Cadena de caracteres |
El mensaje que se mostrará al usuario. Consulte SetErrorMessage y SetWarningMessage arriba. |
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 el método getParameterInfo 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. |
parameterDependencies es equivalente al ajuste Obtenido de del asistente para la Herramienta de secuencia de comandos.
Las dependencias por lo general se configuran en el método getParameterInfo:
def getParameterInfo(self):
#Define parameter definitions
# First parameter
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Second parameter
param1 = arcpy.Parameter(
displayName="Sinuosity Field",
name="sinuosity_field",
datatype="Field",
parameterType="Optional",
direction="Input")
param1.value = "sinuosity"
# Third parameter
param2 = arcpy.Parameter(
displayName="Output Features",
name="out_features",
datatype="GPFeatureLayer",
parameterType="Derived",
direction="Output")
param2.parameterDependencies = [param0.name]
param2.schema.clone = True
params = [param0, param1, param2]
return params
valor
Este valor es del parámetro que el usuario introdujo o usted configuró de forma programada. Puede configurar el valor en el método getParameterInfo, en cuyo caso sirve como el valor predeterminado inicial para el parámetro. También puede configurar el valor en updateParameters en respuesta a una entrada de usuario como se muestra a continuación.
def updateParameters(self, parameters):
# 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 parameters[0].value:
if not parameters[6].altered:
extent = arcpy.Describe(parameters[0].value).extent
if extent.width > extent.height:
parameters[6].value = extent.width / 100
else:
parameters[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 parameters[3].value: # check that parameter has a value
if parameters[3].value == "Get Spatial Weights From File":
parameters[8].enabled = True
else:
parameters[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 parameters[0].value:
workspace = os.path.dirname(parameters[0].value.value)
With the exception of Describe, don't use methods that take a catalog path, such as ListFields, in validation. The dataset may not exist when your tool is validated in ModelBuilder, and the method may fail or give unexpected results.
In the specific case of ListFields, the Describe object's fields property will provide the equivalent information.
Don't set a parameter value in updateMessages() since the value will not be validated by the internal validation routine.
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 parameters[2].altered:
parameters[2].value = "POINT"
hasBeenValidated
hasBeenValidated es falso si el usuario ha modificado el valor de un parámetro desde la última vez que se invocaron updateParameters y una validación interna. Una vez que se invocó la validación interna, el geoprocesamiento se configura hasBeenValidated automáticamente en 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.
def updateParameters(self, parameters):
# 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 parameters[0].value:
if not parameters[6].altered:
extent = arcpy.Describe(parameters[0].value).extent
if extent.width > extent.height:
parameters[6].value = extent.width / 100
else:
parameters[6].value = extent.height / 100
return