Sélection dans les Visualiseurs de peuplement
F. de Coligny - 21.11.2003
Ce document traite de la sélection générique d'objets (arbres, cellules de terrain…) dans les visualiseurs de peuplements Capsis. Le système décrit ici s'appuie sur les extensions de type ObjectViewer qui représentent graphiquement l'objet qu'on leur passe en paramètre. On se limite au fonctionnement interactif de Capsis (pilote gui).
1. Les ObjectViewers
Les ObjectViewers sont des extensions graphiques qui représentent un objet dont on leur passe la référence. Ils utilisent le système standard de compatibilité des extensions (la méthode matchWith () fait des tests sur l'objet candidat). Ils peuvent selon les cas représenter un seul objet (fig. 1a) ou une liste d'objets (fig. 1b) passés dans une Collection.
Fig. 1a. Un ObjectViewer : Proportion des espèces dans une unité d'analyse du module Ventoux (S. Chalon)
Pour invoquer un ObjectViewer sur un objet dans Capsis, il faut exprimer la demande au travers de l'interface graphique. Plusieurs possibilités :
Depuis le Visu Simple (SVSimple) ou une sous-classe (SVMountain, SVVentoux…),
Depuis le Visu Explorateur (SVController),
Depuis un inspecteur de données (Inspector, SVInspector, CellInspectorViewer…).
}}
Fig. 1b. Sélection de plusieurs cellules dans un CellInspectorViewer
2. Le composant OVChooser
Pour faciliter la sélection en s'appuyant sur les ObjectViewers, on peut utiliser le composant OVChooser. Il se présente sous la forme d'un combo box proposant la liste des ObjectViewers compatibles avec la totalité des éléments sélectionnables par l'outil.
Fig. 2. OVChooser simple : un combo box proposant des ObjectViewers
L'OVChooser peut être affiché avec plus ou moins de fonctionnalités (fig. 2 et 3) en fonction des capacités du Visu associé. Le bouton de sélection est ainsi inutile dans les visualiseurs cartographiques qui déclenchent la sélection par une action de la souris
Fig. 3. OVChooser désactivable avec bouton pour déclencher la sélection
Quand l'utilisateur choisit un ObjectViewer dans le combo box, il détermine un mode de sélection courant. Une sélection dans le visualiseur associé à l'OVChooser déclenche l'ouverture d'un ObjectViewer du type choisi, représentant les objets sélectionnés.
3. Sélection dans le Visu Simple
Le visualiseur graphique Simple (SVSimple) montre un peuplement spatialisé sous la forme d'une carte vue de dessus. Il autorise le zoom, la translation et la sélection (voir aide en ligne). Le système de sélection s'appuie sur un OVChooser (fig. 4).
Fig. 4. Une sélection à la souris dans le Visu Simple ouvre un ObjectViewer du type de la sélection courante dans le combo box OVChooser. Ici, sélection multiple d'arbres. Les éléments sélectionnés ont un rendu particulier dans le Visu (ici une cible rouge)
Les fonctionnalités offertes sont les suivantes :
Choix du mode de sélection courant dans l'OVChooser,
Sélection d'un élément par double-clic gauche,
Sélection multiple par rectangle de sélection avec bouton droit,
Ajout / suppression dans la sélection courante par Ctrl-sélection simple ou multiple,
Marquage des éléments sélectionnés sans le Visu,
Mémorisation du mode de sélection pour le visualiseur à la prochaine utilisation,
En cas de sélection de cellules de plusieurs niveaux, la sélection concerne le niveau le plus fin,
Simplification de l'implémentation : on passe une collection contenant tous les objets dessinés dans le rectangle de sélection et l'OVChooser extrait ceux qui sont montrable par l'ObjectViewer courant.
Fig. 5. Sélection multiple d'arbres dans le Visu Mountain (SVMountain), sous classe du Visu Simple
Le SVSimple est souvent sous-classé par les modélisateurs, le mode de sélection est hérité (fig. 5).
4. Sélection dans l'Explorateur
Le Visu Explorateur (SVController) est compatible avec les modèles qui gèrent une liste d'arbres (modèles spatialisés ou modèles indépendant des distances). Il présente une table contenant une ligne par arbre du peuplement sur lequel il est synchronisé. Il autorise l'application rapide de groupes et la sélection (fig. 6) d'un ou plusieurs arbres de la table pour visualisation avec un ObjectViewer.
Fig. 6. Sélection dans le Visu Explorateur. Désignation des lignes dans la table, puis action sur le bouton de sélection de l'OVChooser. Le visualiseur d'arbre reconnait une structure de données additionnelle AMAPsim et représente des couches de houppier
5. Sélection dans un Inspecteur
L'inspecteur est un outil très utilisé dans Capsis, on le retrouve sous plusieurs formes : inspecteur générique du menu général “Outil” (Inspector, démarre sur la classe Engine du noyau Capsis), Visu inspecteur (SVInspector) synchronisable sur une étape de projet (fig. 7) comme le Visu Simple et l'Explorateur, ObjectViewer inspecteur de cellule (CellInspectorViewer), d'arbre (TreeInspectorViewer), ou de tout autre type d'objet (InspectorViewer).
Fig. 7. Sélection à partir d'un Visu Inspecteur. La loupe de la barre d'outil permet de choisir un ObjectViewer pour l'objet courant dans l'inspecteur
6. Notes d'implémentation pour le Visu Simple
Pour hériter des fonctionnalités de sélection offertes par l'OVChooser dans un visualisateur cartographique sous classes de SVSimple, il faut éviter de redéfinir les méthodes suivantes :
getPilot () : positionne le combo box graphique dans la barre d'outils,
select (selectionRectangle, ctrlIsDown) : implemente la selection des arbres et cellules (si existantes pour ces dernières) : restriction au groupe d'arbre courant si nécessaire, ajout / suppression dans la sélection des arbres et cellules dans le rectangle de sélection (pied de l'arbre / intersection pour cellules), invocation de l'OVChooser, récupération de l'ObjectViewer retourné, demande à l'OVChooser des références des objects dont la sélection a été retenue en fonction de ObjectViewer courant, raffraichissement du Visu pour apparition des marques de sélection pour ces objets (couleurs, signes de sélection), retourne l'ObjectViewer qui sera affiché dans la boite d'information du Visu.
draw () : stratégie de dessin de la scène : restriction au groupe courant si nécessaire, invoque drawCell () pour chaque cellule à dessiner, invoque drawTree () pour chaque arbre à dessiner (si ca cellule intersecte la vue courante en tenant compte du zoom), dessine les marques de sélection pour les arbres et cellules sélectionnés, dessine des labels d'arbres en fonction de leur taille apparente, fonction de leur éloignement à l'observateur (pour éviter des centaines de labels sur des objets minuscules sur une vue de loin), met à jour le titre du Visu en fonction du groupe sélectionné,
processCell () : dessine une cellule si visible, gère selectCellIfNeeded (), puis traite les cellules imbriquées récursivement, tout en complétant l'inventaire des arbres contenus dans les cellules visibles pour accélérer le rendu des arbres dans la foulée,
selectTreeIfNeeded () : si l'arbre est sélectionné, dessine une marque de sélection,
selectCellIfNeeded () : si la cellule est sélectionnée, applique la couleur de sélection au fond de la cellule.
En revanche, il est possible de modifier l'aspect des arbres / cellule ou d'ajouter des fonctionnalités au Visu Simple en redéfinissant certaines méthodes dans une sous classe :
preprocessTrees () : appliquer un traitement sur les arbres à dessiner (restrictions groupes et cellules visibles sont déjà effectués) avant leur dessins, par défaut : tri sur hauteur croissante pour que les petits soient “sous” les grands,
drawTree () : dessiner l'arbre différemment (houppier polygonal, sommet décalé par rapport au pied…),
drawCell () : dessiner la cellule de terrain différemment (couleur, labels à l'intérieur…),
drawSelectionMark () : pour dessiner une marque de sélection pour les arbres différente de la marque par défaut,
getPilot () : Attention, pour ajouter des boutons à la suite de ceux qui sont dans la barre d'outils, récupérer super.getPilot () et la compléter (elle contient notamment le combo box de l'OVChooser, à ne pas écraser),
selectMore (selectionRectangle, ctrlIsDown, currentSelection) : invoquée juste avant l'appel à la méthode de sélection de l'OVChooser : la collection currentSelection contient des arbres et des cellules de terrain contenus dans / intersectant le rectangle de sélection : on peut ajouter dans cette collection des objets autres que des arbres et des cellules dessinées dans drawMore () et ignorés du Visu Simple. On suppose l'existence d'un ObjectViewer pouvant les montrer et que des marques de sélections appropriées seront dessinées dans drawMore (),
drawMore (g2, stand) : permet de dessiner d'autres objets que des arbres et cellules de terrain (piquets, chemins, éléments de paysage…). Doit gérer la sélection (marques) en cohérence avec selectMore ().