| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | """***************************************************************************    ScriptAlgorithmProvider.py    ---------------------    Date                 : August 2012    Copyright            : (C) 2012 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__ = 'August 2012'__copyright__ = '(C) 2012, Victor Olaya'import osfrom qgis.core import (Qgis,                       QgsMessageLog,                       QgsApplication,                       QgsProcessingProvider,                       QgsRuntimeProfiler)from processing.core.ProcessingConfig import ProcessingConfig, Settingfrom processing.gui.ProviderActions import (ProviderActions,                                            ProviderContextMenuActions)from processing.script.AddScriptFromFileAction import AddScriptFromFileActionfrom processing.script.CreateNewScriptAction import CreateNewScriptActionfrom processing.script.AddScriptFromTemplateAction import AddScriptFromTemplateActionfrom processing.script.DeleteScriptAction import DeleteScriptActionfrom processing.script.EditScriptAction import EditScriptActionfrom processing.script.OpenScriptFromFileAction import OpenScriptFromFileActionfrom processing.script import ScriptUtilsfrom processing.tools.system import userFolderclass ScriptAlgorithmProvider(QgsProcessingProvider):    def __init__(self):        super().__init__()        self.algs = []        self.additional_algorithm_classes = []        self.actions = [CreateNewScriptAction(),                        AddScriptFromTemplateAction(),                        OpenScriptFromFileAction(),                        AddScriptFromFileAction()                        ]        self.contextMenuActions = [EditScriptAction(),                                   DeleteScriptAction()]    def load(self):        with QgsRuntimeProfiler.profile('Script Provider'):            ProcessingConfig.settingIcons[self.name()] = self.icon()            ProcessingConfig.addSetting(Setting(self.name(),                                                ScriptUtils.SCRIPTS_FOLDERS,                                                self.tr("Scripts folder(s)"),                                                ScriptUtils.defaultScriptsFolder(),                                                valuetype=Setting.MULTIPLE_FOLDERS))            ProviderActions.registerProviderActions(self, self.actions)            ProviderContextMenuActions.registerProviderContextMenuActions(self.contextMenuActions)            ProcessingConfig.readSettings()            self.refreshAlgorithms()        return True    def unload(self):        ProcessingConfig.removeSetting(ScriptUtils.SCRIPTS_FOLDERS)        ProviderActions.deregisterProviderActions(self)        ProviderContextMenuActions.deregisterProviderContextMenuActions(self.contextMenuActions)    def icon(self):        return QgsApplication.getThemeIcon("/processingScript.svg")    def svgIconPath(self):        return QgsApplication.iconPath("processingScript.svg")    def id(self):        return "script"    def name(self):        return self.tr("Scripts")    def supportsNonFileBasedOutput(self):                                        return True    def add_algorithm_class(self, algorithm_class):        """        Adds an algorithm class to the provider        """        self.additional_algorithm_classes.append(algorithm_class)        self.refreshAlgorithms()    def loadAlgorithms(self):        self.algs = []        folders = ScriptUtils.scriptsFolders()                defaultScriptFolder = ScriptUtils.defaultScriptsFolder()        if defaultScriptFolder not in folders:            folders.append(defaultScriptFolder)                for folder in folders:            folder = ScriptUtils.resetScriptFolder(folder)            if not folder:                continue            for path, subdirs, files in os.walk(folder):                for entry in files:                    if entry.lower().endswith(".py"):                        moduleName = os.path.splitext(os.path.basename(entry))[0]                        filePath = os.path.abspath(os.path.join(path, entry))                        alg = ScriptUtils.loadAlgorithm(moduleName, filePath)                        if alg is not None:                            self.algs.append(alg)        for alg_class in self.additional_algorithm_classes:            self.algs.append(alg_class())        for a in self.algs:            self.addAlgorithm(a)
 |