Viac

Automatické obnovenie vyvolané zmenami v adresári pre ArcPy?


Mám skript sledovania zmeny adresára, ktorý sleduje všetky zmeny, ktoré sa v adresári vyskytli, chcem spustiť automatické obnovenie Arcmap vždy, keď bola zistená zmena (napr. Do súboru bol pridaný nový riadok). Pokúsil som sa spustiť program monitorovania v príkazovom okne arcmap python pomocou execfile ("myprogram.py"). Problém, s ktorým som sa stretol, je, že akonáhle skript začne monitorovať a automaticky sa obnovovať, hlavné okno arcmap bolo zamknuté a zamrznuté, nijako ho nezastavím, okrem vypnutia arcmap, aj keď vidím, že k automatickému obnoveniu došlo vždy, keď existuje zmeniť. Existuje spôsob, ako spustiť skript monitora v samostatnom procese alebo na pozadí bez uzamknutia alebo zmrazenia hlavného okna? Tu je môj monitorovací skript, ktorý je vypožičaný od Tima Goldena,

import os import win32file import win32con import arcpy # Vyhľadať nové údaje AKCIA = {1: "Vytvorené", 2: "Odstránené", 3: "Aktualizované", 4: "Premenované z niečoho", 5: "Premenované na niečo" } 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 | win_con_FE__IN_FINE_FREE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE_FINE, = 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, None, None) k akcii, súbor vo výsledkoch: full_filename = os. path.join (path_to_watch, file) print full_filename, ACTION.get (action, "Unknown") arcpy.RefreshActiveView ()

Tu je absolútna matice a skrutky metódy:

IDynamicMap gDynamicMap; IDynamicDisplay gDynamicDisplay; FileSystemWatcher eLogWatcher; bool gLOGchanged = false; protected override void OnClick () {IMap pMap = ArcMap.Document.FocusMap; gDynamicMap = (IDynamicMap) pMap; if (! gDynamicMap.DynamicMapEnabled) gDynamicMap.DynamicMapEnabled = true; gDynamicMap.DynamicDrawRate = (int) RefreshRate.Value; // tu nastavíte svoju obnovovaciu frekvenciu // drôtové dynamické udalosti ((IDynamicMapEvents_Event) gDynamicMap) .DynamicMapFinished + = nový IDynamicMapEvents_DynamicMapFinishedEventHandler (OnTimerElapsed); ((IDynamicMapEvents_Event) gDynamicMap) .AfterDynamicDraw + = nový IDynamicMapEvents_AfterDynamicDrawEventHandler (OnAfterDynamicDraw); // spustiť strážcu eLogWatcher = nový FileSystemWatcher (); eSnavWatcher.Path = BaseFolderPath.Text + " pos"; eSnavWatcher.Filter = "* .log"; // nastavte toto, alebo získate udalosti pre každý súbor, ktorý zmení eSnavWatcher.NotifyFilter = NotifyFilters.LastWrite; // aj toto obmedzte udalosti eSnavWatcher.Changed + = new FileSystemEventHandler (eSnavWatcher_Changed); eSnavWatcher.EnableRaisingEvents = true; } private void OnTimerElapsed (IDisplay Display, IDynamicDisplay dynamicDisplay) {# urobte nejaké spracovanie tu, mapa sa už obnovuje # je bezpečné tu nič nerobiť, ak! gLOGchanged - nič robiť. if (gLOGchanged) {# čítate tu gLOGchanged = false; // reset! }} void OnAfterDynamicDraw (esriDynamicMapDrawPhase DynamicMapDrawPhase, IDisplay Display, IDynamicDisplay dynamicDisplay) {# nakresliť grafiku na obrazovku tu} void eSnavWatcher_Changed (odosielateľ objektu, FileSystemEventArgs e) {gLOGchanged = true; }

Kľúčom je DynamicMap a DynamicDisplay, ktoré nepretržite spúšťajú každý interval. Aby ste mohli kresliť grafiku, musíte použiť DynamicSymbols (nie štandardné symboly).

Pomocou FileSystemWatcher nastavím boolean, ak sa zmení súbor, a potom pomocou pravidelného obnovenia zistím, že boolean označujúci zmenu súboru. Poznámka: Ak si myslíte, že sa ukladanie do vyrovnávacej pamäte môže zmeniť, súbor FileSystemWatcher odpovie iba keď sa zmenil súbor na disku.

Tento kód pochádza z pracovného nástroja, ktorý vykresľuje priebeh vozidla v reálnom čase (alebo v dostatočnej blízkosti) na notebooku, aby zistil, či vozidlo ide z kurzu, a opraví ho skôr, ako sú zaznamenané údaje neplatné.


Pozri si video: Python: Map Automation in ArcGIS Pro (Október 2021).