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()
# 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()