mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-27 00:33:48 -05:00
188 lines
6.9 KiB
Python
188 lines
6.9 KiB
Python
# -*- 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'
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
__revision__ = '$Format:%H$'
|
|
|
|
from PyQt4 import QtCore, QtGui
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from processing.modeler.ModelerAlgorithm import AlgorithmAndParameter
|
|
from processing.modeler.ModelerGraphicItem import ModelerGraphicItem
|
|
from processing.modeler.ModelerArrowItem import ModelerArrowItem
|
|
from processing.parameters.ParameterMultipleInput import ParameterMultipleInput
|
|
|
|
|
|
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)
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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(';')
|
|
for token in tokens:
|
|
aap = AlgorithmAndParameter(float(token.split('|')[0]),
|
|
token.split('|')[1])
|
|
ret = self.getItemsFromAAP(aap, False)
|
|
if ret:
|
|
for item in ret:
|
|
items.append(item)
|
|
else:
|
|
iModelParam = 0
|
|
for modelparam in self.model.parameters:
|
|
if modelparam.name == aap.param:
|
|
items.append((self.paramItems[iModelParam], -1))
|
|
break
|
|
iModelParam += 1
|
|
else:
|
|
idx = 0
|
|
for output in self.model.algs[start].outputs:
|
|
if output.name == aap.param:
|
|
items.append((self.algItems[start], idx))
|
|
break
|
|
idx += 1
|
|
|
|
return items
|
|
|
|
def paintModel(self, model):
|
|
self.model = model
|
|
i = 0
|
|
|
|
# Inputs
|
|
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
|
|
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
|
|
|
|
# And then the arrows
|
|
iAlg = 0
|
|
for alg in model.algs:
|
|
params = model.algParameters[iAlg]
|
|
idx = 0
|
|
for parameter in alg.parameters:
|
|
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
|
|
for depend in model.dependencies[iAlg]:
|
|
arrow = ModelerArrowItem(self.algItems[depend], -1,
|
|
self.algItems[iAlg], -1)
|
|
self.addItem(arrow)
|
|
iAlg += 1
|
|
|
|
# And finally the outputs
|
|
for (iAlg, alg) in enumerate(model.algs):
|
|
outputs = model.algOutputs[iAlg]
|
|
outputItems = {}
|
|
for (idx, key) in enumerate(outputs.keys()):
|
|
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)
|
|
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)
|
|
outputItems[key] = item
|
|
arrow = ModelerArrowItem(self.algItems[iAlg], idx, item,
|
|
-1)
|
|
self.addItem(arrow)
|
|
else:
|
|
outputItems[key] = None
|
|
self.outputItems.append(outputItems)
|
|
|
|
def mousePressEvent(self, mouseEvent):
|
|
if mouseEvent.button() != QtCore.Qt.LeftButton:
|
|
return
|
|
|
|
super(ModelerScene, self).mousePressEvent(mouseEvent)
|