-
Notifications
You must be signed in to change notification settings - Fork 1
/
visualization.py
85 lines (63 loc) · 2.21 KB
/
visualization.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import networkx as nx
import numpy as npy
import matplotlib.pyplot as plt
import machine_parser
import validation
def build_graph(G, machine):
G.add_nodes_from(list(range(int(machine.vertex_cnt))))
G.add_node(int(machine.vertex_cnt))
edges = []
for i in machine.edges:
edges.append((int(i[0]), int(i[1])))
edges.append((int(machine.vertex_cnt), int(machine.start_vertex)))
G.add_edges_from(edges)
def set_node_labels(G):
nx.set_node_attributes(G, {i: {'label': i} for i in G.nodes})
def set_edge_labels(G, machine):
labelseee = {}
for i in machine.edges:
labelseee[(int(i[0]), int(i[1]))] = i[2]
labelseee[(int(machine.vertex_cnt), int(machine.start_vertex))] = ""
nx.set_edge_attributes(G, {(e[0], e[1]): {'label': labelseee[(e[0], e[1])]} for e in G.edges(data=True)})
def paint_vertices(G, machine, D):
colour_map = {}
for i in G.nodes:
n = D.get_node(i)
n.attr['shape'] = 'circle'
if i == int(machine.start_vertex):
colour_map[i] = 'darkviolet'
elif str(i) in machine.terminal_vertexes:
colour_map[i] = 'pink'
n = D.get_node(i)
n.attr['shape'] = 'doublecircle'
else:
colour_map[i] = 'grey'
for i in D.nodes():
n = D.get_node(i)
n.attr['color'] = 'black'
n.attr['style'] = 'filled'
n.attr['fillcolor'] = colour_map[int(n)]
n = D.get_node(int(machine.vertex_cnt))
n.attr['label'] = ""
n.attr['color'] = 'white'
n.attr['style'] = 'filled'
n.attr['fillcolor'] = 'white'
def paint_edges(D, valide):
if valide:
for i in validation.Edge.valide_edges:
n = D.get_edge(int(i.to), int(i.frm))
n.attr['color'] = 'red'
else:
D.edge_attr.update(color='black', arrowsize=1)
def draw_graph(machine, filename, valide):
G = nx.DiGraph()
build_graph(G, machine)
set_node_labels(G)
set_edge_labels(G, machine)
D = nx.drawing.nx_agraph.to_agraph(G) # makes graphiz graph from nx
paint_vertices(G, machine, D)
paint_edges(D, valide)
pos = D.layout('dot')
ready_image = filename + '.png'
D.draw(path=ready_image, format='png')
return ready_image