Зареєструйте власну qgsfunction в pyqgis


9

Я використовую pyqgis в окремому додатку. Тепер я хотів створити спеціальний вираз, який використовуватиме як filterExpression у правилі 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'. Тому я вважаю, що це має відношення до типу, що повертається ?!


1
Скопіюйте свій файл, ~/.qgis2/python/expressions/а потім перезавантажте QGIS, і функція доступна в розділі
конструктора

Після вашої поради, функція з’являється в редакторі функцій QGIS, і я можу використовувати її як слід. Але при спробі використовувати його в моєму автономному додатку, функція не працює! - Я думаю, коли QGIS запускається, він якось реєструє всі файли у папці виразів, але мені цікаво як ?!
Хенхуй

Чи використовуєте ви @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) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.