From f9f98593e04a815edfe1f80c16f6b54890950bda Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 29 Jun 2017 11:37:08 +1000 Subject: [PATCH] Draw links between dependent parameters in graphical modeler Fix #12907 --- .../processing/modeler/ModelerArrowItem.py | 14 +++++++++++++- .../processing/modeler/ModelerGraphicItem.py | 5 ++++- .../plugins/processing/modeler/ModelerScene.py | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/python/plugins/processing/modeler/ModelerArrowItem.py b/python/plugins/processing/modeler/ModelerArrowItem.py index 7c079defece..5392d240653 100644 --- a/python/plugins/processing/modeler/ModelerArrowItem.py +++ b/python/plugins/processing/modeler/ModelerArrowItem.py @@ -70,11 +70,23 @@ class ModelerArrowItem(QGraphicsPathItem): Qt.RoundCap, Qt.RoundJoin)) self.setZValue(0) + def setPenStyle(self, style): + pen = self.pen() + pen.setStyle(style) + self.setPen(pen) + self.update() + def updatePath(self): self.endPoints = [] controlPoints = [] endPt = self.endItem.getLinkPointForParameter(self.endIndex) - startPt = self.startItem.getLinkPointForOutput(self.startIndex) + if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ModelParameter): + startPt = self.startItem.getLinkPointForParameter(self.startIndex) + else: + startPt = self.startItem.getLinkPointForOutput(self.startIndex) + if isinstance(self.endItem.element, QgsProcessingModelAlgorithm.ModelParameter): + endPt = self.endItem.getLinkPointForParameter(self.startIndex) + if isinstance(self.startItem.element, QgsProcessingModelAlgorithm.ChildAlgorithm): if self.startIndex != -1: controlPoints.append(self.startItem.pos() + startPt) diff --git a/python/plugins/processing/modeler/ModelerGraphicItem.py b/python/plugins/processing/modeler/ModelerGraphicItem.py index 149e74d6c19..33bd83ee1a2 100644 --- a/python/plugins/processing/modeler/ModelerGraphicItem.py +++ b/python/plugins/processing/modeler/ModelerGraphicItem.py @@ -199,7 +199,7 @@ class ModelerGraphicItem(QGraphicsItem): self.element.setDescription(dlg.param.name()) self.model.addModelParameter(dlg.param, self.element) self.text = dlg.param.description() - self.update() + self.scene.dialog.repaintModel() elif isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm): dlg = None try: @@ -336,6 +336,9 @@ class ModelerGraphicItem(QGraphicsItem): if isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm) and self.element.parametersCollapsed(): paramIndex = -1 offsetX = 17 + if isinstance(self.element, QgsProcessingModelAlgorithm.ModelParameter): + paramIndex = -1 + offsetX = 0 font = QFont('Verdana', 8) font.setPixelSize(12) fm = QFontMetricsF(font) diff --git a/python/plugins/processing/modeler/ModelerScene.py b/python/plugins/processing/modeler/ModelerScene.py index 542fcbc5a68..b1bcd659ee3 100644 --- a/python/plugins/processing/modeler/ModelerScene.py +++ b/python/plugins/processing/modeler/ModelerScene.py @@ -94,6 +94,22 @@ class ModelerScene(QGraphicsScene): item.setPos(inp.position().x(), inp.position().y()) self.paramItems[inp.parameterName()] = item + # Input dependency arrows + for input_name in list(model.parameterComponents().keys()): + idx = 0 + parameter_def = model.parameterDefinition(input_name) + if hasattr(parameter_def, 'parentLayerParameter') and parameter_def.parentLayerParameter(): + parent_name = parameter_def.parentLayerParameter() + if input_name in self.paramItems and parent_name in self.paramItems: + input_item = self.paramItems[input_name] + parent_item = self.paramItems[parent_name] + arrow = ModelerArrowItem(parent_item, -1, input_item, -1) + input_item.addArrow(arrow) + parent_item.addArrow(arrow) + arrow.setPenStyle(Qt.DotLine) + arrow.updatePath() + self.addItem(arrow) + # We add the algs for alg in list(model.childAlgorithms().values()): item = ModelerGraphicItem(alg, model, controls, scene=self) @@ -104,6 +120,7 @@ class ModelerScene(QGraphicsScene): self.algItems[alg.childId()] = item # And then the arrows + for alg in list(model.childAlgorithms().values()): idx = 0 for parameter in alg.algorithm().parameterDefinitions():