123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- """
- ***************************************************************************
- ProjectProvider.py
- ------------------------
- Date : July 2018
- Copyright : (C) 2018 by Nyall Dawson
- Email : nyall dot dawson 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__ = 'Nyall Dawson'
- __date__ = 'July 2018'
- __copyright__ = '(C) 2018, Nyall Dawson'
- import os
- from PyQt5.QtGui import QIcon
- from qgis.core import (Qgis,
- QgsApplication,
- QgsProcessingProvider,
- QgsMessageLog,
- QgsProcessingModelAlgorithm,
- QgsProject,
- QgsXmlUtils,
- QgsRuntimeProfiler)
- PROJECT_PROVIDER_ID = 'project'
- pluginPath = os.path.normpath(os.path.join(
- os.path.split(os.path.dirname(__file__))[0], os.pardir))
- class ProjectProvider(QgsProcessingProvider):
- def __init__(self, project=None):
- super().__init__()
- if project is None:
- self.project = QgsProject.instance()
- else:
- self.project = project
- self.model_definitions = {} # dict of models in project
- self.is_loading = False
- # must reload models if providers list is changed - previously unavailable algorithms
- # which models depend on may now be available
- QgsApplication.processingRegistry().providerAdded.connect(self.on_provider_added)
- self.project.readProject.connect(self.read_project)
- self.project.writeProject.connect(self.write_project)
- self.project.cleared.connect(self.clear)
- def on_provider_added(self, _):
- self.refreshAlgorithms()
- def load(self):
- with QgsRuntimeProfiler.profile('Project Provider'):
- self.refreshAlgorithms()
- return True
- def clear(self):
- """
- Remove all algorithms from the provider
- """
- self.model_definitions = {}
- self.refreshAlgorithms()
- def add_model(self, model):
- """
- Adds a model to the provider
- :type model: QgsProcessingModelAlgorithm
- :param model: model to add
- """
- definition = model.toVariant()
- self.model_definitions[model.name()] = definition
- self.refreshAlgorithms()
- def remove_model(self, model):
- """
- Removes a model from the project
- :type model: QgsProcessingModelAlgorithm
- :param model: model to remove
- """
- if model is None:
- return
- if model.name() in self.model_definitions:
- del self.model_definitions[model.name()]
- self.refreshAlgorithms()
- def read_project(self, doc):
- """
- Reads the project model definitions from the project DOM document
- :param doc: DOM document
- """
- self.model_definitions = {}
- project_models_nodes = doc.elementsByTagName('projectModels')
- if project_models_nodes:
- project_models_node = project_models_nodes.at(0)
- model_nodes = project_models_node.childNodes()
- for n in range(model_nodes.count()):
- model_element = model_nodes.at(n).toElement()
- definition = QgsXmlUtils.readVariant(model_element)
- algorithm = QgsProcessingModelAlgorithm()
- if algorithm.loadVariant(definition):
- self.model_definitions[algorithm.name()] = definition
- self.refreshAlgorithms()
- def write_project(self, doc):
- """
- Writes out the project model definitions into the project DOM document
- :param doc: DOM document
- """
- qgis_nodes = doc.elementsByTagName('qgis')
- if not qgis_nodes:
- return
- qgis_node = qgis_nodes.at(0)
- project_models_node = doc.createElement('projectModels')
- for a in self.algorithms():
- definition = a.toVariant()
- element = QgsXmlUtils.writeVariant(definition, doc)
- project_models_node.appendChild(element)
- qgis_node.appendChild(project_models_node)
- def name(self):
- return self.tr('Project models', 'ProjectProvider')
- def longName(self):
- return self.tr('Models embedded in the current project', 'ProjectProvider')
- def id(self):
- return PROJECT_PROVIDER_ID
- def icon(self):
- return QIcon(os.path.join(pluginPath, 'images', 'dbms', 'tools.png'))
- # return QgsApplication.getThemeIcon("/providerGdal.svg")
- def svgIconPath(self):
- return os.path.join(pluginPath, 'images', 'dbms', 'tools.png')
- # return QgsApplication.iconPath("providerGdal.svg")
- # def icon(self):
- # return QgsApplication.getThemeIcon("/mIconQgsProjectFile.svg")
- #
- # def svgIconPath(self):
- # return QgsApplication.iconPath("mIconQgsProjectFile.svg")
- def supportsNonFileBasedOutput(self):
- return True
- def loadAlgorithms(self):
- if self.is_loading:
- return
- self.is_loading = True
- for definition in self.model_definitions.values():
- algorithm = QgsProcessingModelAlgorithm()
- if algorithm.loadVariant(definition):
- self.addAlgorithm(algorithm)
- else:
- QgsMessageLog.logMessage(
- self.tr('Could not load model from project', 'ProjectProvider'),
- self.tr('Processing'), Qgis.Critical)
- self.is_loading = False
|