123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- """
- ***************************************************************************
- Grass7AlgorithmProvider.py
- ---------------------
- Date : April 2014
- Copyright : (C) 2014 by Victor Olaya
- Email : volayaf at gmail dot com
- ***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************
- """
- __author__ = 'Victor Olaya'
- __date__ = 'April 2014'
- __copyright__ = '(C) 2014, Victor Olaya'
- import os
- from pathlib import Path
- from qgis.PyQt.QtCore import QCoreApplication
- from qgis.core import (Qgis,
- QgsApplication,
- QgsProcessingProvider,
- QgsVectorFileWriter,
- QgsMessageLog,
- QgsProcessingUtils,
- QgsRuntimeProfiler)
- from processing.core.ProcessingConfig import (ProcessingConfig, Setting)
- from grassprovider.Grass7Utils import Grass7Utils
- from grassprovider.Grass7Algorithm import Grass7Algorithm
- from processing.tools.system import isWindows, isMac
- class Grass7AlgorithmProvider(QgsProcessingProvider):
- descriptionFolders = Grass7Utils.grassDescriptionFolders()
- def __init__(self):
- super().__init__()
- self.algs = []
- def load(self):
- with QgsRuntimeProfiler.profile('Grass Provider'):
- ProcessingConfig.settingIcons[self.name()] = self.icon()
- ProcessingConfig.addSetting(Setting(
- self.name(),
- Grass7Utils.GRASS_LOG_COMMANDS,
- self.tr('Log execution commands'), False))
- ProcessingConfig.addSetting(Setting(
- self.name(),
- Grass7Utils.GRASS_LOG_CONSOLE,
- self.tr('Log console output'), False))
- ProcessingConfig.addSetting(Setting(
- self.name(),
- Grass7Utils.GRASS_HELP_URL,
- self.tr('Location of GRASS docs'), ''))
- # Add settings for using r.external/v.external instead of r.in.gdal/v.in.ogr
- # but set them to False by default because the {r,v}.external implementations
- # have some bugs on windows + there are algorithms that can't be used with
- # external data (need a solid r.in.gdal/v.in.ogr).
- # For more info have a look at e.g. https://trac.osgeo.org/grass/ticket/3927
- ProcessingConfig.addSetting(Setting(
- self.name(),
- Grass7Utils.GRASS_USE_REXTERNAL,
- self.tr('For raster layers, use r.external (faster) instead of r.in.gdal'),
- False))
- ProcessingConfig.addSetting(Setting(
- self.name(),
- Grass7Utils.GRASS_USE_VEXTERNAL,
- self.tr('For vector layers, use v.external (faster) instead of v.in.ogr'),
- False))
- ProcessingConfig.readSettings()
- self.refreshAlgorithms()
- return True
- def unload(self):
- ProcessingConfig.removeSetting(Grass7Utils.GRASS_LOG_COMMANDS)
- ProcessingConfig.removeSetting(Grass7Utils.GRASS_LOG_CONSOLE)
- ProcessingConfig.removeSetting(Grass7Utils.GRASS_HELP_URL)
- ProcessingConfig.removeSetting(Grass7Utils.GRASS_USE_REXTERNAL)
- ProcessingConfig.removeSetting(Grass7Utils.GRASS_USE_VEXTERNAL)
- def createAlgsList(self):
- algs = []
- folders = self.descriptionFolders
- for folder in folders:
- for descriptionFile in folder.glob('*.txt'):
- try:
- alg = Grass7Algorithm(descriptionFile)
- if alg.name().strip() != '':
- algs.append(alg)
- else:
- QgsMessageLog.logMessage(self.tr('Could not open GRASS GIS 7 algorithm: {0}').format(descriptionFile), self.tr('Processing'), Qgis.Critical)
- except Exception as e:
- QgsMessageLog.logMessage(
- self.tr('Could not open GRASS GIS 7 algorithm: {0}\n{1}').format(descriptionFile, e), self.tr('Processing'), Qgis.Critical)
- return algs
- def loadAlgorithms(self):
- version = Grass7Utils.installedVersion(True)
- if version is None:
- QgsMessageLog.logMessage(self.tr('Problem with GRASS installation: GRASS was not found or is not correctly installed'),
- self.tr('Processing'), Qgis.Critical)
- return
- self.algs = self.createAlgsList()
- for a in self.algs:
- self.addAlgorithm(a)
- def name(self):
- return 'GRASS'
- def longName(self):
- version = Grass7Utils.installedVersion()
- return 'GRASS GIS ({})'.format(version) if version is not None else "GRASS GIS"
- def id(self):
- return 'grass7'
- def helpId(self):
- return 'grass7'
- def icon(self):
- return QgsApplication.getThemeIcon("/providerGrass.svg")
- def svgIconPath(self):
- return QgsApplication.iconPath("/providerGrass.svg")
- def defaultVectorFileExtension(self, hasGeometry=True):
- # By default,'gpkg', but if OGR has not been compiled with sqlite3, then
- # we take "SHP"
- if 'GPKG' in [o.driverName for o in
- QgsVectorFileWriter.ogrDriverList()]:
- return 'gpkg'
- else:
- return 'shp' if hasGeometry else 'dbf'
- def supportsNonFileBasedOutput(self):
- """
- GRASS7 Provider doesn't support non file based outputs
- """
- return False
- def supportedOutputVectorLayerExtensions(self):
- # We use the same extensions than QGIS because:
- # - QGIS is using OGR like GRASS
- # - There are very chances than OGR version used in GRASS is
- # different from QGIS OGR version.
- return QgsVectorFileWriter.supportedFormatExtensions()
- def supportedOutputRasterLayerExtensions(self):
- return Grass7Utils.getSupportedOutputRasterExtensions()
- def canBeActivated(self):
- return not bool(Grass7Utils.checkGrassIsInstalled())
- def tr(self, string, context=''):
- if context == '':
- context = 'Grass7AlgorithmProvider'
- return QCoreApplication.translate(context, string)
|