Next: , Previous: , Up: Top   [Contents][Index]


4 Script Smalltalk Dr.Geo

Dr.Geo est une application dynamique écrite en Smalltalk. Cela signifie qu’il est possible de modifier Dr.Geo alors qu’il est en cours de fonctionnement. Nous avons exploité cette possibilité pour définir dans Dr.Geo des items de figure qui sont en fait des scripts Smalltalk – des bouts de codes – pour étendre dynamiquement, à l’infini, les possibilités de Dr.Geo. Mais qu’est-ce que Smalltalk ?

Smalltalk est un langage de programmation orienté objet, réflexif et dynamiquement typé. Il fut l’un des premiers langages de programmation à disposer d’un environnement de développement intégré complètement graphique. Il a été créé en 1972. Il est inspiré par Lisp et Simula. Il a été conçu par Alan Kay, Dan Ingals, Ted Kaehler, Adele Goldberg au Palo Alto Research Center de Xerox. Le langage a été formalisé en tant que Smalltalk-80 et est depuis utilisé par un grand nombre de personnes. Smalltalk est toujours activement développé.

Smalltalk a été d’une grande influence dans le développement de nombreux langages de programmation, dont : Objective-C, Actor, Java et Ruby.

Un grand nombre des innovations de l’ingénierie logicielle des années 1990 viennent de la communauté des programmeurs Smalltalk, tels que les Design Patterns (appliquées au logiciel), l’Extreme Programming (XP) et le refactoring. Ward Cunningham, l’inventeur du concept du Wiki, est également un programmeur Smalltalk.

Wikipedia, Smalltalk, 2 janvier 2011

Cet extrait de la préface du livre Pharo By Example7 décrit précisément la plate forme Smalltalk utilisée pour Dr.Geo :

Pharo est une implémentation moderne, libre et complète de l’environnement et langage de programmation Smalltalk.

Pharo s’attache à offrir une plate forme robuste et stable pour du développement professionnel en langages et environnement dynamiques.

Pharo By Example, introduction

Dr.Geo exploite l’environnement Smalltalk pour proposer, d’une part, un environnement convivial d’écriture de scripts et, d’autre part, pour donner accès à l’interface des items géométriques ou numériques constitutifs d’une figure. L’interface est en fait l’ensemble des méthodes d’instance – fonctions de classe – de ces items.

Ainsi l’utilisateur peut écrire des scripts pour manipuler les items des figures ; et puisque ces scripts sont des items de figure au même titre que d’autres, ils n’ont pas besoin d’être dans un fichier séparé, ils sont enregistrés dans le fichier de la figure.

L’autre grande force des scripts est de s’appuyer sur l’environnement de développement de Pharo Smalltalk ; l’utilisateur bénéficie ainsi d’outils évolués pour mettre au point ces scripts : navigateur de classes, inspecteur, débogueur, etc. L’utilisateur souhaitant exploiter au mieux la puissance des scripts est donc invité à étudier le livre Pharo By Examplehttp://pharobyexample.org, il y apprendra le langage Smalltalk et son environnement.

4.1 Script par l’exemple

Les scripts ont deux facettes :

Les outils pour créer et éditer un script sont disponibles depuis les menus Script → Créer un script et Script → Modifier un script. Ces fonctions se trouvent également dans la barre d’outils. Pour utiliser un script choisir le menu Script → Utiliser un script, également disponible dans la barre d’outils.

Un script est un objet de première classe8. Il est défini comme une classe Smalltalk et une instance de celle-ci est créée pour chacune de ses utilisations dans une figure géométrique.

Lors de la sauvegarde d’une figure comprenant une ou plusieurs instances de scripts, le code source de leur classe est également enregistré ; pour s’en convaincre ouvrir avec un éditeur de texte un fichier .fgeo d’une figure utilisant un script.

Dans son utilisation, un script peut recevoir de 0 à n paramètres d’entrée. Après le choix du script à insérer dans la figure, il suffit alors de cliquer sur les objets de type paramètres d’entrée – comme précisé lors de la création du script – puis sur le fond de la figure pour y placer le résultat du script.

Par la suite nous vous proposons de travailler sur quelques exemples de scripts pour comprendre leur fonctionnement. Les scripts, comme les macro-constructions, donnent une dimension particulière à Dr.Geo, ils permettent – chacun avec un positionnement différent9 – d’aller là où les auteurs du logiciel ne sont pas allés ou ne souhaitent pas aller.

