La propiedad de simbología de un parámetro de herramienta de script le permite asociar un único archivo de capa (.lyrx) con un parámetro de salida. Cuando se ejecuta la herramienta de script, los datos de salida se agregan a la visualización con la simbología que se encuentra en el archivo de capa. También puede configurar la propiedad de simbología en el código de simbología del script.
En ambos casos, puede asociar un solo archivo de capa con el parámetro de salida. Tener un solo archivo de capa funciona muy bien si los datos de salida están bien definidos. Pero ¿qué ocurre si su salida no está bien definida? Por ejemplo, sabe que los datos de salida son una clase de entidad, pero no sabe si contienen entidades de punto, de polilínea o de polígono hasta que se ejecuta la herramienta. Los archivos de capa dependen del tipo de geometría, lo que significa que no puede tener un archivo de capa que simbolice varios tipos de entidades. En este caso, necesita tener tres archivos de capa, uno para cada tipo de geometría, y asociar el archivo de capa correcto según el tipo de geometría de salida. El siguiente fragmento de código lo demuestra:
# Set the symbology of the output.
output = self.params[1].value
if output:
desc = arcpy.Describe(output)
if desc.shapeType == "Polygon":
self.params[2].symbology = "c:/Tools/Extractor/ToolData/polygon.lyr"
elif desc.shapeType == "Polyline":
self.params[2].symbology = "c:/Tools/Extractor/ToolData/polyline.lyr"
else:
self.params[2].symbology = "c:/Tools/Extractor/ToolData/point.lyr"
La lógica del script anterior es bastante simple: comprobar el tipo de geometría (forma) y configurar el archivo de capas en consecuencia. Aun cuando la lógica es más compleja, el patrón permanece igual:
- Crea un archivo de capa que simbolizará cada salida posible.
- Basado en la lógica del script, determina qué archivo de capa se debe utilizar y lo configura con la propiedad de simbología del parámetro.
Configurar la simbología en un script o en la clase ToolValidator
Si está familiarizado con la programación de la lógica de validación de la herramienta en una clase ToolValidator, puede ver que el fragmento de código anterior se puede volver a escribir para ser utilizado en el método updateParameters. En realidad, si solo necesita hacer referencia a un archivo de capa, debe hacerlo en las propiedades de la herramienta de script o en el método initializeParameters. Pero si necesita configurar la simbología de uno de los tantos archivos de capa, hágalo en la herramienta de script. Colocar esa lógica en la clase ToolValidator alarga innecesariamente el código con una lógica que no está relacionada con la validación de la herramienta y, en algunos casos, es posible que no sepa qué archivo de capa utilizar hasta la ejecución de la herramienta.
Ejemplo de script
El siguiente script crea entidades basadas en la distancia desde los parques de la ciudad de Portland. Existen tres parámetros: las entidades de entrada, la distancia y las entidades de salida. Las entidades de salida se simbolizan para que se puedan distinguir fácilmente de otras entidades del mapa (una simbología distinta de la predeterminada, que puede ser difícil de distinguir). Debido a que las entidades de entrada pueden ser de punto, de polilínea o de polígono, se necesitan tres archivos de capa diferentes.
Este script también demuestra varias técnicas de codificación para la portabilidad. Las técnicas de portabilidad que se utilizan son las siguientes:
- Utilizar __file__ para recuperar la ruta completa del archivo de script
- Utilizar el módulo os de Python para crear rutas hacia los datos
- Utilizar la función CreateScratchName para crear una clase de entidad temporal
# ExtractData.py
# Description: Script that will extract features from an input layer within a specified
# distance from a park.
# Parameters:
# 0 - input features
# 1 - distance from parks (linear units)
# 2 - output feature class
import arcpy
import os
arcpy.env.overwriteOutput = True
try:
# This tool uses a system folder with a Scripts and ToolData subfolder.
# You can discover the pathname of this folder using the Python __file__
# attribute, which is the pathname to the script
# (example: 'E:\examples\symbology\scripts\ExtractData.py'.) You
# then use the toolSharePath variable to create paths to your
# shapefile data and layer files ('E:\examples\symbology\ToolData\points.lyr').
scriptPath = __file__
toolSharePath = os.path.dirname(os.path.dirname(scriptPath))
dataPath = os.path.join(toolSharePath, 'ToolData')
parkPath = os.path.join(dataPath, 'PortlandParks.shp')
pointLyrPath = os.path.join(dataPath, 'point.lyr')
polygonLyrPath = os.path.join(dataPath, 'polygon.lyr')
polylineLyrPath = os.path.join(dataPath, 'polyline.lyr')
# Buffer the parks by the specified distance. The output is a scratch
# feature class in the same workspace as the output feature class
arcpy.SetProgressorLabel('Buffering parks ...')
scrname = arcpy.CreateScratchName('xxx', '', 'featureclass',
os.path.dirname(arcpy.GetParameterAsText(2)))
arcpy.Buffer_analysis(parkPath, scrname, arcpy.GetParameterAsText(1))
# Clip the defined layer with the buffered parks
arcpy.SetProgressorLabel('Clipping {} ...'.format(arcpy.GetParameterAsText(0)))
output = arcpy.Clip_analysis(arcpy.GetParameterAsText(0), scrname,
arcpy.GetParameterAsText(2))
# Delete the intermediate dataset
try:
arcpy.Delete_management(scrname)
except:
pass
# Set the symbology of the output.
params = arcpy.GetParameterInfo()
desc = arcpy.Describe(output)
if desc.shapeType == 'Polygon':
params[2].symbology = polygonLyrPath
elif desc.shapeType == 'Polyline':
params[2].symbology = polylineLyrPath
else:
params[2].symbology = pointLyrPath
except Exception as err:
arcpy.AddError('An error occurred: {}'.format(err))