Más

¿Actualización automática provocada por cambios en el directorio de ArcPy?

¿Actualización automática provocada por cambios en el directorio de ArcPy?


Tengo una secuencia de comandos de Python de monitoreo de cambio de directorio que monitorea cualquier cambio ocurrido en un directorio, quiero activar la actualización automática de Arcmap cada vez que se detecta un cambio (por ejemplo, una nueva línea agregada a un archivo). Traté de iniciar el programa de monitoreo dentro de la ventana de comandos de arcmap python usando execfile ("myprogram.py"). El problema que encontré es que una vez que el script comienza a monitorear y actualizar automáticamente, la ventana principal de arcmap estaba bloqueada y congelada, no hay forma de detenerla excepto apagar el arcmap, aunque puedo ver que la actualización automática ocurre cada vez que hay un cambiar. ¿Hay alguna forma de ejecutar el script del monitor en un proceso separado o en segundo plano sin bloquear o congelar la ventana principal? Aquí está mi script de monitor que está tomado de Tim Golden,

import os import win32file import win32con import arcpy # Buscar los nuevos datos ACCIÓN = {1: "Creado", 2: "Eliminado", 3: "Actualizado", 4: "Renombrado de algo", 5: "Renombrado a algo" } FILE_LIST_DIRECTORY = 0X0001 path_to_watch = "C:  Directory" hDir = win32file.CreateFile (path_to_watch, FILE_LIST_DIRECTORY, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_WRITE mientras que win32con.FILE_SHARE. = win32file.ReadDirectoryChangesW (HdiR, 1024, True, win32con.FILE_NOTIFY_CHANGE_FILE_NAME | win32con.FILE_NOTIFY_CHANGE_DIR_NAME | win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | win32con.FILE_NOTIFY_CHANGE_SIZE | win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | win32con.FILE_NOTIFY_CHANGE_SECURITY, Nada, Nada) para la acción, en el archivo de resultados: full_filename = OS. path.join (path_to_watch, file) print full_filename, ACTION.get (action, "Desconocido") arcpy.RefreshActiveView ()

Aquí está el absoluto tuercas y tornillos del método:

IDynamicMap gDynamicMap; IDynamicDisplay gDynamicDisplay; FileSystemWatcher eLogWatcher; bool gLOGchanged = falso; anulación protegida void OnClick () {IMap pMap = ArcMap.Document.FocusMap; gDynamicMap = (IDynamicMap) pMap; if (! gDynamicMap.DynamicMapEnabled) gDynamicMap.DynamicMapEnabled = true; gDynamicMap.DynamicDrawRate = (int) RefreshRate.Value; // establece tu frecuencia de actualización aquí // conecta eventos dinámicos ((IDynamicMapEvents_Event) gDynamicMap) .DynamicMapFinished + = new IDynamicMapEvents_DynamicMapFinishedEventHandler (OnTimerElapsed); ((IDynamicMapEvents_Event) gDynamicMap) .AfterDynamicDraw + = nuevo IDynamicMapEvents_AfterDynamicDrawEventHandler (OnAfterDynamicDraw); // inicia el observador eLogWatcher = new FileSystemWatcher (); eSnavWatcher.Path = BaseFolderPath.Text + " pos"; eSnavWatcher.Filter = "* .log"; // establezca esto o obtendrá eventos para cada archivo que cambie eSnavWatcher.NotifyFilter = NotifyFilters.LastWrite; // esto también, limita los eventos eSnavWatcher.Changed + = new FileSystemEventHandler (eSnavWatcher_Changed); eSnavWatcher.EnableRaisingEvents = true; } private void OnTimerElapsed (IDisplay Display, IDynamicDisplay dynamicDisplay) {# procese un poco aquí, el mapa ya se está actualizando # es seguro no hacer nada aquí si! gLOGchanged - nada que hacer. if (gLOGchanged) {# lea aquí gLOGchanged = false; // ¡Reiniciar! }} void OnAfterDynamicDraw (esriDynamicMapDrawPhase DynamicMapDrawPhase, IDisplay Display, IDynamicDisplay dynamicDisplay) {# dibuje gráficos en la pantalla aquí} void eSnavWatcher_Changed (remitente del objeto, FileSystemEventArgs e) {gLOGchanged = true; }

La clave aquí es DynamicMap y DynamicDisplay, que dispara cada intervalo de forma continua. Para dibujar gráficos es necesario utilizar DynamicSymbols (no símbolos estándar).

Usando un FileSystemWatcher establezco un booleano si se cambia un archivo y luego, con la actualización regular, detecto ese booleano que indica que el archivo ha cambiado. Nota: con el almacenamiento en búfer, es posible que el archivo no cambie cuando usted cree que sí, FileSystemWatcher responde solamente cuando el archivo del disco ha cambiado.

Este código proviene de una herramienta de trabajo que traza el curso de un vehículo en tiempo real (o lo suficientemente cerca) en una computadora portátil para saber si el vehículo se está desviando y corrige antes de que los datos capturados sean inválidos.


Ver el vídeo: How to recover path environment variables on Windows 10