[FOSSGIS-Talk] While-Schleife in Python-Plugin um auf Veränderungen in Attributtabelle zu reagieren

Thomas B rdbath.regiodata at gmail.com
Do Sep 29 13:35:47 CEST 2022


Hallo Stefan, Bernhard, Claas und co :-)
echt schick das gemeinsame Brainstorming.

Die Idee mit QtCore.QFileInfo.lastModified() oder QFileSystemWatcher ist ne
gute Sache und definitiv besser als immer einen ForceReload zu machen.

Das Beispiel, das ich gestern Claas geschickt hatte (
https://github.com/thbaumann/claas_temp ) , war auch erst mal nur als ein
Grundgerüst bzw. zum weiteren Ausbau gedacht und kurz in ein paar Minuten
aus meinen minimal-Plugin-Skelett, bestehenden eigenen Plugins und dem
Autosaver zusammengepackt.

Weil die QTimer-Thematik ja mit Vorsicht zu genießen ist und da die Lösung
von Bernhard schon ausgefeilter klang, hatte ich es mal nur off-list als
Inspiration geschickt aber in Verbindung mit dem "Gefahrenhinweis" ist es
ja ok, wenn jemand hier über das Beispiel stolpert.

@Bernhard: Dein Plugin würde mich auch interessieren. Falls du mir den
Quellcode mal schicken möchtest würde ich da auch gerne mal draufschauen.

VG
Thomas


Am Do., 29. Sept. 2022 um 13:09 Uhr schrieb Stefan Giese (WhereGroup) <
stefan.giese at wheregroup.com>:

> Hallo alle,
>
> gerade noch die Idee gehabt ob es so was wie ein watcher Klasse in Qt
> gibt...und siehe da:
>
> from PyQt5.QtCore import QFileSystemWatcher
> watcher = QFileSystemWatcher()
> watcher.addPath(filePath)
> watchedLayer = vlayer
> def reload_watched_layer():
>     watchedLayer.dataProvider().forceReload()
> watcher.fileChanged.connect(reload_watched_layer)
>
> Am 29.09.2022 um 13:04 schrieb Bernhard Ströbl:
>
> Hallo Thomas und Liste,
> genau mit dem QTimer habe ich das seinerzeit auch gemacht. Bei mir war es auch so, dass das andere Programm eine Textdatei geschickt bzw. etwas in die Zwischenablage gelegt hat mit einem Schlüsselwort drin. Der QTimer prüft dann regelmässig, ob was da ist und wenn ja, emittet er ein Signal.
> Bei der dbf könnte QGIS ja den Zeitpunkt der letzten Änderung prüfen (QtCore.QFileInfo.lastModified()), und nur, wenn der neuer ist als der letze, wird der Layer refresht, braucht auf jeden Fall weniger Zeit und Ressourcen als ein Refresh des Layers mit nachfolgender Abfrage; geht natürlich nur, wenn es gelegentliche Änderungen gibt und nicht alle paar Sekunden, hängt also auch wieder vom Einsatzbereich ab.
> Grüße
> Bernhard
>
>
> Thomas B <rdbath.regiodata at gmail.com> <rdbath.regiodata at gmail.com> hat am 29.09.2022 12:22 CEST geschrieben:
>
>
> Hallo in die Runde,
> ich teile grundsätzlich die Bedenken gegen Lösungen, wo ein Timer im
> Hintergrund läuft und im selben Thread werkelt und würde auch wenn möglich
> Signale abgreifen.
> Bei Änderungen an der DBF durch einen anderen Prozesses wird das allerdings
> schwierig, weil QGIS ja nicht ohne Anlass dauernd auf  die Festplatte
> schaut, ob sich was ändert. Sprich solange du keinen Refresh auslöst, z.B.
> durch Bewegen innerhalb des Layers wird QGIS erst mal nichts von den
> Änderungen auf der Platte mitbekommen.
> Man könnte in den Layereigenschaften das Aktualisierungsinterval nutzen
> aber in zu kurzen Intervallen will das auch niemand machen.
>
> Ich persönlich differenziere auch etwas nach der Frage, wie breit der
> Nutzerkreis ist. Bei hausinternen Plugins mit klar begrenztem/geschulten
> Nutzerkreis würde ich ggf. auch Sachen nutzen, die ich bei einem breiten
> Nutzerkreis (offizielles Repo o.ä.) nicht machen würde. QTimer haben wir
> hausintern zwar nicht bei eigenen Plugins im Einsatz aber das wäre ggf. so
> ein Fall ) .
>
> Vor ein paar Jahren hatte ich mal bei einer Behörde hier in Freiburg
> mitbekommen, dass die ein abzulösendes GIS mit QGIS synchronisieren
> wollten, sprich alle X Sekunden schrieb das alte GIS eine kleine txt-Datei
> mit dem zuletzt eingestellten Mapextent und QGIS schaute per QTimer drauf
> und stellte den Mapextent auch so ein. Wurde damals von einem
> Dienstleister, der mehrere QGIS-Core-Entwickler an Bord hat entwickelt.
> Es gibt auch andere Plugins, die mit einem QTimer arbeiten wie den
> AutoSaver, den ich seit mehreren Jahren tagtäglich aktiv habe (https://github.com/enricofer/autoSaver/blob/master/autosave.py#L203 )
>
> und auch mit dem Plugin SyncQGISWithDir des begabten German Carillo hab ich
> sehr gute Erfahrungen gemacht unter QGIS2 (https://github.com/gacarrillor/SyncQGISWithDir/blob/master/syncqgiswithdir.py
> ) .
>
> Wenn möglich wäre es sicher schick die Hauptarbeit (auf  die Platte
> schauen, ob sich was geändert  hat) in einen eigenen Task/Thread
> auszulagern. Dafür könnte evtl. das hier  hilfreich sein:https://gis.stackexchange.com/questions/307379/threading-with-timer-in-pyqgis/307631#307631
>
> Oder man lagert den Job zum Überwachen ganz aus QGIS aus in ein
> Standalone-Script, das einen TCP-Server betreibt und QGIS hat nur den
> Receiver dazu an Bord... Inspiration könnte man sich da aus dem
> QgsRemoteControl Plugin der Kollegen von Datalyze holen (https://github.com/datalyze-solutions/QgsRemoteControl ) .
> Wird zwar schon ne Weile nicht mehr weiterentwickelt aber zeigt ja die
> Grundidee auf.
>
> Auf jeden Fall eine spannende und in der Praxis immer mal wieder
> vorkommende Fragestellung, wie QGIS etwas mitbekommt, wenn sich Daten
> außerhalb von QGIS ändern.
>
> Am schicksten wäre die Lösung mit PostgreSQL, weil man da ja direkt bei
> Datenänderung über einen Trigger ein Signal an QGIS senden könnte, was von
> QGIS dann überwacht wird... rein mit Bordmitteln.
>
> Aber die Tatsache, dass Shapefiles heute manchmal halt bei
> Kunden/Firmen/Behörden noch im Einsatz sind kennt wohl jeder hier in der
> Liste und fällt unter den Hashtag #ischso :-)
>
> Viele Grüße,
> Thomas
>
>
>
>
> Am Mi., 28. Sept. 2022 um 16:16 Uhr schrieb Claas Leiner <claas.leiner at gkg-kassel.de>:
>
>
> Hallo Kolleginnen und Kollegen,
>
> ich bin ja jetzt auch immer wieder mit Python unterwegs
> und versuche folgende umzusetzen:
>
> In einem Punkt-Shapefile (leider Shapefile) gibt es
> die Spalte M1. Wenn ein externes Programm auf die DBF zugrieft und den
> Attributwert 50 in M1 einträgt, soll QGIS automatisch zu den
> betreffendem Punkt zoomen.
>
> Ich bekommes es in meinem Plugin hin, das QGIS mit einem Klick auf ein
> Icon automatisch zu den Punkten zoomt
>
> QGIS soll diese Veränderungen jedoch im Hintergrund erkennen und
> automatisch reagieren. Also ich klicke aufs Icon und nichts passiert,
> wenn kein Wert 50 vorhanden ist. Die Schaltfläche bleibt "checked" und
> wenn das externe Programm eine 50 in M1 einträgt, reagiert QGIS, ohne
> das ich ein weiteres mal klicken muss.
>
> Ich habe versucht das folgendermaßen umzusetzen:
> Mit einem Klick auf ein Icon wird folgende Funktion aufgerufen:
> -----------------------------------
>
> def tis_bau(self, checked):
>      vlayer = QgsProject.instance().mapLayersByName("Baeume")[0]
>
>      while checked:
>          time.sleep(1)
>          expr = QgsExpression('"M1"=50')
>          it = vlayer.getFeatures( QgsFeatureRequest(expr) )
>          anz = len(list(it))
>
>          if anz > 0:
>         #hier die Anwesiungen um zu den Objekten zu zoomen
>
>          else:
>              continue
>      else:
>          # hier igentetwass
>          break
> --------------------------------
>
> Die While-Schleife soll im Sekundentakt prüfen, ob der Wert 50
> eingetragen wurde und im Entdeckungsfall die Aktion auslösen.
> Wenn jetzt aber keine 50er gefunden werden, friert die While-Schleife
> QGIS ein.
> Ist es möglich, den Code so zu zuschreiben, dass die While-Schleife im
> Hintergrund läuft, ohne die  Benutzeroberfläche zu blockieren?
> Kann ich mein Ziel mit diesem Ansatz überhaupt erreichen?
>
> Ich freue mich über Ideen,
>
> Viele Grüße,
>
> Claas
>
>
>
>
> --
> -----------------------------------------
> GKG-Kassel - Dr.-Ing. Claas Leiner
> QGIS-Support und mehr
>
> Geodatenservice, Kartenwerkstatt &
> GIS-Schule Kassel
>
> Wilhelmshöher Allee 304 E
> 34131 Kassel
> Tel. 0561/56013445claas.leiner at gkg-kassel.de
> ----------------------------------------http://www.gkg-kassel.de
> ----------------------------------------
> Unterstützen Sie QGIS
> QGIS-DE e.V. | http://qgis.de
> QGIS Projekt | http://qgis.org/de/site/
> --
> ....................................................................
> FOSSGIS Veranstaltungenhttps://www.fossgis.de/news/fossgis-events/
>
> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
> GIS-Bereich und Freier Geodaten!https://www.fossgis.de/             https://twitter.com/FOSSGIS_Verein
>
> ____________________________________________________________________
> FOSSGIS-Talk-Liste mailing listFOSSGIS-Talk-Liste at fossgis.dehttps://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
>
> --
> ....................................................................
> FOSSGIS Veranstaltungenhttps://www.fossgis.de/news/fossgis-events/
>
> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
> GIS-Bereich und Freier Geodaten!https://www.fossgis.de/             https://twitter.com/FOSSGIS_Verein
>
> ____________________________________________________________________
> FOSSGIS-Talk-Liste mailing listFOSSGIS-Talk-Liste at fossgis.dehttps://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
>
> --
> Mit freundlichen Grüßen
> Stefan Giese
> Projektleiter/Consultant
> ---------------------------------------------
> Aufwind durch Wissen!
> Jetzt neu: Web-Seminare und Online-Schulungen
> bei der www.foss-academy.com
> ---------------------------------------------
> WhereGroup GmbH
> Schwimmbadstr. 2
> 79100 Freiburg
> Germany
>
> Tel.: +49 (0)761 / 519 102 - 61
> Fax: +49 (0)761 / 519 102 - 11
> stefan.giese at wheregroup.comwww.wheregroup.com
> Geschäftsführer:
> Olaf Knopp, Peter Stamm
> Amtsgericht Bonn, HRB 9885
>
>


Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste