• Aucun résultat trouvé

Les instruments dédiés à la transformation des formes

Partie IV Utilisation de Malai et de Malan : études de cas

9.8 Instruments

9.8.1 Les instruments dédiés à la transformation des formes

Sélectionneur d’instruments d’édition

Le but de l’instrument SélectionneurInstrument, dont le diagramme de classes est défini dans la figure 9.11a, est d’activer ou désactiver les instruments dédiés à différents types

d’édi-9.8 Instruments

(a) Diagramme de classes (b) Liaisons entre les interactions et l’action

Fig. 9.11: Partie statique du sélectionneur d’instruments d’édition

tion, à savoir la main et le crayon. Cet instrument possède un bouton pour chacun des types disponibles.

La figure 9.11b définit les liaisons entre l’action et les interactions gérées par l’instrument. Le pseudo-code ci-dessous détaille la partie dynamique de ces liaisons. Tout d’abord, le simple clic, dont la cible doit être un des boutons de l’instrument, est utilisé pour créer une action SélectionnerInstrument (lignes 2 à 6). La voix est également employée dans ce but : la sélection des instruments est effectuée en fonction du mot prononcé : « main », « rectangle », « ellipse », « polygone » ou « ligne » (lignes 7 à 13).

1 L i a i s o n s SélectionneurInstrument i n s {

2 Voix v o i x −> SélectionnerInstrument a c t i o n {

3 c o n d i t i o n :

4 v o i x . mot=="main " | | v o i x . mot==" r e c t a n g l e " | |

5 v o i x . mot==" e l l i p s e " | | v o i x . mot=="p o l y g o n e " | | v o i x . mot==" l i g n e "

6 } 7 SimpleClic c l i c −> SélectionnerInstrument a c t i o n { 8 c o n d i t i o n : 9 c l i c . o b j e t==b o u t S e l e c t i o n | | c l i c . o b j e t==b o u t R e c t a n g l e | | 10 c l i c . o b j e t==b o u t E l l i p s e | | c l i c . o b j e t==b o u t P o l y O u v e r t | | 11 c l i c . o b j e t==boutPolyFerme 12 } 13 } Poignées de contrôle

Les poignées de contrôle sont des instruments faisant partie intégrante de la présentation concrète. Trois types de poignées de contrôle sont définis : celles visant à faire pivoter des formes ; celles dédiées au redimensionnement de formes ; celles déplaçant les points de polygones. Etant similaires d’un point de vue conceptuel, seule la poignée de rotation est décrite dans cette section ; les poignées de redimensionnement et de déplacement de points sont présentées en annexe C.4, page 226.

Comme le décrit le diagramme de classes de la figure 9.12a, une poignée de rotation possède : une position ; la forme à laquelle la poignée appartient ; une orientation (nord, sud, sud-ouest,

(a) Diagramme de classes (b) Liaison entre l’interaction et l’action

Fig. 9.12: Partie statique de la poignée de rotation

9.12b) ; la condition de cette liaison, définie dans le pseudo-code suivant, stipule que l’objet source de ce dernier doit correspondre à l’instrument (ligne 3).

Le feed-back intérimaire de cet instrument se rapporte à un changement de curseur lorsque l’action en cours est une action de type PivoterFormes (lignes 4 et 7).

1 L i a i s o n s PoignéeRotation p o i g n é e { 2 GlisserDéposer gd −> PivoterFormes a c t i o n { 3 c o n d i t i o n : gd . s o u r c e==p o i g n é e 4 f e e d b a c k : r e m p l a c e r c u r s e u r c o u r a n t p a r c u r s e u r r o t a t i o n 5 } 6 défaut { 7 r e m p l a c e r c u r s e u r c o u r a n t p a r c u r s e u r p a r défaut 8 } 9 } Main

La main est un instrument permettant la sélection, le déplacement, le redimensionnement et la rotation de formes.

