# Metavisu un système graphique interactif

Andre Ducrot, Alain Lemaire

► To cite this version:

Andre Ducrot, Alain Lemaire. Metavisu un système graphique interactif. [Rapport de recherche] IRIA-RR-036, IRIA. 1973, pp.57. hal-04715981

HAL Id: hal-04715981

https://inria.hal.science/hal-04715981v1

Submitted on 1 Oct 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
RIA
laboria

laboratoire de recherche
en informatique
et automatique

METAVISU

Un système graphique
interactif

A.Ducrot

A.Lemaire

<figure><img src="image_2.png" /></figure>

Institut de Recherche
d'Informatique
et d'Automatique

Domaine de Voluceau
Rocquencourt
78150 - Le Chesnay
Tél. 954.90.20

Rapport de Recherche n° 36
novembre 1973
METAVISU
UN SYSTEME GRAPHIQUE INTERACTIF

A. Ducrot - A. Lemaire

Résumé :

Le but de ce rapport est de décrire d'une part les principes de conception et de fonctionnement du système graphique interactif METAVISU. Il présente d'autre part, le manuel d'utilisation du langage de spécification des interactions.

METAVISU a été conçu de telle sorte qu'il permette une écriture rapide et simplifiée d'une gamme étendue d'applications graphiques interactives. Il offre des outils de haut niveau permettant la description dynamique d'images [2] et d'une base de données associative [1].

En outre il distingue nettement les parties algorithmiques et interactives d'un programme d'application et fournit, pour cette dernière, un langage spécialisé qui permet de décrire le dialogue homme-machine de façon très naturelle.

Enfin des compilateurs conversationnels à la compilation et à l'exécution et de nombreux outils d'aide à la mise au point facilitent grandement la programmation des applications.

Abstract :

The goal of this paper is, on the one hand to describe the conception principles and main features of the general purpose graphic system METAVISU. On the other hand, it presents the user's manual for the Interaction Specification Language.

METAVISU has been realised to allow a rapid and easier programming of a large field of interactive graphic applications. It provides high-level tools to describe dynamical pictures [2] and associative data base [1].

Moreover, it introduces a clear distinction between the algorithmic part and the interactive part of an application's program. For the last part, a specialized language has been defined which allows the man-machine dialog to be described in a very natural way.

Finally, conversationnal compilers and many debugging facilities are a great help for the application's programmer.
# INTRODUCTION

Depuis leur apparition, les terminaux graphiques ont suscité une profusion de langages et de systèmes spécialisés pour chacune des nombreuses applications qui les utilisent (conception de circuits électroniques, architecture, dessin de fuselage ou de carrosseries, analyse statistique, etc...).

Dans certains cas particuliers tels que la simulation en temps réel de systèmes complexes (atterrissage d'avion par exemple), la réalisation d'un système spécifique se justifie pleinement. Il s'agit alors, à l'aide d'outils spécialisés, de programmer une fois pour toutes l'ensemble calculateur - terminal (ou terminaux) graphique.

Pour tous les autres cas, par contre, l'équipe chargée de la réalisation d'une application se trouve confrontée avec trois problèmes importants :

- génération d'images

- structuration des données

- gestion des moyens d'entrée du terminal (crayon optique, clés de fonction, clavier alphanumérique, tablette, etc...).

Dès lors, le grave défaut de toutes les solutions adoptées pour les résoudre est qu'elles sont fortement dépendantes de l'application et bien souvent du type de terminal utilisé. Elles impliquent donc un effort de programmation important et ne sont pas utilisables en dehors de leur contexte.

Une approche différente a été adoptée pour la réalisation de METAVISU. Mettant de côté les cas particuliers cités plus haut nous avons voulu construire un système graphique interactif couvrant la plus large gamme possible d'applications. Cette solution consiste à offrir au programmeur un certain nombre d'outils généraux permettant de résoudre facilement les trois problèmes évoqués précédemment. Nous soulignons le terme "facilement" car, pour être justifié, un système général doit poser nettement moins de problèmes au programmeur qu'il ne lui permet d'en résoudre. Pour cela, un tel système doit être :
- clair ; cela veut dire que les concepts liés à l'utilisation de terminaux graphiques doivent être parfaitement définis et apparais-sent dans la structure même des programmes d'applications,

- complet ; pour éviter que les programmeurs passent leur temps à en combler les lacunes,

- souple ; tout sous-ensemble du système doit pouvoir être utilisé séparément,

- concis ; il faut que le manuel d'utilisation ressemble plus à un livre de poche qu'à une encyclopédie,

- "agréable" ; en ce sens que l'écriture et la mise au point des programmes doit être facilitée par des langages conversationnels à la fois à la compilation et à l'exécution et de nombreux outils d'aide à la mise au point.

La suite de cet article décrit de quelle façon, pour la réalisation de METAVISU, nous avons tenté de mettre en pratique ces principes. Après une description rapide de l'environnement hardware et software et du système lui-même, nous développerons plus particulièrement le principe de fonctionnement de METAVISU et le langage de Spécification des Interactions. La structuration des données et la génération d'images font l'objet de deux autres rapports LABORIA [1] [2].
# I. PRESENTATION DU SYSTEME METAVISU

<figure><img src="image_3.png" /><figcaption>Figure 1</figcaption></figure>
La figure 1 montre la configuration hardware sur laquelle est implanté METAVISU. La console SINTRA VU 2000 est reliée au calculateur principal CII 10070 selon le mode "accès direct mémoire". Elle accède sa liste d'affichage dans un bloc mémoire particulier du 10070 (16 K mots de 32 bits). La console CIT-ALCATEL par contre possède une mémoire d'entretien intégrée (4 K mots de 16 bits) et se trouve connectée au système principal par l'intermédiaire d'un calculateur satellite CII MITRA 15 et d'une ligne téléphonique. Cette configuration est complétée par un traceur BENSON utilisé off-line et une tablette graphique SYNELEC.

Le calculateur principal CII 10070 est géré par le système à partage de ressources ESOPE [3]. Ce système d'exploitation, réalisé à l'IRIA met notamment à la disposition de ses utilisateurs un compilateur interpréteur conversationnel CPL/1 également réalisé à l'IRIA. Ces deux travaux ont servi de support au système METAVISU.

METAVISU comporte trois parties distinctes et relativement indépendantes :

- les deux premières sont des extensions de PL1 permettant :

1) la création et la modification dynamique de structure de données associative,

2) la génération d'images.

- la troisième est un compilateur interpréteur conversationnel d'un langage permettant à l'utilisateur de spécifier le dialogue homme-machine (Langage de Spécification des Interactions).

Bien que les modes de connexion et les caractéristiques des deux consoles graphiques soient différents, un même programme d'application peut tourner indifféremment à partir de l'une ou de l'autre. Pour que cela soit possible, nous nous sommes placés à priori dans le contexte de la configuration générale d'une console à distance avec calculateur satellite associé. Dans le cas de la console SINTRA nous avons simulé ce calculateur satellite sur le 10070 au moyen d'une partie réservée de la mémoire physique et d'un processus particulier du moniteur ESOPE.
## II. PRINCIPE DE FONCTIONNEMENT

La figure 2 décrit la structure générale d'un programme d'application. On constate que ce programme est divisé en deux parties :

- un programme dit d' "Interaction" s'exécutant dans le calculateur satellite,

- un ensemble de procédure CPL/1 s'exécutant dans le calculateur principal.

Certes cette solution adoptée déjà dans les systèmes UNIVAC [5], GRAPHIC-II [6] et de l'Université d'UTAH [7] en particulier, implique pour le programmeur d'être bilingue. Elle présente cependant de nombreux avantages.

