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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
import matplotlib
matplotlib.use('TkAgg') # KEEP - Eviter erreur avc WSL
import osmnx as ox
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
# Variables globales pour stocker la graphique et son état
fig = None
ax = None
def init_display():
global fig, ax
if fig is None and ax is None:
plt.ion() # Création du graphique par défaut s'il n'existe pas
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
plt.show(block=False)
def edge_in_list(edge, edge_list):
if edge_list is None:
return False
for e in edge_list:
if (e[0] == edge[0] and e[1] == edge[1]) or \
(e[0] == edge[1] and e[1] == edge[0]):
return True
return False
def display_graph(G, place_name, reversed_legend, highlight_edges=None, current_edges=None, last_call=False, double_sens=False):
"""
Affiche le graphe G avec la quantité de neige sur chaque arête et les habitations.
Parameters:
G : Le graphe à afficher.
place_name : Nom du lieu
reversed_legend : Si True, la légende est à droite
highlight_edges : Liste des arêtes à mettre en surbrillance
current_edges : Liste des arêtes visitées
last_call : Si True, le graphique est affiché indéfiniment
"""
global fig, ax
# Initialisation du graphique si premier appel
init_display()
# Suppression du graphique actuel
ax.clear()
# Récupérer les quantités de neige sur les arêtes
snow_quantities = []
for u, v, k, data in G.edges(keys=True, data=True):
snow_quantities.append(data.get('snow', 0))
# Affecter une couleur à chaque arête en fonction de la quantité de neige et habitation
legend_labels = ['<2.5cm', '<5cm', '<10cm', '+10cm']#, 'Habitations']
legend_colors = ['red', 'deepskyblue', 'dodgerblue', 'navy']#, 'green']
if double_sens:
legend_labels= ["double sens", "une direction"]
legend_colors= ['green', 'black']
snow_colors = []
if snow_quantities:
for i, (u, v, k) in enumerate(G.edges(keys=True)):
snow = snow_quantities[i]
edge = (u, v, k)
if double_sens:
if any((v, u, k) == edge for edge in G.edges(keys=True)):
snow_colors.append('green')
else:
snow_colors.append('black')
continue
# Déterminer la couleur de l'arête
elif current_edges and edge in current_edges:
# Si c'est la dernière arête visitée
snow_colors.append("purple")
elif last_call or (highlight_edges and edge_in_list(edge, highlight_edges)):
# Si c'est une arête enneigée
if snow < 2.5:
snow_colors.append('red')
elif snow < 5:
snow_colors.append('deepskyblue')
elif snow < 10:
snow_colors.append('dodgerblue')
else:
snow_colors.append('navy')
else:
# Couleur normale basée sur la neige
snow_colors.append("white")
else:
snow_colors = 'b'
# Tracer toutes les arêtes sur le graphique
ox.plot_graph(G, edge_color=snow_colors, edge_linewidth=2, ax=ax, show=False, close=False)
# Configurer le titre et la légende
ax.set_title('Graphe | ' + place_name)
# Mise à jour de la légende & ajout des couleurs
for i in range(len(legend_colors)):
ax.plot([], [], color=legend_colors[i], linewidth=4, label=legend_labels[i])
if highlight_edges:
if current_edges:
ax.plot([], [], color="purple", linewidth=4, label='Chemin actuel')
if double_sens:
ax.legend(title='Sens de circulation', loc='lower ' + ("right" if reversed_legend else "left"))
else:
ax.legend(title='Quantité de neige', loc='lower ' + ("right" if reversed_legend else "left"))
# Sauvegarder l'image pour le debug
plt.savefig('temp/debug_graph.png', dpi=300)
# Mettre à jour l'affichage
fig.canvas.draw()
fig.canvas.flush_events()
if not last_call:
plt.pause(0.01) # Délai pour pas tout exploser
else:
plt.pause(120) # Temporaire pour dernier affichage car destruction massive si pas de pause longue
|