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 :
- Créez un fichier de couches qui symbolisera chacune de vos sorties possibles.
- En fonction de la logique de votre script, déterminez le fichier de couches à utiliser et définissez-le à l'aide de la propriété Symbologie du paramètre.
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é. Les techniques de portabilité utilisées sont comme suit :
- Utilisation de sys.argv[0] pour récupérer le chemin d'accès complet au fichier de script
- Utilisation du module os de Python pour créer des chemins d'accès aux données
- Utilisation de la fonction CreateScratchName pour créer une classe d'entités temporaire
# 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))