summaryrefslogtreecommitdiff
path: root/ero1/src/helper/display_graph.py
blob: 693d6e1b94b0607ad98b2864645735435ae46eb1 (plain)
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