A new feature for QGIS 2.8 is a function editor for expressions. Being able to define your own custom functions has be possible for a while now, over a year, I even have a plugin (Expressions+) that adds some extra ones, however it wasn’t easy for new users and required you to create files that lived on python path while also editing the startup.py file for QGIS so that functions got registed at start up. Way too much effort for my liking.
This feature is now exposed via the expression builder on the Function Editor tab. The function editor will create new Python files in
qgis2\python\expressions and will auto load all functions defined when starting QGIS. I remember Sean Gillies saying that Python support in a field calculator should be a gateway to full Python programming, can’t get any more Python then full Python modules.
The best way to show this feature is a quick video so here it is
The play button in the editor will run the current editor file in the QGIS session and register any functions it finds, it will also save the file in the expressions folder.
You can make a new file by pressing the new file button which will add the basic function template, changing the name in the combobox and hitting save will save the file.
The function editor allows you have to define reuseable functions for your QGIS. If you want to share a function you simply share the .py file from the
expressions folder and give it to another user. In future versions of QGIS we might have a way to download other users functions.
Auto expanding values
You can also use the
args="auto" keyword in place of the number of args which will let QGIS work it out and expand the arguments for you.
Here is an example
@qgsfunction(args="auto", group='Custom') def myfunc(value1, value2 feature, parent): pass
and can be used like this:
QGIS will workout how many arguments your function takes based on what you have defined. Note: The last arguments should always be feature, parent, these are not included in the count.
If you need to report a error from a function simply use the
raise method like normal in QGIS and raise an exception.
@qgsfunction(args="auto", group='Custom') def myfunc(value1, value2 feature, parent): raise Expection("Hahah Nope!")
The function wrapper will catch the exception and raise it though the expression engine.
A couple of things to note
- New functions are only saved in the
expressionsfolder and not in the project file. If you have a project that uses one of your custom functions you will need to also share the .py file in the expressions folder.
- The editor doesn’t unregister any functions. If you define a function called
test, hit play, change the name to
test_2, hit play, both functions will exist until you reload QGIS.