Il est aussi important de comprendre que l’ensemble des fonctionnalités de Pharo Smalltalk sont disponibles depuis les scripts. C’est particulièrement vrai pour ses bibliothèques de fonctions10, nous allons bien sûr les utiliser intensément.

4.1.1 Principe de construction d’un script

Lors de la construction d’un script, depuis Script → Créer un script, trois éléments sont demandés pour le définir :

  1. son nom ;
  2. sa description ;
  3. les types de paramètres d’entrée.

Le troisième point indique l’ordre et les objets sur lesquels cliquer (point, segment, etc.) pour créer une instance du script.

4.1.2 Script sans paramètre d’entrée

Premier exemple :

La procédure pour créer un script sans paramètre d’entrée est la suivante :

  1. Édition du script
    1. Choisir Script → Créer un script dans le menu. Le constructeur de script s’affiche alors :
      fig35

      Figure 4.1: Le constructeur de script

      Il comprend trois parties :

      • Nom. Son nom, saisir Mon premier script. Dans le menu “Script”, ce script est alors affiché avec ce nom, le choisir donc avec soin. Il est modifiable ultérieurement.
      • Description. Sa description, saisir Le commentaire de mon premier script. Dans le menu “Script”, ce script a une bulle d’information avec ce texte. Inscrire donc ici l’ensemble des détails nécessaires à son utilisation : ce qu’il fait et les types d’objets sur lesquels cliquer pour le faire fonctionner.
      • Arguments. Les types d’objets utilisés en paramètres d’entrée, ceux sur lesquels cliquer pour activer le script. Dans ce premier exemple, nous n’ajoutons pas d’argument car nous créons un script sans paramètre d’entrée.
    2. Presser le bouton Construire, Dr.Geo construit alors une classe pour ce script et affiche l’éditeur de code – le navigateur de classes ou class browser – sur celle-ci :
      fig38

      Figure 4.2: Navigateur de classes sur mon premier script

      De la gauche vers la droite et du haut vers le bas y sont présentées :

      • Les bibliothèques de classes, ici DrGeoII-User, c’est l’emplacement des scripts utilisateur.
      • La liste des scripts utilisateur, de la forme DrGeoScriptxxxx, les classes représentant les scripts.
      • Les catégories de méthodes par classe (script) pour les ranger, ici une seule catégorie : public. L’utilisateur en crée d’autres si besoin. La catégorie public est activée, en général c’est dans celle-ci que l’utilisateur place les méthodes de son script.
      • Les méthodes de la catégorie sélectionnée. Ici, dans la catégorie public, se trouve l’unique méthode compute. En cliquant sur une méthode, son code source est affiché dans l’éditeur de texte en bas. La méthode compute est créée par défaut par Dr.Geo. C’est cette méthode qui retourne le résultat à afficher dans la figure. Attention à ne pas la supprimer cela provoquerait une erreur, il est toutefois possible de la recréer lors d’une telle erreur ou depuis le navigateur de classe.
      • Sur toute la largeur, la zone texte pour édition du code source de la méthode sélectionnée. Pour valider une modification, il suffit de presser les touches Ctrl-s.
    3. Saisir le code source ci-dessous dans le panneau du bas du navigateur de classes See scriptClass:
      compute
         ^ 'hello !'.
      

      Sauvegarder le script par la combinaison de touches Ctrl-s, Dr.Geo pourra vous demander vos nom et prénom, saisir par exemple EricDupont sans espace.

      La première ligne d’une méthode, compute désigne toujours le nom de la méthode, la suite est le code source du script. La deuxième ligne de celle-ci, entre guillemets, est un commentaire de ce que fait la méthode, nous conseillons de bien documenter losrque vous créer plusieurs méthodes dans un script.

      L’éditeur de script peut maintenant être fermé.

  2. Utilisation du script dans la figure
    Choisir Script → Utiliser un script dans le menu. Dans la boîte de dialogue qui s’affiche alors choisir le script Mon premier script que nous avons créé précédemment. Noter qu’à chaque fois qu’un script est choisi, son commentaire descriptif est affiché en dessous.
    fig50

    Figure 4.3: Choisir un script

    Une fois le script sélectionné, cliquer dans la figure à l’emplacement souhaité, le script y est inséré ; dans cet exemple il ne fait que retourner le message “hello !”. La valeur retournée par la méthode compute est toujours celle affichée dans la figure.

