VISIBILITE
La plupart des applications graphiques interactives ont besoin, à un moment donné de l'exécution, de rendre provisoirement invisible une structure ou certaines primitives d'une structure. Il existe plusieurs solutions pour gérer la visibilité. 3 méthodes parmi les plus simples sont présentées :
- par changement d'identificateur
Si la scène S comporte n structures d'identificateurs respectifs S1 à Sn, pour rendre provisoirement invisible la structure Si il suffit de la renommer en lui donnant comme nouvel identificateur une valeur différente de S, S1...Sn. Le plus simple est de choisir systématiquement des valeurs > 0 pour S, S1...Sn et de renommer Si en -Si. Lors d'un redraw, lorsque le traversal rencontre l'élement pexec_struct (Si) dans la scène, la structure Si n'existant plus avec cet identificateur elle n'est pas tracée. Pour renommer une structure il suffit d'appeler la fonction PHIGS pchange_struct_id (old_struct_id, new_struct_id).
Ainsi, les 2 instructions suivantes suffisent à changer la visibilité de la structure d'identificateur Si
pchange_struct_id (Si,-Si); Si *= -1;
predraw_all_structs (ws_id, pflag_always);
Cependant, si par la suite la scène doit être reconstruite, il faut que celle ci fasse toujours référence à la valeur absolue de la variable Si
- par reconstruction de la scène
Si la scène S comporte n structures d'identificateurs respectifs S1 à Sn, pour rendre provisoirement invisible la structure Si il suffit de l'enlever de la liste des structures de la scène : soit la scène fait référence à une structure de moins, soit on remplace la référence à la structure Si dans la scène par une référence à une structure n'existant pas. Comme avec la méthode précédente, le plus simple est de changer dans la scène la référence à la structure Si par la référence à la structure -Si (si celle-ci n'existe pas). Ce changement peut être fait soit par édition de la structure de la scène, soit par la reconstruction de la scène comme suit :
struct_id_list.ints[i] *= -1;
tscene (S,&struct_id_list, view_ind);
predraw_all_structs (ws_id, pflag_always);
- par filtre d'invisibilité
Cette notion de filtre permet de gérer la visibilité des structures pour un poste de travail donné contrairement aux 2 méthodes précédentes qui gèrent le visibilité globalement pour tous les postes de travail. En plus, cette méthode permet de gérer la visibilité d'un certain nombre de primitives dans une structure, sans modification de la CSS lors du changement de visibilité.
Pour que la visibilité soit gérée par filtre, il faut que les structures concernées contiennent des attributs name set insérés par la fonction PHIGS padd_names_set. Pour comprendre entièrement la notion de Name Set et de leurs filtres associés, il est conseillé de se référer aux paragraphes "Name Set" du Manuel de Référence GPHIGS-G5G.
PHIGURE facilite la gestion de visibilité par filtre en insérant systématiquement un élément padd_names_set dans chaque structure créée par PHIGURE (on peut éviter cette insertion systématique en appelant tstruct_create_flags). La visibilité des structures créées par PHIGURE peut alors se gérer de la façon suivante:
Si la scène S comporte n structures d'identificateurs respectifs S1 à Sn et si l'application doit pouvoir rendre interactivement visible ou invisible chacune d'entre elles, il est nécessaire de créer un tableau de n entiers valant respectivement ±S1, ±S2, ±S3,... ±Sn. Ce tableau doit être utilisé en entrée de la fonction PHIGS pset_invis_filter (set invisibility filter) comme ensemble d'inclusion du filtre d'invisibilité. (par la suite on appellera ce tableau ensemble d'inclusion). Au moment d'un retracé si le ième élément de l'ensemble d'inclusion vaut +Si alors la structure Si sera invisible sinon elle sera visible. Pour changer interactivement la visibilité de la structure Si il suffit de changer le signe du ième élément du tableau en entrée de la fonction pset_invis_filter (à condition bien sûr que l'identificateur Si soit non nul).
Exemple : création d'une scène de 5 structures d'identificateur respectif 1, 2, 3, 4, 5 avec les structures 3 et 5 invisibles sur le poste de travail d'identificateur wkid.
static Pint struct_ids[] = {1,2,3,4,5};
static Pint_list struct_id_list = {5,struct_ids};
static Pint invisible_struct[] = {-1,-2,3,-4,5};
Pfilter invisibility_filter;
tscene (S, &struct_id_list, view_ind);
invisibility_filter.incl_set.num_ints = 5;
invisibility_filter.incl_set.ints = invisible_struct;
pset_invis_filter (wkid, &invisibility_filter);
predraw_all_structs (wkid,PFLAG_ALWAYS);
Aprés cette séquence d'appels les structures 3 et 5 de la
scène sont invisibles. Pour changer le statut de visibilité de la
ième structure de la scène il suffit alors de faire les
traitements suivants :
invisible_struct[i] *= -1; pset_invis_filter (wkid, &invisibility_filter); predraw_all_structs (wkid,PFLAG_ALWAYS);
DETECTABILITE
La détectabilité des structures se gère obligatoirement par filtre. Mais le filtre utilisé est appelé filtre de détectabilité et il est défini sur un poste de travail par l'appel de la fonction pset_pick_filter (set pick filter). Néanmoins, au moment d'un retracé si le ième élément de l'ensemble d'inclusion vaut +Si alors la structure Si sera détectable sinon elle sera indétectable. Ainsi, pour l'exemple précédent les structures 3 et 5 sont détectables et les structures 1, 2 et 4 sont indétectables.
Ci après on trouvera un rappel décrivant les fonctions PHIGS pchange_struct_id, pset_invis_filter et pset_pick_filter, et une description des fonctions PHIGURE tadd_names_set et tremove_names_set.