Configurar la simbología de salida en secuencias de comandos
La propiedad de simbología de una parámetro de herramienta de secuencia de comandos le permite asociar un único archivo de capa (.lyr) con un parámetro de salida. Cuando se ejecuta la herramienta, 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 de la secuencia de comandos.
En ambos casos, puede asociar un solo archivo de capa con el parámetro de salida. Tener un sólo archivo de capa funciona muy bien si los datos de salida están bien definidos. Pero, ¿qué sucede si los datos de salida no están bien definidos? 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 = the output value # params[2] = the output parameter # params = arcpy.GetParameterInfo() desc = arcpy.Describe(output) if desc.shapeType == "Polygon": params[2].symbology = "c:/Tools/Extractor/ToolData/polygon.lyr" elif desc.shapeType == "Polyline": params[2].symbology = "c:/Tools/Extractor/ToolData/polyline.lyr" else: params[2].symbology = "c:/Tools/Extractor/ToolData/point.lyr"
La lógica de la secuencia de comandos anterior es bastante simple: se comprueba el tipo de geometría (forma) y se configura el archivo de capa consecuentemente. Aún cuando la lógica es más compleja, el patrón permanece igual:
- Crea un archivo de capa que simbolizará cada uno de los datos de salida posible.
- Basado en el lógica de la secuencia de comandos, 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 una secuencia de comandos 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 sólo necesita hacer referencia a un archivo de capa, debe hacerlo en las propiedades de la herramienta de secuencia de comandos 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 secuencia de comandos. Colocar esa lógica en la clase ToolValidator aumenta 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 secuencia de comandos
La siguiente secuencia de comandos crea entidades basadas en la distancia desde los parques de la ciudad de Portland. Hay 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.
Esta secuencia de comandos también demuestra varias técnicas de codificación para la portabilidad basadas en la estructura de carpetas de ToolShare.
Las técnicas de portabilidad que se utilizan son las siguientes:
- Utilizar sys.argv[0] para recuperar la ruta completa al archivo de secuencia de comandos.
- 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.
Más información acerca de la portabilidad de las secuencias de comandos de Python
# 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 from arcpy import env import os import sys env.overwriteOutput = True try: # This tool makes use of the recommended toolshare folder structure, # a system folder with a Scripts and ToolData subfolder. We can # discover the pathname of this toolshare folder by examining the # first argument to the script, which is the pathname to the script # (example: "E:\examples\symbology\scripts\ExtractData.py".) We # then use this toolSharePath variable to create pathnames to our # shapefile data and layer files ("E:\examples\symbology\ToolData\points.lyr"). # scriptPath = sys.argv[0] 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 " + arcpy.GetParameterAsText(0) + " ..." ) output = arcpy.Clip_analysis(arcpy.GetParameterAsText(0), scrname, arcpy.GetParameterAsText(2)) # Delete 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: arcpy.AddError("An error occurred. " + arcpy.GetMessages(2))