Exemplo n.º 1
0
class NodeGraphScene(QtGui.QGraphicsScene):
    '''
    '''
    def __init__(self):
        super(NodeGraphScene, self).__init__()
        #Keep a dictionary of nodes.
        self.nodeDict = {}

        #Register a dispatcher object to talk with other widgets.
        self.dispatcher = Dispatcher(self)
        self.signalMapperParam = QtCore.QSignalMapper(self)
        self.signalMapperView = QtCore.QSignalMapper(self)
        self.signalMapperView.mapped[str].connect(self.dispatcher.initViewer)
        self.signalMapperParam.mapped[str].connect(self.dispatcher.swapParams)

        #SR = self.sceneRect()
        #SR.adjust(500, 500, 500, 500)
        #self.setSceneRect(SR)

    @QtCore.Slot(str)
    def sendUpdate(self, changedNode):
        self.dispatcher.updateQ(changedNode)

    def addNode(self, pos=(50, 50), name=NODE_DEFAULT_NAME):
        #Create node obj
        newNode = Node(name=name)
        newNode.setPos(pos[0], pos[1])
        newNode.update()
        #Add to scene
        self.addItem(newNode)
        self.nodeDict[name] = weakref.ref(newNode)
        #Reigster params with dispatcher
        self.dispatcher.registerParams(name, newNode.params)
        #Connect switches with signalmapper
        self.signalMapperParam.setMapping(newNode.editSwitch.switchObj, unicode(name))
        self.signalMapperView.setMapping(newNode.viewSwitch.switchObj, unicode(name))
        newNode.editSwitch.switchObj.toggleSignal.connect(self.signalMapperParam.map)
        newNode.viewSwitch.switchObj.toggleSignal.connect(self.signalMapperView.map)
        #Connect paramchanged with DAG update
        newNode.nodeObj.paramChSignal.connect(self.sendUpdate)
        return newNode

    def addEdge(self, outPort, inPort):
        '''Connect two nodes with an edge.'''
        #TODO - make this not stupid
        if outPort in self.items() \
            and inPort in self.items():
                newEdge = Edge()
                self.addItem(newEdge)
                newEdge.outPort = weakref.ref(outPort)
                newEdge.inPort = weakref.ref(inPort)
                outPort.connectedEdges.append(weakref.ref(newEdge))
                inPort.connectedEdges.append(weakref.ref(newEdge))
                newEdge.adjust()
                return newEdge
        else:
                raise ValueError("Port not found.")

    def deleteNodes(self, nodeList=[]):
        self.detachNodes(nodeList)
        for node in nodeList:
            if node in self.items():
                self.removeItem(node)
                del self.nodeDict[node.name]

    def detachNodes(self, nodeList=[]):
        for node in nodeList:
            if node in self.items():
                for port in node.portIter():
                    if len(port.connectedEdges):
                        for edge in port.connectedEdges:
                            self.removeItem(edge())
                        port.connectedEdges = []
            else:
                raise ValueError("Node not found: " + node)

    def clearScene(self):
        self.deleteNodes(self.nodeDict.items())

    @QtCore.Slot()
    def editSelNodes(self):
        for node in self.selectedItems():
            node.editSwitch.toggle()

    @QtCore.Slot()
    def viewSelNodes(self):
        for node in self.selectedItems():
            node.viewSwitch.toggle()

    @QtCore.Slot()
    def extractNode(self):
        self.detachNodes(self.selectedItems())

    @QtCore.Slot()
    def ignoreNode(self):
        for node in self.selectedItems():
            node.toggleIgnored()
