mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
221 lines
9.1 KiB
Python
221 lines
9.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
ModelerGraphicItem.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'
|
|
|
|
from qgis.PyQt.QtCore import QCoreApplication
|
|
|
|
from qgis.core import (QgsProcessingParameterDefinition,
|
|
QgsProject,
|
|
Qgis)
|
|
from qgis.gui import (
|
|
QgsProcessingParameterDefinitionDialog,
|
|
QgsProcessingParameterWidgetContext,
|
|
QgsModelParameterGraphicItem,
|
|
QgsModelChildAlgorithmGraphicItem,
|
|
QgsModelOutputGraphicItem,
|
|
QgsProcessingContextGenerator
|
|
)
|
|
from processing.modeler.ModelerParameterDefinitionDialog import ModelerParameterDefinitionDialog
|
|
from processing.modeler.ModelerParametersDialog import ModelerParametersDialog
|
|
from processing.tools.dataobjects import createContext
|
|
from qgis.utils import iface
|
|
|
|
|
|
class ModelerInputGraphicItem(QgsModelParameterGraphicItem):
|
|
"""
|
|
IMPORTANT! This is intentionally a MINIMAL class, only containing code which HAS TO BE HERE
|
|
because it contains Python code for compatibility with deprecated methods ONLY.
|
|
|
|
Don't add anything here -- edit the c++ base class instead!
|
|
"""
|
|
|
|
def __init__(self, element, model):
|
|
super().__init__(element, model, None)
|
|
|
|
self.processing_context = createContext()
|
|
|
|
class ContextGenerator(QgsProcessingContextGenerator):
|
|
|
|
def __init__(self, context):
|
|
super().__init__()
|
|
self.processing_context = context
|
|
|
|
def processingContext(self):
|
|
return self.processing_context
|
|
|
|
self.context_generator = ContextGenerator(self.processing_context)
|
|
|
|
def create_widget_context(self):
|
|
"""
|
|
Returns a new widget context for use in the model editor
|
|
"""
|
|
widget_context = QgsProcessingParameterWidgetContext()
|
|
widget_context.setProject(QgsProject.instance())
|
|
if iface is not None:
|
|
widget_context.setMapCanvas(iface.mapCanvas())
|
|
widget_context.setActiveLayer(iface.activeLayer())
|
|
|
|
widget_context.setModel(self.model())
|
|
return widget_context
|
|
|
|
def edit(self, edit_comment=False):
|
|
existing_param = self.model().parameterDefinition(self.component().parameterName())
|
|
comment = self.component().comment().description()
|
|
comment_color = self.component().comment().color()
|
|
new_param = None
|
|
if ModelerParameterDefinitionDialog.use_legacy_dialog(param=existing_param):
|
|
# boo, old api
|
|
dlg = ModelerParameterDefinitionDialog(self.model(),
|
|
param=existing_param)
|
|
dlg.setComments(comment)
|
|
dlg.setCommentColor(comment_color)
|
|
if edit_comment:
|
|
dlg.switchToCommentTab()
|
|
if dlg.exec_():
|
|
new_param = dlg.param
|
|
comment = dlg.comments()
|
|
comment_color = dlg.commentColor()
|
|
else:
|
|
# yay, use new API!
|
|
context = createContext()
|
|
widget_context = self.create_widget_context()
|
|
dlg = QgsProcessingParameterDefinitionDialog(type=existing_param.type(),
|
|
context=context,
|
|
widgetContext=widget_context,
|
|
definition=existing_param,
|
|
algorithm=self.model())
|
|
dlg.setComments(comment)
|
|
dlg.setCommentColor(comment_color)
|
|
dlg.registerProcessingContextGenerator(self.context_generator)
|
|
|
|
if edit_comment:
|
|
dlg.switchToCommentTab()
|
|
|
|
if dlg.exec_():
|
|
new_param = dlg.createParameter(existing_param.name())
|
|
comment = dlg.comments()
|
|
comment_color = dlg.commentColor()
|
|
|
|
if new_param is not None:
|
|
self.aboutToChange.emit(self.tr('Edit {}').format(new_param.description()))
|
|
self.model().removeModelParameter(self.component().parameterName())
|
|
self.component().setParameterName(new_param.name())
|
|
self.component().setDescription(new_param.name())
|
|
self.component().comment().setDescription(comment)
|
|
self.component().comment().setColor(comment_color)
|
|
self.model().addModelParameter(new_param, self.component())
|
|
self.setLabel(new_param.description())
|
|
self.requestModelRepaint.emit()
|
|
self.changed.emit()
|
|
|
|
def editComponent(self):
|
|
self.edit()
|
|
|
|
def editComment(self):
|
|
self.edit(edit_comment=True)
|
|
|
|
|
|
class ModelerChildAlgorithmGraphicItem(QgsModelChildAlgorithmGraphicItem):
|
|
"""
|
|
IMPORTANT! This is intentionally a MINIMAL class, only containing code which HAS TO BE HERE
|
|
because it contains Python code for compatibility with deprecated methods ONLY.
|
|
|
|
Don't add anything here -- edit the c++ base class instead!
|
|
"""
|
|
|
|
def __init__(self, element, model):
|
|
super().__init__(element, model, None)
|
|
|
|
def edit(self, edit_comment=False):
|
|
elemAlg = self.component().algorithm()
|
|
dlg = ModelerParametersDialog(elemAlg, self.model(), self.component().childId(),
|
|
self.component().configuration())
|
|
dlg.setComments(self.component().comment().description())
|
|
dlg.setCommentColor(self.component().comment().color())
|
|
if edit_comment:
|
|
dlg.switchToCommentTab()
|
|
if dlg.exec_():
|
|
alg = dlg.createAlgorithm()
|
|
alg.setChildId(self.component().childId())
|
|
alg.copyNonDefinitionPropertiesFromModel(self.model())
|
|
self.aboutToChange.emit(self.tr('Edit {}').format(alg.description()))
|
|
self.model().setChildAlgorithm(alg)
|
|
self.requestModelRepaint.emit()
|
|
self.changed.emit()
|
|
|
|
res, errors = self.model().validateChildAlgorithm(alg.childId())
|
|
if not res:
|
|
self.scene().showWarning(
|
|
QCoreApplication.translate('ModelerGraphicItem', 'Algorithm “{}” is invalid').format(alg.description()),
|
|
self.tr('Algorithm is Invalid'),
|
|
QCoreApplication.translate('ModelerGraphicItem', "<p>The “{}” algorithm is invalid, because:</p><ul><li>{}</li></ul>").format(alg.description(), '</li><li>'.join(errors)),
|
|
level=Qgis.Warning
|
|
)
|
|
else:
|
|
self.scene().messageBar().clearWidgets()
|
|
|
|
def editComponent(self):
|
|
self.edit()
|
|
|
|
def editComment(self):
|
|
self.edit(edit_comment=True)
|
|
|
|
|
|
class ModelerOutputGraphicItem(QgsModelOutputGraphicItem):
|
|
"""
|
|
IMPORTANT! This is intentionally a MINIMAL class, only containing code which HAS TO BE HERE
|
|
because it contains Python code for compatibility with deprecated methods ONLY.
|
|
|
|
Don't add anything here -- edit the c++ base class instead!
|
|
"""
|
|
|
|
def __init__(self, element, model):
|
|
super().__init__(element, model, None)
|
|
|
|
def edit(self, edit_comment=False):
|
|
child_alg = self.model().childAlgorithm(self.component().childId())
|
|
param_name = '{}:{}'.format(self.component().childId(), self.component().name())
|
|
dlg = ModelerParameterDefinitionDialog(self.model(),
|
|
param=self.model().parameterDefinition(param_name))
|
|
dlg.setComments(self.component().comment().description())
|
|
dlg.setCommentColor(self.component().comment().color())
|
|
if edit_comment:
|
|
dlg.switchToCommentTab()
|
|
|
|
if dlg.exec_():
|
|
model_output = child_alg.modelOutput(self.component().name())
|
|
model_output.setDescription(dlg.param.description())
|
|
model_output.setDefaultValue(dlg.param.defaultValue())
|
|
model_output.setMandatory(not (dlg.param.flags() & QgsProcessingParameterDefinition.FlagOptional))
|
|
model_output.comment().setDescription(dlg.comments())
|
|
model_output.comment().setColor(dlg.commentColor())
|
|
self.aboutToChange.emit(self.tr('Edit {}').format(model_output.description()))
|
|
self.model().updateDestinationParameters()
|
|
self.requestModelRepaint.emit()
|
|
self.changed.emit()
|
|
|
|
def editComponent(self):
|
|
self.edit()
|
|
|
|
def editComment(self):
|
|
self.edit(edit_comment=True)
|