Dans les exemples ci-dessous, nous donnons uniquement le code source de la méthode compute. En reprenant les étapes précédentes, à vous de créer le script en choisissant à votre convenance ses nom et description, nous ne revenons pas sur ces étapes.

Un générateur de nombres aléatoires et autres :

Si vous souhaitez un générateur de nombres entiers aléatoires entre 0 et 10, rien de plus simple, c’est ce que fait le script suivant :

compute
"Je retourne un nombre aléatoire"
   ^ 10 atRandom.

À chaque mise à jour de la figure, il génère un nombre aléatoire entier dans l’intervalle [0 ; 10]. Si vous préférez un nombre flottant dans l’intervalle [0 ; 1], utilisez ce script :

compute 
"Je retourne un nombre décimal aléatoire entre 0 et 1"
   ^ 100 atRandom / 100.

Quelques précisions :

Calculer des valeurs usuelles :

Pour calculer une valeur approchée de pi ou de e :

compute
   ^ Float pi
compute
   ^ Float e

Les valeurs retournées par ces scripts sont ensuite utilisables comme toutes les autres valeurs numériques générées par Dr.Geo. Pour toutes ces petites choses les scripts sont donc vos amis. Mais ils peuvent faire bien plus de choses intéressantes lorsqu’ils reçoivent des paramètres en entrée.

En effet ici les scripts n’avaient aucun argument, il n’y avait donc pas lieu de sélectionner des items de la figure lors de l’insertion des scripts dans la construction. Bien sûr leur intérêt réside dans les traitements numériques qu’ils permettent sur des items et la restitution de ce résultat dans la figure, sous la forme d’un objet qui lui même peut-être utilisé par d’autres scripts. Dans les sections suivantes nous montrerons de tels enchaînements de scripts.

4.1.3 Script avec un paramètre d’entrée

4.1.3.1 L’exemple

Prenons l’exemple d’un script qui étant donné un polygone va :

4.1.3.2 Objectif

Cet exemple montre comment faire des calculs à partir de l’état d’un objet – un polygone – et modifier un attribut visuel d’un objet – sa couleur. Étant donné que le langage informatique Smalltalk des scripts est le même que celui de Dr.Geo, nous montrons que l’étude du fonctionnement interne de Dr.Geo permet d’utiliser au mieux les scripts.

Enfin les trois constituants d’un objet mathématique sont exposés : hiérarchies des classes DrGMathItem pour le modèle mathématique, DrGMathItemCostume pour la représentation visuelle et DrGCostumeStyle pour gérer les attributs visuels (couleur, formes,...).

4.1.3.3 Créer le script

La procédure pour créer un script avec un paramètre d’entrée est sensiblement la même. Toutefois un argument de type polygone est nécessaire, en effet lors de son utilisation il faut choisir un polygone dans la figure. Les paramètres du constructeur de ce script – à invoquer par le menu Script → Créer un script – ressembleront à la figure See scriptConstructorOneArg.

SmalltalkScript01

Figure 4.4: Le constructeur de script avec un argument demandé

4.1.3.4 Logique

La logique de ce script est implémentée dans sa méthode compute. Elle est la suivante :

  1. colorier en rouge le polygone
  2. tester si le polygone est un quadrilatère, dans la négative retourner le message 'Je ne suis même pas un quadrilatère'.
  3. tester si ses diagonales sont isométriques et partagent le même milieu :
    1. si oui, colorier en bleu le polygone et retourner le message 'Je suis un rectangle.
    2. si non, retourner le message 'Je ne suis PAS un rectangle'.
  4. fin de la méthode compute

4.1.3.5 Le code source

La méthode principale compute du script :

compute
   | diag1 diag2 points mid1 mid2|
   self paintRed.
   self isQuad ifFalse: [ ^ 'Je ne suis même pas un quadrilatère !' ].
   points := self arg1 points.
   diag1 := points first - points third.
   mid1 := points first + points third / 2.
   diag2 := points second - points fourth.
   mid2 := points second + points fourth / 2.
   (diag1 r = diag2 r and: [mid1 = mid2])  
      ifTrue: [ 
         self paintBlue.
         ^ 'Je suis un rectangle :)' ]
      ifFalse: [ ^ 'Je ne suis PAS un rectangle :(' ].

