Зарегистрировать пользовательскую функцию qgs в pyqgis

9

Я использую Pyqgis в автономном приложении. Теперь я хотел создать собственное выражение для использования в качестве filterExpression в rule ruleBasedRendererV2. (Я пробовал рендерер с существующими функциями, и все работало нормально!)

Пользовательская qgisfunction(побитовая AND-функция - поскольку такой функции еще нет) выглядит так:

from qgis.utils import qgsfunction

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1 & value2

Я также попытался зарегистрировать его через:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 

Тестирование выражения с помощью:

expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
    print(exp.parserErrorString())

(Даёт 2=2так всегда True) работает после регистрации функции и не работает, если нет. Но все же я не могу использовать выражение в правиле ...

Прямо сейчас файл, содержащий функцию, находится сверху в папке моего проекта, которая автоматически включается в PATH, не так ли ?! (По словам Натана Вудроу, файл можно разместить в любом месте в PATH - см. Https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).

ОБНОВЛЕНИЕ: регистрация функции работает до сих пор, с кодом сверху - теперь проблема заключается в самой функции ...

ОБНОВЛЕНИЕ № 2:

Очень странно! Простая функция do_nothingполучения двух аргументов прекрасно работает в моем коде:

@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
    return value1

Используя выражение expString = 'do_nothing(2, 2) = 2'

ОБНОВЛЕНИЕ № 3:

Простое изменение do_nothingна add_oneбольше не работает:

@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
    return value1 + 1

звонить через expString = 'add_one(2, 2) = 3'. Вот почему я думаю, что это как-то связано с возвращением типа ?!

Henhuy
источник
1
Скопируйте ваш файл, ~/.qgis2/python/expressions/затем перезагрузите QGIS, и функция будет доступна в разделе python для построителя выражений
ThomasG77
Следуя вашему совету, функция появится в редакторе функций QGIS, и я могу использовать ее, как и ожидалось. Но при попытке использовать его в моем автономном приложении функция не работает! - Думаю, когда QGIS запускается, он как-то регистрирует все файлы в папке выражений, но мне интересно, как ?!
Henhuy
Используете ли вы @qgsfunctionфункцию в вашем коде, как вы определяете функцию в коде. Вы можете игнорировать expressionsпапку, если вы создаете свой собственный скрипт, предназначенный только для основного приложения
Nathan W
Вы правы - при регистрации функция работает как описано выше (например do_nothing). Но моя оригинальная функция bitwise_andвсе еще не работает. Теперь я думаю, что это как-то связано с типом возвращаемого значения функции, поскольку do_nothing works, но add_oneне имеет!
Henhuy

Ответы:

8

Я наконец-то решил проблему!

Это была действительно проблема типа, так как входные значения определены как QVariantвнутри @qgsfunction. Итак, чтобы заставить мой код работать, я должен был сначала преобразовать их в целые числа. Судя по всему, QGIS сама занимается преобразованием типов ...

Теперь функция выглядит так:

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1.toInt()[0] & value2.toInt()[0]

И если у вас есть функция, размещенная в папке вашего проекта, не забудьте сначала зарегистрировать ее:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
Henhuy
источник