Exemplo n.º 2
0
class NodeGraphScene(QtGui.QGraphicsScene):
    '''
    '''
    def __init__(self):
        super(NodeGraphScene, self).__init__()
        #Keep a dictionary of nodes.
        self.nodeDict = {}

        #Register a dispatcher object to talk with other widgets.
        self.dispatcher = Dispatcher(self)
        self.signalMapperParam = QtCore.QSignalMapper(self)
        self.signalMapperView = QtCore.QSignalMapper(self)
        self.signalMapperView.mapped[str].connect(self.dispatcher.initViewer)
        self.signalMapperParam.mapped[str].connect(self.dispatcher.swapParams)

    def adjustSceneRect(self):
        itemsRect = self.itemsBoundingRect()
        itemsRect.adjust(20, 20, 20, 20)
        return itemsRect
        #self.setSceneRect(itemsRect)

    @QtCore.Slot(str)
    def sendUpdate(self, changedNode):
        self.dispatcher.updateQ(changedNode)

    def addNode(self, pos=(50, 50), name=NODE_DEFAULT_NAME):
        #Create node obj
        newNode = Node(name=name)
        newNode.setPos(pos[0], pos[1])
        newNode.update()
        #Add to scene
        self.addItem(newNode)
        self.nodeDict[name] = weakref.ref(newNode)
        #Reigster params with dispatcher
        self.dispatcher.registerParams(name, newNode.params)
        #Connect switches with signalmapper
        self.signalMapperParam.setMapping(newNode.editSwitch.switchObj, unicode(name))
        self.signalMapperView.setMapping(newNode.viewSwitch.switchObj, unicode(name))
        newNode.editSwitch.switchObj.toggleSignal.connect(self.signalMapperParam.map)
        newNode.viewSwitch.switchObj.toggleSignal.connect(self.signalMapperView.map)
        #Connect paramchanged with DAG update
        newNode.nodeObj.paramChSignal.connect(self.sendUpdate)
        #self.adjustSceneRect()
        return newNode

    def addEdge(self, outPort, inPort):
        '''Connect two nodes with an edge.'''
        #TODO - make this not stupid
        if outPort in self.items() \
            and inPort in self.items():
                newEdge = Edge()
                self.addItem(newEdge)
                newEdge.outPort = weakref.ref(outPort)
                newEdge.inPort = weakref.ref(inPort)
                outPort.connectedEdges.append(weakref.ref(newEdge))
                inPort.connectedEdges.append(weakref.ref(newEdge))
                newEdge.adjust()
                return newEdge
        else:
                raise ValueError("Port not found.")

    def deleteNodes(self, nodeList=[]):
        print nodeList
        self.detachNodes(nodeList)
        for node in nodeList:
            print node
            if node in self.nodeDict.keys():
                self.removeItem(self.nodeDict[node]())
                del self.nodeDict[node]

    def detachNodes(self, nodeList=[]):
        for node in nodeList:
            if node in self.nodeDict.keys():
                for port in self.nodeDict[node]().portIter():
                    if len(port.connectedEdges):
                        for edge in port.connectedEdges:
                            self.removeItem(edge())
                        port.connectedEdges = []
            else:
                raise ValueError("Node not found: " + node.name)

    def clearScene(self):
        self.deleteNodes(self.nodeDict.keys())

    def loadFromJSON(self, jsonStr):
        #pp(json.loads(jsonStr))
        loadedNodes = []
        for name, node in json.loads(jsonStr).iteritems():
            newNode = self.addNode(name=name, pos=node["pos"])
            for port in node["ports"]:
                for edge in port["connected"]:
                    try:
                        outNode = self.nodeDict[edge["out"]["node"]]
                        inNode = self.nodeDict[edge["in"]["node"]]
                        outPort = outNode().port(edge["out"]["port"])
                        inPort = inNode().port(edge["in"]["port"])
                    except KeyError:
                        print "Node not found, no edge created."
                        continue
                    self.addEdge(outPort, inPort)
            loadedNodes.append(newNode)
        return loadedNodes

    def asJSON(self, nodes=[]):
        if not nodes:
            nodes = self.nodeDict.keys()
        nodesDict = {}
        for node in nodes:
            nodesDict[node] = self.nodeDict[node]().asDict()
        return json.dumps(nodesDict, sort_keys=True, indent=4, separators=(',', ': '))

    @QtCore.Slot()
    def editSelNodes(self):
        for node in self.selectedItems():
            node.editSwitch.toggle()

    @QtCore.Slot()
    def viewSelNodes(self):
        for node in self.selectedItems():
            node.viewSwitch.toggle()

    @QtCore.Slot()
    def extractNode(self):
        self.detachNodes(self.selectedItems())

    @QtCore.Slot()
    def ignoreNode(self):
        for node in self.selectedItems():
            node.toggleIgnored()