Đăng ký tùy chỉnh qssfloyment trong pyqgis


9

Tôi đang sử dụng pyqgis trong một ứng dụng độc lập. Bây giờ tôi muốn tạo một biểu thức tùy chỉnh để sử dụng như bộ lọcExpression theo quy tắc ruleBasedRendererV2. (Tôi đã thử trình kết xuất với các chức năng hiện có trước đây và mọi thứ đều hoạt động tốt!)

Tùy chỉnh qgisfunction(hàm bitwise AND - vì chưa có chức năng như vậy) trông như thế này:

from qgis.utils import qgsfunction

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

Tôi cũng đã cố gắng đăng ký nó, thông qua:

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

Kiểm tra biểu thức thông qua:

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

(Đưa ra 2=2luôn luôn True) hoạt động sau khi đăng ký chức năng, và thất bại nếu không. Nhưng vẫn vậy, tôi không thể sử dụng biểu thức trong một quy tắc ...

Ngay bây giờ, tệp chứa hàm nằm ở trên cùng trong thư mục dự án của tôi, được tự động đưa vào PATH, phải không?! (Theo Nathan Woodrow, tập tin có thể được đặt ở bất cứ đâu trong PATH - xem https://nathanw.net/2012/11/10/user-dained-expression-fifts-for-qgis/ ).

CẬP NHẬT: Đăng ký chức năng hoạt động cho đến nay, với mã từ phía trên - bây giờ vấn đề nằm ở chính chức năng ...

CẬP NHẬT # 2:

Rất lạ! Hàm đơn giản do_nothingnhận hai đối số hoạt động tốt trong mã của tôi:

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

Sử dụng biểu thức expString = 'do_nothing(2, 2) = 2'

CẬP NHẬT # 3:

Thay đổi đơn giản do_nothingthành add_onekhông còn hoạt động nữa:

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

gọi nó qua expString = 'add_one(2, 2) = 3'. Đó là lý do tại sao tôi nghĩ rằng nó có liên quan đến loại trở lại?!


1
Sao chép tệp của bạn ~/.qgis2/python/expressions/sau đó tải lại QGIS và chức năng có sẵn trong phần trình tạo biểu thức python
ThomasG77

Theo lời khuyên của bạn, chức năng xuất hiện trong trình chỉnh sửa chức năng của QGIS và tôi có thể sử dụng nó như mong đợi. Nhưng khi cố gắng sử dụng nó trong ứng dụng độc lập của tôi, chức năng không hoạt động! - Tôi nghĩ, khi QGIS bắt đầu, bằng cách nào đó, nó đăng ký tất cả các tệp trong thư mục biểu thức, nhưng tôi tự hỏi làm thế nào?!
Henhuy

Bạn có đang sử dụng @qgsfunctionhàm trong mã của mình không, như trong bạn xác định hàm trong mã. Bạn có thể bỏ qua expressionsthư mục nếu bạn đang tạo tập lệnh của riêng mình chỉ dành cho ứng dụng chính
Nathan W

Bạn đã đúng - khi đăng ký chức năng hoạt động như mô tả ở trên (ví dụ do_nothing). Nhưng chức năng ban đầu của tôi bitwise_andvẫn không hoạt động. Bây giờ, tôi nghĩ nó có liên quan đến kiểu trả về của hàm do_nothing works, nhưng add_onekhông được!
Henhuy

Câu trả lời:


7

Cuối cùng tôi đã giải quyết được vấn đề!

Đây thực sự là một vấn đề kiểu, vì các giá trị đầu vào được xác định như QVariantbên trong @qgsfunction. Vì vậy, để làm cho mã của tôi hoạt động, trước tiên tôi phải chuyển đổi chúng thành số nguyên. Rõ ràng, QGIS tự xử lý các chuyển đổi loại ...

Chức năng trông như thế này bây giờ:

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

Và nếu bạn có chức năng được đặt trong thư mục dự án của mình, đừng quên đăng ký trước:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.