Configurar la simbología de salida en las 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. Al ejecutar la herramienta de secuencia de comandos, se agrega la salida a la vista con la simbología que se encuentre 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:

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. Las técnicas de portabilidad que se utilizan son las siguientes:

# 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 a system folder with a Scripts and ToolData subfolder.      #  We can discover the pathname of this 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))
9/11/2013