186 lines
6.8 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. *
* *
***************************************************************************
"""
__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$'
2012-09-15 18:25:25 +03:00
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from processing.modeler.ModelerAlgorithm import AlgorithmAndParameter
2013-08-12 20:44:27 +02:00
from processing.modeler.ModelerGraphicItem import ModelerGraphicItem
from processing.modeler.ModelerArrowItem import ModelerArrowItem
from processing.parameters.ParameterMultipleInput import ParameterMultipleInput
2012-09-15 18:25:25 +03:00
2012-09-15 18:25:25 +03:00
class ModelerScene(QtGui.QGraphicsScene):
def __init__(self, parent=None):
super(ModelerScene, self).__init__(parent)
self.paramItems = []
self.algItems = []
self.outputItems = []
self.setItemIndexMethod(QtGui.QGraphicsScene.NoIndex)
2012-09-15 18:25:25 +03:00
def getParameterPositions(self):
pos = []
for item in self.paramItems:
pos.append(item.pos())
return pos
def getAlgorithmPositions(self):
pos = []
for item in self.algItems:
pos.append(item.pos())
return pos
2013-05-15 20:42:04 +02:00
def getOutputPositions(self):
pos = []
for alg in self.outputItems:
outputPos = {}
for (key, value) in alg.iteritems():
if value is not None:
outputPos[key] = value.pos()
else:
outputPos[key] = None
pos.append(outputPos)
return pos
2012-09-15 18:25:25 +03:00
def getLastParameterItem(self):
return self.paramItems[-1]
def getLastAlgorithmItem(self):
if self.algItems:
return self.algItems[-1]
else:
return None
def getItemsFromAAP(self, aap, isMultiple):
items = []
start = int(aap.alg)
if aap.alg == AlgorithmAndParameter.PARENT_MODEL_ALGORITHM:
if isMultiple:
multi = self.model.paramValues[aap.param]
tokens = multi.split(';')
2012-09-15 18:25:25 +03:00
for token in tokens:
aap = AlgorithmAndParameter(float(token.split('|')[0]),
token.split('|')[1])
2012-09-15 18:25:25 +03:00
ret = self.getItemsFromAAP(aap, False)
if ret:
for item in ret:
items.append(item)
else:
iModelParam = 0
2012-09-15 18:25:25 +03:00
for modelparam in self.model.parameters:
if modelparam.name == aap.param:
2013-04-17 13:16:34 +02:00
items.append((self.paramItems[iModelParam], -1))
2012-09-15 18:25:25 +03:00
break
iModelParam += 1
2012-09-15 18:25:25 +03:00
else:
2013-04-17 13:16:34 +02:00
idx = 0
for output in self.model.algs[start].outputs:
if output.name == aap.param:
items.append((self.algItems[start], idx))
break
2013-05-01 23:45:20 +02:00
idx += 1
2012-09-15 18:25:25 +03:00
return items
def paintModel(self, model):
self.model = model
i = 0
# Inputs
2012-09-15 18:25:25 +03:00
for param in model.parameters:
item = ModelerGraphicItem(param, i, model)
item.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
item.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
self.addItem(item)
item.setPos(model.paramPos[i])
self.paramItems.append(item)
i += 1
# We add the algs
iAlg = 0
2012-09-15 18:25:25 +03:00
for alg in model.algs:
item = ModelerGraphicItem(alg, iAlg, model)
item.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
item.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
self.addItem(item)
item.setPos(model.algPos[iAlg])
self.algItems.append(item)
iAlg += 1
2013-05-15 20:42:04 +02:00
# And then the arrows
iAlg = 0
2012-09-15 18:25:25 +03:00
for alg in model.algs:
params = model.algParameters[iAlg]
2013-04-17 13:16:34 +02:00
idx = 0
2013-05-01 23:45:20 +02:00
for parameter in alg.parameters:
if not parameter.hidden:
param = params[parameter.name]
if param:
sourceItems = self.getItemsFromAAP(param,
isinstance(alg.getParameterFromName(parameter.name), ParameterMultipleInput))
for sourceItem in sourceItems:
arrow = ModelerArrowItem(sourceItem[0], sourceItem[1], self.algItems[iAlg], idx)
self.addItem(arrow)
idx += 1
2013-02-03 10:26:43 +01:00
for depend in model.dependencies[iAlg]:
arrow = ModelerArrowItem(self.algItems[depend], -1,
self.algItems[iAlg], -1)
2013-02-03 10:26:43 +01:00
self.addItem(arrow)
iAlg += 1
2013-05-15 20:42:04 +02:00
# And finally the outputs
for (iAlg, alg) in enumerate(model.algs):
2013-05-15 20:42:04 +02:00
outputs = model.algOutputs[iAlg]
outputItems = {}
for (idx, key) in enumerate(outputs.keys()):
2013-05-15 20:42:04 +02:00
out = outputs[key]
if out is not None:
item = ModelerGraphicItem(out, idx, model)
item.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
item.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
self.addItem(item)
2013-05-15 20:42:04 +02:00
pos = model.outputPos[iAlg][key]
if pos is None:
pos = self.algItems[iAlg].pos() \
+ QtCore.QPointF(ModelerGraphicItem.BOX_WIDTH, 0) \
+ self.algItems[iAlg].getLinkPointForOutput(idx)
item.setPos(pos)
2013-05-15 20:42:04 +02:00
outputItems[key] = item
arrow = ModelerArrowItem(self.algItems[iAlg], idx, item,
-1)
self.addItem(arrow)
else:
2013-05-15 20:42:04 +02:00
outputItems[key] = None
self.outputItems.append(outputItems)
2012-09-15 18:25:25 +03:00
def mousePressEvent(self, mouseEvent):
if mouseEvent.button() != QtCore.Qt.LeftButton:
2012-09-15 18:25:25 +03:00
return
super(ModelerScene, self).mousePressEvent(mouseEvent)