Quelques explications :

 

Passons maintenant aux trois autres méthodes de ce script, à savoir paintRed, paintBlue et isQuad :

paintRed
   self costume1 style color: Color red
paintBlue
   self costume1 style color: Color blue

Le message #costume1 demande le costume du premier argument du script, à savoir le costume du polygone. Dans Dr.Geo, le costume d’un objet permet à la fois l’accès au modèle mathématique et à sa représentation graphique ainsi que ses attributs associés de style13. Ces deux méthodes demandent donc le style du costume (message #style) pour lui envoyer ensuite le message à mot clé #color: avec comme argument la couleur souhaitée.

Les messages à mot clé sont une spécificité de Smalltalk : les arguments sont intercalés dans le nom du message.

La dernière méthode annexe est triviale, elle demande au modèle (le polygone retourné par la méthode arg1) sa liste des sommets, puis la taille de cette liste. Le polygone est un quadrilatère si cette taille est de 4  :

isQuad
   ^ self arg1 points size = 4

Après la saisie de chacune de ces méthodes, le code source doit être sauvé et compilé par le raccourci clavier Ctrl-s.

Pour l’utilisation du script (Script → Utiliser un script), Dr.Geo attend que l’utilisateur clique sur un polygone, puis sur un emplacement de la figure.

Selon le type d’objet en référence, diverses méthodes sont disponibles ; qui pour obtenir sa valeur, qui pour obtenir ses coordonnées, etc. Le répertoire des méthodes est disponible depuis la section Méthodes de référence des scripts See api-dgs.

4.1.4 Script avec deux paramètres d’entrée :

Pour calculer la distance entre deux points14, nous créons alors un script avec deux arguments : deux points. L’unique méthode compute est alors :

compute
"Calcule la distance entre deux points"
   ^ self arg1 point dist: self arg2 point

Ici les méthodes arg1 et arg2 retournent des objets Dr.Geo de type point, dans la hiérarchie de classe DrGPointItem. Cette classe a une méthode point qui retourne ses coordonnées.

#dist: est un message à mot clé 15 de la classe Point qui attend comme unique argument un autre point, elle calcule la distance entre ces deux instances. Elle peut se comprendre comme : “distance entre arg1 point et arg2 point”.

Pour utiliser ce script, procéder comme dans les exemples précédents : choisir deux points de la construction et un emplacement de la figure pour y placer le résultat du script.

4.1.5 Example détaillé de figure avec plusieurs scripts

Dans la section suivante, nous présentons une figure plus complexe intégrant un enchaînement de scripts pour la construction d’une portion de courbe représentative d’une fonction et la tangente en un point mobile de cette portion de courbe.

La figure finale est disponible dans le dossier examples de Dr.Geo, elle s’appelle Curve and slope.fgeo.

fig55

Figure 4.5: Courbe et tangente en un point

Dans une nouvelle figure, nous commençons par construire un segment horizontal, nous y plaçons un point libre appelé “Move me”. Ce point servira de base à la construction de la courbe comme lieu d’un point.

Définir un fonction :

Comme un script est capable de retourner n’importe quel type d’objet, le premier de notre construction définira simplement la fonction utilisée. Pour ce faire nous utilisons des objets Smalltalk de type bloc de code – fonction anonyme en Lisp. Nous nommons ce script Function, sans arguments, sa méthode compute est :

compute
"La définition de notre fonction"
   ^ [:x | x cos]

Ensuite nous le plaçons dans la figure16. Ainsi le bloc de code retourné par Function attend un argument :x et retourne le cosinus de celui-ci. Nous verrons dans la suite comment manipuler ce script.

Image d’une valeur par une fonction :

Maintenant nous calculons les coordonnées d’un point appartenant à la courbe. Nous utilisons notre point “Move me” et notre fonction. Ce script Mcoord aura comme arguments ce point et le script Function (dans cet ordre) :

compute
   ^ (self arg1 point x) @ (self arg2 compute value: self arg1 point x)

L’abscisse de ses coordonnées est la même que celle du point de départ, son ordonnée est l’image de son abscisse par la fonction.

Noter :

