En GP-herramientas escrita en C# (ArcObjects) podemos escuchar la cancelación del evento y de reaccionar a eso. Me pregunto si hay algo similar en Python GP-herramientas de la aplicación de arcpy. Busqué en google el tema y lo único que encontré fue la de Cancelar el método en el Resultado-Objeto, de modo que usted puede pedir que el estado de el resultado de un GP-herramienta, es decir, si fue cancelado). Soy consciente de que usted puede cancelar GP-herramientas que se ejecutan en segundo plano en la Ventana de resultados, pero esta Cancelar el evento es apresado por el sistema y por lo tanto el desarrollador o la GP-herramienta no puede reaccionar a eso. Gracias de antemano!
Respuestas
¿Demasiados anuncios?Esto no es una respuesta, sino una elaboración sobre la cuestión. He publicado un servicio asíncrono de gp usando el código que se muestra a continuación. Si el usuario cancela, el objeto de resultado devuelto indica que. Sin embargo, el bucle se ejecuta durante el número completo de segundos. Me gustaría salir del bucle si el usuario ha cancelado.
def execute(self, parameters, messages):
secondstosleep = int(parameters[0].valueAsText)
output = parameters[1].valueAsText
if secondstosleep < 0:
messages.addErrorMessage("{0} : less than zero.".format(secondstosleep))
raise arcpy.ExecuteError
messages.addMessage("starting to sleep for {0} seconds".format(secondstosleep))
slept = 0
for t in xrange(0,secondstosleep):
# would like to break if user has canceled
# check for cancel here and break
slept = slept + 1
time.sleep(1)
messages.addMessage("slept for {0} seconds".format(slept))
return
La única manera en que puedo pensar es en el uso de Progressor en Arcpy. Utilizando Progressor una vez que el usuario presione el botón de cancelar el bucle se rompe. A continuación, puede comprobar el objeto de resultado para ver si es cancelado por el usuario. He aquí un ejemplo de código:
def execute(self, parameters, messages):
import time
n=30
p=1
arcpy.SetProgressor("step",
"Step progressor: Counting from 0 to {0}".format(n),
0, n, p)
loopTime=.3
for i in range(n):
if (i % p) == 0:
## # would like to break if user has canceled
arcpy.SetProgressorLabel("Iteration: {0}".format(i))
arcpy.SetProgressorPosition(i)
#print(i)
time.sleep(loopTime)
arcpy.SetProgressorLabel("Iteration: {0}".format(i + 1))
arcpy.SetProgressorPosition(i + 1)
return