159 lines
6.4 KiB
Python
Raw Normal View History

2012-10-04 19:33:47 +02:00
# -*- coding: utf-8 -*-
"""
***************************************************************************
ModelerScene.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. *
* *
***************************************************************************
"""
2012-10-04 19:33:47 +02:00
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
2012-10-04 19:33:47 +02:00
# This will get replaced with a git SHA1 when you do a git archive
2012-10-04 19:33:47 +02:00
__revision__ = '$Format:%H$'
2016-04-22 10:38:48 +02:00
from qgis.PyQt.QtCore import QPointF, Qt
from qgis.PyQt.QtWidgets import QGraphicsItem, QGraphicsScene
2013-08-12 20:44:27 +02:00
from processing.modeler.ModelerGraphicItem import ModelerGraphicItem
from processing.modeler.ModelerArrowItem import ModelerArrowItem
from processing.modeler.ModelerAlgorithm import ValueFromInput, ValueFromOutput, CompoundValue
class ModelerScene(QGraphicsScene):
2012-09-15 18:25:25 +03:00
def __init__(self, parent=None):
super(ModelerScene, self).__init__(parent)
self.paramItems = {}
self.algItems = {}
self.outputItems = {}
self.setItemIndexMethod(QGraphicsScene.NoIndex)
2012-09-15 18:25:25 +03:00
def getParameterPositions(self):
2016-09-27 19:51:06 +02:00
return {key: item.pos() for key, item in list(self.paramItems.items())}
2012-09-15 18:25:25 +03:00
def getAlgorithmPositions(self):
2016-09-27 19:51:06 +02:00
return {key: item.pos() for key, item in list(self.algItems.items())}
2013-05-15 20:42:04 +02:00
def getOutputPositions(self):
pos = {}
2016-09-27 19:51:06 +02:00
for algName, outputs in list(self.outputItems.items()):
outputPos = {}
2016-09-27 19:51:06 +02:00
for (key, value) in list(outputs.items()):
if value is not None:
outputPos[key] = value.pos()
else:
outputPos[key] = None
pos[algName] = outputPos
return pos
2012-09-15 18:25:25 +03:00
2014-07-02 07:46:03 +02:00
def getItemsFromParamValue(self, value):
2012-09-15 18:25:25 +03:00
items = []
if isinstance(value, list):
for v in value:
items.extend(self.getItemsFromParamValue(v))
elif isinstance(value, CompoundValue):
for v in value.values:
items.extend(self.getItemsFromParamValue(v))
elif isinstance(value, ValueFromInput):
items.append((self.paramItems[value.name], 0))
elif isinstance(value, ValueFromOutput):
outputs = self.model.algs[value.alg].algorithm.outputs
for i, out in enumerate(outputs):
if out.name == value.output:
2014-07-02 07:46:03 +02:00
break
items.append((self.algItems[value.alg], i))
return items
def paintModel(self, model, controls=True):
2012-09-15 18:25:25 +03:00
self.model = model
# Inputs
2016-09-21 18:24:26 +02:00
for inp in list(model.inputs.values()):
item = ModelerGraphicItem(inp, model, controls)
item.setFlag(QGraphicsItem.ItemIsMovable, True)
item.setFlag(QGraphicsItem.ItemIsSelectable, True)
2012-09-15 18:25:25 +03:00
self.addItem(item)
item.setPos(inp.pos.x(), inp.pos.y())
2014-07-02 07:46:03 +02:00
self.paramItems[inp.param.name] = item
2014-07-02 07:46:03 +02:00
# We add the algs
2016-09-21 18:24:26 +02:00
for alg in list(model.algs.values()):
item = ModelerGraphicItem(alg, model, controls)
item.setFlag(QGraphicsItem.ItemIsMovable, True)
item.setFlag(QGraphicsItem.ItemIsSelectable, True)
2012-09-15 18:25:25 +03:00
self.addItem(item)
item.setPos(alg.pos.x(), alg.pos.y())
2014-07-02 07:46:03 +02:00
self.algItems[alg.name] = item
2013-05-15 20:42:04 +02:00
# And then the arrows
2016-09-21 18:24:26 +02:00
for alg in list(model.algs.values()):
2013-04-17 13:16:34 +02:00
idx = 0
for parameter in alg.algorithm.parameters:
if not parameter.hidden:
if parameter.name in alg.params:
value = alg.params[parameter.name]
else:
value = None
sourceItems = self.getItemsFromParamValue(value)
for sourceItem, sourceIdx in sourceItems:
arrow = ModelerArrowItem(sourceItem, sourceIdx, self.algItems[alg.name], idx)
sourceItem.addArrow(arrow)
self.algItems[alg.name].addArrow(arrow)
arrow.updatePath()
self.addItem(arrow)
idx += 1
for depend in alg.dependencies:
arrow = ModelerArrowItem(self.algItems[depend], -1,
self.algItems[alg.name], -1)
self.algItems[depend].addArrow(arrow)
self.algItems[alg.name].addArrow(arrow)
arrow.updatePath()
2013-02-03 10:26:43 +01:00
self.addItem(arrow)
2013-05-15 20:42:04 +02:00
# And finally the outputs
2016-09-21 18:24:26 +02:00
for alg in list(model.algs.values()):
outputs = alg.outputs
2013-05-15 20:42:04 +02:00
outputItems = {}
idx = 0
for key in outputs:
2013-05-15 20:42:04 +02:00
out = outputs[key]
if out is not None:
item = ModelerGraphicItem(out, model, controls)
item.setFlag(QGraphicsItem.ItemIsMovable, True)
item.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.addItem(item)
pos = alg.outputs[key].pos
if pos is None:
2017-03-04 19:41:23 +01:00
pos = (alg.pos + QPointF(ModelerGraphicItem.BOX_WIDTH, 0) +
self.algItems[alg.name].getLinkPointForOutput(idx))
item.setPos(pos)
2013-05-15 20:42:04 +02:00
outputItems[key] = item
arrow = ModelerArrowItem(self.algItems[alg.name], idx, item,
-1)
self.algItems[alg.name].addArrow(arrow)
item.addArrow(arrow)
arrow.updatePath()
self.addItem(arrow)
idx += 1
else:
2013-05-15 20:42:04 +02:00
outputItems[key] = None
self.outputItems[alg.name] = outputItems
2012-09-15 18:25:25 +03:00
def mousePressEvent(self, mouseEvent):
if mouseEvent.button() != Qt.LeftButton:
2012-09-15 18:25:25 +03:00
return
super(ModelerScene, self).mousePressEvent(mouseEvent)