Maintenant utilisons ce script Mcoord avec comme argument le point “Move me!” ; le résultat du script est de la forme 1.2@0.5, cela représente un couple de coordonnées.

Avec l’outil point fig7, Points → Coordonnées, créons un point ayant ses coordonnées contraintes par le résultat de ce script.

L’outil lieu d’un point fig14, Lignes → Lieu de point, donne ensuite la courbe en sélectionnant nos deux points.

Pente en un point de la courbe d’une fonction et tangente :

Pour ce faire, nous calculons une valeur approchée de la pente en un point de la courbe, avec celle-ci nous déduirons un deuxième point de la tangente.

p = ( f(x + 0.0001) - f(x) ) / 0.0001

Cela se traduit par un script Ncoord avec comment argument le point où calculer une approximation de la pente et le script Function :

compute
| p x f |
   f := self arg2 compute.
   x := self arg1 point x.
   p := ((f value: x + 0.0001) - (f value: x)) / 0.0001.
   ^ self arg1 point + (1 @ p)

Nous plaçons ensuite ce script dans la figure.

Noter :

Utilisons ce script avec comme arguments le point de notre courbe et notre script Function. Nous obtenons un deuxième couple de coordonnées. Avec celles-ci construisons un point, la tangente est la droite définie par ce point et celui de la courbe.

En déplaçant le point “Move me!”, la tangente est recalculée. Tout aussi intéressant : modifier le script Function actualise correctement l’ensemble de notre construction. Quelques exemples de modifications :

   ^ [:x | x * x / 10]

   ^ [:x | x cos + (10 * x) sin]

   ^ [:x | (x * 5) cos + x abs]

4.2 Élément de dissection d’un script

Quelques éléments d’explication sur la représentation d’un script :

4.3 Méthodes de référence pour les scripts Dr.Geo

Un argument passé à un script est toujours une référence vers une instance de classe de la hiérarchie DrGMathItem, elle est le modèle de base pour représenter tout objet d’une figure. Ainsi pour connaître les messages compris par un argument d’un script, il convient d’examiner la hiérarchie de DrGMathItem. Celle-ci comprend plus de 80 classes, mais du fait des héritages, seules quelques unes sont intéressantes pour les usages courants des scripts :

Pour explorer ces classes, ouvrir un espace de travail – Ctrl-k après un clic sur le fond de l’environnement – y saisir et sélectionner le nom de la classe puis ouvrir le navigateur de classe par Ctrl-b.

Les sections suivantes contiennent la description de quelques messages pouvant être utiles. Elles sont présentées par classe.

4.3.1 Item math

Cette section regroupe des méthodes de la classe DrGMathItem, classe mère de la hiérarchie des objets d’une figure.

Ces messages peuvent donc être envoyés à tous les types d’objets passés en argument à un script.

Method on DrGMathItem: <String> safeName

⇒ une chaîne de caractères représentant le nom de l’item

nom := point1 safeName
^nom asUppercase.
Method on DrGMathItem: <Boolean> exist

⇒ un booléen indiquant si l’item est dans un état permettant son existence

Du fait de la dimension dynamique d’une figure géométrique, un objet peut ne plus exister temporairement. C’est par exemple le cas pour le point d’intersection de deux segments, cette méthode permet alors de vérifier l’existence de l’intersection.

line exist ifTrue: [ position := line origin ]
Method on DrGMathItem: <Collection> parents

⇒ une collection d’items, parents de l’item

point1 := segment parents first
Method on DrGMathItem: move: unVecteur

unVecteur, instance de Point, vecteur de coordonnées (x,y) représentant le déplacement

Déplace un item dans une direction donnée, tout en tenant compte de ses contraintes.

circle move: 2@1
Method on DrGMathItem: <Point> closestPointTo: unPoint

⇒ coordonnées du point sur l’item le plus proche de unPoint unPoint, un couple de coordonnées

Cette méthode prend tout son sens sur des items de type ligne comme droite, cercle, arc, polygone, etc.

position := segment closestPointTo: 2@1

position := arc closestPointTo: 2@1

4.3.2 Point

Un item point – objet point defini dans une construction Dr.Geo – passé en argument à un script est un objet très complexe. Il peut être un point libre dans le plan, sur une ligne, une intersection, etc. Quelques méthodes spécifiques permettent d’exploiter ce type d’objet depuis les scripts.