L’attribut rotation que possède la classe Main (cf. figure 9.13a) définit si la main doit permettre la rotation ou le redimensionnement. Lorsque rotation prend la valeur « vrai », les instruments liés à la rotation sont activés et ceux liés au redimensionnement désactivés. Les liaisons entres les actions et les interactions gérées par cet instrument sont représentées dans la figure 9.13b et décrites dans le pseudo-code ci-dessous. Un simple clic sur une forme déjà sélectionnée exécute une action ActiverRotationRedim qui modifie l’attribut rotation (lignes 2 à 4). Une interaction de type PressionBouton crée une action SélectionnerFormes à condition que l’objet concerné par la pression soit du type FormeUI pour la sélection d’une forme ou du type CanvasUI pour la désélection de formes (lignes 5 à 7). L’interaction GlisserDéposer permet de sélectionner plusieurs formes si l’objet ciblé par le point initial de cette interaction est le CanvasUI de l’éditeur (lignes 8 à 10) : les formes à sélectionner sont celles contenues ou en intersection avec le rectangle formé par les points initial et final du « glisser-déposer ». Cette interaction est également utilisée pour déplacer des formes (lignes 11 à 13). Dans ce cas la condition à respecter stipule que l’objet source de l’interaction doit être une instance de FormeUI. L’interaction bimanuelle permet de redimensionner (lignes 14 à 16) ou de faire pivoter des formes (lignes 17 à 19) en fonction de la valeur de l’attribut rotation et si l’objet de la première pression est une instance de FormeUI. La seconde pression définit le second point de

9.8 Instruments

(a) Diagramme de classes (b) Liaisons entre les interactions et les actions

Fig. 9.13: Partie statique de la Main

référence du redimensionnement ou de la rotation ; ainsi, lorsque l’un des deux points bouge, le redimensionnement ou la rotation est recalculé en fonction des deux points.

