Daftarkan fungsi qgs khusus di pyqgis

9

Saya menggunakan pyqgis dalam aplikasi mandiri. Sekarang saya ingin membuat ekspresi khusus untuk digunakan sebagai filterExpression ruleBasedRendererV2. (Saya mencoba renderer dengan fungsi yang ada sebelumnya dan semuanya bekerja dengan baik!)

Kustom qgisfunction(fungsi AND bitwise - karena belum ada fungsi seperti itu) terlihat seperti ini:

from qgis.utils import qgsfunction

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

Saya juga mencoba mendaftarkannya, melalui:

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

Menguji ekspresi melalui:

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

(Memberi 2=2selalu True) berfungsi setelah mendaftar fungsi, dan gagal jika tidak. Tapi tetap saja, saya tidak bisa menggunakan ekspresi dalam aturan ...

Saat ini, file yang berisi fungsi terletak di atas di folder proyek saya, yang secara otomatis dimasukkan ke PATH, bukan ?! (Menurut Nathan Woodrow, file dapat ditempatkan di mana saja di PATH - lihat https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).

PEMBARUAN: Mendaftarkan fungsi berfungsi sejauh ini, dengan kode dari atas - sekarang masalahnya terletak pada fungsi itu sendiri ...

PEMBARUAN # 2:

Sangat aneh! Fungsi sederhana do_nothingmendapatkan dua argumen berfungsi dengan baik dalam kode saya:

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

Menggunakan ekspresi expString = 'do_nothing(2, 2) = 2'

PEMBARUAN # 3:

Perubahan sederhana do_nothingmenjadi add_onetidak berfungsi lagi:

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

memanggilnya via expString = 'add_one(2, 2) = 3'. Itu sebabnya saya pikir itu ada hubungannya dengan mengetik kembali ?!

Henhuy
sumber
1
Salin file Anda ~/.qgis2/python/expressions/kemudian muat ulang QGIS dan fungsinya tersedia di bagian python ekspresi builder
ThomasG77
Mengikuti saran Anda, fungsi muncul di editor fungsi QGIS dan saya dapat menggunakannya seperti yang diharapkan. Tetapi ketika mencoba menggunakannya di aplikasi mandiri saya, fungsi tidak bekerja! - Saya pikir, ketika QGIS mulai, entah bagaimana mendaftarkan semua file dalam folder ekspresi, tapi saya bertanya-tanya bagaimana ?!
Henhuy
Apakah Anda menggunakan @qgsfunctionfungsi dalam kode Anda, seperti dalam Anda mendefinisikan fungsi dalam kode. Anda dapat mengabaikan expressionsfolder jika Anda membuat skrip Anda sendiri yang hanya untuk aplikasi utama
Nathan W
Anda benar - ketika mendaftar fungsi berfungsi seperti dijelaskan di atas (misalnya do_nothing). Tetapi fungsi asli saya bitwise_andmasih tidak berfungsi. Sekarang, saya pikir itu ada hubungannya dengan jenis kembalinya fungsi, karena do_nothing works, tetapi add_onetidak!
Henhuy

Jawaban:

8

Saya akhirnya memecahkan masalah!

Itu benar-benar tipe-masalah, karena nilai input didefinisikan sebagai QVariantdi dalam @qgsfunction. Jadi, untuk mendapatkan kode saya bekerja saya harus mengubahnya menjadi bilangan bulat terlebih dahulu. Tampaknya, QGIS menangani konversi tipe itu sendiri ...

Fungsi terlihat seperti ini sekarang:

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

Dan jika Anda memiliki fungsi yang ditempatkan di folder proyek Anda, jangan lupa untuk mendaftarkannya terlebih dahulu:

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