Method on DrGPointItem: <Point> point

⇒ coordonnées de ce point

L’objet retourné est une instance de Point, son abscisse et ordonnée s’obtiennent par le message #x et #y respectivement.

abscissa := pointA point x
Method on DrGPointItem: point: aPoint

aPoint, couple de coordonnées

Modifie les coordonnées de l’item point tout en respectant ses contraintes propres. Pour un point libre, la nouvelle position sera exactement celle donnée en argument, pour un point contraint (sur ligne, intersection) cela sera sans effet.

pointA point: 5@2
Method on DrGPointOnCurveItem: <Float> abscissa

⇒ abscisse curviligne de ce point sur sa ligne, elle est normalisée sur [0 ; 1]

Cette méthode est réservée au point libre sur une ligne

a := mobile abscissa
Method on DrGPointOnCurveItem: abscissa: uneValeur

uneValeur, valeur décimale de [0 ; 1]

Modifie l’abscisse curviligne d’un point libre sur une ligne.

pointItem abscissa: 0.5
Method on DrGPointItem: moveAt: unPoint

unPoint, couple de coordonnées (x,y) où déplacer le point

Déplace le point à la position donnée en argument.

point moveAt: 2@1

4.3.3 Ligne droite ou courbe

Ces messages sont à envoyer aux objets de type ligne comme droite, cercle, polygone, etc.

Method on DrGCurveItem: <Float> abscissaOf: unPoint

⇒ une valeur de [0 ; 1], abscisse curviligne de unPoint sur la ligne

unPoint, un point (x,y)

a := curve abscissaOf: 2@1
Method on DrGCurveItem: <Point> pointAt: uneValeur

⇒ coordonnées du point de la ligne d’abscisse curviligne uneValeur

uneValeur, un nombre de [0 ; 1]

myPoint := curve pointAt: 0.5.
^ myPoint x
Method on DrGCurveItem: <Boolean> contains: unPoint

⇒ un booléen indiquant si unPoint est sur la ligne

unPoint, un point (x,y)

(curve contains: 0@1) ifTrue: [^ 'Yes!']

4.3.4 Droite, demi-droite, segment, vecteur

Ensemble de méthodes dédiées aux lignes droites.

Method on DrGDirectionItem: <Point> origin

⇒ un point origine de cette ligne

D’un point de vue interne les droites sont graduées avec une origine. Cela permet de positionnement de points sur celle-ci.

segment origin
Method on DrGDirectionItem: <Point> direction

⇒ un vecteur (x,y) indiquant la direction de la ligne

v := droite direction.
pente := v y / v x
Method on DrGDirectionItem: <Point> normal

⇒ un vecteur unitaire normal à la direction de la ligne

n := vecteur normal

4.3.5 Segment

Ensemble de méthodes dédiées aux segments.

Method on DrGSegmentItem: <Float> length

⇒ longueur du segment

segment := canvas segment: 0@0 to: 5@5.
l := segment length
Method on DrGSegmentItem: <Point> extremity1

⇒ coordonnées de l’extrémité 1 du segment

segment := canvas segment: 0@0 to: 5@5.
p := segment extremity1.
Method on DrGSegmentItem: <Point> extremity2

⇒ coordonnées de l’extrémité 2 du segment

segment := canvas segment: 0@0 to: 5@5.
p := segment extremity2
Method on DrGSegmentItem: <Point> middle

⇒ coordonnées du milieu du segment

segment := canvas segment: 0@0 to: 5@5.
m := segment middle

4.3.6 Cercle, arc de cercle, polygone

Ensemble de méthodes réservées aux cercle, arc et polygone.

Method on DrGCircleItem|DrGArcItem: <Point> center

⇒ point, centre du cercle ou de l’arc de cercle

c := arcAB center
Method on DrGCircleItem|DrGArcItem: <Float> radius

⇒ rayon du cercle ou de l’arc de cercle

rayon := monCercle radius
Method on DrGCircleItem|DrGArcItem|DrGPolygonItem: <Float> length

⇒ longueur du cercle, de l’arc de cercle ou du polygone

perimetre := triangle length

4.3.7 Valeur

Method on DrGValueItem: <Float> valueItem

⇒ valeur de cet item

