编写程式

来自GeoGebra Manual
跳转至: 导航搜索
Accessories dictionary.png
本页为官方文件,一般使用者无法修改,若有任何误谬,请与官方联络。如欲编辑,请至本页的开放版


GeoGebra 支援两种程式语言 - GGBScript 和 Javascript。我们可以在下列的事件中编写相对的触发程序:

  • 用鼠标点选某物件时 (On Click)
  • 某物件数值或属性变更时 (On Update, ...)
  • 开启 GeoGebra 档案时 (ggbOnInit)
  • Javascript 触发程序 (listener),详情请参考 JavaScript

我们可以透过物件属性视窗中的“程式”页面来编写程式码。

属性视窗的“程式”页

GGBScript

GGBScript 主要是用 GeoGebra 本身的指令来编写。

范例:
  • 假设 a 是一个范围从 1 到 3 的整数
  • 在命令列中输入以下的集合
    colors = {"red", "green", "blue"}
  • 进入 a属性中的“程式”页面,然后在“On Update”页面中输入:
    SetColor[a, Element[colors, a]]
  • 最后,调整 a 值就可以改变它的颜色
Note 提示: 有些指令只能用于 GGBScript 中,详情请参阅:GGBScript 指令
Note 提示: 有关颜色的名称与编码,请参阅:完整的颜色列表

JavaScript

JavaScript 是一种常用于网页中的程式语言。不像 GGBScript 只能依序执行一些 GeoGebra 指令而己,JavaScript 可以使用 ifwhilefor 等关键字来控制程式的流程。

Note 提示: 若想进一步了解 JavaScript 的语法,请参阅 developer.mozilla.org

我们也可以使用一些特别的 JavaScript 函数来作图,这些函数都是 ggbApplet 的物件方法,也就是说我们必须使用:ggbApplet.method(a, b, ...)这样的语法来呼叫这些函数才行。

Note 提示: 详细的函数说明,请参阅 ggbApplet 物件方法列表。


范例:

for(var i =0;i<10;i++) ggbApplet.evalCommand("A_"+i+"=(random()*10,random()*10)");

这段程式会画出 10 个点:A0A9,其座标均由乱数产生。

GeoGebra 拥有自己的 JavaScript 编译程式。当我们要将 GeoGebra 汇出网页时,我们可以选择要使用 GeoGebra 自己的编译程式还是浏览器的编译程式。如果你直接在 HTML 网页码中编辑 JavaScript 的话,记得要先执行:ggbApplet = document.applets[0]; 否则 ggbApplet 物件无法自行启动。

全域 JavaScript

GlobalJavascriptPanel.png

在“属性”视窗的“全域 JavaScript”页面中, 你可以编写一些 JavaScript 函数或作一些全域变数设定,GeoGebra 会在载入物件前,先执行这里的程式码。 “全域 JavaScript”页面不特属于任何物件,所以不管你打开哪个物件的属性视窗,都会看到这个页面。


你也可以在这里面定义 ggbOnInit() 函数,此函数会在 GeoGebra 载入所有物件后马上执行,因此我们常在这个函数中放入一些物件的相关触发程序(JavaScript listeners),下面就是一个例子:

范例:
function ggbOnInit(){
    // 當有物件新增(如新增一個點或一條線等)時,就會觸發 onAdd() 函數。
    ggbApplet.registerAddListener("onAdd");
}

function onAdd(objName){
    alert("物件:"+objName+" 已新增!");
}

首先,我们在系统内定的 ggbOnInit() 函数中利用 registerAddListener() 函数指定了一个“新增物件”的触发程序,这行指令告诉系统:只要有物件新增了,就启动 onAdd() 函数,系统同时会将新增物件的名称丢给这个函数(也就是范例中的 objName,这个名称不是关键字,你也可以用 name、obj 或其他变数名称都可以),以方便后续的处理。

onAdd() 函数是使用者自订的,所以你也可以将函数名称改为 doSomething(),或其他名称。

当我们写好了这段程式,然后将档案存档再重新开启,系统就会载入 ggbOnInit() 函数。之后,假设我们新增了一点 A,onAdd() 函数就会执行,然后显示出“物件:A 已新增!”的讯息。

除了指定“新增物件”的触发程序外,我们也可以指定诸如“改名”、“删除”、“清除全部物件”等等事件的触发程序,完整的说明请看这里

Note 提示: JavaScript 函数的启动顺序如下:

全域 JavaScript(ggbOnInit 除外)⇨ 载入物件 ⇨ ggbOnInit() 函数

因此请勿在全域 JavaScript 中直接呼叫 ggbApplet 的物件方法,因为在 GeoGebra 尚未载入物件完成前,ggbApplet 物件根本就还没产生,所以也没办法呼叫它。


范例: 当 GeoGebra 中有物件新增、变更、或删除时,将其状态显示于其他网页元件上。

以下为此网页的 JavaScript 程式部分:

<script type="text/javascript">

function ggbOnInit() {
  // 指定「新增物件、刪除物件、變更名稱、清除繪圖區、物件更新」等事件的觸發程序。
  var applet = document.ggbApplet;
  applet.registerAddListener("addListener");
  applet.registerRemoveListener("removeListener");
  applet.registerRenameListener("renameListener");
  applet.registerClearListener("clearListener");
  applet.registerUpdateListener("updateListener");
}

var strLength = 150;
function addListener(objName) { 
  document.listenerForm.textarea1.value = "add: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength );	
  printConstructionState();
}

function removeListener(objName) {
  document.listenerForm.textarea1.value = "remove: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength );	
  printConstructionState();
}

function renameListener(oldObjName, newObjName) {
  document.listenerForm.textarea1.value = "rename: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength );	
  printConstructionState();
}

function updateListener(objName) {
  strVal = document.ggbApplet.getValueString(objName);
  document.listenerForm.textarea2.value = strVal + "\n" + document.listenerForm.textarea2.value.substring(0, strLength );
}

function clearListener() {
  document.listenerForm.textarea1.value = "";
  document.listenerForm.textarea2.value = "";
  document.listenerForm.textarea1.value = "construction cleared";
  document.listenerForm.consState.value = "";
}

function printConstructionState() {
  var applet = document.ggbApplet;
  var objNumber = applet.getObjectNumber();
  var strState = "Number of objects: " + objNumber;

  for (i=0; i < objNumber; i++) {
	strName = applet.getObjectName(i);
	strType = applet.getObjectType(strName);
	strCommand = applet.getCommandString(strName);
	strState += "\n" + strType + " " + strName + ", " + strCommand;
  }
  document.listenerForm.consState.value = strState;
}
</script>

USB Data Logging (From GeoGebra 4.2)

For logging data from some Vernier USB Data Loggers, eg Go!Motion and Go!Temp one can define a logger listener using the registerLoggerListener method. Such listener can look like this:

function logger(value) {
   var d = value * 1;
   ggbApplet.evalCommand("(CopyFreeObject[a],"+d+")");
   ggbApplet.evalCommand("SetValue[a,a+1]");
}

This script assumes that there is a free number a in the construction. Each time number d is logged, point (a,d) is constructed and a is increased.

© 2022 International GeoGebra Institute