Définition de la symbologie en sortie dans les scripts

La propriété Symbologie d'un paramètre d'outil de script vous permet d'associer un fichier de couches simple (.lyr) à un paramètre en sortie. Lorsque l'outil de script est exécuté, la sortie est ajoutée à l'affichage à l'aide de la symbologie figurant dans le fichier de couches. Vous pouvez également définir la propriété Symbologie dans le code symbologie du script.

Dans les deux cas, vous pouvez associer seulement un fichier de couches au paramètre en sortie. Un seul fichier de couches suffit si la sortie est bien définie. Mais qu'en est-il si votre sortie n'est pas bien définie ? Par exemple, vous savez que votre sortie est une classe d'entités, mais vous ne savez pas si elle contiendra des entités ponctuelles, polylinéaires ou surfaciques jusqu'à ce que l'outil soit exécuté. Les fichiers de couches dépendent du type de géométrie, un seul fichier de couches ne peut donc pas symboliser différents types d'entités. Dans ce cas, vous devez avoir trois fichiers de couches, un pour chaque type de géométrie, puis associer le bon fichier de couches selon le type de géométrie en sortie. L'extrait de code suivant illustre cela.

    # 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 logique dans le script précité est assez facile : testez le type de géométrie (forme) et définissez le fichier de couches en conséquence. Même si la logique est plus complexe, le modèle reste le même :

Définition de la symbologie dans un script et dans la classe ToolValidator

Si vous êtes familiarisé avec la programmation de la logique de validation d'outil dans une classe ToolValidator, vous pouvez constater que l'extrait de code ci-dessus peut être réécrit en vue d'une utilisation dans la méthode updateParameters. En fait, si vous n'avez besoin de référencer qu'un seul fichier de couches, faites-le alors dans les propriétés de l'outil de script ou dans la méthode initializeParameters. Mais si vous avez besoin de définir la symbologie sur plusieurs fichiers de couches, vous devez le faire dans l'outil de script. Le fait d'inclure une telle logique dans la classe ToolValidator gonfle votre code avec une logique qui n'a rien à voir avec la validation d'outils, et, dans certains cas, vous pouvez ne pas savoir quel fichier de couches utiliser jusqu'à l'exécution de l'outil.

Exemple de script

Le script suivant crée des entités en fonction de la distance qui les sépare des parcs de la ville de Portland. Il y a trois paramètres : les entités en entrée, la distance et les entités en sortie. Les entités en sortie sont symbolisées de façon à être facilement repérées par rapport aux autres entités sur la carte (différemment de la symbologie par défaut, qui peut être difficile à distinguer). Etant donné que les entités en entrée peuvent être des points, des polylignes ou des polygones, trois différents fichiers de couches sont nécessaires.

Ce script présente également plusieurs techniques de codage pour la portabilité, toutes basées sur la structure de dossiers ToolShare.

Les techniques de portabilité utilisées sont comme suit :

Pour en savoir plus sur la portabilité des scripts 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))
    

7/10/2012