@Stefan: top, das ist natürlich noch eleganter @Claas: jetzt ist Dir alles klar, musst es nur noch umsetzen :-) Bernhard
> Stefan Giese (WhereGroup) <stefan.gi...@wheregroup.com> hat am 29.09.2022 > 13:09 CEST geschrieben: > > > 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.regiod...@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.lei...@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/56013445 > >>> claas.lei...@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 Veranstaltungen > >>> https://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 list > >>> FOSSGIS-Talk-Liste@fossgis.de > >>> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste > >>> > >> -- > >> .................................................................... > >> FOSSGIS Veranstaltungen > >> https://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 list > >> FOSSGIS-Talk-Liste@fossgis.de > >> https://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 derwww.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.gi...@wheregroup.com > www.wheregroup.com > Geschäftsführer: > Olaf Knopp, Peter Stamm > Amtsgericht Bonn, HRB 9885 -- .................................................................... FOSSGIS Veranstaltungen https://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 list FOSSGIS-Talk-Liste@fossgis.de https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste