def mouseMoveEvent(self, event, item):

        mousePos = event.scenePos()
        if item and item.type == 'node':

            if self.temp_edge:
                # This is the end node
                self.temp_edge.setEnd(item.center.x(), item.center.y())
            else:
                # This is the start node
                self.temp_edge = Edge(item, None)
                self.addEdge(self.temp_edge, temp=True)

            self.container.update()

        elif self.temp_edge:
            self.temp_edge.setEnd(mousePos.x(), mousePos.y())
            self.container.update()
    def addEdge(self, edge, directed=False):
        adj = self.adjacencyList
        nodes = self.nodeList

        toNode = edge.toNode
        fromNode = edge.fromNode

        adj[fromNode.key].append(edge)

        if (directed == False):
            newReverseEdge = Edge(toNode, fromNode)
            adj[toNode.key].append(newReverseEdge)
    def mouseReleaseEvent(self, event, item):
        if item and item.type == 'node':

            # If we are drawing edge and mouse is released at a node, then add that edge
            if self.temp_edge and item is not self.temp_edge.fromNode:
                self.removeEdge(self.temp_edge, temp=True)
                newEdge = Edge(self.temp_edge.fromNode, item)
                self.addEdge(newEdge)
                self.temp_edge = None

        elif self.temp_edge:
            self.removeEdge(self.temp_edge, temp=True)
            self.temp_edge = None

        self.container.update()
def processBackendData(node_data, edge_data):

    nodeList = [
        Node(val['x'], val['y'],
             QColor(val['color'][0], val['color'][1], val['color'][2]))
        for key, val in node_data.items()
    ]

    adjacencyList = [[
        Edge(nodeList[edge['from']], nodeList[edge['to']],
             QColor(edge['color'][0], edge['color'][1], edge['color'][2]))
        for edge in edges
    ] for edges in edge_data]

    return nodeList, adjacencyList
def processBackendData(node_data, edge_data):

    node_objs = {
        key: Node(val['x'], val['y'], key)
        for key, val in node_data.items()
    }

    edge_matrix = []
    for i in range(len(edge_data)):
        row = []
        for j in range(len(edge_data)):
            if edge_data[i][j]:
                row.append(Edge(node_objs[i], node_objs[j]))
            else:
                row.append(None)
        edge_matrix.append(row)

    return node_objs, edge_matrix
    def addEdge(self, edge, temp=False, directed=False):
        cnt = 0
        if self.penColor:
            edge.setPenColor(self.penColor)
        if edge:
            self.container.addItem(edge)
        if not temp:
            adj = self.graph.adjacencyList
            nodes = self.graph.nodeList

            toNode = edge.toNode
            fromNode = edge.fromNode

            adj[fromNode.key].append(edge)

            if (directed == False):
                newReverseEdge = Edge(toNode, fromNode, edge.color)
                adj[toNode.key].append(newReverseEdge)
                self.container.addItem(newReverseEdge)
    def removeNode(self, node):
        newIndex = [-1 for i in range(len(self.nodeList))]
        indexCounter = 0
        for i in range(len(self.nodeList)):
            if (i != node.key):
                newIndex[i] = indexCounter
                indexCounter = indexCounter + 1

        #create modified adjacency list
        adj = []
        currentSize = 0
        for i in range(len(self.adjacencyList)):

            if (i != node.key):
                currentSize = currentSize + 1
                adj.append([])

                for j in range(len(self.adjacencyList[i])):
                    tempEdge = self.adjacencyList[i][j]
                    if (tempEdge.toNode.key != node.key):
                        # modifiedEdge = copy.deepcopy(self.adjacencyList[i][j])
                        modifiedEdge = Edge(tempEdge.fromNode, tempEdge.toNode,
                                            tempEdge.color)
                        modifiedEdge.fromNode.key = newIndex[
                            modifiedEdge.fromNode.key]
                        modifiedEdge.toNode.key = newIndex[
                            modifiedEdge.toNode.key]
                        adj[currentSize - 1].append(modifiedEdge)

        #create modified nodeList
        nodes = []
        for i in range(len(self.nodeList)):
            if (self.nodeList[i].key != node.key):
                modifiedNode = self.nodeList[i]
                modifiedNode = newIndex[modifiedNode.key]
                nodes.append(modifiedNode)

        self.adjacencyList = adj
        self.nodeList = nodes
class GraphManager:
    # Parameters as container nodes and edge_matrix
    # edge matrix stores the connections check dummy data for example
    # nodes is a dictionary of cordinates as values mapped to its indices as keys
    # converted nodes to self.nodes which is dictionary of nodes class object mapped to indices as keys
    # converted edge_matrix to self.edges which is 2d matrix of edge class objects

    def __init__(self, container, nodes, edge_matrix):
        self.container = container
        if len(nodes) > 0:
            self.currentKey = max([key for key in nodes]) + 1
        else:
            self.currentKey = 0

        self.nodes = {}
        self.edges = []
        for _ in range(self.currentKey):
            self.edges.append([None] * self.currentKey)

        for key, val in nodes.items():
            self.addNode(key, val)

        for row in edge_matrix:
            for edge in row:
                if edge:
                    self.addEdge(edge)

        self.temp_edge = None
        self.selectedItem = None

    # adds edge in gui and in stored matrix
    # any doubt contact arib

    def addEdge(self, edge, temp=False):
        if edge:
            self.container.addItem(edge)
        if not temp:
            self.edges[edge.fromNode.key][edge.toNode.key] = edge

    # removes edge in gui and stored matrix
    # any doubt contact sid

    def removeEdge(self, edge, temp=False):
        self.container.removeItem(edge)
        if not temp:
            self.edges[edge.fromNode.key][edge.toNode.key] = None

    # adds edge in gui and in stored matrix
    # any doubt contact arib

    def addNode(self, key, node):
        self.container.addItem(node)
        self.nodes[key] = node
        if key == self.currentKey:
            self.edges.append([None] * key)
            for row in self.edges:
                row.append(None)

    # removes node in gui and stored matrix and
    # any doubt contact sid

    def removeNode(self, node):
        self.container.removeItem(node)
        self.nodes.pop(node.key)
        for edge in self.edges[node.key]:
            if edge:
                self.removeEdge(edge)
        for i in range(len(self.edges)):
            if self.edges[i][node.key]:
                self.removeEdge(self.edges[i][node.key])

    # any doubt contact arib
    def toggleItem(self, item):

        if self.selectedItem and item is self.selectedItem:
            self.selectedItem.clicked = False
            self.selectedItem = None
        elif self.selectedItem:
            self.selectedItem.clicked = False
            self.selectedItem = item
            self.selectedItem.clicked = True
        else:
            self.selectedItem = item
            self.selectedItem.clicked = True

    def mouseMoveEvent(self, event, item):

        mousePos = event.scenePos()
        if item and item.type == 'node':

            if self.temp_edge:
                # This is the end node
                self.temp_edge.setEnd(item.center.x(), item.center.y())
            else:
                # This is the start node
                self.temp_edge = Edge(item, None)
                self.addEdge(self.temp_edge, temp=True)

            self.container.update()

        elif self.temp_edge:
            self.temp_edge.setEnd(mousePos.x(), mousePos.y())
            self.container.update()

    # any doubt contact arib

    def mouseReleaseEvent(self, event, item):
        if item and item.type == 'node':

            # If we are drawing edge and mouse is released at a node, then add that edge
            if self.temp_edge and item is not self.temp_edge.fromNode:
                self.removeEdge(self.temp_edge, temp=True)
                newEdge = Edge(self.temp_edge.fromNode, item)
                self.addEdge(newEdge)
                self.temp_edge = None

        elif self.temp_edge:
            self.removeEdge(self.temp_edge, temp=True)
            self.temp_edge = None

        self.container.update()

    # any doubt contact arib

    def mousePressEvent(self, event, item):
        mousePos = event.scenePos()
        if item and item.type == 'node':

            # Remove node if right-button clicked
            if item is self.selectedItem and event.button() == Qt.RightButton:
                self.removeNode(item)

            if event.button() == Qt.LeftButton:
                self.toggleItem(item)

        elif item and item.type == 'edge':

            if item is self.selectedItem and event.button() == Qt.RightButton:
                self.removeEdge(item)

            if event.button() == Qt.LeftButton:
                self.toggleItem(item)

        else:

            # Add Node
            # node = Node(mousePos.x(), mousePos.y(), self.currentKey)
            # self.addNode(self.currentKey, node)
            # self.currentKey += 1

            # self.toggleItem(node)
            if self.selectedItem:
                self.selectedItem.clicked = False
                self.selectedItem = None

    def mouseDoubleClickEvent(self, event, item):
        mousePos = event.scenePos()
        if not item:
            # Add Node
            node = Node(mousePos.x(), mousePos.y(), self.currentKey)
            self.addNode(self.currentKey, node)
            self.currentKey += 1

    def getData(self):
        return self.nodes, self.edges

    def printMatrix(self):
        for row in self.edges:
            for edge in row:
                if edge:
                    print("1", end=" ")
                else:
                    print("0", end=" ")
            print()
        print()
