Нужна помощь с "геометрией"

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
axav
Интересующийся
Сообщения: 16
Зарегистрирован: 24 апр 2013, 13:33
Репутация: 2

Нужна помощь с "геометрией"

Сообщение axav » 04 янв 2014, 14:26

Здравствуйте
С наступившим всех!
Разрабатываю плагин для QGIS.
Стоит такая задача. Геометрия в XML файле описана в виде точек:
<Point>
<UIDP>10</UIDP>
<PN>7</PN>
<DeterminationMethod>
<Survey></Survey>
</DeterminationMethod>
<X>5345406.27</X>
<Y>6275515.35</Y>
<MX>0</MX>
<MY>0</MY>
</Point>
И линий:
<PL>
<ULID>1</ULID>
<Points>
<P>10</P>
<P>11</P>
<P>12</P>
<P>2</P>
<P>3</P>
<P>4</P>
</Points>
<Length>36.0256882174956</Length>
</PL>
Отрисовать все это в QGIS не проблема, сделал слой точки(точки) и слой линии(линии).Как организовать связь между слоем линии и точки что б при редактировании точки изменялись линии в состав которых входит эта точка. Или хотя бы получать сообщение о изменении в слое "точки" что б дернуть метод и изменить, перерисовать линии.

axav
Интересующийся
Сообщения: 16
Зарегистрирован: 24 апр 2013, 13:33
Репутация: 2

Re: Нужна помощь с "геометрией"

Сообщение axav » 14 янв 2014, 15:56

Как положено сам себе и отвечаю :)
Только этот сигнал и работает :cry:
QObject.connect(layer, SIGNAL("layerModified()"), layerModified)

QObject.connect(layer, SIGNAL("featureAdded()"), featureAdded) #Устанавливается, но не работает
QObject.connect(layer, SIGNAL("featureDeleted()"), featureDeleted) #Устанавливается, но не работает



def layerModified():
QgsMessageLog.logMessage(u'Слой изменён.',Сообщение')
return

def GeometryChanged(fID, fGeom):
QgsMessageLog.logMessage(u'Изменена геометрия объекта.',u'Сообщение')
return

def featureAdded():
QgsMessageLog.logMessage(u'Создан новый объект.',u'Сообщениеx')
return

def featureDeleted():
QgsMessageLog.logMessage(u'Объект удалён.',u'Сообщение')
return

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Нужна помощь с "геометрией"

Сообщение yellow-sky » 15 янв 2014, 10:57

Win7 x86_64. QGIS 2.1.0-Master 9b0652f
Все отлично работает.

Добавил слой, в питоновской консоле набрал:

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

lyr = iface.activeLayer()
def added(): QgsMessageLog.logMessage(u'Добавлена геометрия',u'Сообщение')
lyr.featureAdded.connect(added)
После любое добавление нового объекта выводит в логе сообщение.

axav
Интересующийся
Сообщения: 16
Зарегистрирован: 24 апр 2013, 13:33
Репутация: 2

Re: Нужна помощь с "геометрией"

Сообщение axav » 15 янв 2014, 14:26

Все отлично работает.
К сожалению работает только этот сигнал.
QObject.connect(layer, SIGNAL("layerModified()"), layerModified)
От него в моем случае толку немного. Невозможно понять не только какой объект изменился, но даже в каком слое произошли изменения.
Есть сигнал geometryChanged, но он не работает и в обозримом будущем скорее всего не заработает.
http://hub.qgis.org/issues/6573

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Нужна помощь с "геометрией"

Сообщение yellow-sky » 16 янв 2014, 10:41

Вы бы хоть сказали на какой версии у вас не работает.
У меня прелестно работает на трех версиях: 2.0.1 и 2.1-Master для венды и 2.1 для линукса.
Да, на geometryChanged в венде можно подписаться только в старом стиле. Все остальные сигналы подключаются и работают и в новом стиле.

pi1985
Новоприбывший
Сообщения: 1
Зарегистрирован: 21 янв 2014, 17:15
Репутация: 0

Re: Нужна помощь с "геометрией"

Сообщение pi1985 » 21 янв 2014, 22:11

Хочу подключить geometryChanged питоне в (QGIS 2.1-0c6d9ef в linux):

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

QObject.connect(layer, SIGNAL("geometryChanged(QgsFeatureId, QgsGeometry)"), GeometryChanged(QgsFeatureId, QgsGeometry))
Но при выполнении строки возникает ошибка: QgsFeatureId не определено. Какой модуль нужно подключить для его использования?
Сейчас подключены:

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

import os.path, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
import logging

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Нужна помощь с "геометрией"

Сообщение yellow-sky » 23 янв 2014, 10:38

Вы используете неверный синтаксис.
При подключении сигналов в старом стиле последний аргумент - название функции или метода. Поэтому ваш код должен быть таким:

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

QObject.connect(layer, SIGNAL("geometryChanged(QgsFeatureId, QgsGeometry)"), GeometryChanged)

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя