@@ -45,7 +45,7 @@ observer var pan_constellation_y = 0
4545# Etat du mode recit et de la comparaison
4646observer var mode_recit = faux
4747observer var entites_comparaison = [] # [{id, type, label}, ...]
48- observer var donnees_comparaison = {} # id -> {label, artistes_ids, artistes_labels}
48+ observer var donnees_comparaison = {} # id -> {label, items_ids, items_labels, items_kind, artistes_ids, artistes_labels}
4949
5050# Etat de la trajectoire d'influence
5151observer var trajectoire_depart_id = ""
@@ -609,6 +609,40 @@ déf obtenir_artistes_mouvement(mouvement_id: chaine) -> liste:
609609 retour ids
610610
611611
612+ déf _id_depuis_champ_entite(champ: dictionnaire) -> chaine:
613+ """Extraire un Q-id depuis un champ normalisé {value: uri}."""
614+ retour _extraire_id_entite(champ)
615+
616+
617+ déf _enregistrer_donnees_comparaison(entite_id: chaine, etiquette: chaine, ids: liste, labels: dictionnaire, kind: chaine):
618+ """Stocker une collection comparable pour une entité."""
619+ donnees_courantes = donnees_comparaison.obtenir(entite_id, {})
620+ donnees_courantes["label"] = etiquette ou donnees_courantes.obtenir("label", entite_id)
621+ donnees_courantes["items_ids"] = ids
622+ donnees_courantes["items_labels"] = labels
623+ donnees_courantes["items_kind"] = kind
624+
625+ # Compatibilité avec l'ancien panneau orienté mouvements/artistes.
626+ si kind == "artists":
627+ donnees_courantes["artistes_ids"] = ids
628+ donnees_courantes["artistes_labels"] = labels
629+
630+ donnees_comparaison[entite_id] = donnees_courantes
631+
632+
633+ déf _extraire_oeuvres_comparaison(oeuvres: liste) -> dictionnaire:
634+ ids = []
635+ labels = {}
636+ pour oeuvre dans oeuvres:
637+ oeuvre_id = _id_depuis_champ_entite(oeuvre.obtenir("artwork", {}))
638+ label_oeuvre = _etiquette_entite(oeuvre, ["artworkLabel"], "")
639+ si oeuvre_id:
640+ ids.ajouter(oeuvre_id)
641+ si label_oeuvre:
642+ labels[oeuvre_id] = label_oeuvre
643+ retour {"ids": ids, "labels": labels}
644+
645+
612646déf basculer_comparaison(entite_id: chaine, type_entite: chaine, etiquette: chaine) -> booleen:
613647 """Ajouter ou retirer une entité du panneau de comparaison. Retourne vrai si ajoutée."""
614648 pour entite dans entites_comparaison:
@@ -639,18 +673,14 @@ déf basculer_comparaison(entite_id: chaine, type_entite: chaine, etiquette: cha
639673 si noeud:
640674 artistes_labels[artiste_id] = noeud.etiquette
641675
642- donnees_comparaison[entite_id] = {
643- "label": etiquette,
644- "artistes_ids": artistes_ids,
645- "artistes_labels": artistes_labels
646- }
676+ _enregistrer_donnees_comparaison(entite_id, etiquette, artistes_ids, artistes_labels, "artists")
647677 retour vrai
648678
649679
650680asynchrone déf charger_donnees_comparaison(entite_id: chaine, type_entite: chaine):
651681 """Charger les données d'une entité pour la comparaison sans modifier le graphe principal"""
652682 existantes = donnees_comparaison.obtenir(entite_id, {})
653- si existantes.obtenir("artistes_ids ", []):
683+ si existantes.obtenir("items_ids ", []):
654684 retour
655685
656686 si type_entite == "mouvement":
@@ -668,10 +698,28 @@ asynchrone déf charger_donnees_comparaison(entite_id: chaine, type_entite: chai
668698 ids.ajouter(artiste_id)
669699 si label_art:
670700 labels[artiste_id] = label_art
671- donnees_courantes = donnees_comparaison.obtenir(entite_id, {})
672- donnees_courantes["artistes_ids"] = ids
673- donnees_courantes["artistes_labels"] = labels
674- donnees_comparaison[entite_id] = donnees_courantes
701+ _enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), ids, labels, "artists")
702+ sauf erreur:
703+ passe
704+ sinon si type_entite == "artiste":
705+ essayer:
706+ oeuvres = attendre donnees.requetes.obtenir_oeuvres_artiste(entite_id, 50, mode_langue_actif)
707+ extraites = _extraire_oeuvres_comparaison(oeuvres)
708+ _enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
709+ sauf erreur:
710+ passe
711+ sinon si type_entite == "musee":
712+ essayer:
713+ oeuvres = attendre donnees.requetes.obtenir_oeuvres_musee(entite_id, 50, mode_langue_actif)
714+ extraites = _extraire_oeuvres_comparaison(oeuvres)
715+ _enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
716+ sauf erreur:
717+ passe
718+ sinon si type_entite == "sujet":
719+ essayer:
720+ oeuvres = attendre donnees.requetes.obtenir_oeuvres_par_sujet(entite_id, 50, mode_langue_actif)
721+ extraites = _extraire_oeuvres_comparaison(oeuvres)
722+ _enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
675723 sauf erreur:
676724 passe
677725
@@ -713,10 +761,35 @@ asynchrone déf trouver_trajectoire_influence(depart_id: chaine, arrivee_id: cha
713761 affichage_chargement = vrai
714762
715763 essayer:
716- attendre construire_graphe_influences(depart_id)
717- attendre construire_graphe_influences(arrivee_id)
718-
719- chemin = graphe.chemin_plus_court(depart_id, arrivee_id)
764+ chemin = []
765+ visites = {depart_id}
766+ queue = [[depart_id]]
767+ profondeur_max = 4
768+
769+ # Le graphe courant est incomplet: enrichir les voisins d'influence à mesure du BFS.
770+ tantque len(queue) > 0 et non chemin:
771+ chemin_courant = queue.pop(0)
772+ noeud_courant = chemin_courant[len(chemin_courant) - 1]
773+
774+ si len(chemin_courant) - 1 < profondeur_max:
775+ attendre construire_graphe_influences(noeud_courant)
776+ voisins = graphe.obtenir_voisins(noeud_courant, "a_influence")
777+
778+ pour voisin_id dans voisins:
779+ si non chemin:
780+ nouveau_chemin = []
781+ pour etape_id dans chemin_courant:
782+ nouveau_chemin.ajouter(etape_id)
783+ nouveau_chemin.ajouter(voisin_id)
784+
785+ si voisin_id == arrivee_id:
786+ chemin = nouveau_chemin
787+ sinon si voisin_id non dans visites:
788+ visites.ajouter(voisin_id)
789+ queue.ajouter(nouveau_chemin)
790+
791+ si non chemin:
792+ chemin = graphe.chemin_plus_court(depart_id, arrivee_id)
720793
721794 labels = {}
722795 pour noeud_id dans chemin:
0 commit comments