Le plus important est, sans aucun doute, la clarté. On peut remarquer en effet que chacune des deux parties d'un programme d'application répond à des objectifs différents et indépendants. Le programme d'interaction permet de gérer les moyens d'entrée de la console et de diriger dynamiquement le déroulement du programme, alors que les procédure CPL/1 traitent essentiellement la partie algorithmique du problème (calculs, structuration des données, génération d'images).

<figure><img src="image_4.png" /><figcaption>Figure 2</figcaption></figure>
<figure><img src="image_5.png" /><figcaption>Figure 3</figcaption></figure>

Exemple

Exemple :

Soit GRAVITE (N, POINTS) une procédure CPL/1 calculant le centre
de gravité de N points. Il est évident que cette procédure est totalement
indépendante du nombre de points et surtout du fait que les coordonnées
de ces points soient fournies à l'aide d'une tablette, d'un crayon optique
ou tapées au clavier. C'est le rôle du programme d'interaction (figure 3)
que de permettre une introduction souple de ces données.

La facilité de mise au point est aussi un avantage appréciable.
En raison de leur indépendance, les deux parties du programme peuvent être
écrites et mises au point séparément. Il est certain, en particulier, que
le programme d'interaction fera l'objet de multiples retouches en fonction
de l'expérimentation du dialogue homme-machine. Il est bien agréable alors
de n'avoir que cette partie à modifier. Notons également à ce sujet l'intérêt
de pouvoir disposer pour l'une et l'autre des deux parties du programme
de langages conversationnels à la compilation et à l'exécution et de
nombreux outils d'aide à la mise au point.

Enfin, dans le contexte de temps partagé où nous sommes placés,
cette solution permet une implantation différente des deux parties du
programme. Le programme d'interaction est interprété soit dans le calculateur
satellite (cas de la console à distance), soit dans le calculateur principal
par un processus système prioritaire (cas de la console à accès direct).
Dans les deux cas, s'il n'est pas fait appel aux procédures CPL/l, le
temps de réponse est quasi-nul. Les procédures CPL/l par ailleurs, s'exé-
cutent dans le calculateur principal sans aucune prérogative particulière
par rapport aux autres usagers conversationnels du système. Il est ainsi
possible d'élaborer interactivement les données avec un temps de réponse
très agréable pour cette phase active de l'utilisateur et de ne faire
appel aux procédure CPL/l que lorsque les données sont prêtes. Dans ce
dernier cas, l'utilisateur étant dans une phase passive accepte plus
volontiers un délai de réponse plus important. Cette solution comporte
également un avantage d'efficacité par rapport à celle d'un programme
unique où toute intervention de l'utilisateur provoque le chargement,
le plus souvent inutile, du programme en mémoire centrale.

### III. LANGAGE DE SPECIFICATION DES INTERACTIONS

Nous avons vu que le rôle du programme d'interaction était de
rendre possible pour l'utilisateur un contrôle permanent et souple de
l'évolution d'un problème et également de fournir une réponse rapide
et visible à ses interventions.

En outre, ce programme doit permettre l'exécution au niveau du
calculateur satellite de calculs simples (associés généralement à des
problèmes d'édition graphique) ainsi que le stockage et la modification de
données. Sur ce dernier point signalons qu'il ne s'agit nullement ici
de construire ou de modifier une structure de données locale. Cette
restriction distingue fondamentalement METAVISU des systèmes UNIVAC ou
GRAPHIC-II.
Ce choix découle directement de l'option que nous avons prise concernant la notion de structure d'image. Lorsque cette notion est utilisée, toutes image est extraite d'une structure de données principale et envoyée au calculateur satellite sous forme d'une structure partielle et simplifiée ne comportant que des informations graphiques. On peut alors, au niveau local, modifier à la fois l'image et la structure ou parcourir celle-ci. Pour justifier notre choix au niveau du calculateur local, on peut remarquer que, d'une part la recherche ou l'adjonction d'informations non graphiques à la structure et d'autre part les transformations de l'image visible dans le contexte de l'image globale (rotations ou translations) nécessitent forcément le recours au calculateur principal. On peut noter, de plus que toute modification apportée à la structure locale doit finalement être reportée dans la structure principale, ce qui ne facilite pas la tâche du programmeur. Pour ces raisons et d'autres exposées dans [2] nous n'avons pas retenu la notion de structure d'image. L'association des éléments d'une structure et d'une image en vue de leur désignation future au crayon optique est cependant assurée comme on le verra plus loin (Associateurs).

## Description des interactions

Pour décrire le dialogue homme-machine, W. NEWMAN [8] a introduit une représentation sous forme d'un diagramme d'états. Dans cette notation les états (figurés par des cercles) sont les points de contrôle du programme ou celui-ci se met en attente d'une intervention de l'utilisateur. Les flèches reliant les états entre eux représentent les événements qui permettent de passer d'un état à l'autre. Les triangles sur ces flèches sont les actions à exécuter lorsque l'événement spécifié a été reconnu ; elles constituent la réponse du système.

Dans l'exemple de la figure 3, l'utilisateur a la possibilité de créer sur l'écran un nuage de points et de demander à tout instant le calcul de leur centre de gravité.
<figure><img src="image_6.png" /><figcaption>Figure 3</figcaption></figure>

S1 et S2 sont les noms des états.

Function 1, Function 2, Move Pen et l'élément de menu "NOUVEAU POINT" sont les événements.

RANGER, DEPLACER, AFFICHER sont des fonctions locales
GRAVITE est une procédure externe.

Le langage de spécification des interactions du système METAVISU est basé sur ce principe. Il comporte cependant un certain nombre de différences par rapport au "CONTROL LANGUAGE" de Newman [8]. Dans l'exemple précédent en particulier, on voit que les procédures externes sont attachées aux branches et non aux états.
# IV. MANUEL D'UTILISATION DU LANGAGE DE SPECIFICATION DES INTERACTIONS

## 1. Notations syntaxiques

Dans ce qui suit, nous utilisons pour décrire la syntaxe du langage
la métasyntaxe suivante :

- les Mots-Clés sont ici représentés en lettres majuscules

- les crochets [ ] dénotent que le ou les éléments qu'ils délimitent sont facultatifs.

- les parenthèses regroupent des éléments syntaxiques indissociables

- les accolades { } dénotent qu' un choix est possible entre les éléments superposés qu'elles encadrent.

- les séparateurs suivants : ( ) ; : " sont des éléments de la syntaxe et non de la métasyntaxe. Les crochets et les parenthèses sont également des éléments syntaxiques (cf. utilisation des listes) ; lorsqu'ils apparaissent en tant que tels ils sont encadrés d'apostrophes.

- les mots ou suites de mots écrits en italique sont des éléments syntaxiques qui sont décrits par ailleurs.

- le sigma Σ indique la possibilité de répétition du ou des éléments qui suivent, ceci au moins une fois.

## 2. Identifiers

Un identificateur est une chaîne d'au maximum 31 caractères alphanumériques commençant par une lettre.

## 3. Description d'un programme d'interaction

Un programme d'interaction est décrit comme un bloc unique de nom standard UTI sans paramètres.

## 4. Déclarations

L'instruction NEW permet de déclarer :
a) Les Variables

NEW identifieur [Σ(,identifieur)];

Le type des variables n'a pas a être déclaré. Il sera déterminé
à l'exécution par la première affectation.

b) Les Procédures Externes

Les procédures externes sont les procédure CPL/1 qui sont appelées
depuis le programme d'interaction.

NEW PL1 identifieur ['('spécificateur[Σ(,spécificateur)]')'];

spécificateur ::
  { ENT
  COU
  TEX
  FIG }
  ['( 'nombre ' )']

Le spécificateur permet de préciser le type des arguments de
la procédure externe ainsi que le nombre maximum d'éléments de l'argument
s'il s'agit d'une liste.

La signification des mots clés ENT, COU, TEX, FIG est la suivante :

- ENT pour entier

- COU pour couple d'entiers

- TEX pour une chaîne de caractères

- FIG pour un associateur
à l'intérieur du bloc courant ou d'un bloc plus externe.

## 5. Constantes et Values

Il existe trois types de constantes :

- entier de $-2^{31}$ à $2^{31}-1$

exemples : -2147 483 648 (soit $-2^{31}$)
+193 4593

- chaîne de au plus 254 caractères

exemples : ABCD s'écrit 'ABCD'
chaîne vide s'écrit ''
N'DIAI s'écrit 'N'' (guillemet) DIAI'

- couple d'entiers

exemples : <-1, 255> <3001, -20> <0,33>

Une VALUE est une constante symbolique définie par les instructions suivantes :

VALUE nom = exp;
VALUE nom c = <exp, exp >;

ou "nom" et "nom c" sont des identificateurs et "exp" une expression de constantes numériques ou de constantes symboliques définies précédemment.

Du fait qu'il représente une constante un identificateur de _value_ ne devra jamais apparaître en partie gauche d'une instruction d'affectation.

La portée d'un identificateur de value est elle aussi régie par la structure de blocs.
c) Les blocs