n1 := item2 valueItem.
n2 := item2 valueItem.
n1 + n2.
Method on DrGValueItem: valueItem: uneValeur

uneValeur, valeur décimale

Modifie la valeur d’un item de type valeur libre.

item valueItem: 5.2.
Method on DrGValueItem: position: unPoint

unPoint, point (x,y)

Déplace dans la figure l’item à la position unPoint.

maValeur position: 0.5@2.

4.3.8 Angle

Method on DrGAngleItem: <Integer> degreeAngle

⇒ une mesure en degrés de cet angle orienté ou géométrique

angle1 := a1 degreeAngle.
Method on DrGAngleItem: <Float> radianAngle

⇒ une mesure en radian de cet angle orienté ou géométrique

angle1 := a1 radianAngle.

4.4 Modifier l’aspect d’un objet depuis un script

Un script, en plus de faire des calculs, peut modifier l’aspect d’un objet mathématique passé en argument, de lui même ou de tout autre objet d’une figure (i.e. canevas).

Précédemment, nous avons discuté des modèles d’objet géométrique, ils sont tous des instances de classe de la hiérarchie DrGMathItem ; leur représentant graphique à l’écran sont appelés costumes, instances de classe de la hiérarchie DrGMathItemCostume. Accéder au costume d’un modèle offre la possibilité d’éditer son aspect : couleurs, style de traits, etc. Quelques méthodes sont décrites dans la section suivante pour accéder aux costumes et aux styles. Le lecteur curieux explorera les hiérarchies des classes DrGMathItemCostume et DrGCostumeStyle pour en découvrir davantage.

Method on DrGeoUserScript: <DrGMathItemCostume> costume

⇒ costume du script lui-même. Il faut toujours tester l’existence du costume avant son utilisation (voir exemple)

compute
   self costume ifNotNil: 
      [self costume style color: Color blue].
Method on DrGeoUserScript: <DrGMathItemCostume> costume1

⇒ le costume du modèle passé en premier argument à ce script

paintBlue
   self costume1 style color: Color blue
Method on DrGeoUserScript: <DrGMathItem> arg1

⇒ le modèle passé en premier argument à ce script. Son type exact dépend des arguments avec lesquels l’instance du script a été créée.

isParallelogram
"Test my polygon argument is a parallelogram"
   | points mid1 mid2|
   points := self arg1 points.
   mid1 := points first + points third / 2.
   mid2 := points second + points fourth / 2.
   ^ points size = 4 and: [mid1 = mid2]

Des paires de méthodes pour les arguments suivants sont disponibles : costume2/arg2, costume3/arg3 et costume4/arg4.

Method on DrGeoUserScript: <DrGeo> app

⇒ l’instance Dr.Geo où ce script existe. Entre autres choses, donne accès aux costumes de la figure.

polygonCostumes
"Return the list of polygon costume in the canvas"
   ^ self app costumes select: [ :costume | 
      costume mathItem isPolygonItem].

Footnotes

(7)

http://pharobyexample.org

(8)

https://fr.wikipedia.org/wiki/Objet_de_premi\%C3\%A8re_classe

(9)

Les macro-constructions ont une approche géométrique tandis que les scripts ont une approche numérique mais aussi et surtout nous pouvons les utiliser dans un esprit de bidouillage (“hacking” en anglais).

(10)

En particulier, les fonctions mathématiques.

(11)

Une instance de n’importe quelle classe pour être précis car les types n’existent pas en Smalltalk

(12)

Pour découvrir le protocole de cette classe, écrire son nom dans un Workspace, le sélectionner à la souris puis presser les touches Ctrl-b, un navigateur de classes s’affiche alors sur cette classe, il permet de naviguer et d’étudier son code source.

(13)

Pour être précis, un script reçoit toujours par sa variable arguments les costumes des objets sur lesquels l’utilisateur a cliqué ; la méthode arg1 donne alors le modèle par un appel arguments first mathItem, tandis que la méthode costume1 se contente de faire arguments first.

(14)

Cette fonctionnalité est nativement présente dans Dr.Geo, il s’agit donc là d’un prétexte à un exercice.

(15)

Nom de message comprenant des “:

(16)

Il est important de le référencer dans la figure afin qu’il soit inclus dans la description de celle-ci lors d’une opération de sauvegarde sur fichier.


Next: , Previous: , Up: Top   [Contents][Index]