Légendes dynamiques
Dans ViSit Anywhere, le rendu cartographique des objets est toujours basé sur les attributs (ou les combinaisons de valeurs de ces attributs). La légende statique (le rendu par défaut) permet de choisir exactement le dessin souhaité (rendu linéaire, remplissage, choix et taille des symboles, etc. La légende dynamique permet de changer à volonté ce rendu de base, en changeant la couleur ou le remplissage, ainsi que l’épaisseur de trait, selon la valeur (ou les plages de valeurs) d’un attribut ou d’une expression calculée sur les attributs.
Nous avons récemment mis en place des composants qui permettent de visualiser le contenu de la légende dynamique en cours, dans le panneau ‘Ma carte’ et dans les cartouches d’impression.
Le panneau 'Ma Carte'
Depuis VA 18.2.25, le panneau ‘Ma Carte’ expose les légendes thématiques actives dans la composition courante.
Ces légendes sont présentées par table ; quand la légende dynamique implique plusieurs rendus différents, on peut choisir d’afficher chaque rendu séparément :
A noter : le panneau contient un item pour rafraîchir le contenu courant de la carte et mettre à jour le contenu de la légende.
Légende par expression
Quand la légende dynamique est basée sur le calcul d’une expression à partir d’un ou plusieurs attributs, on peut adapter le code de la fonction pour renseigner correctement la légende. Si on examine par exemple la fonction Date1980Rouge, qui effectue un calcul complexe pour retourner une couleur selon le matériau et l’année de pose :
dt => {
object result = result = (uint) MapPalette.Hide.ToArgb ( );
if (dt.Rows.Count > 0) {
DataRow dr = dt.Rows[0];
object v = dr[0];
if (v is int) {
if ((int)v == 10 || (int)v == 0) {
v = dr[1];
result = (uint) MapPalette.Render.ToArgb ( );
if (v is DateTime) {
if ((DateTime)v < new DateTime (1980, 1, 1)) {
result = (uint) Color.Red.ToArgb ( );
} else {
result = (uint) Color.Green.ToArgb ( );
}
}
}
}
}
return result;
}
Quand le matériau n’est pas PVC, la conduite n’est pas représentée ; sinon, les conduites posées avant 1980 sont en rouge, celles après 1980 en vert et les autres (date de pose inconnue) sont laissées en cyan.
On peut modifier cette fonction pour qu’elle retourne l’explication de la couleur attribuée ; par convention, on fait ce traitement quand la table passée en argument est nulle ; les explications sont retournées sous la forme d’un dictionnaire :
dt => {
if (dt == null) {
var descr = new Dictionary<string, Color>();
descr["PVC avant 1980"] = Color.Red;
descr["PVC après 1980"] = Color.Green;
descr["PVC inconnu"] = Color.Cyan;
descr["Autres"] = Color.Transparent;
return descr;
} else if (dt.Rows.Count > 0) {
…
…
}
return result;
}
Remarque : Pour une symbologie affectant l'épaisseur ou le style de trait, VA attend les explications sous la forme d'un Dictionary<string, int>
ViSit Anywhere est alors en mesure d’afficher le contenu de la légende, comme dans une légende classique :
Rendu papier
On peut afficher le contenu de la légende dans un cartouche d’impression ;il suffit pour cela d’insérer une sous-composition dans le cartouche, de type ‘Légende’ :
La fonction de cette composition se contente de passer des paramètres à une fonction ad hoc de ViSit :
dt => {
ProjectTypeIndexer.RootCollection.DisplayManager.DrawLegend (
dt,
new Mnemonic ("aep_reseau"),
SymbologyPart.Color,
"matériau",
"Conduites PVC"
);
return null;
}
Le premier argument, dt, permet à la fonction de récupérer l’emprise de la sous-composition dans le cartouche.
Le 2ème argument est l’identifiant de la table concernée (la table des conduites)
Le 3ème argument permet de spécifier (le cas échéant) le type de rendu choisi ; les valeurs suivantes sont possibles :
- SymbologyPart.Color
- SymbologyPart.FillColor
- SymbologyPart.LineWeight
- SymbologyPart.LineStyle
Le 4ème argument permet de nommer le champ concerné (pour les légendes par plages de valeur)
Le dernier argument est le titre de la légende.