NEW BLOC identifieur[('identifieur[Σ,(identifieur)]')』';
BEGINBLOC
[Σdéclaration d'identifieurs]
[Σinstruction]
[Σdéclaration d'état]
ENDBLOC ;

Un "bloc" est donc un ensemble d'instructions que l'on peut
accéder globalement sous forme d' "appel de procédure" ou d' "appel de
fonction" au sens ALGOL de ces termes.

Les noms des paramètres formels spécifiés éventuellement entre
parenthèses à la suite du nom d'un bloc n'ont pas à être redéclarés à
l'intérieur du bloc.

Les déclarations d'identifieurs peuvent être des déclarations
de variables ou de "VALUE", de procédures externes ou de blocs.

Instructions et déclaration d'état seront décrits par la suite.

Remarques : La portée des identifieurs de variable ou de bloc est limitée au bloc dans lequel ils sont déclarés. Par contre un identifieur de procédure externe est valide pour l'ensemble du programme. Par conséquent, plusieurs procédures externes ne peuvent pas porter le même nom.

Un identifieur ne peut être référencé que s'il a été précédemment
déclaré dans le bloc courant ou dans un bloc plus externe. La référence
en avant est toutefois autorisée pour un identifieur d'état
## 6. Variables

Une variable est un identificateur déclaré à l'aide d'une instruction NEW, et dont le type est déterminé à l'exécution par la première affectation de cet identificateur.

Pour chaque type de variable, les paragraphes suivants précisent la description du type, les opérateurs, fonctions internes et instructions spéciales qui leur sont associés.

Dans tout ce qui suit, entier, chaîne, etc... représentent en fait le résultat de l'évaluation d'une expression (cf § 8.1) supposé du type indiqué.

### 6.1. Entier

- *description* : valeurs entières comprises entre $-2^{31}$ et $2^{31}-1$

- *opérateurs* : unaire

+ somme

- différence

* multiplication

/ division

- *fonctions internes*

**INTEGER(C)** ou C est une chaîne
retourne l'entier résultant de la conversion de la chaîne C sous réserve qu'elle représente un entier.

**ISINT(C)** ou C est une chaîne
retourne 1'entier 1 si la conversion de C en entier est possible, ou 1'entier zéro dans le cas contraire.

**FUNCNAME**
retourne l'entier correspondant au numéro de la touche du clavier de fonction qui a été enfoncée (cf la description des événements)
### KEYTYPE

retourne l'entier 1 si une touche "caractère" du clavier alphanumérique a été enfoncée
l'entier 0 si une touche "fonction" du clavier a été enfoncée.

l'entier -1 si aucune touche du clavier alphanumérique n'a été enfoncée (cf la description d'un état).

### KEYNAME

retourne l'entier correspondant au numéro de fonction de la touche enfoncée du clavier alphanumérique sous réserve qu'il s'agit bien d'une touche fonction (cf fonction KEYTYPE).

COUNT(A) ou A est une chaîne de caractères ou une liste retourne l'entier représentant le nombre d'éléments de la liste (cf variable de liste) si A est une liste ou de la chaîne si A est une chaîne.

### PEN

retourne la valeur entière 0 si le crayon est levé et la valeur 1 si le crayon est enfoncé.

### HITFRACOUNT

retourne l'indice de la dernière image désignée d'une liste d'images (cf description d'un état et la variable FRAME),
ou 0 s'il n'y a pas eu d'image élément de liste désignée, si la liste ou l'image a été détruite entre temps, ou si l'image a été retirée de la liste.

### HITSYMBOLCOUNT

retourne l'indice du dernier symbole désigné d'une liste de symboles (cf description d'un état et la variable SYMBOL),
ou 0 s'il n'y a pas eu de symbole élément de liste
désigné, ou si la liste ou le symbole désigné a été
détruit entre temps, ou si le symbole désigné a été
retiré de liste depuis la désignation

UPFRAME

retourne la valeur entière 1 si on a remonté d'un niveau
dans la hiérarchie d'une image désignée (cf description
d'un état et variable FRAME),

0 si le niveau atteint est le sommet de la hierarchie,
-1 s'il n'y a pas eu d'image désignée ou si l'image
désignée a été détruite entre temps.

ABS(n) ou n est un entier, retourne la valeur absolue de
cet entier.

SQRT(n) ou n est un entier, retourne la racine carrée de
n si n est positif, la valeur 0 si non.

SIGN(n) ou n est un entier, retourne
  1 si n ≥ 0
-1 si n < 0
## 6.2. Couple

- **description** : ensemble ordonné de deux entiers

- **opérateurs** :

- **unaire** $\leftarrow a, b \rightarrow = \leftarrow a, \neg b \rightarrow$

- **somme** $\langle a, b \rangle + \langle c, d \rangle = \langle a+c, b+d \rangle$

- **différence** $\langle a, b \rangle - \langle c, d \rangle = \langle a-c, b-d \rangle$

* produit par un entier $\langle a, b \rangle * c = \langle a*c, b*c \rangle$

/ division par un entier $\langle a, b \rangle / c = \langle a/c, b/c \rangle$

- **fonctions internes**

FIRST fournit le premier élément d'un couple

FIRST(<a,b>) = a

SECOND fournit le second élément d'un couple

SECOND(<a,b>) = b

DOUBLET(x,y) ou x et y sont des entiers

retourne un couple formé par ces deux entiers

CROSSCOOR

retourne le couple représentant les coordonnées

écran actuelles de la croix du tracking (cf instructions de mode)

BALLCOOR

retourne le couple représentant les coordonnées écran actuelles de la boule (cf instructions de mode)

HITSYMBCOOR

retourne le couple représentant la position sur l'écran de l'occurence du dernier symbole désigné sous réserve qu'il y en ait un et qu'il n'ait pas été détruit depuis.
(cf description d'un état et variable symbole)

TABCOOR

retourne le couple représentant les coordonnées prélevées sur la tablette graphique.
## 6.3 CHAÎNE de caractères

- **description** : suite d'au maximum 254 caractères alphanumériques

- **opérateurs** :

+ concaténation 'abc' + 'de' = 'abcde'

- **fonctions internes**

### KEYNAME

retourne la chaîne de 1 caractère correspondant à la dernière touche "caractère" enfoncée du clavier alphanumérique (cf la description d'un état et la fonction KEYTYPE)

### INTEXT

retourne la chaîne de caractères entrée au clavier alphanumérique en mode EDIT (cf instructions de mode)

### CHAR(n) ou n est un entier

retourne la chaîne de caractères représentant le nombre n en décimal

### SUBSTR (C,i,n) ou C est une chaîne de caractères, i et n des entiers

retourne la chaîne d'au plus n caractères extraite de la chaîne C à partir du caractère de rang i.

retourne la chaîne vide si $i \le 0$, $i > \text{COUNT}(C)$ ou $n \le 0$. Si n est omis il est pris égal à $\text{COUNT}(C)-i+1$

Si i et n sont omis, i est pris égal à 1 et n à $\text{COUNT}(C)$.

## 6.4 SYMBOLE

- **description**

Un symbole est une entité graphique simple construite dynamiquement au niveau local à l'aide de déplacements, vecteurs et textes dans un espace de coordonnées qui lui est propre.
L'instruction d'affectation suivante :

<figure><img src="image_7.png" /></figure>

Décrit un symbole dans son propre espace et lui affecte un nom. Il ne sera affiché que lors de la création d'une occurence de ce symbole par une instruction COPY ou lors d'un TRACKING où ce symbole est attaché à la croix (option WITH SYMBOL d'un mode CROSS ou BALL).

*   **MOVE TO** positionnement aux coordonnées absolues <x,y> par rapport à l'origine <0,0> de définition du symbole.

*   **MOVE OF** déplacement de <dx,dy> par rapport à la dernière position atteinte précédemment.
LINE tracé d'une ligne brisée.

DOT en trait pointillé } par défaut continu
DASH en trait tireté

FROM coordonnées <xo,yo> de l'extrémité de départ de la ligne brisée.

TO <x,y> coordonnées absolues.

OF <dx,dy> coordonnées relatives
lc est une liste de couples

MARK "c" est un caractère.

TEXT la chaîne de caractères "texte" est à la position courante.

SMALL la taille des caractères du texte est petite. Elle est grande par défaut.

VERTICAL les caractères du texte sont écrits suivant l'axe des y. L'option par défaut est horizontale.

SMALLVERT les caractères du texte sont écrits verticalement en petite taille.

SYMBOL "s" est un identificateur de symbole ou une expression retournant un symbole.

Dans cette instruction et par la suite les mots-clés HITSYMBOL et HITSYMBOL possèdent la signification suivante :

HITSYMBOL désigne le dernier symbole désigné au crayon optique
HITSYMBOL désigne l'occurence particulière du HITSYMBOL.

Remarques :

- l'unité utilisée pour x,y,dx,dy est l'incrément. La taille de l'écran SINTRA est de 2048 incrément x 2048 incrément.

- lorsqu'un symbole S est utilisé pour en décrire un autre il est alors recopié. Par conséquent si, par la suite, le symbole S est modifié, cela n'aura aucune influence sur les symboles dans lesquels il intervient.
- Un symbole est "neutre" ; c'est-à-dire qu'il n'introduit aucun déplacement du faisceau lorsqu'il est utilisé pour en décrire un autre.

- L'affectation d'un symbole détruit automatiquement toutes les occurences existantes de ce symbole (cf instruction COPY).

Exemple :

NEW I, RESIST, ELEM ;
VALUE N = 10 ;
SYMBOL ELEM := LINE OF <50,100> OF <100, -200> OF <50,100> ;
SYMBOL RESIST := LINE OF <200,0> ;
FOR I = 1 STEP 1 UNTIL N DO
  SYMBOL RESIST := RESIST MOVE OF DOUBLET(200*I,0) ELEM ;
  SYMBOL RESIST := RESIST MOVE OF DOUBLET(200*I,0) LINE OF <200,0> ;
Les instructions précédentes créent un symbole RESIST représentant une résistance dont le nombre N d'éléments est variable (ajustement de la value ou paramètre formel d'un bloc).

Instructions spéciales

<table><tr><td>COPY</td><td>{ nom<br/>HITSYMBOL } AT &lt;x,y&gt;;</td></tr></table>

crée une nouvelle occurence du symbole nommé ou précédemment désigné et l'affiche à la position spécifiée par AT. L'origine des coordonnées pour l'écran SINTRA est le coin gauche.
```pascal
MOVE
    {
        nom
        HITSYMBOL
        HITSYMBOC
    }
    {
        TO <x,y>
        OF <dx,dy>
    }
;
```

déplace toutes les occurences du symbole spécifié par son nom ou du symbole ou modifie la dernière occurence désignée.

```pascal
LIGHT
    {
        nom
        HITSYMBOL
    }
    WITH a,cl,i;
    où a, cl et i sont des entiers.
```

modifie les caractéristiques graphiques du symbole spécifié par son nom ou du dernier symbole désigné pour toutes ses occurences.

```pascal
a =
    {
        0 éteint
        1 allumé
        ≠ 0,1 inchangé
    }
    cl =
        {
            0 clignotement
            ≠ 0,1 inchangé
        }
        i =
            {
                0 intensité forte
                1 intensité faible
                ≠ 0,1 inchangé
            }
```

```pascal
DESTROY
    {
        nom
        HITSYMBOL
        HITSYMBOC
    }
;
```

provoque la destruction de toutes les occurences du symbole spécifié par son nom ou du dernier symbole désigné ou la destruction de la seule occurence vue du dernier symbole désigné.
### Remarque :

Aucun opérateur n'ayant été défini sur la variable de type SYMBOL celle-ci ne doit donc jamais intervenir dans l'évaluation d'une expression (erreur détectée à l'exécution).

## 6.5 FRAME

- **description :**

Une "FRAME" est une variable qui permet de manipuler au niveau du programme d'interaction les images générées par l'exécution d'une procédure externe écrite en CPL/1.

- **affectation :**

L'affectation d'une variable de type FRAME est faite à l'aide de l'instruction d'appel de procédure externe (voir plus loin). C'est le seul mode d'affectation possible ; par conséquent une variable de type FRAME ne devra jamais apparaitre en partie gauche d'une instruction d'affectation (erreur détectée à l'exécution). De même une FRAME ne pourra pas être passée en argument d'un bloc (cf § appel de bloc).

- **fonctions internes :**

### UPFRAME

En CPL/1 étendu, l'option AS de l'appel graphique de procédure [2] permet de hiérarchiser une image en une structure de blocs. A chaque bloc peut ainsi être associé l'identificateur d'un élément de la structure de données. Lors de la désignation d'une FRAME un pointeur mis à jour automatiquement repère le bloc le plus interne contenant l'élément d'image désignée. La fonction UPFRAME permet de remonter ce pointeur d'un niveau dans la hiérarchie des blocs.
- instructions spéciales

<table><tr><td>LIGHT</td><td>{ nom<br/>HITFRAME } WITH a, cl, i ;</td></tr></table>

a le même effet que l'instruction LIGHT décrite au §6.4.

Lorsque l'option HITFRAME est présente elle agit uniquement sur le bloc actuellement pointé (voir la fonction UPFRAME).

**Remarque** : Aucun opérateur n'ayant été défini sur la variable de type FRAME un identificateur de variable de ce type ne peut intervenir dans l'évaluation d'une expression (erreur détectée à l'exécution).

## 6.6 ASSOCIATEUR

- **description**

Comme on l'a vu au paragraphe précédent, un nom interne de la structure de données peut être associé à chaque partie d'image. Une variable de type "associateur" permet de stocker ces noms associés pour ensuite les transmettre à une procédure externe.

- **fonction interne**

HITNAME

retourne le nom interne associé à la partie d'image actuellement pointée.

**Remarque** : Une variable du type "associateur" ne peut apparaître qu'en partie gauche d'une affectation par HITNAME ou comme paramètre d'appel d'une procédure externe sans reflet (cf appel de procédure externe). Toute autre utilisation sera détectée comme une erreur à l'exécution.
## 6.7 LISTE

- **description**

Une liste est un ensemble ordonné de variables de type quelconque (y compris du type liste).

Le rang d'un élément de liste est son numéro d'ordre dans la liste. Le premier élément d'une liste a pour rang 1.
Une liste homogène est une liste dont tous les éléments sont de même type.

- **opérateurs**

+ concaténation de deux listes

Exemple : L := 11 + 12 ou 11 et 12 sont des listes.

Les éléments de la liste 12 sont ajoutés en queue de la liste 11 pour former la liste L.

- **fonctions internes**

LIST(11,12,...,ln) n quelconque
retourne une liste consituée des éléments 11, 12,...,ln
dans cet ordre. 11, 12,..., ln sont indifféremment
des constantes, des variables ou des expressions.

COUNT(1) ou 1 est une liste
retourne le nombre d'éléments de la liste.

**accès à un élément de liste :**

l'accès à un élément de liste se fait à l'aide d'une
écriture indicée.

Exemples : L[n] ou L est une liste et n un entier > 0
retourne l'élément de rang n de la liste L
L[m][n] ou L est une liste et m et n des
entiers > 0
retourne l'élément de rang n de la liste
L[m] si L[m] est bien une liste.
- instructions spéciales

<table><tr><td>INSERT exp</td><td>IN ident BEFORE indice<br/>{ HEAD }<br/>{ TAIL }<br/>[OF] ident</td></tr></table>

insère le résultat de l'évaluation de l'expression "exp" devant l'élément de rang "indice" de la liste ident ou ajoute ce résultat en tête (option HEAD) ou en queue (option TAIL) de cette liste.

Si exp est une liste le résultat de INSERT n'est pas équivalent à la concatenation, car cette liste est considérée comme un seul élément de type liste et non comme l'ensemble de ses constituants.

Exemple :

<figure><img src="image_8.png" /></figure>

Si on écrit :

<figure><img src="image_9.png" /></figure>

Si on écrit :

<figure><img src="image_10.png" /></figure>
<table><tr><td rowspan="2">REMOVE</td><td>indice FROM ident</td></tr><tr><td>{ HEAD } [OF] ident<br/>TAIL}</td></tr></table>

supprime l'élément de rang "indice" ou l'élément de tête (option HEAD) ou de queue (option TAIL) de la liste de nom "ident".

**Remarques :** - Dans les deux instructions précédentes ident peut être un nom simple ou un nom indicé permettant d'accéder à une sous-liste.

- Comme on le verra dans l'instruction d'appel de procédure externe, une liste de "FRAME" peut également être retournée par l'appel de cette procédure.

## 7. Description d'un état

### 7.1 Déclaration d'un état

STATE identifieur

TITLE t₁ AT <x₁,y₁> [Σ(tₙ AT <xₙ,yₙ>)] [;]

[zone mode]

ON [EVENT] Σ(événement Σ (instruction))

"identifieur" est le nom de l'état.

t₁,..., tₙ sont des constantes chaîne de caractères qui s'afficheront aux positions de coordonnées respectives <x₁,y₁>,..., <xₙ,yₙ> (les <xᵢ,yᵢ> sont des constantes ou values de couple) lorsque l'état sera actif.
"zone mode" est une séquence facultative d'instructions ou de spécifications de modes (cf § 7.2) qui sera exécutée à l'entrée de l'état.

"événement" spécifie quelle intervention de l'opérateur sur les moyens d'entrée doit être reconnue par le programme (cf 7.3) ; la suite des instructions qui lui est associée sera exécutée lorsque l'événement spécifié et lui seul se sera produit.

**Définition** : Un état est dit "actif" lorsque, à la suite d'une instruction de branchement (cf instruction GOTO) ou d'appel de bloc, l'interpréteur après avoir mis en place le " titre " et exécuté les instructions de la zone mode, se bloque en attente d'une intervention licite de l'opérateur sur les moyens d'entrée.

## 7.2 Zone mode

Comme il a été dit au paragraphe précédent cette zone comporte une séquence d'instructions et de spécification de mode.

Ces dernières permettent d'indiquer au système graphique quelles fonctions standards il doit mettre en oeuvre durant l'activité de l'état.

**Remarques** :

La zone mode ne peut comporter les instructions suivantes :

- appel de procédure externe

- appel de bloc

- branchement ou IDEM

Cependant les appels de fonctions internes (ou standards) sont autorisés. Une instruction de spécification de mode ne peut apparaître dans le corps d'une instruction conditionnelle ou d'une instruction de boucle, ainsi qu'en dehors de la zone mode.
EDIT [texte] [AT <x,y>] ;

Permet l'entrée d'une chaîne de caractères au moyen du clavier alphanumérique.

texte - chaîne de caractères qui représente le texte initial que l'on veut modifier.

Le nombre maximum de caractères est 64.

AT<x,y> - Position du texte sur l'écran.

Si cette option est omise, la position sera 0,64 c'est-à-dire
la dernière ligne de l'écran.

Remarques : - Un seul mode EDIT est permis par état.

- L'événement KEY FM est obligatoire et tous les autres événements KEY sont interdits.

Lorsque cette clé est enfoncée, le texte entrée peut ensuite
être récupéré, par la fonction INTEXT.

- Le texte reste affiché durant l'activité de l'état.

CROSS - Déplacement d'une croix avec le crayon.

WITH HITSYMBOLBOC - attache à la croix l'occurence du dernier symbole désigné.
Le positionnement initial de la croix est celui de l'occurrence désigné.

WITH SYMBOL - crée une nouvelle occurrence du symbole "identifieur" qui est affiché à la position de la croix et attache la croix à cette occurrence du symbole.
AT<x,y> - Positionne la croix en <x,y>

RUBBERBAND - trace une ligne depuis la position indiquée par l'option
FROM <x,y> , ou si cette option est omise depuis la position
initiale de la croix, jusqu'à la position courante de la
croix déplacée.

BALL - Déplacement avec la boule ; effet identique à CROSS mais sans affichage de croix.

Remarques : - Un seul mode CROSS et un seul mode BALL peuvent être spécifiés dans un même état.

- Si CROSS et BALL sont utilisés ensemble, il ne peut y avoir qu'un seul RUBBERBAND.

- En mode CROSS, tous les événements PENHIT sont interdits.

- La position de la croix déplacée par le crayon ou de la boule est récupérable, à l'aide des fonctions CROSCOOR et BALLCOOR.

7.3 EVENEMENTS

<figure><img src="image_11.png" /></figure>

$0 \le n \le 15$

valide la touche du clavier fonctions spécifiée par le nombre "n"
ou toutes les touches d'une plaque avec le mot clé ANY.

Pour un état donné, les touches fonctions validées sont éclairées.

Remarques : - Le numéro de la touche de fonction enfoncée est récupérable par la fonction FUNCNAME.

- Avec ANY il ne peut exister d'autres événements FUNCTION dans
le même état.
KEY
{ } : { caractère
    n
    FM
    ANY

0 ≤ n ≤ 14

(clé 15 réservée à l'appel
système)

valide la touche du clavier alphanumérique spécifiée par :

- un seul caractère alphanumérique,

- le code de l'une des 16 fonctions de clavier alphanumérique,

- FM qui est la touche 13,

- l'une quelconque des touches avec le mot clé ANY.

**Remarques** : - Toutes les clés, à l'exception de FM, qui est obligatoire, sont interdites si le mode EDIT est spécifié dans l'état.

- Le code de la clé est récupérable avec la fonction KEYNAME. La fonction KEYTYPE fournit la valeur 0 pour un numéro de touche où la valeur 1 pour un caractère, et la valeur -1 si aucune touche n'a été enfoncée depuis la mise en place de l'état.

- Avec ANY il ne peut exister d'autres événements KEY dans le même état.

PENHIT ON
{ texte AT x,y
    identifieur } :

valide le crayon pour une désignation.

texte - chaîne de caractères constituant le texte élément d'un menu. Ce texte est affiché à la position indiquée par l'option AT.

identifieur - est un nom de symbole ou un nom de FRAME ou d'une liste homogène de SYMBOLES ou de FRAMES. L'événement se produira lorsque l'(ou les) entité(s) graphique(s) identifiée(s) par ce nom sera désignée à l'aide du crayon.
- Pour un symbole, son occurrence devient la valeur courante de la fonction HITSYMBOL. Les coordonnées de positionnement correspondant à cette occurrence sont récupérables par la fonction HITSYMBCOOR.

- Pour une image générée par CPL/1-G, le nom interne (c'est-à-dire l'item de la structure de données) est récupérable à l'aide de la fonction HITNAME.

La fonction UPFRAME permet de remonter dans la hiérarchie constituée par des images imbriquées. Elle retourne :

- la valeur 1 si un niveau supérieur est atteint (l'item peut à nouveau être récupéré par HITNAME),

- la valeur 0 l'on se trouvait déjà au sommet,

- la valeur -1 lorsque la fonction UPFRAME est utilisée alors qu'aucune image n'a été désignée.

- Les fonctions HITFRACOUNT et HITSYMBCOUNT permettent de récupérer le rang de l'élément graphique désigné d'une liste de FRAMES ou de SYMBOLES.

Remarque : - Pour l'option "texte AT" le mot clé PENHIT ON est facultatif.

CYCLE :

L'événement de cycle est un événement systématique lié au cycle de rafraichissement de l'image (cf le manuel de référence de la console graphique SINTRA VU 2000).

Cet événement se produit de façon régulière (environ 40 fois par seconde) à chaque fois que le processeur graphique reboucle sur le début de la liste d'affichage.

Il peut être utilisé à des fins d'animation ou de contrôle du tracking (boule, croix ou tablette graphique).
Exemple :

Contrôle du déplacement de la croix

NEW BLOC TRAC ;
BEGINBLOC
NEW PREM ;
STATE S1
TITLE 'DEPLACER LA CROIX' AT <500, 2000>
CROSS ; PREM := O ;
ON CYCLE :
    IF PREM = 1 & PEN = O THEN GOTO S2 ;
    PREM := PEN
STATE S2
TITLE 'POURQUOI AVOIR LEVE LE CRAYON ?' AT <500, 2000>
ON
    'FATIGUE' AT <1500, 1000> : GOTO'S1 ;
    'VALIDER' AT <1500, 900> : RETURN CROSCOOR ;
ENDBLOC TRAC ;

TABLET :

Cet événement systématique est lié au cycle d'échantillonnage de la tablette graphique SYNELEC. En mode "poursuite" lorsque le stylo est enfoncé ses coordonnées sont prélevées à une fréquence réglable de façon continue sur le tableau de commande. En mode "coup par coup" les coordonnées du stylo sont prélevées une fois lorsque l'on enfonce le stylo qu'il faut relever ensuite. Dans les deux modes de fonctionnement une interruption est envoyée au calculateur à chaque échantillonnage qui provoque l'événement TABLET. Les coordonnées du crayon peuvent alors être récupérées à l'aide de la fonction interne TABCOOR.
# 8. Instructions

## 8.1 instruction d'affectation

```
identifieur := expression
```

où une expression est une suite d'identificateurs, d'appels de fonction ou de bloc, de constantes ou d'expressions entre parenthèses séparés par des opérateurs.

## 8.2 conditions

une condition est de la forme :

```
condition simple [Σ({δ} condition)]
```

δ opérateur boolean et

† opérateur boolean ou

condition simple :

```
Expression

| =
| . =
| >
| <
| >=
| <=

'('condition')'
```

<table><thead><tr><th>Opérateurs</th><th></th><th>Type des expressions admises</th></tr></thead><tbody><tr><td>=</td><td>égal</td><td>entier, couple, item, chaîne de caractères</td></tr><tr><td>.=</td><td>différent</td><td>entier, couple, item, chaîne de caractères</td></tr><tr><td>&gt;</td><td>supérieur</td><td>entier</td></tr><tr><td>&lt;</td><td>inférieur</td><td>entier</td></tr><tr><td>&gt;=</td><td>plus grand ou égal</td><td>entier</td></tr><tr><td>&lt;=</td><td>plus petit ou égal</td><td>entier</td></tr></tbody></table>
## 8.3 Instruction conditionnelle IF :

```
IF condition THEN unité-1 [ELSE unité-2] ;
```

- si la condition est vérifiée, l'unité-1 est exécutée,

- si la condition n'est pas vérifiée, l'unité-2 est exécutée si l'option ELSE est présente.

- unité-1 est une instruction inconditionnelle ou un bloc BEGIN-END

- unité-2 est une instruction quelconque ou un bloc BEGIN-END

## 8.4 Instruction répétitive FOR :

```
FOR identificateur := exp1 [STEP exp2] [WHILE condition]
UNTIL exp3 DO unité ;
```

**identificateur** - compteur d'itération de la boucle.

*   **exp1** est la valeur initiale du compteur d'itération.

*   **exp2** est le pas d'incrémentation du compteur. Si l'option STEP est omise le pas est implicitement égal à 1.

*   **exp3** est la valeur limite du compteur pour laquelle la dernière itération sera effectuée.

- "condition" est une condition qui, si elle est vérifiée, provoque une itération ou, si elle n'est pas vérifiée, provoque la sortie de la boule.

*   **unité** - est une instruction ou un bloc BEGIN-END.

- L'expression de l'option UNTIL n'est évaluée qu'une fois à l'initialisation de la boucle FOR.

- La condition de l'option WHILE est réévaluée à chaque itération.
### 8.5 Instruction répétitive WHILE :

WHILE condition DO unité ;

- tant que la condition sera vérifiée, l'unité (instruction ou bloc) sera exécutée.

La boucle sera terminée lorsque la condition, qui est évaluée à chaque itération, n'est plus vérifiée.

### 8.6 Branchement conditionnel par indexation :

CASE exp OF unité-1
    Σ OR unité-i ;

l'expression est évaluée et fournit la valeur d'indexation (i) de l'unité qui sera exécutée.

Si la valeur de l'expression n'est pas dans le champ de variation de i, c'est-à-dire une valeur nulle, négative ou supérieure à la valeur maximum de i, l'instruction est ignorée.

Les unités sont des instructions inconditionnelles ou des blocs.

### 8.7 Branchement conditionnel par comparaison :

CASE expo IS exp1 unité-1
    Σ IS expi unité-i ;

expo est évaluée et comparée avec l'évaluation des expi. Lorsque les valeurs sont identiques, l'unité correspondante est exécutée.
## 8.8 Instruction d'appel de procédures externes :

```
CALL nom [(arguments)] IN {
    FRAME suite d'images
    LISTFRAME 1f
} ;
```

- "nom" est le point d'entrée de la procédure PL1 précédemment déclarée par NEW PL1.

- "arguments" est une suite de noms de variables ou d'expressions parés par des virgules.

Le type de ces arguments doit correspondre à la "suite de types" de la déclaration NEW PL1.

Si une astérisque précède le nom d'une variable, il y aura reflet c'est-à-dire que la valeur du paramètre associé à cet argument sera affectée à ce dernier après l'exécution de la procédure.

- "suite d'images" est une suite de un ou plusieurs noms de variables FRAME. Ces variables référencent successivement les images générées au niveau graphique zéro par CPL/1-G.

- "lf" est le nom d'une variable liste de FRAME dont les éléments recevront successivement les images générées au niveau graphique zéro par CPL/1-G.

## 8.9 Instruction d'appel d'un bloc :

```
identificateur de bloc ['(expression[Σ,(expression)]')'] ;
```

les paramètres sont passés par valeur.
## 8.10 Instructions GOTO et IDEM

GOTO nom ;

Cette instruction provoque l'abandon de l'état actuellement actif et active l'état "nom".

IDEM ;

Cette instruction termine les instructions à exécuter sur événement et remet le système dans l'état oisif.

L'état actuellement actif reste actif.

Les instructions de la zone "mode" de cet état ne sont pas réexécutées.

Si aucune instruction GOTO ou IDEM ne termine les instructions à exécuter sur événement, l'instruction IDEM est implicitement présente.

**Remarques** : Si, parmi les instructions à exécuter sur événement, un appel de bloc contenant des états est effectué, l'instruction IDEM est remplacée implicitement par un GOTO vers l'état actif actuel. Dans ce cas les instructions de mode de cet état sont réexécutées.

Les instructions GOTO et IDEM sont interdites dans la zone "mode" d'un état.

## 8.11 Instruction STOP

STOP n ;

n entier

Cette instruction placée en un endroit quelconque du programme provoque un déroutement vers le "moniteur d'interaction" qui affiche la valeur de l'entier n.
Le "moniteur d'interaction" qui est en fait un programme d'interaction englobant automatiquement le programme utilisateur permet lorsqu'il est mis en oeuvre (au départ, sur instruction STOP, sur Appel Système ou sur erreur détectée à l'exécution) :

- d'afficher et de modifier le contenu des variables ;

- de consulter et de modifier le programme utilisateur ;

- de changer le point de reprise du programme ;

- de relancer l'exécution du programme ;

## 9. Mise en oeuvre du système METAVISU

### 9.1 Admission de l'utilisateur

Au départ la console graphique se comporte comme un télétype. La console étant en état de marche (voyant "alimentation" allumé), la touche fonction 15 du clavier alphanumérique joue le rôle d'"Appel Système".

### 9.2 Appel du système METAVISU

La commande *VIS provoque la compilation du "moniteur d'interaction" qui prend ensuite le contrôle. L'utilisateur peut alors soit taper un programme d'interaction, soit demander la compilation d'un programme dont il indique le nom.

Les éventuelles erreurs lui sont alors signalées et il a la possibilité de corriger ou de modifier son programme avant de lancer l'exécution.

### 9.3 Lancement de l'exécution

L'utilisateur ayant demandé l'exécution de son programme, si celui-ci comporte des appels de procédures externes, une "main procédure" CPL/1 comportant les appels effectifs est alors générée automatiquement puis compilée. L'utilisateur doit alors taper une commande *CPL indiquant le fichier source contenant les procédures externes. Ces procédures étant compilées, la frappe d'une commande %EXEC contenant le nom GOPL1 du fichier "code intermédiaire" de la main-procédure redonne le contrôle au programme d'interaction qui s'exécute alors.
## 9.4 Exécution conversationnelle

L'appel système, la rencontre d'une instruction STOP, une erreur détectée à l'exécution provoque un déroutement vers le "moniteur d'interaction" (cf § 8.11).

Lorsqu'une procédure externe est en cours d'exécution, la console graphique se comporte comme un télétype. Dès lors les instructions d'entrée-sortie ou de mise au point conversationnelle de CPL/1 [9] sont disponibles. En particulier la touche "Appel Système" (touche 15 du clavier alphanumérique) est alors prise en compte par l'interpréteur CPL/1.

## 9.5 Abandon du programme

Lorsque le "moniteur d'interaction" possède le contrôle, l'utilisateur peut abandonner l'exécution de son programme. Si ce programme comporte des procédures externes il lui faudra ensuite taper une commande %END permettant de sauvegarder ses fichiers.
## 10. Conclusion

La programmation de quelques applications :

- édition et simulation d'un réseau de files d'attente

- édition de cartes aériennes d'approche d'aéroport

- étude graphique du comportement de programmes en milieu paginé

a permis de montrer que les outils fournis par le système METAVISU ainsi que le mode de programmation qu'il impose (structure modulaire, séparation de la partie interaction et de la partie algorithmique) étaient une aide très appréciable pour la programmation d'applications interactives.

En ce qui concerne le langage de spécification des interaction, les notions de diagrammes et sous-diagrammes d'états et la manipulation de symboles graphiques et de listes se sont révélées extrêmement utiles et efficaces pour la description du dialogue homme-machine.
# ANNEXE

## Exemple de programme d'interaction :

### Simulation d'un réseau de files d'attente

L'exemple ci-dessous ne comporte que la partie édition du réseau.

Un réseau comporte trois types d'éléments :

- les entrées,

<figure><img src="image_12.png" /></figure>

- les servants,

<figure><img src="image_13.png" /></figure>

- les sorties,

<figure><img src="image_14.png" /></figure>

reliés par des liaisons qui peuvent avoir deux formes :

- lignes directes

- lignes horizontales et verticales

<figure><img src="image_15.png" /></figure>

Exemple de réseau obtenu
Le programme permet d'ajouter ou de retrancher des éléments au réseau
et crée la structure de données correspondante.

Celle-ci complétée par des données numériques telles que taux de
service, probabilités d'entrée,... sera utilisée pour les calculs.

La structure de données comprend trois listes :

- la liste des entrées ENT

- la liste des servants SER

- la liste des sorties SOR

et des doublets représentant des liaisons.

L'utilisateur ne peut pas créer de liaison partant d'un élément vers
une entrée ou partant d'une sortie vers un élément, ceci sans qu'un
test soit nécessaire dans le programme.

Des modifications apportées au réseau sont effectuées localement
au moyen de symboles puis sont introduits dans la structure de
données. L'image du réseau est alors regénérée et les symboles sont
détruits.

Le programme ne comporte que neuf états (quatre dans le programme
principal) ce qui montre l'efficacité de la notion de sous-diagrammes
d'états.
EW-BLAC UTI;

EGINBLAC

EW I, J, RESEAU, ENTRÉE, SORTIE, SERVANT, L, AST;

ALUE POSTIT= <1500,1800>,DFC=<0,-100>,PM1=POSTIT+DFC,PM2=PM1+DFC,PM3=PM2+DEC,
PM4=PM3+DEC,PM5=PM4+DFC;

EW PL1 SUPPRESS1(TEX,ENT,ENT);

EW PL1 SUPPRESS(FIG,ENT,ENT);

EW PL1 ENTRÉES(CDU,TEX);

EW PL1 SORTIES(CDU,TEX);

EW PL1 SERVANTS(CDU,TEX);

EW PL1 LIAISON(CDU(10),ENT);

EFG SLHC AJOUTER(I)

EGINBLAC

* I EST LE TYPE LE L'ÉLÉMENT A AJOUTER */

STATE AJEU

TITLF 'A MÉNER L'ÉLÉMENT A LA POSITION DESIREE' AT POSTIT
'LE NOMMER SI DESIRE' AT PM1

EDIT;

CROSS WITH HITSYMBOL

ON KEY FM:

CARE I

OF CALL ENTRÉES(CROSSCORR,INTEXT) IN FRAME RESEAU

OR CALL SERVANTS(CROSSCORR,INTEXT) IN FRAME RESEAU

OR CALL SORTIES(CROSSCORR,INTEXT) IN FRAME RESEAU;

INSERT CROSSCORR TAIL L(I);

LIGHT RESEAU WITH 1,2,2;

DESTROY HITSYMBOL;

ETURK;

ENDBLAC;

NEW PLAC MODIF;

EGINBLAC

* MODIFICATIONS DES CARACTÉRISTIQUES */

ENDBLAC;

NEW PLAC LIEE;

EGINBLAC VALUE VERT=1,HOR=2;

NEW CARQUIS,LS,LE,SENS,BIOM,DEPART;

EW MITE;

NEW PLAC AFFICHER;

EGINBLAC

* AFFICHE LE SYMbole DE LA LIAISON AU COURS DE SA CONSTRUCTION */

SYMBOL CHEQUIS:=AVE TO LS(1) LINE TO LS;

COPY CHEQUIS AT <0,0>;

ENDBLAC;
/*
NEW BLDC RELIEF;
NEW BLDC
NEW K,DSINTRAV,CUILA;
*/

/*
NEW BLDC LBLPHSPROCHG;
GJLPLBC
*/

/* CALCUL DU POINT DE PLUS PROCHES */
NEW D,OMIT,J,J, IS, OF MAX = 100000;
IF COUNT(POLYTRAV)=0 THEN RETURN 0;
IF IM:=MAX;
FOR J:=1 UNTIL COUNT(POLYTRAV) <8
  -FGJ
  D:=COUNT, ACE(LC(I),POLYTRAV(J));
  IF L<OMIT THEN
    EFGJ
    OMN:=J;
    OMN:=J;
    EJ;
  END;
  SETJ:=J+1;
  LBLBC;
*/

/*
NEW BLDC LBLCHG;
LEGINDLBC
EJLBC;
EJLBC;
IF FIRST(POLYTRAV(X))>1024 THEN N:=2 ELSE N:=1;
IF SECOND(POLYTRAV(X))>1024 THEN N:=N+2;
CASE
  IF SYMLBL S:=LINE F <8,-8> OF<0,-8> OF <28,44> OF<0,-20> OF <20,0>
    < -44,-28> OF <8,0> OF <-20,-8>
  IF SYMLBL S:=LINE F <8,-20> OF <0,-8> OF <-28,44> OF<0,-20> OF <-20,0>
    < -44,-20> OF <8,0> OF <20,-8>
  IF SYMLBL S:=LINE F <8,-20> OF <0,8> OF <28,-44> OF<0,20> OF <20,0>
    < -44,20> OF <8,0> OF <-20,8>
  IF SYMLBL S:=LINE F <8,-20> OF <0,8> OF <-28,-44> OF<0,20> OF <-20,0>
    < -44,20> OF <8,0> OF <20,8>;
RETURN;
  LBLBC;
*/
PRINTTRAV:=L2;K:=LEPLUSPROCHE;IF K=0 THEN RETURN 0;

SYMBOL CUILA:= SYMBOL FLECHE;

STATE S

TITLE : LE PRINT DESIEME FST-IL LE BUN$! AT POSTIT

COPY CUILA AT PRINTTRAV(<);LIGHT CUILA WITH 2,0,2;

IN 'LON' AT PM1;

ON DREND LE SUIVANT */

RENEW K FOR PRINTTRAV;K:=LEPLUSPROCHE;

IF K=0 THEN RETURN 0;

SYMBOL CUILA:=SYMBOL FLECHE;GATR 3;

L'QUI' AT PM2; DEPART:=PRINTTRAV(K);

CASE MIDE

IF (S(I):=P-INTRAV(K))

• LINE DIRECT *;

OR : BEGIN

• TRACE LIMNS HORIZONTAL E T VERTICALS */

IF I=2 THEN

BEGIN IF SENS=VERT THEN

LS(2):=DOUBLET(FIRST(LS(I)),SECOND(PRINTTRAV(K)))

ELSE LS(2):=DOUBLET(FIRST(PRINTTRAV(K)),SECOND(LS(I)))

INSERT PRINTTRAV(K) TAIL LS; I:=I+1;

END;

ELSE : END;

LS(1):=PRINTTRAV(K);I:=I-1;

IF SENS = VERT THEN

LS(1):=DOUBLET(FIRST(PRINTTRAV(K)),SECOND(LS(I)))

ELSE LS(1):=DOUBLET(FIRST(LS(I)),SECOND(PRINTTRAV(K)));

I:=I+1;

END;

• A : F I C : F : P ;

END;

• P : F : I : O : N : 1 ;

I : P : O : R : L : C ;
NEW PLC CRALEVE ;
BEGIN PLC
STATE SPUP
TITLE JOB FAIRE AT PASTIT
BY 'CONTINUER' AT PM1; RETURN 0;
'RELIEF' AU PRINT LE PLUS PRACHE' AT PM2:
DEFT EM RELIEF;
ENDPLAC;

NEW PLC LHV;
BEGIN PLC
IF DELTA CHANGE DELT;

NEW PLC TESTSUP;
SET PLC
IF SENS=VENT THEN DELTA:=SECOND(LS(I-1))-SECOND(CROSSCOUR);
ELSE DELTA:=FIRST(LS(I-1))-FIRST(CROSSCOUR);
DELTA:=ADD DELTA;
IF DELTA<DELT THEN
BEGIN
SENS:=CHANGE(SENS);
IF I=P THEN LS(2):=LS(1)
ELSE
BEGIN
      CLOSE TAIL LS; I:=I-1; LHV:=
      LNL;
RETURN 1;
FND
ELSE RETURN 2;
ENDPLAC;

CHANGE:=LIST(2,1);DELT:=04,
IF SENS=VENT THEN
  REG1:=FIRST(DELT(FIRST(LS(1)),SECOND(CROSSCOUR)));
  DELTA:=FIRST(LS(1)-FIRST(CROSSCOUR));
  LAD
ELSE REG1:=
  LS(1):=CHANGE(FIRST(CROSSCOUR),SECOND(LS(1)));
  DELTA:=SECOND(LS(1))-SECOND(CROSSCOUR);
  LAD;
DELTA:=ADD DELTA;
IF DELTA<DELT THEN
  BEGIN TESTSUP; RETURN; END
ELSE IF TESTSUP=1 THEN LHV
  FLSE:=0;
  INSERT CROSSCOUR TAIL LS; I:=I+1;
  SENS:=CHANGE(SENS);RETURN;
  FNL;
ENDPLAC;
SUNS:=VERT;
L2:=L(2)+L(3);
STATE UN

TITLE DESIGNS FOR ELEMENT OF DEPART. AT POST IT

ON PERMIT ON AST:

DEPART:=HITSYNTHAPR+<90T(0)>

SYMBOL AST:=TEXT *1; LS:=LIST(DEPART,DEPART);

FOR I:=1 UNTIL COUNT(12) DO COPY AST AT L2(I);

GETU TEX;

STATE DEUX

TITLE 'CROSSING LINE' OF TRACE' AT POST IT

I:=2;

ON 'FIRST' AT PM1:

FILE:=1;GETU TRIGS;

'LINES' OR '70' TAPE AT VERTICALS' AT PM2;

FILE := 2; GETU TRIGS;

STATE TRIGS

TITLE ' ' AT POST IT

CROSS AT DEPART;

IF CROSSING:=DEPART THEN

BEGIN IF COUNT=1 THEN LS(I):=CROSSING ELSE LHV; AFFICHES;

IF COUNT=0 THEN

BEGIN

IF COUNTER=1 THEN

BEGIN

DEPART:=LS(I);

CLOSE;

END;

CALL LINES (LS, I) TO FRAME RESERVE;

RETURN;

END;

PM;

ENDPL C;
/* DEbut DU PROGRAMME PRINCIPAL */

FOR I:=1 UNTIL 3 OR INSERT LIST TAIL L;

I:=0; J:=0;

STATE DEBUT

TITLE 'SOUTE VOLEZ VOUS FAIRE'S' AT PASTIT

ON CALCULE AT PM1:

IDEM;

'COIFICATIONS' AT PM2:

GETU CHI X;

'FIN' AT PM3:

RETURN;

STATE CHEIX

TITLE 'CHOISIR LA MODIFICATION AT PASTIT

ON AJOUTERA AT PM1:

GETU CHI X2;

'SUPPRIMÉ' AT PM2:

GETU SUP;

MODIFIE LES CARACTERISTIQUES AT PM3:

MODIF;

'FIN DES MODIFICATIONS' AT PM4:

GETU DEBUT;

STATE SUP

TITLE 'DESIGNER LE ELEMENT A SUPPRIMÉ AT PASTIT

TAU CRAYON OU EN LE DROITANT AT PM1

EDIT;

ON KEY F1:

/* ENTRÉE QUIE CHAINE DE CARACTÈRES */

CALL SUPPRESS(1,1,1,*J)IN FRAME RESEAU;

IF I> THE REMOVE I FROM L(J);

LIGHT RESEAU WITH 1,2,3;

SETU CHI X;

PERMIT TO RESEAU:

/* DÉSIGNATION */

CALL SUPPRESS(HITNAME,*1,*J)IN FRAME RESEAU;

IF I> THE REMOVE I FROM L(J);

LIGHT RESEAU WITH 1,2,3;

GETU CHI X;
DATE CHG1&P

TITLE 'COF VAOUIFZ VALS ADJUTER$' AT PASTIT

SYMBOL SERVANT:=LINE OF <15,0> OF <0,30> OF <60,0> OF <0,-60> OF <-60,0>
OF <0,30> LINE FROM <75,0> OF <15,0>;

SYMBOL ENTRER:=LINE OF <0,15> OF <60,0> OF <0,15> OF <30,-30> OF <-30,-30>
OF <0,15> OF <-60,0> OF <0,15>;

SYMBOL SPLITR:=SYMBOL ENTRER MOVE OF <30,30> MARK 'S1';

COPY SERVANT AT PM1;

COPY ENTRER AT PM2;

COPY SPLITR AT PM3;

APR: PERMIT ON SPLITR;

DESTROY ENTRER;

DESTROY SERVANT;

ADJUTER(3);

PERMIT ON SERVANT;

DESTROY ENTRER;

DESTROY SPLITR;

ADJUTER(2);

PERMIT ON ENTRER;

DESTROY SPLITR;

DESTROY SERVANT;

ADJUTER(1);

'LIAISON' AT PM4:

SYMBOL ACT:= TEXT 1, 2;

FOR I:=1 UNTIL A;

IF COUNT(I(I)) > 3 THEN

FOR J:=1 UNTIL COUNT(L(I)) OF

COPY ACT AT L(I)(J);

LIER; DESTROY ACT;

LIGHT RESEAU WITH 1,2,3;

'FIN' AT PM5:

GOTO CHG1;

DCLP:
```
SUPPRESS1:EREC(A,B,C)CPTIONS(ENTRY:SUPPRESS);
DCL A CHAR(*)VARYING;
/* CAN BE L'ELEMENT OF A SUPPRINER */
DCL (.,C)DIM FIXEL (s1);
DCL ITCAVAR X;
X<-A;
SUPPRESS:ENTRY(.,C);
DCL ITCAVE;
/* USE INTERNAL DE L'ELEMENT OF A SUPPRINER */
B,C=C;
IF (A=2(X)=1) T=FRF *<-D;
IF X [1] E L T THE X,
    =INDEX(LNT,(X.,));
C=1;
    =ERASE (E1,1,1);
D=LET T<*,*>; ERASE <*,*>;
F=1;
ELSE IF X [1] IS THE X,
    =INDEX(X,DEG Y,(X.,));
    =2;
    =RENEW (E1RY,1,1);
    D=LET T<*,*>; ERASE <X,*>;
    D=LET T<*,*>; ERASE <*,Y>;
    =3;
    =ERASE (E1,1,1);
    D=LET T<*,*>; ERASE <*,X>;
    =3;
    =RENEW (E1,1,1);
    D=LET T<*,*>; ERASE <*,X>;
    =3;
ERASE <*,*>,
CALL IMAGE AT 1,3;
END; /* SUPPRESS*/
```
LIAISON: PREC(A,1),

DCL A(*,*) BIN FIXED(31);

DCL I BIN FIXED(31);

DCL J BIN FIXED(31);

DCL ITEMVAR X(2) BIN FIXED(31);

DCL ITEMVAR Y(2) BIN FIXED(31);

DCL ITEMVAR Z(2,1) BIN FIXED(31);

FORNE *X IN ENTITIES AND A(1,1)=DATUM X(1)+50 AND DATUM X(2)=A(2,1);

/* RECHERCHE DE L'ELEMENT DE L'ARBITRE */

END;

FORNE *Y IN SERVICES AND A(1,1)=DATUM Y(1) AND A(2,1)=DATUM Y(2);

/* RECHERCHE DE L'ELEMENT DE LA RIVIERE */

END;

Z-<X,Y>;

DB J=1 TO J;

DATUM /(1,J)=A(1,J);

DATUM /(2,J)=A(2,J);

END;

CALL IMAGE AT J, J;

END; /* LIAISON-*/

ENTREES: PREC(A,1),

/* POSITIF DE L'ELEMENT A ADJUGER */

/* INCL DE L'ELEMENT A ADJUGER */

DCL A(*) BIN FIXED(31);

DCL B CHAR(*) VARY;

DCL ITEMVAR Y(2) BIN FIXED(31);

IF n=1 THE Y->M;ELSE Y->N;

DATUM Y(1)=A(1);

DATUM Y(2)=A(2);

ENT=ENTI(•Y);

CALL IMAGE AT J, J;

END; /* ENTERES */
SERVATS:PRPC(A,B);
DCL A(*)BIN FIXED(31);
DCL B CHAR(*)VARYING;
DCL ITEMVAR Y(2)BIN FIXED(31);
IF E='1' THEN Y->N;ELSE Y->R;
DATUM Y(1)=A(1);
DATUM Y(2)=A(2);
SERV=SERVII(•Y•);
CALL IMAGE AT 0.0;
END;

SORTIES:PRPC(A,•);
DCL A(*)BIN FIXED(31);
DCL B CHAR(*)VARYING;
DCL ITEMVAR Y(2)BIN FIXED(31);
IF E='1' THEN Y->N;ELSE Y->R;
DATUM Y(1)=A(1);
DATUM Y(2)=A(2);
SUR=SERVII(•Y•);
CALL IMAGE AT 0.0;
END; /*SORTIES*/
REFERENCES

1 P. BOULLIER, P. JANCENE, "LAMBDA" LAngage de Manipulation d'une Base de Données Associative", Rapport Laboria.

2 J. GROS, E. SALTEL. "Extension de la Notion de Procédure pour la Génération d'images" Congrès AFCET, Grenoble, Nov. 1972.

3 C. BETOURNE, J. BOULENGER, C. KAISER, J. FERRIE, S. KRAKOWIAK, J. MOSSIERE. "Process Management and Resource Sharing in the Multiaccess System ESOPE". Comm. ACM 13,12 pp. 727 (1970).

4 F. BLAIZOT, L. BLAIZOT, B. LORHO, M. VATOUX. "Organisation du Compilateur-Interpréteur CPL/1". Congrès AFCET Paris (1970).

5 I.W. COTTON, F.S. GREATOREX. "Data Structures and Techniques for remote computer graphics". AFIPS Conf. Proc. Vol 33. (1968) FJCC.

6 C. CHRISTENSEN, E.N. PINSON. "Multi-function graphics for a large computer system". AFIPS Conf. Proc. Vol 31, (1967) FJCC.

7 W.M. NEWMAN, H. GOURAUD, D.R. OESTREICHER. "A programmer's guide to PDP-10 EULER". Computer Science Tech. Report. University of UTAH, SALT LAKE CITY, UTAH.

8 W.M. NEWMAN. "A System for Interactive graphical Programming". AFIPS, Conf. Proc. Vol 32, (1968) SJCC.

9 F. BLAIZOT, L. BLAIZOT, B. LORHO, M. VATOUX. "CPL/1 Manuel de Référence". Note interne PL1/B/002 du 11 Dec. 1972. IRIA.