Tutorial:AutoValidación de Guiones
Los siguientes guiones están escritos en la pestaña Guión > Javascript Global' En efecto, apelan a la función ggbOnInit para desencadenar el lanzamiento del archivo; después de cambiar la secuencia de comandos, se guarda el archivo, se lo cierra y, a continuación, se lo abre nuevamente para controlar la relevancia de los cambios realizados.
Guión 1
"El GUION" de referencia
Rudimentaria: llamada, en el archivo de GeoGebra, siendo el "objetivo", el objeto esperado. Se debe repetir aquí: Construcción auto-validada
Tarea: Utilizando las herramientas de la barra de herramientas, construir el punto medio del segmento [AB]. (Siendo A y B dos puntos 3D)
Guión | Comentario |
---|---|
function ggbOnInit() { | Esta función se ejecutará cuando el archivo GGB se inicie |
ggbApplet.debug("ggbOnInit"); | (Se lo habilita, de modo opcional, para "administrar" los errores) |
ggbApplet.registerAddListener("NuevoObj"); | ¡¡Esta es la clave!! Establecimiento de una "cookie", que, cada creación de nuevo objeto llamará al procedimiento NuevoObj |
} | Fin de ggbOnInit |
function NuevoObj (obj) { | Inicio del procedimiento que se llevará a cabo cada vez que se cree un nuevo objeto |
if (obj != "fini") { | Cada vez que se ejecuta, el procedimiento crea una booleana llamado, por lo que no debería ser ejecutada por el objeto 'concluida', sino, ¡sería un bucle ciclando sobre este objeto! |
var cmd = "fini = ("+obj+"== cible)"; | Definición del comando que establecerá la booleana 'concluida' que controla si el nuevo objeto es igual al "objetivo" esperado. |
ggbApplet.debug(cmd); | |
ggbApplet.evalCommand(cmd); | Ejecución del comando |
fini = ggbApplet.getValueString("concluida"); | Lectura del valor de la booleana 'concluida' |
if (fini.indexOf("true") > -1) { | Se controla si aparece un 'true' en la 'concluida' |
alert("C'est bien !"); | Si es así, se le asigna un "pop-up" al estudiante |
} | Fin del "si" respecto de la "concluida" |
} | Fin del procedimiento realizado por un nuevo objeto diferente de "concluida" |
} | Fin del procedimiento 'NuevoObj' |
Guión 2
Una variante, siempre con un objetivo, podría ser tener dos "tipos" diferentes: por ejemplo, si uno espera una bisectriz de un ángulo (sin ser demasiado directivo el enunciado), se construye como una semirrecta o una recta, la respuesta debe ser validada.
Definir en un archivo GGB un 'destino1', la bisectriz y el objetivo 2 ', la semirrecta bisectriz.
Tarea: Utilizando sólo las herramientas proporcionadas, construir la bisectriz del ángulo \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 distances 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.)