Страница 1 из 1

Автообновление

Добавлено: 09 окт 2017, 11:18
BPV217
Не могу найти настройки автообновления карты.
В идеале обновление одного слоя.
Нужно что бы без каких либо манипуляций с картой обновлялся слой.
QGis 2.18.13

Re: Автообновление

Добавлено: 09 окт 2017, 15:08
Эдуард Казаков
В консоли

Код: Выделить всё

layer.dataProvider().forceReload()
layer.triggerRepaint()
где в layer ваш объект QGSVectorLayer. Будет перерисовываться только он.

Можно обернуть в таймер, чтобы само запускалось каждые n времени. Можно наверное плагин заделать, который будет управлять этим. Штатного решения вроде бы нет.

Re: Автообновление

Добавлено: 10 окт 2017, 15:55
BPV217
Такой запрос в питоне, но обновляет всю карту.

Код: Выделить всё

import PyQt4
from PyQt4 import QtCore

def timer_action():
    layer = iface.activeLayer()
    layer.dataProvider().forceReload()
    layer.triggerRepaint()
  
  timer = QtCore.QTimer()
QtCore.QObject.connect(timer, QtCore.SIGNAL('timeout()'), timer_action)
timer.start(10000)
Что не так, почему он не конкретный слой проверяет?
Как задать эту функцию для конкретного слоя, а не для всей карты и без использования iface.activeLayer(),
Я пробовал заменять layer на u'\u041f\u0426' (как я понял это и есть название моего слоя на питоне)

Код: Выделить всё

layer = iface.activeLayer()
layer.name()
Но не помогло.

Код: Выделить всё

layer = u'\u041f\u0426'
Тоже не заработало.

И в конечном итоге, какие варианты есть рационального запуска всего этого со стороны пользователя, в конечном итоге нужно либо кнопку создать, либо в QGis на автовыполнение поставить. Какие у меня варианты создать что-либо?

Re: Автообновление

Добавлено: 16 окт 2017, 11:54
BPV217
Рабочий вариант:

Код: Выделить всё

import time,threading
interval=6 #Интервал в секундах
def job():
    name = u'\u0411\u043e\u043b\u043e\u0442\u0430'
    layer = QgsMapLayerRegistry.instance().mapLayersByName(name)[0]
    layer.triggerRepaint()
    threading.Timer(interval,job).start()
threading.Timer(interval,job).start()
Узнать название слоя

Код: Выделить всё

layer = iface.activeLayer()  #layer = активный слой
layer.name()                 #Имя объекта layer

Re: Автообновление

Добавлено: 16 окт 2017, 14:32
BPV217
Как теперь это всё поставить на автозапуск, чтоб при запуске QGis включался скрипт?

Re: Автообновление

Добавлено: 31 окт 2017, 10:36
BPV217
Вопрос решили так:
в папке ...\.qgis2\python создали файл startup.py

Код: Выделить всё

from PyQt4 import QtGui, QtCore
from qgis._core import *

def tick():
    layerList = [u'SensorData']
    for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
        if lyr.name() in layerList:
            if lyr != None: lyr.triggerRepaint()    

interval=10

timer = QtCore.QTimer()
timer.timeout.connect(tick)
timer.start(interval * 1000)

def job():
    layer=None
    print 'non'
    print layer
    for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
        if lyr.name() == u'\u0417\u0434\u0430\u043d\u0438\u044f':
            layer = lyr
            break
    print layer.name()
    if layer != None: layer.triggerRepaint()
    print layer

Всё работает, слой SensorData обновляется раз в 10 сек.

Re: Автообновление

Добавлено: 20 ноя 2017, 08:43
BPV217
Я могу средствами QGis сделать звуковое оповещение при изменении параметров у символа?
Взять какое-либо значение за норму, а в случае отклонения от неё сделать звуковое оповещение, а так же при возвращении в норму, другое оповещение.

Re: Автообновление

Добавлено: 04 июл 2018, 09:20
BPV217
Никто не делал автообновление экрана в версии 3.0+
С версией 2.18 мы разобрались, но нам нужно всё тоже самое повторить в версии 3.0+, желательно в 3.2, что-бы уже раз и навсегда уйти от 2.18
Мб. startup.py надо переделать или положить в другое место, мб новые решения появились
Подскажите в какую сторону копать