Пример #9
0
# node_objs = {}
# # Creates a dictionary of Node Objects as value linked to their indices as keys
# def node_object_convert(dict1)
# for i in dict:
#     node_objs[i] = Vertex(dict[i][0],dict[i][1])

edge_matrix = []

for i in range(len(matrix)):
    row = []
    for j in range(len(matrix[i])):
        if not matrix[i][j]:
            row.append(None)
        else:
            row.append(Edge(node_objs[i], node_objs[j]))
    edge_matrix.append(row)


def remove_connections(index):
    for i in range(len(edge_matrix)):
        edge_matrix[index][i] = None
        edge_matrix[i][index] = None


def remove_node(index):
    del node_objs[index]
    remove_connections(index)


def get_processed_data():
class GraphManager:
    # Parameters as container nodes and edge_matrix
    # edge matrix stores the connections check dummy data for example
    # nodes is a dictionary of cordinates as values mapped to its indices as keys
    # converted nodes to self.nodes which is dictionary of nodes class object mapped to indices as keys
    # converted edge_matrix to self.edges which is 2d matrix of edge class objects

    def __init__(self, container, newGraph):
        self.container = container
        self.temp_edge = None
        self.selectedItem = None
        self.penColor = None
        self.graph = None
        self.vertexMask = []
        self.updateVirtualGraph(newGraph)
        self.AlgorithmManager = AlgorithmManager(self.graph)

    def updateVirtualGraph(self, newGraph):
        if self.graph:
            # Update Graph

            # Remove all nodes first
            for node in self.graph.nodeList:
                self.removeNode(node)

        # Adding nodes in graph

        self.graph = Graph([], [])

        for node in newGraph.nodeList:
            self.addNode(node)

        for edges in newGraph.adjacencyList:
            for edge in edges:
                self.addEdge(edge, False, True)

    # adds edge in gui and in stored matrix

    def addEdge(self, edge, temp=False, directed=False):
        cnt = 0
        if self.penColor:
            edge.setPenColor(self.penColor)
        if edge:
            self.container.addItem(edge)
        if not temp:
            adj = self.graph.adjacencyList
            nodes = self.graph.nodeList

            toNode = edge.toNode
            fromNode = edge.fromNode

            adj[fromNode.key].append(edge)

            if (directed == False):
                newReverseEdge = Edge(toNode, fromNode, edge.color)
                adj[toNode.key].append(newReverseEdge)
                self.container.addItem(newReverseEdge)

    # removes edge in gui and stored matrix
    def removeEdge(self, edge, temp=False, directed=False):
        self.container.removeItem(edge)
        # self.printAdjList()
        if not temp:
            toNode = edge.toNode
            fromNode = edge.fromNode

            self.removeEdgeFromList(fromNode, toNode)
            if directed == False:
                self.removeEdgeFromList(toNode, fromNode)

    #to remove edge from list
    def removeEdgeFromList(self, fromNode, toNode):
        adj = self.graph.adjacencyList[fromNode.key]
        newAdj = []
        for i in range(len(adj)):
            if (adj[i].toNode.key != toNode.key):
                newAdj.append(adj[i])
        self.graph.adjacencyList[fromNode.key] = newAdj

    # adds edge in gui and in stored matrix

    def addNode(self, node):
        if self.penColor:
            node.setPenColor(self.penColor)
        self.container.addItem(node)

        adj = self.graph.adjacencyList
        nodes = self.graph.nodeList

        node.key = len(nodes)
        # print(node.key)
        nodes.append(node)

        newList = []
        adj.append(newList)

    # removes node in gui and stored matrix and

    def printAdjList(self):
        for i in range(len(self.graph.adjacencyList)):
            print('adj - ' + str(i) + ':', end=' ')
            for j in range(len(self.graph.adjacencyList[i])):
                print(self.graph.adjacencyList[i][j].toNode.key, end=' ')
            print()
        print()
        print()

    def removeNode(self, node):

        self.container.removeItem(node)

        for edge in self.graph.adjacencyList[node.key]:
            self.container.removeItem(edge)

        self.graph.adjacencyList.pop(node.key)
        for edgelist in self.graph.adjacencyList:
            tempEdge = []
            for edge in edgelist:
                if edge.toNode.key == node.key or edge.fromNode.key == node.key:
                    tempEdge.append(edge)
                    break
            for e in tempEdge:
                self.container.removeItem(e)
                edgelist.remove(e)

        for nde in self.graph.nodeList:
            if nde.key > node.key:
                nde.key = nde.key - 1

        self.graph.nodeList.remove(node)

    # any doubt contact arib
    def toggleItem(self, item):

        if self.selectedItem and item is self.selectedItem:
            self.selectedItem.clicked = False
            self.selectedItem = None
        elif self.selectedItem:
            self.selectedItem.clicked = False
            self.selectedItem = item
            self.selectedItem.clicked = True
        else:
            self.selectedItem = item
            self.selectedItem.clicked = True

    def setPenColor(self, penColor):
        self.penColor = penColor

    def mouseMoveEvent(self, event, item):

        mousePos = event.scenePos()
        if item and item.type == 'node':

            if self.temp_edge:
                # This is the end node
                self.temp_edge.setEnd(item.center.x(), item.center.y())
            else:
                # This is the start node
                self.temp_edge = Edge(item, None)
                self.addEdge(self.temp_edge, temp=True)

            self.container.update()

        elif self.temp_edge:
            self.temp_edge.setEnd(mousePos.x(), mousePos.y())
            self.container.update()

    def mouseReleaseEvent(self, event, item):
        if item and item.type == 'node':

            # If we are drawing edge and mouse is released at a node, then add that edge
            if self.temp_edge and item is not self.temp_edge.fromNode:
                self.removeEdge(self.temp_edge, temp=True)
                newEdge = Edge(self.temp_edge.fromNode, item)
                self.addEdge(newEdge)
                self.temp_edge = None

        elif self.temp_edge:
            self.removeEdge(self.temp_edge, temp=True)
            self.temp_edge = None

        self.container.update()

    def mousePressEvent(self, event, item):
        mousePos = event.scenePos()
        if item and item.type == 'node':

            # Remove node if right-button clicked
            if item is self.selectedItem and event.button() == Qt.RightButton:
                self.removeNode(item)

            if event.button() == Qt.LeftButton:
                self.toggleItem(item)

        elif item and item.type == 'edge':

            if item is self.selectedItem and event.button() == Qt.RightButton:
                self.removeEdge(item)

            if event.button() == Qt.LeftButton:
                self.toggleItem(item)

        else:

            if self.selectedItem:
                self.selectedItem.clicked = False
                self.selectedItem = None

            self.removeMask()

    def mouseDoubleClickEvent(self, event, item):
        mousePos = event.scenePos()
        if not item:
            # Add Node
            node = Node(mousePos.x(), mousePos.y())
            self.addNode(node)

    def getData(self):
        return self.graph.nodeList, self.graph.adjacencyList

    def callAlgorithms(self, id):
        self.removeMask()
        self.vertexMask = self.AlgorithmManager.runAlgorithm(id)
        self.addMask()

    def addMask(self):

        for i in range(len(self.vertexMask)):
            if not self.vertexMask[i]:
                self.graph.nodeList[i].addMask()

        self.container.update()

    def removeMask(self):

        for i in range(len(self.vertexMask)):
            if not self.vertexMask[i]:
                self.graph.nodeList[i].removeMask()

        self.container.update()

    def printMatrix(self):
        for row in self.edges:
            for edge in row:
                if edge:
                    print("1", end=" ")
                else:
                    print("0", end=" ")
            print()
        print()