Différences entre versions de « Tutoriel:Scripts AutoValidation »

De GeoGebra Manual
Aller à : navigation, rechercher
m (Remplacement du texte — « tube.geogebra.org » par « www.geogebra.org »)
 
(Aucune différence)

Version actuelle datée du 12 mai 2016 à 01:29

Scripts écrits dans l'onglet Script > Javascript Global

en effet, ils font appel à la fonction ggbOnInit appelée au lancement du fichier ; après toute modification du script, sauvegarder le fichier, fermer le, puis l'ouvrir à nouveau afin de pouvoir tester la pertinence de vos modifications.

Script 1

"LE SCRIPT" de référence

rudimentaire : on nomme, dans le fichier GeoGebra, 'cible' l'objet attendu.

repris ici : Construction auto-validée Tâche : En utilisant les outils présents dans la barre d'outils, construire le milieu du segment [AB]. (A et B étant deux points 3D)

Script Commentaire
function ggbOnInit() { Cette fonction va être exécutée au lancement du fichier GGb
ggbApplet.debug("ggbOnInit"); (facultatif, "gérer" les erreurs)
ggbApplet.registerAddListener("NouvObj"); C'est le point clé !! Création d'un "mouchard", qui, à chaque création de nouvel objet, va appeler la procédure NouvObj
} Fin de ggbOnInit
   
function NouvObj (obj) { Début de la procédure qui va être exécutée à chaque création d'un nouvel objet
if (obj != "fini") { Chaque fois qu'elle est exécutée, la procédure crée un booléen nommé 'fini', il ne faut donc pas qu'elle soit exécutée pour l'objet 'fini', sinon elle tournerait en rond sur cet objet !
var cmd = "fini = ("+obj+"== cible)"; Définition de la commande qui va définir le booléen 'fini' testant si le nouvel objet est égal à l'objet 'cible' attendu
ggbApplet.debug(cmd);  
ggbApplet.evalCommand(cmd); Exécution de la commande
fini = ggbApplet.getValueString("fini"); Lecture de la valeur du booléen 'fini'
if (fini.indexOf("true") > -1) { on teste si 'true' est présent dans 'fini'
alert("C'est bien !"); Si oui, un "pop-up" à destination de l'élève
} Fin du "if" sur 'fini'
} Fin de la partie de procédure exécutée pour un nouvel objet différent de 'fini'
} Fin de la procédure 'NouvObj'





Script 2

Une variante avec, toujours 1 cible, mais pouvant avoir 2 "natures" différentes : par exemple, si on attend une bissectrice d'angle (sans avoir été plus directif dans l'énoncé), que soit construite une demi-droite ou une droite, la réponse doit être validée.
Définir dans le fichier GGb une 'cible1', la droite bissectrice et une 'cible 2', la demi-droite bissectrice.

ici : Construction auto-validée bissectrice Tâche : En utilisant uniquement les outils proposés, construire la bissectrice de l'angle \hat{ABC}.


function ggbOnInit() {    
ggbApplet.debug("ggbOnInit");
ggbApplet.registerAddListener("NouvObj");
}
function NouvObj (obj) {
if (obj != "fini") {
var cmd = "fini = ("+obj+"== cible1 || "+obj+"== cible2 )"; Écriture de la commande qui va définir le booléen 'fini' testant si le nouvel objet est égal à l'un ou l'autre des objets 'cible1' ou 'cible2' attendu. (la double barre || obtenue par 2 pressions successives sur AltGr + 6 est le OU logique en js.)


ggbApplet.debug(cmd); 
ggbApplet.evalCommand(cmd);
fini = ggbApplet.getValueString("fini");
if (fini.indexOf("true") > -1) {
alert("C'est bien !"); 
}
}
}

Script 3

On reprend le "même", mais sans définir au préalable de cible
et en ne poursuivant une action que pour un nouvel objet d'un type donné, ici : un point.

ici : Const. auto-valid Pts équidistants de deux droites sécantes Tâche : En utilisant uniquement les outils proposés, placer des points équidistants des droites (AB) et (BC).

