ลงทะเบียน qgsfunction ที่กำหนดเองใน pyqgis


9

ฉันใช้ pyqgis ในแอปพลิเคชันแบบสแตนด์อโลน ตอนนี้ผมต้องการที่จะสร้างการแสดงออกที่กำหนดเองเพื่อที่จะใช้เป็น FilterExpression ruleBasedRendererV2ในการปกครองของ (ฉันลองใช้โหมดแสดงภาพกับฟังก์ชั่นที่มีอยู่ก่อนหน้าและทุกอย่างทำงานได้ดี!)

Custom qgisfunction(bitwise AND-function - เนื่องจากยังไม่มีฟังก์ชั่นดังกล่าว) มีลักษณะดังนี้:

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/11/user-defined-expression-functions-for-qgis/ )

UPDATE: การลงทะเบียนฟังก์ชั่นใช้งานได้จนถึงตอนนี้ด้วยรหัสจากด้านบน - ตอนนี้ปัญหาอยู่ที่ฟังก์ชัน ...

อัปเดต # 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 และฟังก์ชั่นนั้นมีอยู่ใน python ส่วน Builder expression
ThomasG77

ปฏิบัติตามคำแนะนำของคุณฟังก์ชั่นจะปรากฏในเครื่องมือแก้ไขฟังก์ชั่น QGIS และฉันสามารถใช้งานได้ตามที่คาดไว้ แต่เมื่อพยายามใช้มันในแอปพลิเคชันแบบสแตนด์อโลนของฉันฟังก์ชั่นไม่ทำงาน! - ฉันคิดว่าเมื่อ QGIS เริ่มต้นมันจะลงทะเบียนไฟล์ทั้งหมดในโฟลเดอร์ expression แต่ฉันสงสัยว่าอย่างไร!
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) 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.