1 L i a i s o n s Main main { 2 SimpleClic c l i c −> ActiverRotationRedim a c t i o n { 3 c o n d i t i o n : c l i c . o b j e t i s FormeUI && 4 main . c a n v a s . s é l e c t i o n . c o n t a i n s ( c l i c . o b j e t ) 5 } 6 PressionBouton p r e s s i o n −> SélectionnerFormes a c t i o n { 7 c o n d i t i o n : p r e s s i o n . o b j e t i s FormeUI | | p r e s s i o n . o b j e t i s CanvasUI 8 } 9 GlisserDéposer gd −> SélectionnerFormes a c t i o n { 10 c o n d i t i o n : gd . o b j e t i s CanvasUI 11 } 12 GlisserDéposer gd −> DéplacerFormes a c t i o n { 13 c o n d i t i o n : gd . o b j e t i s FormeUI 14 } 15 BimanuellePointeur b i −> RedimensionnerFormes a c t i o n {

16 c o n d i t i o n : ! main . r o t a t i o n && b i . o b j e t 1 i s FormeUI 17 }

18 BimanuellePointeur b i −> PivoterFormes a c t i o n {

19 c o n d i t i o n : main . r o t a t i o n && b i . o b j e t 1 i s FormeUI 20 }

Crayon

Le crayon, réification du concept de crayon du dessinateur, permet la création de formes, à savoir de rectangles, d’ellipses et de polygones ouverts ou fermés. La partie statique de l’ins-trument (cf. figure 9.14a) définit un unique attribut type correspondant au type de formes à dessiner. Le crayon connaît également le CanvasUI dans lequel il dessine.

(a) Diagramme de classes (b) Liaisons entre les interactions et l’action

Fig. 9.14: Partie statique du crayon

Comme l’illustre la figure 9.14b, le crayon utilise l’interaction GlisserDéposer pour créer rectangles et ellipses. La condition de cette liaison, définie dans le pseudo-code ci-dessous, stipule que le type de formes à dessiner est soit « rectangle », soit « ellipse », et que le point de pression de l’interaction se situe dans le CanvasUI (lignes 2 à 7). Ce point, ainsi que le point final, forment un rectangle à partir duquel l’ellipse ou le rectangle est créé. La création de polygones demande une interaction spéciale : l’interaction CréationPolygone. L’utilisateur clique, avec le même bouton, dans le CanvasUI pour définir les points du polygone ; un clic avec un autre bouton termine la création. Pour créer un polygone, il faut que le type de formes à dessiner soit « polygone ouvert » ou « polygone fermé » et que le premier point se situe dans le CanvasUI (lignes 8 à 13).

Le feed-back intérimaire de ces deux liaisons est identique (lignes 6 et 12). Il consiste à ajouter temporairement au CanvasUI la forme en cours de création (ligne 21) afin que l’utilisateur puisse suivre l’évolution de l’action qui réalise. Cela à condition que l’action en cours soit réalisable. Cette forme est supprimée du CanvasUI lorsque l’action est exécutée ou avortée (ligne 15).

1 L i a i s o n s Crayon c r a y o n {

2 GlisserDéposer gd −> AjouterForme a c t i o n {

3 c o n d i t i o n :

4 ( c r a y o n . t y p e==TypeForme . ELLIPSE | | c r a y o n . t y p e==TypeForme .RECTANGLE) 5 && c r a y o n . c a n v a s . c o n t a i n s ( c r a y o n . p o i n t I n i t i a l )

6 f e e d b a c k : f e e d b a c k ( a c t i o n )

7 }

8 CréationPolygone p o l −> AjouterForme a c t i o n {

9 c o n d i t i o n :

10 ( c r a y o n . t y p e==TypeForme .POLY_OUVERT | | c r a y o n . t y p e==TypeForme .POLY_FERME) 11 && c r a y o n . c a n v a s . c o n t a i n s ( p o l . p o i n t s [ 1 ] ) 12 f e e d b a c k : f e e d b a c k ( a c t i o n ) 13 } 14 défaut { 15 #s u p p r i m e r ( c a n v a s . formeTmp , 1 ) 16 }

9.8 Instruments

17 f e e d b a c k ( AjouterForme a ) {

18 s i ( a . peutExécuter ( ) )

19 a l o r s formeUITemp = nouveau FormeUI( a . f o r m e )

20 #s u p p r i m e r ( c r a y o n . c a n v a s . formeTmp , 1 )

21 #a j o u t e r ( c r a y o n . c a n v a s . formeTmp , formeUITemp ) 22 }

23 }

Gestionnaire de mouvements

Le gestionnaire de mouvements est un instrument permettant de déplacer ou pivoter des formes en fonction de mouvements selon l’axe XY ou YZ. L’unique attribut rotation que pos-sède la partie statique de cet instrument (cf. figure 9.15a) définit si l’instrument doit réaliser des rotations ou des redimensionnements (cf. figure 9.15b). Lors d’une rotation, seuls les mouvements XY sont pris en compte pour un déduire un angle de rotation. Une fois la rotation effectuée, l’utilisateur prononce le mot « stop » pour conclure l’action (voir l’interaction Mouvements de la figure 9.8b, page 155). Le déplacement fonctionne de manière identique à la différence que seul l’axe YZ est pris en compte.

(a) Diagramme de classes (b) Liaisons entre l’interaction et les ac-tions

Fig. 9.15: Partie statique du gestionnaire de mouvements

Le pseudo-code suivant décrit la partie dynamique de l’instrument. L’action PivoterFormes est créée si la rotation est activée (ligne 3). De même, L’action DéplacerFormes est créée si la rotation est désactivée (ligne 6).

1 L i a i s o n s GestionnaireMouvements g e s t { 2 Mouvements mvt −> PivoterFormes a c t i o n { 3 c o n d i t i o n : g e s t . r o t a t i o n 4 } 5 Mouvements mvt −> DéplacerFormes a c t i o n { 6 c o n d i t i o n : ! g e s t . r o t a t i o n 7 } 8 }