mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-31 00:06:02 -04: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)
 |