function ggbOnInit() {    
ggbApplet.debug("ggbOnInit");
ggbApplet.registerAddListener("NouvObj");
}
function NouvObj (obj) {
if (obj != "fini") {
type=ggbApplet.getObjectType(obj); On se pose la question du "type" du nouvel objet créé
if(type=="point"){ Les instructions suivantes ne seront exécutées que si le nouvel objet créé est un 'point
var cmd = "fini = (Distance["+obj+",c] ==Distance["+obj+",d] )"} La commande va tester si le point est à égale distance des 2 droites 'c' et 'd' qui ont été construites dans le fichier
ggbApplet.debug(cmd); 
ggbApplet.evalCommand(cmd);
fini = ggbApplet.getValueString("fini");
if (fini.indexOf("true") > -1) {
alert("En voici un !"); 
}
}
}

Script 4

On veut que 2 cibles soient, toutes les 2 !, atteintes. et, d'aucuns n'appréciant pas le if (obj != "fini") { du script "fondateur", en plus des 2 cibles : 'cible1' et 'cible2'
on crée 2 booléens : 'test1' et 'test2' (initialisés à 'false'|'0')

ici : Const. auto-valid des 2 bissectrices de 2 droites sécantes
(finalisé par Michel Iroir) Tâche : Construire les 2 droites bissectrices des angles associés aux droites construites.


function ggbOnInit() {    
ggbApplet.debug("ggbOnInit");
ggbApplet.registerAddListener("NouvObj");
}
function NouvObj (obj) { remarquer que la ligne suivante n'est plus if (obj != "fini") {
type=ggbApplet.getObjectType(obj); Pour reprendre ce qui a été introduit en 3) : On se pose la question du "type" du nouvel objet créé
if(type=="line"){ Les instructions suivantes ne seront exécutées que si le nouvel objet créé est une 'droite, line en anglais
test1 = ggbApplet.getValue("test1"); Lecture de la valeur actuelle du booléen 'test1' (0 au départ)
test2 = ggbApplet.getValue("test2"); idem pour 'test2'
cmd1="SetValue[test1,"+obj+"== cible1]"; Écriture de la commande qui, par la primitive SetValue, va laisser à 0, ou mettre à 1, si la 'cible1' est atteinte, le booléen 'test1'
cmd2="SetValue[test2 ,"+obj+"== cible2]"; idem pour 'test2'
if (test1 == 0) {ggbApplet.evalCommand(cmd1);}; Si 'test1' est à 0, c'est-à-dire que la 'cible1' n'a pas été précédemment atteinte, on teste si elle est atteint par le nouvel objet
if (test2 == 0) {ggbApplet.evalCommand(cmd2);}; .../...
} Fin de la partie de procédure exécutée pour un nouvel objet de type 'line'
} Fin de la procédure 'NouvObj'

Cela n'a rien à voir avec la structure de script, dans le présent fichier, le "alert" des exemples de scripts précédents a été remplacé par un texte défini dans le fichier,
avec pour "Propriétés > Avancé > Condition pour afficher l'objet" test1 & & test2 (la double esperluète & & est le ET logique en js.)

Scripts associés à un "bouton" de validation

Script 5

Une autre solution est d'utiliser le script suivant fonctionnant différemment (et qui présente des avantages et des inconvénients par rapport aux autres méthodes) : Créer un bouton "Vérifier" et lui associer le script suivant :

function c(name) {
var n = ggbApplet.getObjectNumber();
for (var i = 1;i<=n;i++) {
 var o = ggbApplet.getObjectName(i);
 if (o!=name && o!="eval" && o!="") {
  ggbApplet.evalCommand("eval = "+name+"=="+o);
  var r = ggbApplet.getValueString("eval");
  if(r.indexOf("true") > -1) {
   return true;
  }
  }
 }
 return false;
 }
 result = (c("A")&&c("B"))||c("C");
 ggbApplet.evalCommand("result = "+result);

Après chaque clic sur le bouton, la variable result vaudra true s'il existe deux objets égaux à A et à B OU s'il existe un objet égal à C.

© 2024 International GeoGebra Institute