SmileLab Guide de programmation

Transcription

SmileLab Guide de programmation
SmileLab
Guide de programmation
Satimage-software
www.satimage-software.com
c 2004 Satimage (France)
Copyright 10 novembre 2004
Satimage - 1 avenue des prés - 94260 Fresnes - France
Tél.+33.1.46.15.92.92 – Fax +33.1.46.15.92.99
[email protected] - www.satimage-software.com
sarl satimage – société d’application du traitement d’image – rcs créteil b 383 200 573
2
Table des matières
1 Conventions
2 Un
2.1
2.2
2.3
2.4
7
environnement scriptable intégré
Le langage : AppleScript . . . . . . .
Les dictionnaires . . . . . . . . . . .
Les bibliothèques . . . . . . . . . . .
Lancer un script . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Calculs numériques, les bases
3.1 Les fonctions de calcul natives d’AppleScript . .
3.2 Calculer dans Smile . . . . . . . . . . . . . . . .
3.2.1 Les tableaux de réels (arrays of real)
3.2.2 Les matrices . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Réalisation d’un graphique
4.1 Programmer avec QuickPlotLib . . . . . . . . . . . . . . . .
4.1.1 Création du graphique . . . . . . . . . . . . . . . . .
4.1.2 Compléter le graphique . . . . . . . . . . . . . . . . .
4.1.3 Modification des données . . . . . . . . . . . . . . . .
4.1.4 Ajouter des éléments supplémentaires à un graphique
4.1.5 Choisir les dimensions du graphique . . . . . . . . . .
4.1.6 Mettre plusieurs graphiques dans une fenêtre . . . . .
4.1.7 Personnalisation du graphique . . . . . . . . . . . . .
4.2 Programmer directement SmileLab . . . . . . . . . . . . . .
4.3 Le SmileLab Sample Center . . . . . . . . . . . . . . . . . .
.
.
.
.
9
9
9
11
11
.
.
.
.
13
13
14
14
17
.
.
.
.
.
.
.
.
.
.
19
20
20
21
23
23
23
24
25
26
27
5 Manipulations de la fenêtre graphique
29
5.1 Modification des réglages : la fenêtre d’Infos . . . . . . . . . . 29
3
4
5.2
5.3
5.4
5.5
5.6
6 La
6.1
6.2
6.3
6.4
Utilisation de la souris en lecture des données . . . . .
Zoom avant et zoom arrière . . . . . . . . . . . . . . .
Changement de l’angle de vue d’une surface . . . . . .
Changement de l’éclairage d’une surface . . . . . . . .
Déplacement et modification de la taille des graphiques
réalisation de documents avec Smile
Les “bundles” Smile . . . . . . . . . . . . . . .
Réalisation d’un document PDF . . . . . . . . .
Réalisation de fichiers JPEG, PNG, TIFF, BMP
Réalisation d’une séquence QuickTime (movie) .
7 Importation et exportation de données
7.1 Les fichiers ASCII . . . . . . . . . . . .
7.2 Les fichiers binaires . . . . . . . . . . .
7.3 Les fichiers HDF . . . . . . . . . . . .
7.4 Fichiers graphiques . . . . . . . . . . .
7.4.1 Importation de données à partir
7.4.2 Importation de données à partir
.
.
.
.
.
. . . . .
. . . . .
et PSD
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
d’une image bitmap
d’une séquence vidéo
.
.
.
.
.
30
30
31
31
31
.
.
.
.
35
35
36
36
37
.
.
.
.
.
.
39
39
43
45
46
46
47
8 Pilotage de codes avec Smile
49
8.1 Les chemins d’accès aux fichiers . . . . . . . . . . . . . . . . . 49
8.2 Lancement d’un executable UNIX . . . . . . . . . . . . . . . . 50
8.3 Attente de la fin de l’exécution d’un executable UNIX . . . . . 50
9 Rendre son programme scriptable
53
10 Réalisation d’une interface utilisateur
10.1 Personnalisation du menu utilisateur . . . . . . . . . . .
10.2 Réalisation de dialogues personnalisés . . . . . . . . . . .
10.3 Personnalisation de l’interface utilisateur d’un graphique
10.3.1 Comment associer un script à un objet graphique
10.3.2 Personnalisation du menu contextuel . . . . . . .
10.3.3 Gestion des touches du clavier . . . . . . . . . . .
10.3.4 Gestion des clics souris . . . . . . . . . . . . . . .
57
57
58
58
58
59
60
62
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Avant de commencer
65
A.1 Objet du Chapitre . . . . . . . . . . . . . . . . . . . . . . . . 65
A.2 Ce qu’il faut savoir d’AppleScript . . . . . . . . . . . . . . . . 65
Guide de programmation
5
A.3 Ce qu’il y a à savoir concernant Smile . . . . . . . . . . . . . . 71
6
Chapitre 1
Conventions
Conventions typographiques
Ce document utilise les conventions suivantes :
– pour les chemins d’accès de fichiers, on utilise la convention UNIX :
les répertoires sont séparés les uns des autres par la barre de fraction
(“slash”) /, et non pas par les deux-points : comme dans AppleScript.
Exemple :
Recopiez les bibliothèques dans le répertoire Class Scripts/Context
additions/.
– les noms de fichiers et de dossiers ainsi que les chemins d’accès sont en
italique.
Exemple :
Library/Application Support/Smile/
– les menus, les noms des fenêtres, les noms de boutons, utilisent une
police sans empattement.
Exemple :
Dans la fenêtre Contrôle Bombe H, cliquez sur Lancement.
– les exemples de scripts utilisent une police de machine à écrire.
Exemple :
tell application "Finder" to get name of window 1
– les touches de clavier sont imprimées en lettres penchées.
Exemple :
Press cmd-shift-C
– dans Acrobat Reader (ou Adobe Reader) les liens hypertexte appa7
8
raissent en mauve.
Exemple :
Voir le chapitre 1.
– dans Acrobat Reader (ou Adobe Reader) les liens URL apparaissent
en bleu foncé.
Exemple :
Visitez la page d’accueil d’AppleScript.
Vous trouverez des liens hypertexte dans ce document. Il est possible qu’ils
ne fonctionnent que depuis Acrobat ou Acrobat Reader (ou Adobe Reader).
Conventions concernant les menus
Les commandes menus sont données au moyen d’une suite hiérarchique
en utilisant >.
Exemple :
choisissez File > Open dictionary. . . > Other. . . dans le menu.
Dans Smile, un des éléments de la barre de menu est constitué d’une icône
de parchemin (entre le menu Script et le menu Fenêtre). Ce menu (fig.1.1)
s’appelle le menu des Scripts utilisateurs menu. L’utilisateur peut y installer
ses scripts personnels.
Fig. 1.1 – La barre des menus de contient un menu “Scripts utilisateur”.
Conventions concernant les touches
Pour désigner une des touches spéciales, nous utilisons la terminologie de
Apple :
– cmd désigne la touche portant un trèfle à 4 lobes
– option désigne la touche avec un signe bizarre ressemblant à une pédale.
Chapitre 2
Smile, l’environnement
scriptable intégré pour
scientifiques
2.1
Le langage : AppleScript
Smile est un environnement dans lequel vous n’utilisez qu’un seul et même
langage, AppleScript, pour effectuer toutes sortes d’opérations. AppleScript
est le langage inter-application de la plate-forme Apple. Proche de l’Anglais
mais puissant et abstrait, son utilisation est à la fois simple et naturelle.
Ainsi avec AppleScript vous pourrez utiliser les fonctions de visualisation de
données, les fonctions de la bibliothèque graphique, vous pourrez programmer
vos interfaces utilisateur personnalisées, ou encore exécuter des exécutables
UNIX.
SmileLab est une composante de Smile, la plate-forme d’automatisation 100%
AppleScript. Smile donne un cadre dans lequel il est commode de scripter et
d’automatiser n’importe quelle tâche, du post-traitement de données et de
la manipulation de fichiers jusqu’à la personnalisation des graphiques, à la
mise en ligne de fichiers ou à l’intégration de figures dans un article.
2.2
Les dictionnaires
Lors de l’écriture d’un script, vous emploierez des termes appartenant
à AppleScript lui-même, et vous utiliserez des termes spécifiques pour vous
9
10
adresser à tel ou tel composante de la machine.
Par exemple dans le script ci-dessous tell application et set font partie
de la terminologie de base d’AppleScript – tell application permet de
s’adresser à une application donnée, set permet d’assigner une valeur – alors
que le terme selection est propre au Finder.
Exemple 1
tell application "Finder" to set theList to selection
Le dictionnaire d’une application, qu’on peut consulter depuis tous les
éditeurs de script, en particulier depuis Smile, est le document qui présente
la terminologie AppleScript propre à l’application en question.
Voici les principaux dictionnaires que vous serez amené à utiliser, comment
les ouvrir, et en résumé ce qu’ils contiennent.
– le dictionnaire de Smile : sélectionnez Smile > Dictionnaire de Smile.
Le dictionnaire de Smile contient notamment la SmileLab Suite, qui
décrit les objets impliqués dans la visualisation de données, ainsi que
plusieurs autres “Suites”.
– le dictionnaire de l’osax Satimage : sélectionnez Fichier > Ouvrir un
dictionnaire > Scripting additions > Satimage.osax.
L’osax Satimage fait partie de l’installation de Smile.
Le dictionnaire de l’osax Satimage contient la bibliothèque
mathématique sur les nombres et les tableaux de nombres, ainsi que
des commandes de haut niveau pour lire et écrire les fichiers de données
numériques ASCII et binaires.
– le dictionnaire de l’osax Standard additions : sélectionnez Fichier >
Ouvrir un dictionnaire > Scripting additions > StandardAdditions.osax.
L’osax StandardAdditions fait partie de l’installation standard de
MacOS X.
Le dictionnaire de l’osax StandardAdditions contient des commandes
pour lire et écrire les fichiers ASCII ainsi que plusieurs autres fonctions
utilitaires.
Pour consulter le dictionnaire auquel appartient un terme donné, sélectionnez
le terme en question puis tapez la combinaison de touches cmd-shift-F (ou
bien sélectionnez dans le menu Script > Trouver la définition).
Guide de programmation
2.3
11
Les bibliothèques
Une bibliothèque AppleScript est simplement un script ordinaire mais qui
ne contient que des procédures (il ne contient ni lignes exécutables directement ni une procédure run), procédure que vos scripts peuvent exploiter.
Smile inclut plusieurs bibliothèques AppleScript.
Les bibliothèques de Smile que vous utiliserez principalement sont
QuickPlotLib, une famille de procédures de haut-niveau qui permettent de
visualiser des données en quelques instructions, et Graphic Kernel, la bibliothèque graphique PDF de Smile, qui vous permet de personnaliser un
graphique à volonté.
La documentation abrégée de ces bibliothèques est fournie dans le menu
Aide.
Pour afficher la définition d’une procédure qui appartient à l’une des
bibliothèques, sélectionnez son nom puis tapez le raccourci cmd-shift-F (ou
bien sélectionnez Script > Trouver la définition).
2.4
Lancer un script
Exploiter SmileLab consiste à piloter Smile au moyen du langage AppleScript. Vous devez donc connaı̂tre AppleScript et Smile. L’Annexe A présente
l’information minimale nécessaire et indique où trouver l’information de
référence sur AppleScript et sur Smile.
Suivez les instructions suivantes pour lancer un script depuis Smile.
– faites une nouvelle fenêtre de texte en sélectionnant Fichier > Nouveau
texte. Les fenêtres de texte sont blanches, si votre fenêtre a un fond
coloré c’est une fenêtre de script compilé.
– tapez (ou recopiez) votre script dans la nouvelle fenêtre. Vous pouvez
utiliser pour commencer les exemples qui sont fournis dans le SmileLab
Sample Center. Celui-ci se trouve dans le menu Aide.
– à présent vous pouvez exécuter votre script, soit ligne à ligne, soit en
bloc.
Pour exécuter une ligne donnée positionnez le point d’insertion dans
la ligne (cliquez une fois n’importe où dans la ligne) puis tapez Enter
(non pas Retour chariot). Il n’est pas nécessaire de sélectionner la ligne.
Quand vous lancez l’exécution le résultat (s’il y en a un) s’affiche dans
une fenêtre spéciale, la Console, ce qui permet de débugger pas à pas.
12
Pour exécuter un bloc d’un coup, sélectionnez-le tout entier puis tapez
Enter.
Chapitre 3
Les bases du calcul numérique
dans Smile
Dans Smile, vous pouvez utiliser les fonctions de calcul fournies de base
par AppleScript. Cependant, Smile possède ses propres fonctions de calcul,
qui constituent un cadre robuste et puissant pour effectuer des calculs intensifs.
3.1
Les fonctions de calcul natives d’AppleScript
Le langage AppleScript définit plusieurs types de données (qu’on appelle
classes). Les classes numériques sont notamment :
– string : une chaı̂ne de caractères (de taille illimitée)
– real : un réel double-précision dans la gamme ± 10308
– integer : un entier dans la gamme ± (229 − 1)
– number : un integer ou un real
– list : une liste de valeurs de n’importe lesquels de ces types (y compris
list lui-même).
Exemple 2
set myList to {myString, "string", pi/4, 2003}
Les fonctions de base vous permettent de traiter des tableaux de nombres
en utilisant des boucles de programme repeat. Par exemple ci-dessous on
calcule un pas de l’évolution cinématique d’un point dans l’espace.
13
14
Exemple 3
set x to {1.0, 1.2, 1.4}
set v to {10.0, 12.0, 0.0}
set dt to 0.01
repeat with i from 1 to 3
set item i of x to (item i of x) + dt * (item i of
v)
end repeat
x
-- {1.1, 1.32, 1.4}
La structure de liste d’AppleScript (list) est pratique, et nous recommandons de l’utiliser pour stocker de petites quantités de données (pas plus de
quelques centaines). Néanmoins elle n’a pas été conçue pour gérer des volumes
arbitrairement grands de données ni pour effectuer des calculs optimisés sur
les réels. Pour calculer sur de gros volumes de données, vous devez utiliser la
structure exploitée en interne par Smile, et qui est présentée ci-dessous : les
arrays of real (signifie “tableau de réels”).
3.2
Calculer dans Smile
Le lecteur trouvera ci-dessous un rapide résumé des fonctions de calcul de
Smile. Pour la documentation complète vous devez vous référer au document
SmileLab -- Manuel de référence.
3.2.1
Les tableaux de réels (arrays of real)
Si vous manipulez plus que quelques centaines de données, vous devez
utilisez la structure que Smile exploite en interne à la place de la list de
nombres.
Smile stocke les tableaux de réels sous la forme de arrays of real. Un
array of real est logiquement équivalent à une list de réels comme {1.0,
3.14}. La plupart des commandes acceptent indifféremment une list de
réels comme ci-dessus ou un array of real. De plus, le mot-clé as permet
de traduire les données de chacun des deux types dans l’autre.
– pour créer un array of real à partir d’une list AppleScript ordinaire
de nombres réels, utilisez l’opérateur de coercion as.
Guide de programmation
–
–
–
–
1
15
Exemple 4
set a1 to {0, pi} as array of real
-- data Lido4E6F742061207265636F7264202020200000000040490FDB pour créer un array of real avec des valeurs espacées régulièrement,
utilisez createarray.
Exemple 5
set a to createarray 41 range {-10, 10}
-- a = toutes les valeurs de -10 à 10 par pas de 0.5
array of real est une classe (class) opaque. Pour lire les nombres
il est nécessaire de passer par la list AppleScript ordinaire. Pour
transformer un array of real en une list AppleScript ordinaire de
nombres, utilisez as avec le type list of real (c’est un type virtuel :
vous ne le rencontrerez qu’à cette occasion).
Exemple 6
set x1 to a1 as list of real
-- {0.0, 3.141592741013}
Pour visualiser un array of real en un instant, utilisez les fonctions
QuickCurve ou QuickScatter1 comme ci-dessous (fig.3.1).
Exemples 7
set b1 to {0.0, 3.141592741013, 1.570796370506}
QuickCurve(0, b1, 0)
-set r to randomarray 50
QuickScatter(0, r, 0)
les coercions as array of real et as list of real fonctionnent également
sur les listes de listes et les listes d’arrays of real, respectivement.
Exemple 8
set {x1, x2} to {a1, a2} as list of real
-- {{0.0, 3.141592741013}, {3.141592741013, 0.0}}
AppleScript ne peut pas afficher de valeurs NAN (“not a number”, par
exemple 1/0). Lors de la coercion d’un array of real en list de réels
les valeurs NAN sont traduites par la constante AppleScript missing
value.
Exemple 9
QuickCurve et QuickScatter appartiennent à la bibliothèque QuickPlotLib.
QuickPlotLib est documenté dans la Section 4.1. Vous pouvez consulter la documentation rapide de QuickPlotLib au moyen du menu Aide.
16
3.0
0.8
2.0
0.6
0.4
1.0
0.2
0
0
0.5
1.0
1.5
2.0
0
10.0
20.0
30.0
40.0
Fig. 3.1 – QuickPlotLib permet de visualiser graphiquement un tableau de
nombres en une seule instruction.
(asin a1) as list of real
-- {0.0, missing value}
– l’opérateur count fonctionner sur les arrays of real de la même
façon que sur les listes AppleScript ordinaires.
Exemple 10
count a1
-- 2
– les fonctions mathématiques de base fournies dans Satimage.osax fonctionnent aussi bien sur les nombres que sur les listes de réels et que sur
les arrays of real.
Exemple 11
set c1 to cos b1
c1 as list of real
-- {1.0, -1.0, -4.37113882867379E-8}
– pour afficher les valeurs dans la Console utilisez la routine quietmsg2
(qui affiche dans la Console) et le verbe display (qui transforme une
variable en chaı̂ne de caractères).
Exemple 12
2
quietmsg est une des routines générales disponibles dans Smile. Pour consulter l’aide
rapide sur les routines de Smile, sélectionnez quietmsg puis utilisez le menu contextuel.
Guide de programmation
17
quietmsg(display a1 as list of real)
3.2.2
Les matrices
Smile définit, à partir du type array of real, un type adapté au calcul sur les tableaux bi-dimensionnel : le type matrix3 . Une matrix n’est
qu’une structure — un record AppleScript — qui, outre les données sous
forme d’array of real4 (champ array of real), contient deux entiers qui
définissent un nombre de lignes (nrows) et un nombre de colonnes (ncols).
Une structure de type matrix contient donc un ensemble paramétrique
bi-dimensionnel de scalaires. Par exemple vous décrirez une surface à deux
paramètres dans l’espace à trois dimensions au moyen de trois matrix
(x(u, v), y(u, v), z(u, v)).
Exemple 13
set x to {0, 1, 2, 2, 1, 0}
set m to {class :matrix, ncols :3, nrows :2, array of real :x}
A chaque fois que c’est nécessaire, Smile considérera m comme un tableau à
deux dimensions, par exemple ici :
0
1
2
2
1
0
Le champ array of real du type matrix range le tableau bidimensionnel en commençant par la première ligne.
Pour visualiser une matrix en quelques instants utilisez QuickBitMap ou
QuickScalarMap5 .
Exemple 14
QuickBitMap(m, 0)
3
La classe matrix appartient à Satimage.osax.
Il est préférable de passer les données d’une matrix sous forme d’un array of real.
Cependant la matrix supporte également la liste AppleScript ordinaire de réels, ce qui
peut s’avérer plus commode pour les mises au point.
5
QuickBitMap et QuickScalarMap appartiennent à la bibliothèque QuickPlotLib.
QuickPlotLib est documenté dans la Section 4.1. Vous pouvez consulter la documentation rapide de QuickPlotLib au moyen du menu Aide.
4
18
2.0
2.0
1.5
1.5
1.0
1.0
0.5
0.5
0
0
0
0.5
1.0
1.5
2.0
2.5
3.0
Fig. 3.2 – La carte en couleurs d’une petite matrice (3 x 2).
Pour convertir une matrix en texte tabulé, utilisez la commande display.
Exemple 15
set x to {0, 1, 2, 2, 1, 0}
set m to {class :matrix, ncols :3, nrows :2, array of real :x}
quietmsg(display m)
-- Résultat :
0.0
1.0
2.0
2.0
1.0
0.0
Chapitre 4
Réalisation d’un graphique
Smile est un moteur logiciel qui exploite des objets scriptables et qu’on
contrôle par l’intermédiaire de scripts. Vos scripts créent — et éventuellement
suppriment — des objets, et ils les manipulent en fonction de vos besoins.
Par conséquent pour réaliser des graphiques il faut connaı̂tre les objets de
Smile qui sont dédiés à la visualisation de données : ces objets vont vous être
présentés dans ce chapitre. Ce chapitre offre un certain nombre d’exemples
dont la plupart peuvent être exécutés tels quels. Chaque ligne est une instruction AppleScript. Pour commencer, exécutez ces instructions depuis une
fenêtre de texte (une text window). Dans les chapitres suivants vous verrez
comment affecter ces instructions à une commande de menu ou, par exemple,
à un bouton dans une fenêtre de dialogue.
Le dictionnaire de Smile (Smile > Dictionnaire de Smile) contient la liste
exhaustive des classes d’objets de Smile et leur description.
La fenêtre graphique (graphic window) Smile possède plusieurs sortes
de fenêtres, par exemple les fenêtres d’éditeur de texte ou les fenêtres de
script. Les fonctions graphiques de Smile sont implémentées dans un type
spécifique de fenêtre, la fenêtre graphique ou graphic window. Une fenêtre
graphique peut être enregistrée au format PDF, le PDF prenant comme
dimensions les dimensions du rectangle blanc (par opposition au fond gris).
Les vues graphiques (graphic views) Une fenêtre graphique sont capables d’héberger des objets destinés à afficher des graphiques, les vues graphiques, ou “vues”, ou graphic views suivant la terminologie du dictionnaire. La classe graphic view est une classe virtuelle, à savoir que vous
19
20
ne créerez que des objets appartenant à une classe descendant de graphic
view. Vous trouverez dans le dictionnaire les différentes classes descendant
de graphic view, et à quel type de graphique chacune est destinée.
– plot view : permet d’afficher des courbes, (curves)
– planar view : permet d’afficher des courbes de niveaux (contour
maps), des champs vectoriels (vector plots), des cartes bitmap
(bitmaps) et des champs scalaires en couleurs (scalar maps)
– view3D : permet d’afficher des surfaces ainsi que des objets 3D de
synthèse, les GLobjects et les GLUTobjects.
Une graphic window peut contenir un nombre arbitraire de graphic views.
Smile est livré avec une bibliothèque de fonctions de haut niveau (la bibliothèque QuickPlotLib) qui permet de réaliser un graphique moyennant
très peu d’instructions. QuickPlotLib répond à la préoccupation suivante :
vous permettre de visualiser vos données dans le temps le plus court possible.
Dans un graphique, le menu contextuel propose d’ouvrir un dialogue de
réglage qui permet de modifier pratiquement tous les paramètres du graphique (voir le Chapitre 5).
La suite de ce chapitre explique comment manipuler les objets de SmileLab
par script et comment les personnaliser.
4.1
4.1.1
Programmer avec QuickPlotLib
Création du graphique
QuickPlotLib fournit des fonctions de haut niveau pour réaliser rapidement un graphique.
Par exemple QuickCurve(x, y, anObject) permet de tracer une courbe,
où x et y sont deux arrays of real ou deux listes de réels de même taille.
L’exemple ci-dessous crée la courbe de la fig.4.3.
Exemple 16
set y to runningsum (randomarray 500 range {-1, 1})
set c to QuickCurve(0, y, 0)
Dans l’exemple ci-dessus, on a passé 0 à la place de la liste des abscisses :
QuickCurve prend alors automatiquement pour abscisses la liste des premiers entiers.
Le dernier paramètre de QuickCurve est une référence à un objet.
QuickPlotLib utilise cette référence comme indication pour déterminer où
21
Guide de programmation
0
-5.0
-10.0
-15.0
0
100.0
200.0
300.0
400.0
500.0
Fig. 4.1 – Un tirage d’une marche aléatoire de 500 pas.
dessiner les données. Si cette référence est invalide (comme par exemple ici
0), QuickCurve crée le graphique dans une nouvelle fenêtre. Si on passe une
chaı̂ne de caractères au lieu d’une référence, QuickCurve utilise cette chaı̂ne
comme titre de la nouvelle fenêtre.
QuickCurve renvoie une référence à la courbe créée, ce qui permet à votre
script de s’adresser à cet objet (et aux objets qui le contiennent), par
exemple pour les personnaliser.
Autre exemple de fonction de la bibliothèque QuickPlotLib : QuickScalarMap(x,
y, z, anObject) réalise une image en fausses couleurs du champ scalaire
stocké dans z (fig.4.2). z peut être soit une matrix soit une expression des
variables x et y (sous forme d’une chaı̂ne de caractères).
Exemple 17
set s to "exp(-((x*x)^0.3)-y*y)"
set sm to QuickScalarMap({-1, 1}, {-1, 1}, s, 0)
4.1.2
Compléter le graphique
QuickPlotLib réalise des graphiques aussi simples que possible. On peut
ensuite, en utilisant la référence à l’objet créé, le modifier à volonté par script.
Exemple 18
22
1.0
0.8
0.5
0.6
0
0.4
-0.5
0.2
-1.0
-1.0
-0.5
0
0.5
1.0
Fig. 4.2 – QuickScalarMap permet de créer la carte en couleurs de f (x, y).
set y to runningsum (randomarray 500 range {-1, 1})
set c to QuickCurve(0, y, "Random walk")
set v to container of c -- le plot view
set xlabel of v to "t (seconds)"
set ylabel of v to "x (m)"
draw window of c
12.0
10.0
x (m)
8.0
6.0
4.0
2.0
0
0
100.0
200.0
300.0
t (seconds)
400.0
500.0
Fig. 4.3 – Un tirage d’une marche aléatoire de 500 pas.
Guide de programmation
4.1.3
23
Modification des données
QuickPlotLib permet de charger de nouvelles données dans un objet graphique une fois celui-ci créé. Il suffit pour cela de rappeler la même routine en
lui passant la référence à l’objet en question en dernier paramètre. L’exemple
ci-dessous modifie les données de la courbe c créée dans l’exemple 20.
Exemple 19
set y2 to runningsum (randomarray 500 range {-1, 1})
QuickCurve(0, y2, c)
4.1.4
Ajouter des éléments supplémentaires à un graphique
En utilisant toujours la même routine de QuickPlotLib on peut créer
un nouvel objet dans le même graphique que le précédent. Il suffit pour
cela de rappeler la même routine en lui passant la référence à la graphic
view contenant l’objet en question. L’exemple ci-dessous ajoute une seconde
courbe au graphique créé dans l’exemple 20.
Exemple 20
set v to container of c -- le plot view
set y3 to runningsum (randomarray 500 range {-1, 1})
set c2 to QuickCurve(0, y3, v)
Cette technique fonctionne aussi avec les planar views. Dans l’exemple 21,
on superpose un réseau de 15 courbes de niveau à la carte en couleur de
l’exemple 17.
Exemple 21
set s to "exp(-((x*x)^0.3)-y*y)"
set sm to QuickScalarMap({-1, 1}, {-1, 1}, s, 0)
set v to container of sm -- le planar view
QuickContourMap({-1, 1}, {-1, 1}, s, 15, v)
4.1.5
Choisir les dimensions du graphique
Une fois un graphique créé, on peut le redimensionner en redimensionnant
sa fenêtre avec la touche cmd enfoncée.
Pour créer automatiquement un graphique aux bonnes dimensions, il suffit
de créer explicitement la fenêtre graphique puis d’en passer la référence à
24
1.0
0.8
0.5
0.6
0
0.4
-0.5
0.2
-1.0
-1.0
-0.5
0
0.5
1.0
Fig. 4.4 – 15 courbes de niveaux superposées à l’image du champ scalaire
f (x, y).
QuickPlotLib.
Exemple 22
set w to make new graphic window with properties {pagewidth :4
as inches, pageheight :3 as inches}
set c to QuickCurve(0, "x^2", w)
4.1.6
Mettre plusieurs graphiques dans une fenêtre
On peut mettre plusieurs graphiques dans une même fenêtre. Pour cela il
faut préparer la fenêtre graphique au moyen de sa propriété grid. C’est une
liste de deux entiers {i, j} qui partage la page en i×j cases (j lignes de i
cases). L’exemple ci-dessous regroupe les exemples précédents sur une page
unique.
Exemple 23
set w to make new graphic window with properties {pagewidth :5
as inches,
pageheight :3 as inches, grid :{2, 1}}
set y to runningsum (randomarray 500 range {-1, 1})
set c to QuickCurve(0, y, w)
...
set s to "exp(-((x*x)^0.3)-y*y)"
25
Guide de programmation
set sm to QuickScalarMap({-1, 1}, {-1, 1}, s, w)
...
1.0
0
0.8
x (m)
0.5
-5.0
0.6
0
-10.0
0.4
-0.5
0.2
0
100.0 200.0
300.0 400.0 500.0
t (seconds)
-1.0
-1.0 -0.5
0
0.5
1.0
Fig. 4.5 – Un plot view et un planar view dans une même page.
4.1.7
Personnalisation du graphique
Le Chapitre 5 indique comment personnaliser le graphique au moyen du
clavier et de la souris.
Le dictionnaire de la SmileLab Suite publie toutes les propriétés des objets
graphiques. Il est donc possible d’effectuer toutes les personnalisations par
script.
Exemple 24
set c to QuickCurve(0, "x^2", 0)
set c’s name to "x^2"
set c’s dash to 3
set c’s pen color to 1, 0, 0
Il est également possible de modifier le paramétrage par défaut des graphiques. Ce paramétrage (template) est défini dans des fichiers .plist (“Property list”). Par défaut Smile utilise le fichier GraphicWindow.plist situé dans
le dossier :
Smile.app/Contents/Resources/More stuff/SmileLabTemplates
Vous pouvez modifier les fichiers de template et en faire de nouveaux.
Pour changer le template par défaut, utilisez SetQPLDefaultTemplate. L’exemple
ci-dessous sélectionne le fichier des réglages destiné à l’impression en niveaux
de gris.
Exemple 25
SetQPLDefaultTemplate("GrayGraphicWindow.plist")
26
Quand on spécifie un nom de fichier à SetQPLDefaultTemplate, Smile
recherche en premier dans le domaine utilisateur :
/Users/<login>/Library/Application Support/Smile/More
stuff/SmileLabTemplates/
puis
dans
le
dossier
More
stuff/SmileLabTemplates de l’application Smile. Nous conseillons d’utiliser
le domaine utilisateur pour stocker vos fichiers template personnels. Ceci
évite de perturber les autres utilisateurs et de perdre ses fichiers lors d’une
mise à jour.
4.2
Programmer directement SmileLab
QuickPlotLib vous permet de réaliser des graphiques en quelques instructions. Comme toute bibliothèque d’appels de haut niveau, QuickPlotLib peut
entraı̂ner certains inconvénients comme des rafraı̂chissements trop fréquents
ou une gestion non optimale de la mémoire.
Pour plus d’information vous pouvez consulter QuickPlotLib qui se trouve
dans le dossier suivant :
Smile.app/Contents/Resources/Class scripts/Context additions
Vous pouvez donc préférer recourir à une programmation directe des objets SmileLab. Par exemple vous pouvez remplacer QuickPlotLib(x, y, 0)
par :
set w to make new graphic window
set v to make new plot view at w
set c to make new curve at v
set properties of c to {xdata :x, ydata :y}
Programmer les objets de SmileLab consiste simplement à appliquer
AppleScript au dictionnaire de SmileLab. Rappelons la syntaxe des principales instructions.
– pour créer un nouvel objet, utilisez make new :
Exemple 26
set w to make new graphic window
– pour créer un nouvel objet en tant qu’élément d’un autre objet, utilisez
make new ... at :
Exemple 27
set v to make new plot view at w
Guide de programmation
27
– pour référer à un objet, spécifiez soit son index soit son nom (name) et
son conteneur à l’aide de la préposition of. Inversement vous pouvez
utiliser la propriété container :
Exemples 28
set v to plot view 1 of w
set w to container of v
– pour assigner une nouvelle valeur à une propriété d’un objet, utilisez
le verbe set :
Exemple 29
set formula of c to "x^3"
– pour assigner de nouvelles valeurs à plusieurs propriétés en une instruction, utilisez la propriété spéciale properties :
Exemple 30
set properties of c to {xdata :x, ydata :y, pen color :2}
– pour assigner des valeurs à des propriétés d’un objet à la création,
utilisez le paramètre optionnel with properties du verbe make new :
Exemple 31
set w to make new graphic window with properties {template :
"GreyGraphicWindow.plist"}
– pour lire la valeur d’une propriété d’un objet ou pour obtenir la référence
d’un élément d’un objet, utilisez le verbe get1 :
Exemple 32
set d to (get dash of (get curve 3 of v))
– pour détruire un objet, utilisez delete2 :
Exemple 33
delete v
4.3
Le SmileLab Sample Center
SmileLab est livré avec une série d’exemples destinés à être utilisés pour
démarrer un script ou pour illustrer une fonctionnalité particulière.
1
Le verbe get est parfois optionnel.
Pour fermer une fenêtre comme en cliquant dans la case de fermeture, utilisez close.
Attention, le paramètre saving (voir le dictionnaire) n’est pas optionnel.
2
28
Pour naviguer dans les exemples fournis, sélectionnez Aide > SmileLab
Sample Center.
Pour tester un exemple, ouvrez son script, créez une nouvelle fenêtre de
texte (Fichier > Nouveau texte) puis recopiez le script dans la fenêtre de
texte. De la sorte vous pourrez exécuter le script ligne par ligne : positionnez
le curseur sur la première ligne, puis appuyez sur Enter (pas sur Retour
chariot). Le curseur saute à la ligne suivante, tandis que la Console affiche le
résultat. Pressez à nouveau la touche Enter pour exécuter la deuxième ligne
et ainsi de suite. Si vous voulez exécuter le script d’un coup sélectionnez-le en
entier puis pressez la touche Enter. Grâce à l’interprétation des commandes
AppleScript dans les fenêtres de texte, il est facile de tester immédiatement
l’effet d’une nouvelle ligne de script ou d’une modification.
Chapitre 5
Manipulations de la fenêtre
graphique à l’aide de la souris
5.1
Modification des réglages : la fenêtre
d’Infos
La fenêtre d’Infos est une fenêtre de dialogue qui vous permet de lire et
modifier l’essentiel des propriétés des graphic views (plot views, planar
views et view3D).
Fig. 5.1 – La fenêtre d’Infos pour les planar views.
29
30
La fenêtre d’Infos donne également accès aux réglages des objets contenus
dans la graphic view, par exemple les courbes (curves) du plot view. Elle
permet également de supprimer ces objets.
Pour ouvrir la fenêtre d’Infos d’une graphic view déroulez son menu
contextuel (par un ctrl-clic sur l’objet) puis sélectionnez Lire les informations.
Vous pouvez également utiliser le double-clic “en-dehors des données”, par
exemple sur un axe ou sur l’échelle des couleurs.
5.2
Utilisation de la souris en lecture des
données
Lorsque vous cliquez à l’intérieur d’une graphic view, la barre d’outils
(le bandeau sous la barre de titre)1 affiche les coordonnées de la souris en
unités utilisateur (les unités des axes) : x, y, dy/dx dans les plot view, x, y, f
dans les planar view (dans le cas où le planar view affiche un champ scalaire, et uniquement si x, y ne sont pas donnés sous forme de matrices), x, y, z
quand on clique une surface dans une view3D.
Si vous cliquez dans la fenêtre graphique mais en-dehors de toute graphic
view (par exemple, près des bords de la fenêtre) la barre d’outils affiche les
coordonnées en pixels2 et en utilisant le système de coordonnées de la fenêtre
graphique. Fonction à utiliser pour mettre au point les dimensions des objets.
5.3
Zoom avant et zoom arrière
Pour effectuer un zoom avant utilisez la touche cmd. Si vous maintenez
la touche cmd enfoncée à l’intérieur de la zone de tracé (le rectangle donnée
par plot frame) dans une vue de type plot view ou planar view tout
en faisant glisser la souris bouton enfoncé, vous obtenez un rectangle en
“pointillés progressifs”. Quand vous relâchez alors le bouton de la souris, le
graphique effectuera un zoom sur le rectangle ainsi défini.
Pour revenir à l’échelle originale du graphique, faites un double-clic avec la
touche cmd enfoncée.
1
Si la barre d’outils ne s’ouvre pas, utilisez le bouton situé à droite de la barre de titre
de la fenêtre.
2
1 pixel = 1/72 inch.
Guide de programmation
31
Il n’est pas possible dans la version actuelle de zoomer de cette façon dans
une view3D.
5.4
Changement de l’angle de vue d’une surface
Pour faire tourner une view3D, faites glisser la souris bouton enfoncée en
tenant la touche cmd appuyée. Ceci fait apparemment tourner la view3D :
en réalité la surface ne change pas, c’est la position de l’observateur eye
position qui est modifiée.
5.5
Changement de l’éclairage d’une surface
Pour déplacer la lumière dans une view3D sélectionnez Réglage de
l’éclairage dans son menu contextuel. Ce menu ouvre le dialogue de réglage
de l’éclairage dans lequel vous pouvez modifier l’orientation de la source de
lumière.
5.6
Déplacement et modification de la taille
des graphiques
La fenêtre graphique a un mode spécial, le “mode édition”, qu’on peut
activer et désactiver au moyen du menu Edition > Mode édition. Lorsque la
fenêtre graphique est en mode édition, on peut déplacer les graphic views
et modifier leurs dimensions. Cependant la plupart du temps il vaut mieux
procéder par script pour plus de précision et de reproductibilité.
Lorsque la fenêtre graphique est en mode édition, elle affiche le cadre de sa
page graphique et les bords des graphic views qu’elle contient. Une graphic
view affiche au moins deux rectangles : son cadre frame, qui délimite la
graphic view, et son cadre de traçage plot frame — en principe un rectangle plus petit que frame — qui indique le rectangle dans lequel la graphic
view représente les données (par exemple, le plot frame ne contient pas les
légendes d’axes).
Vous pouvez déplacer n’importe lequel de ces rectangles à l’aide de la souris. Vous pouvez modifier ses dimensions en déplaçant son coin inférieur droit.
32
1.0
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1.0
Fig. 5.2 – La fenêtre graphique en mode édition.
Cependant pour ajuster les dimensions d’un graphique il est recommandé de
suivre les instructions ci-dessous, valables aussi bien si les modifications ont
lieu à l’aide de la souris que par script.
1. ajustez d’abord la taille de la page PDF. La page PDF est le rectangle à
fond blanc qui se dessine sur un fond gris si vous agrandissez les dimensions de la fenêtre graphique. Pour ajuster les dimensions de la page
PDF par script, modifiez les propriétés pagewidth and pageheight de
la graphic window.
2. ajustez ensuite les dimensions du cadre (frame) de la graphic view.
Quand vous déplacez ce rectangle, la graphic view se déplace en bloc.
Quand vous modifiez ses dimensions, le graphique qu’il contient se modifie en conséquence, en d’autres termes le plot frame est modifié.
3. ajustez à présente le cadre de traçage (plot frame), le cadre qui
contient la représentation des données à proprement parler. Quand vous
modifiez celui-ci, la légende (legend frame) se modifie automatiquement de façon à préserver l’aspect du graphique.
4. enfin, le cas échéant, modifiez la position et les dimensions de la légende
(legend frame).
Attention : le menu Edition > Mode édition fonctionne également sur
les fenêtres de dialogue. Si par exemple c’est une fenêtre d’Infos qui est au
premier plan et que vous sélectionnez Edition > Mode édition c’est elle qui
Guide de programmation
33
basculera en mode édition, et non la fenêtre graphique qui est au deuxième
plan. Pour désactiver le mode édition pour le dialogue sélectionnez à nouveau
Edition > Mode édition.
34
Chapitre 6
La réalisation de documents
avec Smile
Une fois que vous avez réalisé des graphiques dans une graphic window
vous pouvez en faire différents documents, papier ou électroniques.
6.1
Les “bundles” Smile
Lorsqu’on enregistre une graphic window à l’aide du menu Fichier >
Enregistrer Smile propose de l’enregistrer sous forme d’un Bundle1 , ou d’un
PDF, ou encore d’enregistrer une copie comme PDF, JPEG, PNG, TIFF,
BMP ou PSD. L’option par défaut, Bundle, crée un “bundle Smile”, c’està-dire un fichier qui retient la structure complète de la graphic window. Si
vous la ré-ouvrez plus tard, elle recréera automatiquement tous les objets
qui étaient présents dans la graphic window. Notamment, le bundle Smile
contient les scripts que vous avez éventuellement attachés aux objets, ainsi
que les données numériques qu’ils contiennent le cas échéant.
Le bundle Smile étant en réalité un dossier, vous pouvez (au moyen du
menu contextuel dans Finder) l’ouvrir et l’utiliser pour stocker des fichiers
connexes. Il est recommandé d’y stocker les fichiers de données, les codes
de calcul, les scripts spécialisés et les bibliothèques AppleScript, ainsi que
les dialogues. Quand vous ouvrez le bundle dans Finder vous observerez
qu’il contient un dossier Contents. Ne stockez aucun fichier dans ce dos1
Un “bundle” n’est autre que ce que le Finder appelle un “progiciel” c’est-à-dire en
réalité un dossier qui se présente comme un fichier.
35
36
sier Contents. En effet Smile efface le contenu de ce dossier à chaque nouvel
enregistrement du fichier. Par conséquent, stockez vos fichiers à la racine du
bundle, c’est-à-dire au même niveau que le dossier Contents.
Remarque : certaines versions du Finder n’autorisent pas le déplacement d’un
fichier à cet endroit au moyen de la souris. Si c’est le cas, procéder au moyen
d’un Copier - Coller dans Finder.
Un bundle Smile pouvant éventuellement contenir un nombre important
de fichiers, Smile ne vous autorise pas, par sécurité, à remplacer un bundle
Smile par un autre au moyen de la commande Fichier > Enregistrer sous.
Pour supprimer le bundle existant, glissez-le dans la Corbeille dans Finder.
Pour générer un PDF à partir d’une fenêtre de Smile sans perdre le lien
avec le bundle, utilisez l’option Enregistrer une copie en PDF.
6.2
Réalisation d’un document PDF
La fenêtre graphique concernée étant au premier plan, sélectionnez Fichier
> Enregistrer sous puis Format > PDF puis cliquez Enregistrer. Si nécessaire,
Smile ajoute automatiquement l’extension .pdf au nom du fichier.
La fenêtre prend le nom du fichier et dorénavant le menu Fichier > Enregistrer
met à jour le PDF.
6.3
Réalisation de fichiers JPEG, PNG,
TIFF, BMP et PSD
La fenêtre graphique concernée étant au premier plan, sélectionnez Fichier
> Enregistrer sous puis Format > Enregistrer une copie en JPEG (ou PNG
. . . ) puis cliquez Enregistrer. Si nécessaire, Smile ajoute automatiquement
l’extension ad hoc au nom du fichier.
Quand vous utilisez l’une de ces options, le document est converti en image
bitmap : ce format est bien adapté par exemple à l’affichage sur une page
web.
Guide de programmation
6.4
37
Réalisation d’une séquence QuickTime
(movie)
Les vues affichées successivement par une fenêtre graphique peuvent être
regroupées pour constituer une séquence QuickTime, un movie. On peut
choisir indépendamment la durée de chaque image dans la séquence (pas
moins de 1/60 seconde néanmoins).
Vous devez procéder en trois étapes.
1. fournissez à la graphic window une référence au nouveau fichier : stockez cette référence dans sa propriété movie file. Cette opération est
facultative : si vous préférez, vous pourrez indiquer dans un dialogue où
et sous quel nom enregistrer la nouvelle séquence au moment de l’enregistrement, c’est-à-dire à l’étape 3. L’étape 1 est donc requise pour
automatiser totalement le processus.
2. pour enregistrer l’affichage courant de la graphic window dans la séquence,
utilisez add movieframe. add movieframe admet comme paramètre
optionnel la durée de l’image (0,1 seconde par défaut).
Exemple 34
add movieframe w duration 1/30 -- 1/30 seconde
3. lorsque la réalisation de la séquence est terminée, clôturez-la en appliquant le verb save à la propriété movie file de la graphic window.
Exemple 35
save movie file of w
Au lieu d’enregistrer la totalité de la fenêtre, vous pouvez choisir de n’enregistrer dans la séquence que l’une des vues de la graphic window, c’està-dire (comme vous le découvrirez plus bas) une graphic view. Pour cela,
passez une référence à la graphic view en question — au lieu d’une référence
à sa fenêtre — à add movieframe. A noter que la propriété movie file appartient dans tous les cas à la graphic window.
Exemple 36
set v to graphic view 1 of w
add movieframe v duration 1/30
Vous pouvez ouvrir et lire une séquence vidéo dans Smile (que ce soit
Smile qui l’ait réalisée ou non). Pour cela, déposez son icône sur l’icône de
Smile, ou par script utilisez la syntaxe suivante.
Exemple 37
38
set mw to DoOpen(theMovieFile)
play mw
-- pause :
stop mw
Une fois qu’il est ouvert dans Smile, vous pouvez utilisez les boutons affichés
par la fenêtre de la séquence pour (re)lancer et arrêter la lecture ou pour la
visionner image par image.
Suivant le réglage correspondant du dialogue Préférences, Smile ouvre la
séquence, soit en noir et blanc, soit en couleurs. Quand elle est ouverte en
noir et blanc, vous pouvez importer l’image courante d’une séquence sous
forme d’un tableau de valeurs : voir Section 7.4.
Chapitre 7
Importation et exportation de
données
Vous devez traiter des données qui se présentent sous différents formats.
Souvent, les tableaux à une dimension sont stockés en ASCII par commodité.
Les données de plus haute dimensionnalité peuvent également être stockées
sous forme de fichiers ASCII — qui peuvent utiliser différents séparateurs —
ou sous forme de fichiers binaires, possiblement générés par des programmes
en C ou en FORTRAN. Le plus souvent ces fichiers contiennent des réels
codés en simple précision (sur 4 octets) ou en double précision (sur 8 octets).
Dans certains domaines il est répandu d’utiliser les fichiers HDF. Dans sa
version actuelle, Smile permet de lire et écrire les Scientific Data Sets (SDS)
des fichiers HDF4.
7.1
Les fichiers ASCII
Lecture et écriture de texte Les commandes des Compléments standard
(StandardAdditions) permettent de lire et écrire les fichiers ASCII. Pour voir
ces commandes, sélectionnez Fichier > Ouvrir un dictionnaire > Scripting additions > StandardAdditions.osax, puis dans la fenêtre dictionnaire sélectionnez
Index > File Read/Write. Vous trouverez là les commandes de base permettant de lire et écrire des données dans les fichiers : open for access, close
access, read, write.
Exemple 38
set f to alias ((path to "docs" as text) & "myTextFile.txt")
39
40
set s1 to "des mots "
set s2 to "1 2 3 4"
write s1 to f -- écriture en début de fichier
write s2 starting at (1 + (get eof f)) to f -- écriture
en fin de fichier
set s to read f
-- "des mots 1 2 3 4"
Si vous lancez le script ci-dessus alors que le fichier n’existe pas, AppleScript
affiche un message d’erreur. Pour créer un fichier par script, utilisez open
for access. Vous devez toujours contrebalancer un open for access par
un appel à close access.
Exemple 39
set f to ((path to "docs" as text) & "myTextFile.txt")
set nref to open for access file f
close access nref -- le fichier est créé
write "des mots" to file f
La commande format (dans la Satimage.osax) permet d’écrire des nombres
dans un format fixé. Dans l’exemple ci-dessous, on utilise format pour afficher
jusqu’à 5 chiffres à gauche du séparateur décimal, jusqu’à 3 chiffres à droite,
en remplaçant les zéros du début par des espaces et en affichant les zéros de
la fin.
Exemple 40
format 16/5 into "^^^^^.000"
-- "
3.200"
Extraction de données numériques La commande extractcolumn permet d’extraire des données numériques d’un fichier ASCII. En entrée, extractcolumn
attend une chaı̂ne de caractères utilisant tab comme séparateur de colonnes
et CR (ASCII 13) ou LF (ASCII 10) comme séparateur de lignes. Le paramètre in peut être, soit une telle chaı̂ne de caractères, soit un fichier qui
en contient une.
Vous pouvez indiquer quelles colonnes extraire de l’une des trois façons suivantes : extractcolumn i, extractcolumn i thru j ou extractcolumn
{i, j, ...}. Le paramètre skipping permet de sauter par exemple une
ligne d’en-tête.
Exemple 41
set {x,y} to extractcolumn {1,3} in s skipping 1
Guide de programmation
41
Par défaut, extractcolumn retourne les colonnes (ici les deux colonnes x et
y) sous forme de chaı̂nes de caractères dans lesquelles chaque ligne est séparée
de la suivante par CR. Pour obtenir directement des arrays of real vous
devez forcer la coercion au moyen du mot-clé as.
Exemple 42
set {x,y} to extractcolumn {1,3} in s as array of real
skipping 1
Ici x et y contiendront des arrays of real.
Si vous indiquez extractcolumn ...as string le résultat sera une chaı̂ne
de caractères unique contenant les colonnes sélectionnées sous forme d’un
tableau qui utilise tab et return (CR) comme séparateurs de colonnes et de
lignes, respectivement.
Exemple 43
set theTable to "An.
Rev.
%
2018
708
.3
2019
712
.6"
extractcolumn 2 thru 3 in theTable as string
-- "Rev.
%
708
.3
712
.6"
Si vous indiquez l’indice d’une colonne qui n’existe pas, extractcolumn renvoie une colonne de chaı̂nes vides si le paramètre in est une chaı̂ne de caractères ou un fichier, et il renvoie un array of real contenant une seule
valeur missing value si le paramètre in est une matrix.
Les emplacements pour lesquels extractcolumn n’a pas pu identifier un
nombre valide contiennent la valeur missing value.
Pré-traitement de fichiers ASCII Les fichiers que vous traiterez
peuvent présenter différents formats. Par exemple, votre fichier peut contenir à la fois des espaces et des tabulations. Vous pouvez donc être amené à
traiter le texte avant de lui appliquer extractcolumn.
Pour le traitement de texte, les Compléments standard proposent quelques
commandes : sélectionnez Fichier > Ouvrir un dictionnaire > Scripting Additions > StandardAdditions.osax, puis dans la fenêtre du dictionnaire sélectionnez
Index > String Commands.
En revanche la Satimage.osax offre des outils plus spécifiques et plus puissants, notamment une commande change supportant les Regular expressions.
42
Le script ci-dessous utilise les Regular expressions pour supprimer les espaces
en début de chaı̂ne de caractères, puis les espaces en fin de chaı̂ne, puis pour
remplacer par tab n’importe quelle suite d’espaces précédés ou non de tab.
Exemple 44
set
set
set
set
s
s
s
s
to
to
to
to
read f
change "^[ ]+" into "" in s with regexp
change "[ ]+$" into "" in s with regexp
change "\\t ?[ ]+" into "\\t" in s with regexp
Vous remarquez ici que dans AppleScript on délimite une chaı̂ne de caractères
au moyen des guillemets anglo-saxons (double-quotes), et qu’il faut faire
précéder la barre de fraction inversée (backslash) et les double-quotes par un
backslash : "\\" et "\"".
Fichiers tabulés (.tsv) L’extension .tsv (pour “tab-separated values”)
indique un fichier ASCII dont les colonnes sont séparées par tab (ASCII 9)
et les lignes par CR (ASCII 13) ou LF (ASCII 10).
Smile ouvre les fichiers .tsv d’une façon spéciale : au lieu d’afficher son
contenu dans une fenêtre de texte (une text window) comme il le fait pour
tout fichier ASCII, Smile affiche le contenu du fichier sous forme de courbes
et il ouvre une boı̂te de dialogue spéciale, File plotter, qui permet de personnaliser le graphique (fig.7.1). File plotter vous permet de choisir la colonne des
abscisses, la ou les colonnes à tracer en ordonnées (pour tracer plusieurs colonnes indiquez leurs numéros séparés par des virgules), ainsi que le nombre
de lignes à sauter en tête de fichier. De plus si vous indiquez 1 ligne à sauter,
File plotter essaiera d’utiliser les données contenues dans l’en-tête pour nommer l’axe des abscisses et les courbes.
Vous pouvez enregistrer les réglages courants de File plotter. Ceci vous permet d’ouvrir successivement de la même façon des fichiers de la même nature.
Le bouton Nlle fenêtre permet de laisser la fenêtre courante en l’état et d’en
créer une autre, par exemple pour comparer deux situations. De même, le
bouton Nlle courbe laisse la ou les courbes courantes en l’état et en crée une
autre ou d’autres.
Guide de programmation
43
Fig. 7.1 – Quand on ouvre un fichier .tsv, Smile le trace directement.
7.2
Les fichiers binaires
La Satimage.osax contient les commandes nécessaires pour travailler sur
des fichiers binaires, à savoir read binary et write binary.
Avant de lire des données dans un fichier binaire, il faut savoir si les réels
qu’il contient sont codés en simple précision ou en double précision1 et si le
fichier contient des blocs de remplissage (“paddings”).
Dans l’exemple ci-dessous ou lit 10.000 valeurs dans un fichier produit par
un code FORTRAN en simple précision.
Exemple 45
set a to (read binary alias "myFile" as small real skip
4 length 10000)
Le script saute les quatre premiers octets du fichier : comme c’est souvent
le cas, le format utilisé par le programme FORTRAN encapsule les blocs de
données entre deux blocs de 4 octets nuls.
Si par exemple les données avaient été écrites par des opérations d’écriture
successives, on aurait pu avoir des blocs de remplissage supplémentaires entre
données. Quand vous n’êtes pas sûr de connaı̂tre exactement comment le
fichier est structuré, utilisez la commande AppleScript standard read avec
1
A noter que read binary retourne dans tous les cas un tableau sous forme d’un array
of real, qui stocke les réels en double précision.
44
l’option as integer.
Exemple 46
set mylist to (read alias "myFile" for 256 as integer)
L’option as integer a pour résultat de lire le fichier par blocs de 4 octets,
les blocs de remplissage apparaissant comme des zéros.
La ligne ci-dessus lit 256/4 soit 64 valeurs. Ne tentez pas de l’utiliser pour
lire plus que 4000 valeurs.
Lorsque vous écrivez des données dans un fichier binaire à l’aide de write
binary, vous pouvez indiquer la position à laquelle vous voulez écrire ainsi
que le format des données (nombres codés sur 4 ou 8 octets).
Si le fichier à écrire n’existe pas encore, vous devez passer à write binary
une référence au fichier sous la forme file f2 :
Exemple 47
set f to (path to "docs" as text) & "temp.temp"
write binary file f with data a
Pour insérer un bloc de remplissage de 4 octets nuls, insérez une ligne write
0 in f entre les deux write binary concernées.
Dans les exemples ci-dessus nous avons utilisé read binary et write
binary sur des fichiers. On peut également utiliser, au lieu d’une référence à
un fichier, le numéro de référence du fichier tel que retourné par la commande
AppleScript open for access. Cette référence fournit un accès plus rapide,
de plus elle permet une lecture séquentielle du fichier, celui-ci restant ouvert
entre deux appels.
Exemple 48
set f to (path to "docs" as text) & "temp.temp"
set refNum to open for access (f as alias)
write binary refNum with data a
close access refNum
2
AppleScript gère deux classes pour indiquer un fichier, à savoir file
specification, exemple file "Startup :Applications :Calculator", et alias,
exemple alias "Startup :Applications :Calculator". alias ne peut être utilisé que
si le fichier existe, ce qui n’est pas le cas de file specification. Le Finder gère
préférentiellement les alias.
Guide de programmation
7.3
45
Les fichiers HDF
La HDF.osax (un téléchargement disponible séparément) contient les
commandes nécessaires pour écrire et lire les fichiers HDF : HDFRead, HDFExtract
et HDFWrite.
HDF.osax gère les Scientific Data Sets (SDS) du format HDF4. La structure correspondante dans Smile s’appelle le data set, dont la définition est
donnée dans HDF.osax.
Un data set est en réalité un record au sens de AppleScript, qui contient
les données sous forme d’un array of real, et les dimensions des données
sous forme d’une liste d’entiers : la longueur de la liste est la dimensionnalité
du tableau, et les entiers indiquent les tailles du tableau dans les différentes
directions.
Exemple 49
set mySDSs to (HDFRead alias f)
-- {{name :"fakeDim0", dimensions :{100}}, {name :"fakeDim1",
dimensions :{92}}, {name :"Volcano", dimensions :{100,
92}}}
Par défault HDFRead renvoie uniquement les informations sur la structure du
tableau de données et non pas les données elles-mêmes.
Pour lire les données elles-mêmes vous devez préciser data true : HDFRead
renvoie alors les données dans le champ array of real du record. A noter
que l’ordre utilisé pour le champ dimensions fonctionne comme en FORTRAN : dans le cas ci-dessus ”Volcano” est un tableau de 100 lignes de 92
colonnes.
Exemple 50
set {ySDS, xSDS, zSDS} to (HDFRead alias f data true)
set zdim to dimensions of zSDS
set z to {class :matrix, ncols :item 2 of zdim, nrows :item
1 of zdim, array of real :array of real of zSDS}
Si le tableau de données est de grande taille, par exemple s’il représente
un champ 3-dimensionnel, il peut être souhaitable d’en extraire un sousensemble, par exemple une tranche (à 2 dimensions). C’est le rôle de
HDFExtract. La syntaxe de HDFExtract suit fidèlement la syntaxe de la fonction SDreaddata de la bibliothèque HDF.
Avant d’écrire des données au moyen de HDFWrite vous devez d’abord
constituer un data set. Gardez présent à l’esprit qu’un data set n’est autre
46
qu’un simple record AppleScript :
Exemple 51
set ds to {class :data set, name :"Volcano", dimensions :
{500, 500}, array of real :a}
HDFWrite ds into file "mynewHDFfile"
7.4
Fichiers graphiques
Smile sait ouvrir tous les formats d’image que QuickTime reconnaı̂t, tels
que JPEG, PNG, BMP etc (Smile affiche ce type de fichier dans une fenêtre
de séquence vidéo). Cependant vous pouvez importer dans Smile le tableau
des niveaux de gris d’une image sans pour autant ouvrir l’image.
A l’inverse, pour importer le tableau des niveaux de gris d’une image
(ou de toutes les images) d’une séquence vidéo (”movie”), il est nécessaire
d’ouvrir le fichier dans Smile.
7.4.1
Importation de données à partir d’une image bitmap
Smile permet d’importer les données à partir d’images bitmap à l’aide
des commandes suivantes : imagefile bounds et convert imagefile. Ces
commandes permettent d’importer les données à partir de fichiers d’images
tels que .tiff ou .jpg files.
imagefile bounds renvoie sous forme d’une liste {0, 0, xmax, ymax} les
dimensions (en pixels) de l’images.
convert imagefile renvoie, sous forme d’une matrix, le tableau 2D des
niveaux de gris des pixels de l’image. Les niveaux de gris sont codés entre 0
(blanc) et 255 (noir).
Exemple 52
set m to convert imagefile (alias aPath)
QuickScalarMap(0, 0, m, 0) -- affiche les niveaux de gris
dans un scalar map
Guide de programmation
7.4.2
47
Importation de données à partir d’une séquence
vidéo
Pour travailler sur une séquence vidéo, il faut d’abord l’ouvrir dans Smile
en niveaux de gris. Par défaut Smile ouvre les séquences vidéo en couleurs :
vous pouvez modifier ce comportement dans la section Avancé du dialogue de
Préférences. Pour modifier le comportement par script, modifiez la variable
globale my gMovieGrey.
Exemple 53
set savedmode to my gMovieGrey
set my gMovieGrey to true
set mw to DoOpen(aMoviePath)
set my gMovieGrey to savedmode
Pour récupérer l’image courante sous forme d’une matrix comme plus
haut, utilisez la propriété image de la movie window.
Exemple 54
set m to image of mw
QuickScalarMap(0, 0, m, 0) -- affiche m sous forme d’une
carte en couleurs
Pour passer à l’image suivante ou à l’image précédente de la séquence,
utilisez la propriété class STEP .
Exemple 55
set class STEP of mw to 1 -- image suivante
set class STEP of mw to -1 -- image précédente
48
Chapitre 8
Pilotage de codes avec Smile
Un script AppleScript peut appeler n’importe quelle commande du shell,
exactement comme depuis Terminal. Vous pouvez par conséquent utiliser
n’importe quel outil UNIX depuis n’importe quel script dans Smile. Pour
cela, utilisez la commande AppleScript do shell script : l’instruction
AppleScript do shell script [uneCommande] est équivalente à exécuter
uneCommande depuis une fenêtre de Terminal1 .
8.1
Les chemins d’accès aux fichiers
AppleScript et UNIX utilisent des conventions différentes quand il s’agit
de désigner un fichier à l’aide d’une chaı̂ne de caractères. Là ou UNIX utilise
la barre de fraction (slash) / pour séparer les répertoires successifs, AppleScript utilise les deux-points :2 .
Pour convertir le chemin d’accès UNIX d’un fichier en référence de fichier
AppleScript utilisez la commande POSIX file. POSIX file s’utilise sur les
fichiers aussi bien que sur les répertoires.
Exemple 56
set b to "/usr/local/bin/"
set a to POSIX file b
-- file "Macintosh HD :usr :local :bin :"
1
Les deux ne sont pas rigoureusement équivalents en effet à ce jour Terminal utilise
tcsh comme shell alors que do shell script ouvre une session sh.
2
Par conséquent un / dans un nom de fichier en AppleScript se traduit en deux-points :
dans le nom UNIX du fichier.
49
50
Pour convertir une référence AppleScript à un fichier en chemin d’accès UNIX
utilisez la propriété POSIX path. Le résultat de POSIX path est une chaı̂ne
de caractères. Il se peut que vous ayez à encapsuler (“escape”) cette chaı̂ne
avant de la passer à un script de shell — ce sera le cas par exemple si le
chemin contient des espaces. Pour cela utilisez quoted form, une propriété
spéciale des chaı̂nes de caractères qui encapsule la chaı̂ne de caractères entre
guillemets simples ’ et effectue les transformations nécessaires pour rendre
la chaı̂ne compatible avec les habitudes des commandes de shell.
Exemple 57
set a to file "Macintosh HD :usr :local :bin :"
set b to POSIX path of a
-- "/usr/local/bin/"
set c to quoted form of b
-- "’/usr/local/bin/’"
8.2
Lancement d’un executable UNIX
Dans l’exemple suivant, le script lance un code de calcul nommé spl sur
des données en entrée contenues dans un fichier fin, et rend son résultat sous
forme d’une chaı̂ne de caractères dans la variable s.
Exemple 58
-- fin est le chemin d’accès d’un fichier de données
set fout to change ".ctl$" into ".out" in fin with regexp
set scpt to "/sw/bin/spl " & fin & " >& " & fout
do shell script scpt
set s to read POSIX file fout
8.3
Attente de la fin de l’exécution d’un executable UNIX
Si l’exécution du code de calcul dure davantage que quelques secondes,
vous préférerez qu’il s’exécute en tâche de fond sans vous bloquer. Il s’agit
là d’une fonctionnalité standard du shell : il vous suffit d’ajouter & (après un
espace) à la commande, et de rediriger le résultat et les erreurs vers un fichier
Guide de programmation
51
au moyen de >&. do shell script rendra alors la main immédiatement.
Exemple 59
-- fin est le chemin d’accès d’un fichier de données
set fout to change ".ctl$" into ".out" in fin with regexp
set scpt to "/sw/bin/spl " & fin & " >& " & fout & "
&"
do shell script scpt
Il est souvent souhaitable que le script attende que le code ait terminé de
s’exécuter avant de poursuivre sa propre exécution. Pour cela vous devez utilisez la commande smilepause (spécifique à Smile), qui permet de suspendre
un script sans bloquer l’application, qui demeure totalement interactive.
Exemple 60
repeat
if "/sw/bin/spl" is not in (do shell script "ps -xw")
then exit repeat
smilepause 0.1
end repeat
set s to read POSIX file fout
Pendant l’exécution d’une instruction smilepause, la touche esc déclenche
une erreur error number -128 ("Annulé par l’utilisateur") que vous
pouvez gérer spécifiquement (à l’aide d’une structure try ... end try) et
qui par défaut interromp le script.
52
Chapitre 9
Comment modifier son code
pour le rendre scriptable
Il est possible d’utiliser depuis Smile un programme UNIX tel quel, mais
il bien plus avantageux d’en effectuer réellement le portage sur OSX et de
le rendre ainsi interactif. Pour permettre d’interagir depuis Smile avec un
programme de calcul vous avez deux options.
– vous pouvez faire de votre code de calcul un Complément de pilotage
(ou “osax”). Une osax est un “plug-in” pour AppleScript, qui une fois
installée est disponible depuis n’importe quel script : le dictionnaire
d’une osax s’ajoute à la terminologie d’AppleScript. Le mécanisme des
osax est bien adapté pour de petits codes ne nécessitant pas de gros
temps de calcul ni de grosses quantités de mémoire : par exemple,
Satimage.osax implémente les fonctions transcendantes.
– dans le cas d’un code plus sophistiqué, il est préférable d’en faire une
application scriptable à part entière. En effet vous bénécifierez alors de
possibilités exclusives qui sont les suivantes :
– vous profitez d’un contexte plus confortable et plus souple pour piloter et gérer le calcul, et pour échanger des données avec lui,
– vous pouvez interagir avec votre calcul pendant qu’il s’exécute, et le
surveiller depuis Smile,
– vous pouvez débugger votre programme de calcul de façon interactive.
Le site web de Satimage-software propose des exemples de projets pour
XCode vous permettant de réaliser facilement un Complément de pilotage
ou une application scriptable.
53
54
En principe, quand une instruction adresse une commande à une application scriptable, elle attend que l’application lui ait renvoyé le résultat
avant de poursuivre l’exécution du script. Pour contourner ce problème si
par exemple votre code demande un temps de calcul important, utilisez une
des deux instructions de contrôle AppleScript with timeout (déclenchera
une erreur après un temps fixé, erreur que vous pourrez alors intercepter et
gérer) ou ignoring application responses (qui indique à l’instruction de
poursuivre immédiatement l’exécution du script sans attendre le résultat),
et utilisez smilepause pour suspendre le script sans bloquer Smile.
L’exemple ci-dessous lance un calcul qui ne bloquera pas le script appelant.
Exemple 61
ignoring application responses
tell application "MonAppliScriptable"
compute 10000
end tell
end ignoring
Pour envoyer une requête à votre programme sans risquer de rester bloqué
en cas d’anomalie, utilisez l’instruction with timeout :
Exemple 62
on EssaieLecture()
with timeout of 0.1 seconds
tell application "MonAppliScriptable"
set the result to velocity
end tell
end timeout
return the result
end EssaieLecture
Enfin, pour suspendre un script en attendant la fin d’un calcul, utilisez
smilepause :
Exemple 63
repeat
try
set v to EssaieLecture()
exit repeat -- la tentative a réussi
end try
smilepause 0.1 -- la tentative a échoué, EssaieLecture
Guide de programmation
55
rend une erreur
end repeat
Des modèles client-serveur plus sophistiqués, ne bloquant pas le script appelant, peuvent être également implémentés au moyen d’une programmation multi-tâches (“multi-threading”). Un exemple d’application à “thread”
est donné dans les exemples de projets XCode proposés sur le site web de
Satimage-software.
56
Chapitre 10
Réalisation d’une interface
graphique utilisateur
Comme on l’a vu dans les chapitres précédents, c’est au moyen de scripts
écrits en AppleScript qu’on contrôle Smile. Un script donné peut être appelé
par différents moyens : par exemple, en choisissant son nom dans un menu
déroulant, ou par l’intermédiaire d’une fenêtre de dialogue personnalisée.
Pour exploiter les fonctionnalités qui sont présentées ci-dessous, référezvous à la documentation de Smile. La documentation de Smile est incluse
dans le téléchargement de Smile. Vous pouvez également cliquer ici pour
vous rendre sur la page web de téléchargement séparé de la documentation
de Smile.
10.1
Personnalisation du menu utilisateur
Smile propose un menu appelé menu Scripts utilisateur : c’est le menu indiqué par une icône de parchemin. On peut personnaliser ce menu en ajoutant
et en supprimant des fichiers ou des dossiers dans le dossier User Scripts
de Smile ou dans le dossier /Users/<login>/Bibliothèque/Application
Support/Smile/User Scripts/.
Le menu permet de lancer des scripts ou d’ouvrir des documents.
Pour qu’un script soit disponible à tout instant, recopiez-le dans
le dossier /Users/<login>/Bibliothèque/Application Support/Smile/User
Scripts/. Il n’est pas nécessaire de quitter et relancer Smile : le menu Scripts
utilisateur se met à jour instantanément.
57
58
10.2
Réalisation de dialogues personnalisés
Avec Smile, vous pouvez réalisez des fenêtres de dialogue Aqua
entièrement scriptés, d’où vous pourrez utiliser toute la puissance d’AppleScript1 , et celle de Smile.
Un dialogue personnalisé vous permet de donner aux scripts que vous avez
rédigés l’interface graphique la mieux adaptée. Les dialogues augmenteront
votre productivité en facilitant le travail de recherche, ils vous permettent de
transmettre le résultat de votre travail à des collègues sous la forme la plus
appropriée, ils vous permettent également de présenter dans les conférences
de véritables “data shows” plutôt que des diaporamas statiques.
Un dialogue s’enregistre sur disque comme un document qui présente une
icône de Lego, qu’on peut ouvrir par double-clic ou bien par script. Pour
créer un dialogue personnalisé, on commence par installer dans une fenêtre
de dialogue vide tous les éléments nécessaires, boutons, champs de texte,
menus etc. Puis on associe des scripts au dialogue (et possiblement aussi aux
éléments qu’il contient), qui gèreront le comportement du dialogue vis-à-vis
des actions de l’utilisateur.
Pour tous les détails sur les dialogues personnalisés, ainsi que sur d’autres
moyens de personnaliser l’interface de Smile, reportez-vous à la documentation de Smile.
10.3
Personnalisation de l’interface utilisateur d’un graphique
Un graphique peut répondre aux actions de l’utilisateur de façon
entièrement personnalisée. Pour cela, vous devez associer des scripts aux
objets graphiques.
10.3.1
Comment associer un script à un objet graphique
Vous pouvez associer (on dit parfois “attacher”) un script, soit à une
graphic window, soit à une graphic view (c’est-à-dire à un objet d’une
1
Par exemple les dialogues de Préférences et de Recherche sont des dialogues personnalisés de ce type.
Guide de programmation
59
classe descendant de celle-ci). Pour associer un script à un objet graphique,
ou pour modifier son script, la graphic window doit être en mode “édition”.
Pour cela, choisissez Edition > Mode édition dans le menu (concernant le
mode édition, voir aussi la section 5.6).
En mode édition, la fenêtre graphique affiche les cadres des graphic views.
Pour ouvrir le script d’un objet, cliquez dans l’objet avec les touches cmd et
option enfoncées. Selon que vous cliquez à l’intérieur d’une graphic view ou
non, vous ouvrirez le script de la graphic view ou le script de la fenêtre.
Le script d’un objet s’ouvre dans une fenêtre de script, une script window.
Le menu File > Save met à jour le script de l’objet, et les modifications
sont effectives immédiatement. Pour enregistrer votre travail sur disque —
y compris les scripts — vous devez enregistrer la graphic window comme
“bundle”, voir Section 6.1.
10.3.2
Personnalisation du menu contextuel
Le menu contextuel2 sert à présenter des fonctionnalités personnalisées à
l’utilisateur. Vous pouvez y installer autant de commandes que nécessaire,
et l’utilisateur n’aura aucun mal à se souvenir que toutes les fonctions sont
réunies dans le menu contextuel.
Par défaut, le menu contextuel de la graphic window est vide, et le menu
contextuel des graphic views contient (au moins) la commande Lire les informations, qui permet d’ouvrir le dialogue de réglages pour l’objet en question.
Pour installer d’autres commandes dans le menu contextuel d’un objet,
vous devez ajouter deux procédures dans son script.
1. installez une procédure CustomMenuItems qui doit générer une liste de
chaı̂nes de caractères, les commandes que le menu doit afficher. Inspirezvous de l’exemple suivant.
Exemple 64
on CustomMenuItems(theView)
set theList to {"New run", "Stop run"}
return theList
end CustomMenuItems
Smile passe à CustomMenuItems une référence à l’objet. La procédure
doit retourner une liste de chaı̂nes de caractères.
2
Pour dérouler le menu contextuel d’un objet, cliquez à l’intérieur de l’objet avec la
touche ctrl enfoncée.
60
Le comportement par défaut s’obtient au moyen de continue, un motclé d’AppleScript. L’exemple ci-dessous affichera dans le menu contextuel le menu standard ainsi que des commandes personnalisées.
Exemple 65
on CustomMenuItems(theView)
set theList to {"Lancer la simulation", "Arr^
eter",
"-"}
set theBuiltIn to continue CustomMenuItems(theView)
return theList & theBuiltIn
end CustomMenuItems
2. installez une procédure do menu qui gérera les nouvelles commandes.
Pour la syntaxe de do menu, reportez-vous au dictionnaire de Smile, ou
inspirez-vous de l’exemple suivant.
Exemple 66
on do menu theCmd to theView
if theCmd is "Lancer la simulation" then
-- perform new run
else if theCmd is "Arr^
eter" then
-- stop current run
else
continue do menu theCmd to theView
end if
end do menu
Vous devez appeler le comportement par défaut au moyen du mot-clé
continue.
10.3.3
Gestion des touches du clavier
A chaque fois que l’utilisateur frappe une touche du clavier, ou une combinaison d’une touche avec une des touches spéciales (shift, option, cmd,
caps lock ou ctrl) Smile envoie un événement keyboard down au script de la
graphic window active.
Pour gérer les événements clavier, installez une procédure keyboard down
dans le script de la graphic window. Vous trouverez la syntaxe de keyboard
down dans le dictionnaire de Smile. Smile passe comme paramètres à la
procédure keyboard down la touche qui a été frappée (mot-clé character), et
Guide de programmation
61
la liste des touches spéciales éventuellement enfoncées (mot-clé modifiers)3 .
Les valeurs possibles du paramètre modifiers dont les mêmes que celles de la
propriété modifiers de l’application, qui sont présentées dans le dictionnaire
de Smile à la rubrique Class application.
L’exemple ci-dessous trace des courbes aléatoires en fonction des touches
frappées par l’utilisateur : le script gère les touches “r” (pour “remise à zéro”)
et “n” (pour “nouvelle courbe”).
Exemple 67
on keyboard down theWindow event theEvent
if modifiers of theEvent is not {} then return
if character of theEvent is not in "rn" then return
if character of theEvent is "r" then
try
set v to plot view 1 of theWindow
delete every curve of v
end try
draw theWindow
return
end if
try
set v to plot view 1 of theWindow
on error
set v to make new plot view at theWindow
end try
set c to make new curve at end of v
set f to random number from 0.0 to 2.0
set formula of c to "" & f & "*sin(x^" & f & ")"
draw theWindow
end keyboard down
Si vous souhaitez essayer cet exemple, procédez comme suit :
– sélectionnez Fichier > Nouveau texte
– dans la nouvelle fenêtre de texte, tapez la ligne suivante :
3
Attention : si les touches spéciales modifient “normalement” l’effet de la touche, le
paramètre character contient le caractère modifié. Par exemple si l’utilisateur press shifta le paramètre character contiendra A et non pas a, et le paramètre modifiers contiendra
la liste à un élément {shift down}.
62
make new graphic window
puis pressez la touche Enter (pas la touche Retour chariot)
– sélectionnez Edition > Mode édition pour passer la fenêtre graphique
en mode édition
– faites cmd-option-clic dans la fenêtre graphique. Son script s’ouvre.
– recopiez le script ci-dessus
– sélectionnez Fichier > Enregistrer puis Fichier > Fermer
– sélectionnez Edition > Mode édition pour désactiver le mode édition de
la fenêtre graphique
A présent vous pouvez frapper “n” pour faire une nouvelle courbe, et “r”
pour nettoyer la fenêtre.
10.3.4
Gestion des clics souris
A chaque fois que l’utilisateur clique dans la graphic window, Smile envoie un événement pick in au script de la graphic window ou au script de
la graphic view concernée, en fonction de l’endroit où le clic a eu lieu.
Pour gérer les clics souris, installez une procédure pick in dans le script
de la graphic window et/ou dans les scripts des graphic views. Smile passe
à pick in les paramètres suivants : pick in theObject at theRecord.
theObject est une référence à l’objet qui reçoit le clic (le propriétaire du
script). Le record theRecord contient au minimum deux quantités : point
(une liste de deux nombres réels), qui contient les coordonnées de la souris,
à savoir les coordonnées en pixels si theObject est une graphic window, ou
bien les coordonnées utilisateur si le clic a lieu à l’intérieur du plot frame
d’une graphic view.
Si le clic a lieu dans une view3D, le champ point contient une liste de 3
nombres réels (en coordonnées utilisateur) et theRecord contient également
un champ target object. Ce champ contient une référence à l’objet de la
view3D désigné par la souris, typiquement une surface.
Vous pouvez obtenir les coordonnées en pixels d’un point donnée en
coordonnées utilisateur au moyen de la commande convert coordinates.
Exemple 68
on pick in theView at theRecord
set userPt to point of theRecord
set pixelPt to convert coordinates userPt in theView
Guide de programmation
63
end pick in
Si vous installez une procédure qui gère les clics souris, vous supprimez
le comportement par défaut tel qu’il est décrit au chapitre 5. Pour restituer
le comportement par défaut, utilisez le mot-clé continue (voir Ex.69).
L’exemple ci-dessous crée un nouveau point dans la première courbe (qu’il
crée si nécessaire) du plot view à chaque clic dans son plot frame.
Exemple 69
on pick in theView at theRecord
continue pick in theView at theRecord
set theStep to step of theRecord
if theStep is not 1 then return
set {x, y} to point of theRecord
try
set c to curve 1 of theView
on error
set c to make new curve at theView
set xdata of c to {0}
set ydata of c to {0}
set line style of c to 1
set pattern style of c to 1
end try
set xdata of c to (get xdata of c) & {x}
set ydata of c to (get ydata of c) & {y}
set limits of theView to {0, 1, 0, 1}
draw theView
end pick in
Vous pouvez essayer ce script sur la graphic window de l’exemple précédent :
tapez d’abord simplement “r” pour supprimer toutes les courbes.
Si vous n’avez pas conservé la fenêtre de l’exemple précédent, procédez
comme suit :
– sélectionnez Fichier > Nouveau texte
– dans la nouvelle fenêtre de texte, tapez les deux lignes suivantes :
set w to make new graphic window
make new plot view at w
sélectionnez les deux lignes puis pressez la touche Enter (pas la touche
Retour chariot)
64
– sélectionnez Edition > Mode édition pour passer la fenêtre graphique
en mode édition
– faites cmd-option-clic à l’intérieur du plot view. Son script s’ouvre.
– recopiez le script ci-dessus
– sélectionnez Fichier > Enregistrer puis Fichier > Fermer
– sélectionnez Edition > Mode édition pour désactiver le mode édition de
la fenêtre graphique
Vous pouvez maintenant créer de nouveaux points en cliquant à l’intérieur
du plot view.
Annexe A
Ce qu’il faut savoir pour
exploiter Smile
A.1
Objet du Chapitre
Les sections de ce chapitre vous introduiront à AppleScript et à Smile en
vous proposant pour chacun des deux :
1. une courte présentation
2. les liens vers la documentation de référence
3. un guide pratique résumé.
A.2
Ce qu’il faut savoir d’AppleScript
AppleScript, qu’est-ce que c’est ?
AppleScript est le langage inter-application sur les machines Apple.
Depuis plus de 10 ans AppleScript est intégré aux systèmes d’exploitation
Apple.
La documentation sur AppleScript
Sur votre ordinateur, le module AppleScript de Visualisation Aide offre
une première documentation et contient des liens vers la documentation disponible sur Internet. Pour ouvrir Visualisation Aide, choisissez Aide > Aide
65
66
Mac dans le menu du Finder.
Sur Internet la page officielle des ressources concernant AppleScript est la
suivante :
www.apple.com/applescript/resources (vous pouvez cliquer ici pour visiter
cette page). Vous y trouverez en particulier, au format PDF ou consultable
en ligne, la documentation officielle : AppleScript Language Guide (ASLG),
qui contient notamment la référence du langage1 .
La version française (non officielle) de ASLG est disponible sur le site
http ://trad.applescript.free.fr/.
Il faut lire ASLG pour connaı̂tre tout ce qui est nécessaire pour écrire des
scripts AppleScript. Toutefois la syntaxe est assez simple, les erreurs engendrent des alertes à l’écran mais pas de “crash”, donc vous pouvez souhaiter démarrer en modifiant des scripts existants. Smile est livré avec une série
d’exemples qui sont parfaits pour démarrer : sélectionnez Aide > SmileLab
Sample Center.
Guide résumé d’AppleScript
Le champ d’action d’AppleScript
Voici les composants de votre système que vous pouvez contrôler à l’aide
d’AppleScript, et par quels moyens y arriver.
– AppleScript permet d’effectuer des opérations élémentaires comme les
opérations arithmétiques entre nombres et les lectures/écritures de
fichiers ASCII. AppleScript lui-même contient plusieurs opérateurs
élémentaires. De plus la terminologie peut être étendue en installant
des extensions spécifiques à AppleScript, les Compléments de pilotage
(Scripting additions). Le système d’exploitation comprend en standard
plusieurs Compléments de pilotage.
Pour ouvrir le dictionnaire d’un Complément de pilotage, sélectionnez
son nom dans Fichier > Ouvrir un dictionnaire > Scripting additions.
– AppleScript vous permet de piloter les applications qui sont “scriptables”, c’est-à-dire les applications qui possèdent un “dictionnaire”.
Quand une application scriptable est lancée, son nom s’affiche dans le
menu Fichier > Ouvrir un dictionnaire. Le dictionnaire d’une application indique quels termes il faut employer pour s’adresser à elle. Pour
piloter une application, on rédige un script qui utilise ces termes, qu’on
1
Pour consulter directement la version html de ASLG, vous pouvez cliquer ici.
Guide de programmation
67
encapsule entre un tell application "..." et un end tell2 .
Exemple 70
tell application "[nom de l’application]"
...
end tell
AppleScript permet de piloter une application distante à condition de
connaı̂tre l’adresse IP ou le nom “Rendezvous” de la machine distante.
Si vous n’indiquez pas l’identifiant et le mot de passe, un dialogue vous
proposera de les fournir.
Exemples 71
tell application "Smile" of machine
"eppc ://userid :[email protected] :3031/"
...
end tell
tell application "Smile" of machine
"eppc ://userid :[email protected]/"
...
end tell
Pour ouvrir le dictionnaire d’une application assurez-vous qu’elle soit
lancée puis sélectionnez-la dans le menu File > Open dictionary.
Pour ouvrir le dictionnaire de Smile sélectionnez Smile > Dictionnaire
de Smile.
– AppleScript vous permet de piloter une grande partie du système d’exploitation par l’intermédiaire des Scripting additions.
– Grande nouveauté du MacOS X, AppleScript vous permet de piloter la
couche UNIX par l’intermédiaire de la commande do shell script.
Exécuter la ligne do shell script theCommand dans AppleScript est
équivalent à exécuter dans Terminal la chaı̂ne de caractères contenue
dans la variable theCommand.
La syntaxe d’AppleScript
– il est fortement recommandé de se référer à ASLG (voir Section A.2)
aussi souvent que nécessaire.
Certaines informations sont également présentées dans la AppleScript
2
Quand un script est lancé dans Smile, le tell application "Smile" est implicite.
68
Suite du dictionnaire AppleScript d’AppleScript lui-même3 .
Sélectionnez Fichier > Ouvrir un dictionnaire > AppleScript. Vous
trouverez là un rappel sur les types (classes) de base d’AppleScript
ainsi que sur les opérateurs — y compris les opérateurs arithmétiques.
– comme vous le comprendrez rapidement au moyen des exemples, on
assigne une valeur à une variable au moyen du verbe set. Le verbe
“réciproque” get est souvent optionnel — mais il est parfois indispensable pour forcer AppleScript à évaluer une référence. En effet,
reference fait partie des types de base qu’AppleScript sait manipuler.
Exemple 72
set theTop to item 1 of (get bounds of window 1)
Dans le cas où une variable est d’un type complexe tel que list,
record, date, il faut utiliser copy pour créer une copie du contenu
de la variable, alors que set se contentera de faire une copie de la
référence à un même contenu.
Exemple 73
set theList to {1, 2}
set theNewRef to theList
copy theList to theNewList
set item 1 of theList to 0
-- theNewRef : {0, 2}
-- theNewList : {1, 2}
– pour adresser une instruction ou une série d’instructions à une application spécifique, encapsulez-les dans une structure tell.
Exemple 74
tell application "Finder"
set theList to selection
duplicate theList
end tell
Ceci ne s’applique qu’aux applications : pour faire appel à un
Complément de pilotage possédant l’extension .osax, aucun tell n’est
nécessaire.
3
La AppleScript Suite du dictionnaire d’AppleScript dictionary n’est pas à proprement parler une documentation officielle, il faut plutôt l’utiliser comme une aide d’appoint.
Les applications n’implémentent pas nécessairement cette suite entière.
Guide de programmation
69
Pour s’adresser à une application située sur une machine distante, utilisez le protocole eppc, soit avec l’adresse IP, soit avec le nom “Rendezvous” de la machine (celui-ci doit se terminer par .local).
Exemple 75
tell application "Smile" of machine "eppc :10.0.1.23"
tell dialog "Calculs" to DoCompute(some data)
end tell
Ici on s’adresse à un objet (le dialog "Calculs") qui appartient à
l’application distante.
– interceptez les erreurs d’exécution à l’aide de la structure try .. end
try structure.
Exemple 76
try
set f to alias somePath
-- instructions à exécuter si le fichier existe
on error -- le fichier n’existe pas
-- instructions à exécuter pour gérer l’erreur
end try
Le pilotage d’objets avec AppleScript
Par quel moyen AppleScript permet-il de piloter les applications ? Ouvrons le dictionnaire d’une application, par exemple celui du Finder. Le dictionnaire présente les définitions de quelques commandes de base (des verbes)
ainsi que la description complète de classes d’objets. Le pilotage d’une application s’effectue en manipulant les objets de cette application4 .
Dans l’exemple ci-dessous le script s’adresse à un type d’objet spécifique au
Finder, les process.
Exemple 77
tell application "Finder" to get name of every process
Un objet possède une liste de propriétés et éventuellement des éléments.
Une propriété est un champ pouvant contenir une valeur, par exemple le nom
4
Apple insiste sur le fait que, à l’inverse des “langages de macro” qui s’adressent à
l’interface de l’application — menus, boutons —, AppleScript s’adresse directement aux
objets même de l’application, ce qui permet de la piloter de façon plus puissante.
70
name de l’objet. Les éléments d’un objet sont d’autres objets qu’il est susceptible de contenir. La liste des propriétés (properties) d’un objet, ainsi que
les classes des objets qu’il peut accepter comme elements, sont renseignées
dans le dictionnaire.
La manipulation d’un objet s’effectue à l’aide de la famille des quatre
verbes élémentaires suivants.
make new : crée un nouvel objet de la classe indiquée, et retourne une
référence au nouvel objet.
Exemple 78
set theWindow to make new graphic window
La fenêtre graphique est créée au premier niveau, elle appartient directement à l’application.
Pour créer un objet comme élément d’un objet existant (son conteneur,
dont une référence est stockée dans la propriété container) il faut utiliser le paramètre optionnel at.
Exemple 79
set thePlot to make new plot view at theWindow
set theCurve to make new curve at thePlot
delete : supprime l’objet dont la référence est passée à delete. Aucune
modification ne sera enregistrée.
Exemple 80
delete theCurve
set : modifie la valeur d’une propriété d’un objet.
Exemple 81
set name of thePlot to "2 * x"
get : lit la valeur d’une propriété d’un objet.
Exemple 82
set theBounds to (get bounds of thePlot)
Obtenir la référence d’un objet
Pour faire référence à un objet, si on n’a pas conservé cette référence
dans une variable, il faut connaı̂tre son type (class) et, soit son nom soit
son index.
Exemples 83
Guide de programmation
71
set theWind to graphic window 1
set theWind to graphic window "untitled"
Pour faire référence à un objet contenu dans un autre, il faut utiliser of
pour parcourir la hiérarchie à laquelle il appartient, et dont l’application est
implicitement la racine.
Exemple 84
set theCurve to curve 3 of plot view "Températures" of
theWind
C’est ce qui permettra, par exemple de modifier une propriété de l’objet :
Exemple 85
set theCurve to curve 3 of plot view 1 of graphic window
"untitled"
set pattern style of theCurve to 8
A.3
Ce qu’il y a à savoir concernant Smile
Smile, qu’est-ce que c’est ?
Smile est un environnement de développement qui offre un accès amélioré
et à plusieurs niveaux à AppleScript. Avec AppleScript, langage moderne et
abstrait et dont la syntaxe s’inspire de l’Anglais, cette extension du langage
se fait de façon simple et naturelle.
Smile permet aussi bien d’exécuter une instruction à la volée que de
construire des solutions autonomes complètement automatisées et dotées
d’une interface utilisateur conviviale.
En effet Smile contient un environnement de développement et de debug de scripts (essentiellement basé sur l’interpréteur implémenté dans les
fenêtres de texte), il contient un éditeur de texte — Smile contient une
implémentation des Regular Expressions — il contient un éditeur (et le moteur d’exécution) d’interfaces graphiques scriptées, ainsi qu’une bibliothèque
graphique de génération de PDF. Et surtout, Smile est entièrement scriptable
— c’est ce qui le rend complètement automatisable.
La documentation sur Smile
Pour consulter rapidement les notions de base sur Smile, sélectionnez
Aide > Aide Smile. Vous trouverez là une présentation abrégée des bases à
72
connaı̂tre pour démarrer sur Smile.
La documentation complète sur Smile est incluse dans le téléchargement.
Elle est également disponible sur le site de Satimage-software (URL :
http
://www.satimage-software.com/fr/downloads documentation.html)
sous forme de plusieurs fascicules au format PDF, ce qui permet une lecture
sélective.
Notre conseil est le suivant.
1. lisez attentivement Smile-Prise en main.pdf, un document qui
présente brièvement les concepts fondamentaux avec lesquels vous devez être familier.
2. quand vous aborderez une utilisation plus experte de Smile, notamment
quand vous créerez des interfaces personnalisés, vous devez scripter
Smile : référez-vous alors à chaque fois que c’est nécessaire au document
Smile-GUI editor.pdf (non traduit à l’heure où nous écrivons).
3. sur les aspects spécifiques propres à la bibliothèque graphique de
génération de PDFs, utilisez Smile-Dessiner par script.pdf.
4. enfin, les fonctions propres à Satimage.osax, notamment les Regular
Expressions, sont documentées dans Satimage osax.pdf (non traduit à
l’heure où nous écrivons).
Guide résumé de Smile
A savoir absolument concernant l’environnement Smile pour pouvoir
démarrer rapidement sur Smile :
1. pour ouvrir le dictionnaire de Smile, sélectionnez Smile > Dictionnaire
de Smile
2. quand vous appuyez sur la touche Enter dans une fenêtre de texte5 , la
ligne courante ou bien la ou les lignes sélectionnées sont exécutées (ou
compilées, si par exemple le bloc ne contient que des procédures) à la
volée
3. les variables et les procédures créées ou compilées à la volée dans une
fenêtre de texte comme indiqué ci-dessus sont persistantes : vous pouvez
les ré-utiliser plus tard, dans la même fenêtre ou dans une autre, jusqu’à
5
Les “fenêtres de texte” (text window) sont blanches. Si votre fenêtre possède un fond
coloré, vous avez créé une “fenêtre de script” (script window).
Guide de programmation
73
ce que vous quittiez Smile.
Exemple d’une variable persistante :
Sélectionnez Fichier > Nouveau texte
Tapez dans la nouvelle fenêtre :
set x to 2
Appuyez sur la touche Enter.
Allez à la ligne puis tapez :
beep x
puis appuyez sur Enter. Comme vous le voyez, la variable x
est restée définie.
Exemple d’une procédure persistante :
Sélectionnez Fichier > Nouveau texte
Tapez dans la nouvelle fenêtre :
on AskOK()
display dialog "OK ?"
end AskOK
Sélectionnez le text entier puis appuyez sur Enter.
Allez à la ligne puis tapez :
AskOK()
puis appuyez sur Enter. Comme vous le voyez, la procédure
AskOK est restée définie, vous pourrez l’utiliser jusqu’à ce que
vous quittiez Smile.
4. la combinaison cmd-shift-F, utilisée après avoir sélectionné un terme
AppleScript (un verbe, le nom d’une classe ou le nom d’une procédure),
ouvre le dictionnaire ou la bibliothèque auquel le terme appartient et
dans lequel il est documenté. C’est la façon la plus rapide d’obtenir des
renseignements sur un terme donné.

Documents pareils