diff options
Diffstat (limited to 'ero1/src/helper/display_graph.py')
| -rw-r--r-- | ero1/src/helper/display_graph.py | 116 |
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 |
