Lorsqu'un outil s'exécute, un bouton d'annulation permettant d'arrêter le processus est accessible. Par défaut, lorsqu'un outil de script ou une boîte à outils Python est annulé, le script est annulé après la ligne de code actuelle et l'outil rencontre un échec avec un message d'erreur approprié ('Script annulé <nom_outil>... (<nom_outil>) interrompu par l'utilisateur.'). Dans ce cas, l'annulation est définitive. Il n'est pas possible d'exécuter du code une fois que l'annulation a eu lieu. Pour certains scripts, aucune autre opération n'est requise. Mais dans certains cas, des étapes supplémentaires peuvent être nécessaires après l'annulation pour nettoyer les données, fournir des messages d'outils personnalisés ou assurer d'autres comportements.
La classe arcpy.env inclut deux propriétés, autoCancelling et isCancelled pour contrôler les comportements d'annulation. Par défaut, la propriété autoCancelling est définie sur True de sorte que lorsqu'un outil est annulé, l'annulation se produit après la ligne actuelle. Si la propriété autoCancelling est définie sur False, l'exécution du script se poursuit tant que vous ne l'arrêtez pas. Lorsqu'un outil est annulé, la propriété isCancelled en lecture seule passe de False à True.
Propriété | Description |
---|---|
arcpy.env.autoCancelling | Lorsque la propriété autoCancelling est définie sur True, une annulation met un terme au script sur la ligne actuelle. Si False, une annulation a pour effet de définir la propriété isCancelled sur True et l'exécution se poursuit. autoCancelling est définie sur True par défaut. |
arcpy.env.isCancelled | Lorsque la propriété autoCancelling est définie sur False et que l'outil a été annulé, la propriété isCancelled est définie sur True. isCancelled est définie sur False par défaut et est en lecture seule. |
L'exemple suivant représente un outil de démonstration qui utilise une série de tables, effectue une copie et combine ces tables intermédiaires ensemble. Si la valeur par défaut True de la propriété autoCancelling est conservée, le script s'arrête après la ligne actuelle en cas d'annulation. La nature de cet outil en particulier est de créer plusieurs tables intermédiaires en arrière-plan et nous voulons les nettoyer dans tous les cas, même en cas d'annulation. En définissant la propriété autoCancelling sur False, l'annulation est retardée et le script peut observer des intervalles ou des endroits dans le code choisi en évaluant la propriété isCancelled. Une fois la propriété isCancelled définie sur True, nous savons que l'outil a été annulé et que les données immédiates seront supprimées avant la fin.
import arcpy
arcpy.env.autoCancelling = False
class CustomCancelException(Exception):
"""Custom exception for geoprocessing tool cancellations"""
pass
def my_function(tables, output):
temp_tables = []
try:
for table in tables:
temp_tables.append(arcpy.CopyRows_management(table, '#')[0])
# If isCancelled is True this means that the cancel button
# has been pressed
if arcpy.env.isCancelled:
raise CustomCancelException('Tool has been cancelled')
arcpy.Merge_management(tables, output)
except CustomCancelException as err:
arcpy.AddError(err)
finally:
# If tool is cancelled or finishes successfully, clean up intermediate data
if temp_tables:
for temp_table in temp_tables:
arcpy.Delete_management(temp_table)
if __name__ == '__main__':
inputs = arcpy.GetParameter(0)
out_fc = arcpy.GetParameterAsText(1)
my_function(inputs, out_fc)