GRASS GIS, in addition to importing data in its native formats via
`r.in.gdal`/`v.in.ogr` (and likewise `r.import`/v.import`),
also supports `r.external`/`v.external` which only link the data into
the GRASS DB.
Nevertheless, both `r.external` and `v.external` occasionally have problems,
especially on windows. E.g.:
- https://trac.osgeo.org/grass/ticket/3927
GRASS 7 Processing Plugin already has a setting that controls whether
`v.external` is used (disabled by default).
With this commit the complementary setting for `r.external` gets added too.
Usage of `r.external` is disabled by default. This is changing the existing
behavior, which was to use r`r.external`. The downsides of this change
should be the somewhat lower import speed + higher disk usage. Nevertheless
this way we have the same default value as `v.external` + we circumvent the
`r.import/v.import` shortcomings.
This change makes it easier to subclass `Grass7AlgorithProvider` which
allows e.g. to expose GRASS Addons as QGIS plugins.
Disclaimer: `Grass7AlgorithProvider` is a private API and it may change
without warning. 3rd parties that rely on this should expect
that their code will break in future releases.
For more info please check the comments at #30252
Nevertheless, it currently is possible to subclass with something like this:
class CustomGrassBasedProvider(Grass7AlgorithmProvider):
# Set descriptionFolder to our own description directory
descriptionFolder = os.path.join(os.path.dirname(__file__), 'description')
# 3rd party plugins don't need an activation/deactivation setting
activateSetting = None
# define the rest of the methods that are needed (e.g. name(), id() etc)
# ...
Fixes#30241
Continues #9202
This is a continuation of:
- #8db3dead87e385f2798356d
- #5c97d22b16320874dbe1
This commit only affects users that have multiple GRASS installations on
their Macs. Using the most recent GRASS version is what we do on Linux too.
After @Nyalldawson suggestion [1], we've implemented a Processing plugin
that exposes a GRASS Addon [2]. In order to do this we had to subclass
`Grass7AlgorithmProvider` and override `createAlgsList()`.
`createAlgsList()` had to be overriden in order to change the
"description folder" location.
Nyall wrote:
> And if you do it right (and only import existing
> processing grass code, minimising the copy/paste of this code), then
> your provider will automatically inherit any future fixes and
> features added to the main grass provider.
With this commit we convert the `descriptionFolder` to a class attribute
and in this way, subclasses of `Grass7AlgorithmProvider` will no longer
have to override `createAlgsList()` and will be able to continue inheriting
future enhancements.
References:
1. https://lists.osgeo.org/pipermail/qgis-developer/2019-February/056155.html
2. 948820b1c0/estimap_recreation_provider.py (L40-59)