La propriété de symbologie d’un paramètre d’outil de script vous permet d’associer un fichier de couches unique (.lyrx) à un paramètre en sortie. Lors de l’exécution de l’outil de script, la sortie est ajoutée à l’affichage avec la symbologie du fichier de couches. Vous pouvez également définir la propriété de symbologie dans le code de symbologie du script.
Dans un cas comme dans l’autre, vous pouvez associer un seul fichier de couches au paramètre en sortie. L’utilisation d’un fichier de couches unique fonctionne bien si la sortie est définie correctement. Mais que se passe-t-il si la sortie n’est pas définie correctement ? 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, polylignes 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 avez besoin de trois fichiers de couches, un pour chaque type de géométrie, et vous devez associer le fichier de couches approprié en fonction du type de géométrie en sortie. L'extrait de code suivant illustre cela.
# 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 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éer un fichier de couches symbolisant chaque sortie possible.
- 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 savez programmer une logique de validation d’outil dans une classe ToolValidator, vous pouvez constater que l’extrait de code ci-dessus peut être réécrit pour être utilisé dans la méthode updateParameters. En fait, si un seul fichier de couches doit être référencé, utilisez pour ce faire les propriétés de l’outil de script ou 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 de placer cette logique dans la classe ToolValidator rallonge inutilement le code en ajoutant une logique qui n’a rien à voir avec la validation d’outil et, dans certains cas, vous devez attendre l’exécution de l’outil pour savoir quel fichier de couches utiliser.
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 existe 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 __file__ pour récupérer le chemin d’accès complet du fichier script
- Utilisation du module os Python pour créer les 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
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))