summaryrefslogtreecommitdiff
path: root/ero1/src/helper/display_graph.py
diff options
context:
space:
mode:
Diffstat (limited to 'ero1/src/helper/display_graph.py')
-rw-r--r--ero1/src/helper/display_graph.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/ero1/src/helper/display_graph.py b/ero1/src/helper/display_graph.py
new file mode 100644
index 0000000..693d6e1
--- /dev/null
+++ b/ero1/src/helper/display_graph.py
@@ -0,0 +1,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 \ No newline at end of file