Composition d'applet JavaSketchpad

Syntaxe

La syntaxe du compilateur en ligne est légèrement différente de celle de JavaSketchpad, pour éviter l'inconvénient du numérotage absolu des éléments.
Pour plus de détail sur JavaSketchpad®, ou une interface graphique, se référer au site de JavaSketchpad.
Voir aussi des
Ce compilateur ne remplace pas JavaSketchpad, il en est un complément pour faciliter l'écriture manuelle des scripts.

Chaque ligne du source est soit
{commentaires} soit
{id} Entité (paramètres...)[options];
en gras, partie obligatoire

id est un commentaire pour JavaSketchpad, ici c'est un nom pour l'élément généré.
Caractères autorisés a-z A-Z 0-9 _ @ § # $ % & ~ | ! ? = : / ^ * + . - et espaces dans le nom (ignorés avant et après le nom)
Illégaux < > ( ) [ ] { } , ; \ '  " lettres accentuées et assimilés (ç €)
Les chiffres et espaces sont ignorés avant l'id, {24 T} est équivallent à {T} de même {24T} sans espace est {T} (compatibilité avec des scripts existants)
En l'absence d'id (que des chiffres et espaces) un id est généré automatiquement sous la forme "typennn", ou la valeur de label si elle existe, et le source est modifié (partout) en conséquence.
La syntaxe de Declic est aussi acceptée :
{id} {#num} Entité (paramètres...)[options];
Si id commence par # (symbole d'éléments intermédiaires de Declic), il est numéroté pour avoir un id unique.
(cette numérotation n'a lieu que pour une syntaxe Declic, sinon # est un caractère normal)

Les options... optionnelles sont séparées par des virgules et le tout entre [ ]

Par exemple :
{ ma construction }
{A} Point (200,300);
{B} Point (300,300)[label('B''')];
{AB} Segment (A,B)[yellow,layer(5)];
...
{C} Circle (D,E);
...
Intersect1 (AB,C);
Nota : dans les labels comme dans les autres champs textes un ' se code ' ', le " étant interdit utiliser ' ' ' '

Exemple :
{B!} Point (300,300)[label('B''')]; pour un point affiché B'
Noter que l'id B' étant interdit, il a été noté B!

On peut 'importer' par copier-coller des "Construction value" existantes, non symboliques, le compilateur se chargeant de générer des symboles.
Inversement, la seule façon de sauver son travail est de copier-coller le champ source ou le champ construction value vers un fichier texte.
Pour insérer la construction dans une page Web, cela se fait dans la balise <applet<> de la page
Seul le 'construction value' peut être fourni à l'applet, un texte source est pour l'applet incompréhensible

Plutôt que tout taper à la main, des boites de sélection permettent d'ajouter/modifier la dernière ligne seulement de la construction.

Les options les plus utilisées sont aussi insérées par quelques boutons de raccourcis pour :
label(), hidden, layer(), thick et les valeurs π/2 et π/3

Macros

Les macros sont définies dans la liste déroulante correspondante.
Cette liste peut être éditée par les boutons Add, Del, Edit au dessous
Seules les macros de la boite "macros" sont concernées. Les "macros d'expression" pour Calculate et Function comme min(A,B) = "AB+AB-@abs_-2/" ne sont pas éditables et on ne peut pas en créer.
Une macro est une construction normale que l'on peut tester à part dans une figure normale.
La seule différence est qu'au moment de l'insertion d'une macro, certains symboles sont remplacés :

Les symboles commençant par $ sont des paramètres, demandés lors de l'insertion par une boite de dialogue
Il doivent être déclarés dans la macro comme tels par une ligne :
{ $A='invite pour A', $X='invite pour X' .. }
Sinon le $ est un caractère ordinaire, les symboles ne sont pas substitués par une valeur qui n'est pas demandée !!

Les symboles commençant par % sont des symboles propres à la macro
Ils sont rendus uniques lors de l'insertion par ajout du numéro de macro dans la construction.
Sinon en dehors de l'insertion d'une macro, ces $ et % sont des caractères ordinaires.

Quelques macro sont prédéfinies à l'initialisation, plus à titre d'exemples.
La liste est réinitialisée si on recharge la page, toutes les macros personnelles créés ou modifiées sont perdues.
Les actions demandées (Add, Del, Edit) sont abandonnées si on fait autre chose.

Insertion d'une macro dans la construction

Directement en sélectionnant une macro, celle-ci est alors ajoutée à la fin de la construction en cours, comme n'importe quel élément simple.
Si la macro comporte des paramètres, ($), une boite de dialogue demande de saisir la valeur de ces paramètres sous forme d'une liste de noms d'objets existants ou de valeurs, séparés par des virgules.

Création d'une macro

Le bouton Add fait surgir une fenètre d'édition de macro
Le nom est obligatoire et doit être court. C'est lui qui apparaitra dans la boite de sélection de macros.
Il est tronqué manu militari à 16 caractères (trop long il déformerait la boite de sélection de macros !)
Ce nom doit être unique, sinon le programme propose de remplacer la macro de même nom.

Le source de la macro est à saisir manuellement (pas de possibilité d'utiliser les boites de sélection, qui sont sur une autre fenêtre !
On peut toutefois copier-coller une construction composée et testée de la fenêtre principale. (source)

Une macro avec paramètres ($..) doit comporter une ligne de commentaire définissant les invites correspondantes
Ces invites seront les textes utilisés dans la boite de dialogue lors de l'insertion de la macro.

Par exemple

{ conjugué de $m/($a,$b) }
{ $a='A', $b='B', $m='M' }
{%r} Ratio/Points ($m,$b,$a,0,0,' ')[hidden];
{%s} Calculate (0,0,' ','A1+@sgn_@abs_1-@sqrtA+2*A1+/')(%r)[hidden];
{%N} Dilation/MarkedRatio ($b,$m,%s);

Les paramètres sont $a, $b et $m
Des objets intermédiaires %r, %s et le résultat %N sont crées

Lors de l'insertion de la macro, les invites 'A', 'B', 'M' sont utilisées lorsque le programmme demande les noms des objets réels dans la boite de dialogue
Ces alias peuvent être descriptifs, par exemple : { $a='Extrémité', $b='Centre', $m='Point courant' }
C'est juste du texte pour la boite de dialogue.

La macro générée est alors, si on répond "P, Q, R" :

{ conjugué de R/(P,Q) }
{%15r} Ratio/Points (R,Q,P,0,0,' ')[hidden];
{%15s} Calculate (0,0,' ','A1+@sgn_@abs_1-@sqrtA+2*A1+/')(%15r)[hidden];
{%15N} Dilation/MarkedRatio (Q,R,%15s);

Les paramètres $a, $b et $m ont été remplacés partout par P, Q et R respectivement
%r, %s et %N ont été numérotés en %nnnr, %nnns et %nnnN où nnn est le rang d'appel de la macro dans la construction, pour avoir un id unique.

Expressions arithmétiques
Les paramètres d'une macro peuvent être utilisés s'ils sont numérique dans des expressions arithmétiques
Une telle expression est notée entre « ». Exemple :

{%xgrid} Locus (%XX,%yg,%YY, «abs(ceil($Ymax) - floor($Ymin))*5 + 1»);
Les paramètres $Ymax et $Ymin sont utilisés pour calculer le nombre de points du Locus
Lors de l'insertion de cette macro, si on a répondu -2.5, 5.7 à l'invite pour $Ymin et $Ymax la ligne (statique) générée est

{%5xgrid} Locus (%5XX,%5yg,%5YY, 46);
exécution du calcul : abs(ceil(5.7) - floor(-2.5))*5 + 1 = 46, puisque ceil(5.7) = 6 et floor(-2.5) = -3
Le 5 est le numéro de macro dans la construction (par exemple), comme d'hab pour les symboles avec %

Ces caractères « » "bizarre" pas sur le clavier sont insérés automatiquement par le bouton correspondant, à l'emplacement du curseur.
La syntaxe des expressions est celles de JavaScript.Math (voir doc de JavaScript)
C'est à dire essentiellement :
Opérations + - * / et parenthèses, % (modulo, ne pas confondre avec le % utilisé dans les noms d'entités !)
Fonctions mathématiques abs(), floor(), ceil(), max( , ), min( , ), cos(), sqrt(), etc, les valeurs PI, E etc
Le - unaire
Le résultat est sensé être une valeur numérique
Ces expressions sont donc exclusivement à utiliser dans ce contexte
Il faut ajouter des parenthèses ou des espaces si les paramètres peuvent avoir des valeurs négatives :
«$A-$B» provoque une erreur si $B est négatif car est traduit dans un premier temps en 1--2 et erreur JavaScript
«$A-($B)» est OK : traduit en 1-(-2) = 3
«$A - $B» est aussi OK : traduit en 1 - -2) = 3

Nota : Les erreurs sont reportées directement par JavaScript et pas par le compilateur.

Edition d'une macro

Pour éditer une macro, cliquer sur Edit, puis sélectionner la macro à éditer dans la boite de sélection de macros.
La fenêtre d'édition de macro surgit si elle n'est pas déja là et permet de modifier la macro
Cliquer sur OK pour enregistrer la modification.
Même les macros prédéfinies peuvent être modifiées et adaptées à vos besoins.

Si on sélectionne une autre macro dans la boite de sélection, c'est cette macro là qui est proposée à l'édition.
L'édition précédente est abandonnée.
Pour abandonner l'édition et pouvoir de nouveau insérer des macros, bouton Cancel, ou sélectionner n'importe quel élément autre qu'une macro.

Copie d'une macro

Pour créer une variante d'une macro existante :
Edit
Sélectionner la macro existante
Modifier, y compris le nom
Add
OK

Si on ne modifiait pas le nom il proposerait de remplacer la macro existante
Si on n'appuyait pas sur Add, il modifierait direct la macro existante (on a demandé un Edit !), même avec un nouveau nom : changement du nom de la macro éditée.

Suppression d'une macro

Cliquer sur Del et sélectionner la macro à effacer dans la boite de sélection de macros

Sauvegarde des macro

Comme pour les constructions, les macros ne peuvent être sauvegardées que manuellement, une par une, via la fenêtre d'édition de macro et un copier coller vers un fichier texte.

Version de JavaSketchpad

Le compilateur génère par défaut une applet pour la version 5 de JavaSketchpad (jsp5), la plus récente.
Sinon on peut utiliser la version 4 (jsp4)
Le choix de la version utilisée étant fait par une case à cocher dans le compilateur.
A noter que la version 4 est obsolète et n'est plus disponible auprès du site officiel.
L'inconvénient de la version 5 est les points horribles (trop gros), et l'antialiasing non débrayable
Sinon, bien évidemment la version la plus récente (jsp5) est recommandée !

Entités JavaSketchpad

(en rouge les nouvelles fonctions jsp5)

Point (numx, numx)     Coin supérieur gauche = (0,0)
FixedPoint (numx, numy)
Midpoint (segment)
Point on object (straight|circle|polygon, num)
Intersect (straight, straight)
Intersect1 (straight|circle, circle)
Intersect2 (straight|circle, circle)

Segment (pointB, pointA)    Orientées A→ B
Ray (pointB, pointA)
Line (pointB, pointA)
Perpendicular (straight, point)    (Rotation -π/2)
Parallel (straight, point)
Bisector (pointA, center, pointB)      (génère un Ray d'origine center)

Circle (center, point)
Circle by radius (center, dist|calc)
Circle interior (circle)
Polygon (point, point, point ...)

Reflection (obj, straight)
Dilation (obj, point, num)
Dilation/SegmentRatio (obj, center, segmentN, segmentD)     segmentN/segmentD2
Dilation/3PtRatio (obj, center, pointA, pointD, pointN)     AN/AD !! inverse de SegmentRatio
Dilation/MarkedRatio (obj, center, ratio|calc)
Rotation (obj, center, num)
Rotation/MarkedAngle (obj, center, pointA, pointO, pointB)     angle (OA,OB)
Rotation/MeasuredAngle (obj, center, angle|calc)
Translation (obj, deltax, deltay)     deltay > vers le haut
VectorTranslation (obj, pointA, pointB) A→B
Translation/FixedAngle/MarkedDistance (obj, dist|calc, num)
Translation/MarkedAngle/FixedDistance (obj, angle|calc, num)
Translation/MarkedAngle/MarkedDistance (obj, angle|calc, dist|calc)
Locus (point|straight, freepoint, path, num)

Colorized_Spectrum (obj, measure, min, max, 0/1/2) (0 = entre min-max, 1 = repeat, 2 allers-retours)
Colorized_Grayscale (obj, measure, min, max, 0/1/2)
Colorized_RGB (obj, measR, measV, measB, min, max, 0/1/2)
Colorized_HSV (obj, measH, measS, measV, min, max, 0/1/2)

Length (segment, numX, numY, string)
Angle (pointA, pointO, pointB, numX, numY, string)     angle (OA,OB)
Perimeter (polygon, numX, numY, string)
Circumference (circle, numX, numY, string)
Radius (circle, numX, numY, string)
Area (circle|polygon, numX, numY, string)
Slope (straight, numX, numY, string)      pente (tanα)
Distance (pointA, pointB, numX, numY, string)
Ratio/Segments (segmentN, segmentD, numX, numY, string)     segmentN/segmentD
Ratio/Points (pointO, pointD, pointN, numX, numY, string)     ON/OD !! inverse de Ratio/Segments
Calculate (numX, numY, prefixStr, exprStr)(measureA, ..., measureZ)
    + - / * ^ ! A-Z num, notation polonaise inversée. num doit être ≥0 (pas de - unaire)
    @sin_ @cos_ @tan_ @abs_ @sqrt @ln__ @rond @trnc @sgn_ @asin @acos @atan @log_
    @fx avec x = [A-Z]
Function (numX, numY, prefixStr, exprStr)(measureA, ..., measureZ)
    exprStr contenant la variable 'x' muette en plus des paramètres A..Z

ShowButton (numX, numY, string)(obj1, obj2 ... objN)
HideButton (numX, numY, string)(obj1, obj2 ... objN)
ToggleVisibilityButton (X, Y, 'off|on')(obj1, ... objN)
MoveButton (numX, numY, speed, string)(point1a, point1b, point2a, point2b ... pointNa, pointNb)     pointXb → pointXa (!!!)
AnimateButton (numX, numY, string)(point1, path1, point2, path2 ... pointN, pathN)     pathX=straight|circle|polygon
    (num1, num2 ... numN)     liste de vitesses
    (flag1_1, flag1_2 ... flag1_N)     0=infini, 1=une seule fois
    (flag2_1, flag2_2 ... flag2_N)     0=trigonométrique|aller-retour, 1=horaire|aller
SimultaneousButton (numX, numY, string)(button1, button2 ... buttonN)

FixedText (numX, numY, string)
PeggedText (point, caption|measure)
ConcatText (numX, numY)(caption|measure1, caption|measure2 ... caption|measureN)

Image (numX, numY, urlstring)     affiche une image, url dans le répertoire (codebase) de JavaSketchpad
ImageOnPoint (point, urlstring)
ImageBetweenPoints (PntA, PntB, urlstring)     redimensionne l'image dans le rectangle contenant les deux points

Origin&Unit (origin, unitpoint)     définit un système de coordonnés (grille)
CoordSysByAxes (axeX, axeY)
UnitCircle (circle)     idem à partir d'un cercle
UnitPoint (origine , num)     définit un point 'unité' draggable
AxisX (coord)     trace l'axe Ox
AxisY (coord)     trace l'axe Oy les points 0 et 1 de ces axes ne sont pas net (-200, +200 pixels !)
PlotXY (MesureX, coord, MesureY)     affiche le point de coordonnées (X,Y)
PlotFixedXY (coords, X, Y)
FunctionPlot (func, coord, num, min, max, 0/1/2/3)     coord doit être un CoordSysByAxes un Origin&Unit ne marche pas.
         0 : y = f(x), 1 : x = f(y), 2 : r = f(theta), 3 : theta = f(r).
Coordinates (Point, coord, numX, numY, string)     mesure des coordonnées du point
   #XY dans un calculate Y = 1 abscisse de l'élément X, Y = 2 ordonnée de l'élément X
Abscissa (Pnt, coord, X, Y, 'str')
Ordinate (Pnt, coord, X, Y, 'str')
CoordinateDistance (Pnt, Pnt, coord, X, Y, 'str')

Options

hidden
layer(n)
color(r,g,b)
traced (points, droites et cercles)
    Points seulement :
label('str')
dot
small
mediumPoint
large
    Lignes (droites cercle etc) seulement :
thick
hairline
thin
mediumLine
dashed
dotted
solid
    textes :
font('str')
size(n)
plain
bold
italic
justifyLeft
justifyRight
justifyCenter
    boutons :
auto
image('url.gif')
    mesures et calculs :
suffix('str')
digits(n)

Balise <applet>

Bien que non recomandée par le W3C, la balise <applet> est la seule manière efficace de lancer .. une applet Java.
La méthode "recomandée" via des <object> et <embed> imbriqués est horrible et impraticable car tous les paramètres doivent être dupliqués !! Et la syntaxe dépend du navigateur !!

Le format de cette balise est, pour JavaSketchpad :

<applet code="GSP.class" codebase="../jsp" archive="jsp5.jar" width="800" height="450"> 
<param name=Frame value=0>
<param name=BackRed value=255>
<param name=BackGreen value=255>
<param name=BackBlue value=221>
<param name=MeasureInDegrees value=1>
... autres paramètres d'applet ..
<param name=Construction value="
{1 O} Point (90,350)[blue,label('(d)')];
{2 §x} Translation (1,200,0)[hidden];
{3 §Ko} Circle (1,2)[hidden];
{4 x} Point on object (3,0)[blue];
...
"> 
Texte alternatif affiché si Java ne fonctionne pas.
</applet>
code doit être obligatoirement "GSP.class" (point d'entrée dans l'applet)
codebase est le chemin du répertoire du site contenant le ficher jsp*.jar
archive est le nom du fichier de JavaSketchpad jsp4.jar ou jsp5.jar
Et aussi des paramètres HTML "standard" (width, style etc..)

Les paramètres d'applet <param name=... value=...> sont transmis à l'applet
Voir la doc du site de JavaSketchpad pour une description détaillée des divers paramètres possibles
Les plus importants sont :

Frame
0/1 définit la présence d'un cadre autour de l'applet
BackRed
BackGreen
BackBlue
définissent la couleur de fond (0-255 pour chaque composante)
MeasureInDegrees
Les mesures se font en degré sinon en radian (radians par défaut)
A noter que tous les angles sont par ailleurs en radian.
Si les mesures sont en degrés, il faut les reconvertir (par un Calculate) en radians pour les utiliser au sein de la construction
Inversement si les mesures sont en radians il faut les convertir en degrés explicitement (par un Calculate) pour les afficher en degré.
DirectedAngles
0/1, définit si les angles sont signés (signés par défaut)
LabelFont
ActionFont
MeasureFont
Police par défaut pour les label : "TimesRoman", "Helvetica", "Courier" etc (une police Java)
LabelSize
LabelBold
LabelItalic etc
0/1, et de même pour Action et Measure
Digits
(jsp5) Précision d'affichage en digits après la virgule. 3 par défaut

Restrictions

Commentaires sur une seule ligne, pas de commentaires dans une ligne, à part le champ {id}.

La seule image disponible est 'url.gif' et les boutons 'img/*.bmp'
imglab.bmp=, imghid.bmp=, imgthick.bmp=, imglay.bmp=, imgpi2.bmp=, imgpi3.bmp=,
Car toutes les images doivent être dans le répertoire défini par "codebase" de l'applet, contenant le fichier jsp*.jar, ou un sous répertoire.

Installation locale

dir/mathie.css      (feuilles de style css)
dir/math.css         "
dir/exe/genapp.html (l'interface html du compilateur)
dir/exe/colors.html (la page html de palette)
dir/exe/macro.html  (la page html d'édition de macro)
dir/exe_en/genapp.html   idem en anglais
dir/exe_en/colors.html   "
dir/exe_en/macro.html    "
dir/jsp/jspc.js     (le Javascript du compilateur
dir/jsp/colors.jar  (l'applet Java de palette)
dir/jsp/jsp5.jar    (l'applet Java de JavaSketchpad, à extraire depuis le site de JavaSketchpad
dir/jsp/jsp4.jar    (l'ancienne version, plus disponible ailleurs)
dir/jsp/url.gif     (Image de test.)
dir/imgc/*.gif|bmp  (Icones du menu.)

Puis lancer le compilateur par dir/exe/genapp.html
Il s'agit d'une version "stand alone" du compilateur (menus réduits etc.)
Il ne contient pas les fichiers d'exemples qui restent à l'adresse de mon site.

JavaSketchpad® est la propriété de Key Curriculum Press Inc.