Mit der Symbolisierungseigenschaft eines Skriptwerkzeugparameters können Sie eine einzelne Layer-Datei (.lyrx) mit einem Ausgabeparameter verknüpfen. Wenn das Skriptwerkzeug ausgeführt wird, wird die Ausgabe anhand der Symbolisierung aus der Layer-Datei zur Anzeige hinzugefügt. Sie können die Symbolisierungseigenschaft auch im Symbolisierung-Code des Skripts festlegen.
Auch in diesem Fall können Sie nur eine einzige Layer-Datei mit dem Ausgabeparameter verknüpfen. Eine einzige Layer-Datei funktioniert gut, sofern die Ausgabe wohl definiert ist. Doch was ist, wenn die Ausgabe nicht klar definiert ist? Beispiel: Sie wissen, dass es sich bei der Ausgabe um eine Feature-Class handelt. Ob die Feature-Class jedoch Punkt-, Polylinien- oder Polygon-Features enthält, wissen Sie erst, wenn das Werkzeug ausgeführt wird. Layer-Dateien sind vom Geometrietyp abhängig, das heißt, eine Layer-Datei kann nicht mehrere Feature-Typen symbolisieren. In diesem Fall müssen Sie mit drei Layer-Dateien arbeiten, d. h. mit einer für jeden Geometrietyp, und die richtige Layer-Datei anhand des Ausgabegeometrietyps zuweisen. Im folgenden Codeausschnitt wird dies demonstriert.
# 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"
Die Logik im obigen Skript ist relativ einfach: Der Geometrietyp (Shape) wird geprüft und die Layer-Datei entsprechend festgelegt. Auch bei einer komplexeren Logik bleibt das Muster gleich:
- Sie erstellen eine Layer-Datei, mit der jede der möglichen Ausgaben symbolisiert wird.
- Anhand der Logik im Skript ermitteln Sie, welche Layer-Datei verwendet werden soll, und legen dann die Datei mit der Symbolisierungseigenschaft des Parameters fest.
Festlegen der Symbolisierung in einem Skript im Vergleich zur ToolValidator-Klasse
Falls Sie mit der Programmierung von Werkzeugvalidierungslogik in einer ToolValidator-Klasse vertraut sind, wissen Sie, dass der oben aufgeführte Codeausschnitt auch für die Verwendung in der updateParameters-Methode umgeschrieben werden kann. Wenn Sie nur auf eine Layer-Datei Bezug nehmen müssen, sollten Sie dies genau genommen in den Eigenschaften des Skriptwerkzeugs oder in der initializeParameters-Methode tun. Falls Sie jedoch die Symbolisierung für eine von mehreren Layer-Dateien festlegen müssen, tun Sie dies im Skriptwerkzeug. Wenn Sie eine solche Logik in die ToolValidator-Klasse aufnehmen, wird Ihr Code unnötigerweise mit Logik aufgebläht, die nichts mit der Werkzeugvalidierung zu tun hat. Außerdem können Sie manchmal erst bei Ausführung des Werkzeugs wissen, welche Layer-Datei verwendet werden muss.
Beispielskript
Das folgende Skript erstellt Features basierend auf ihrer Entfernung zu Parkanlagen in Portland (USA). Es gibt drei Parameter: die Eingabe-Features, die Entfernung und die Ausgabe-Features. Die Ausgabe-Features werden symbolisiert, sodass sie sich leicht von anderen Features auf der Karte unterscheiden lassen. (Es wird also eine weitere Symbolisierung neben der Standardsymbolisierung verwendet, die sich oft nur schwierig unterscheiden lässt.) Da es sich bei den Eingabe-Features um Punkt, Polylinie oder Polygon handeln kann, sind drei verschiedene Layer-Dateien erforderlich.
Dieses Skript veranschaulicht auch mehrere Kodierungstechniken für Portabilität. Folgende Vorgehensweisen werden verwendet, um Portabilität zu erzielen:
- Verwendung von __file__ zum Abrufen der vollständigen Pfadangabe zur Skriptdatei
- Verwendung des Python-Moduls os zum Erstellen von Pfadangaben zu Daten
- Verwendung der CreateScratchName-Funktion zum Erstellen einer Scratch-Feature-Class
# 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))