GeoGebra 的脚本功能允许用户通过不同的触发机制(如点击、更新、输入框变化、拖动结束)和全局 JavaScript 自定义图形和交互行为,实现动态数学模型和用户交互,同时 ggbOnInit() 函数可在应用初始化时设置默认状态,提供灵活的定制选项,增强了 GeoGebra 的交互性和功能性。
本来计划GeoGebra脚本放到高级篇去写的,奈何经常用到,那就今天做一个初步探索吧。
目录
- 一、关于GeoGebra的脚本
- 1. 关于脚本的学习
- 2. 关于GeoGebra脚本
- (1)什么是脚本呢?
- (2)GeoGebra支持的脚本类型
- 二、GeoGebra脚本的使用
- 1. 打开GeoGebra后的页面
- 2.在命令行创建一个点A(1,1)
- 3. 创建一个按钮
- 4. 右键按钮,点击设置,可以打开右侧的设置面板
- 5. 在Scripting菜单下选择JavaScript脚本,将代码粘贴到On Click栏里
- 6. 点击按钮就可以开始运行了
- 三、GeoGebra脚本使用的注意事项
- 1. 脚本输入框没有单独的进入选项
- 2. GeoGebra的脚本触发机制有6种
- 3. 如果想写全局脚本
- (1)关于function ggbOnInit() {}的疑惑
- (2)全局脚本的案例(计算有多少行命令)
- 四、关于官方文档的使用
- 五、文章最后
一、关于GeoGebra的脚本
1. 关于脚本的学习
经过查阅一些书籍和文档,我发现还是官方文档最好用,这里给大家放置一下:
- GeoGebra脚本介绍(点击蓝色字跳转)
- GeoGebra关于JavaScript的API (点击蓝色字跳转)
当然,在工作过程中撰写脚本也踩了不少坑,希望以我的前车之鉴,给大家一些借鉴:
- GeoGebra是一个开源的项目,版本更新很快,为了跟上节奏,建议使用网页版操作、观看网页版说明文档(都很全的,查查就有了);
- 尽量避免使用中文操作GeoGebra,到了脚本环节更是如此,因为同一个英文指令在不同的版本中对应不同的中文,很有可能你用中文写的脚本,今天能用,明天就用不了了(版本升级,中文对应不上);
- 书籍资料只能参考,之前我常参考《唐家军—GeoGebra5使用手册》,但后来随着最新版本的发布,界面布局、按钮功能、脚本的输入方式等等全部都不一样了,个人建议:“参考书中的知识脉络,探索最新的实现方式”。
- 国内关于GeoGebra的教学还是比较少的,或许是因为语言、市场占有率、学习难度的原因,使GeoGebra并未全范围铺展开,但无论如何,好的东西不分国界。
2. 关于GeoGebra脚本
(1)什么是脚本呢?
脚本可以理解为一系列操作的合集,将一堆命令集合起来,点击运行,然后达到某种效果。比如:
用GeoGebra制作一个小球弹跳的效果,如果说第二次弹起是上一次弹起的3/4高度,那么小球从5米落下,多久可以停止跳动?(小于0.01米算停止)
这个过程如果用GeoGebra命令行一行一行的写也可以实现,但是如果用脚本的话也就是几行代码的事情,这就是脚本的威力。
(2)GeoGebra支持的脚本类型
GeoGebra 支持两种脚本语言:GGBScript 和 JavaScript,注意,第五设计所有的脚本均是JavaScript(C++、python、JavaScript这些语言比较通用,学习后可以不局限于某一个平台)。
二、GeoGebra脚本的使用
为了方便介绍,接下来我将实现一个简单功能,用按钮控制点A(1,1)显示或隐藏,感兴趣可以试一下。
1. 打开GeoGebra后的页面
不用费心思去找脚本的按钮了,因为版本更新后没有这个选项,很多人不知道,所以导致被网上的很多教程误导了很久,最后放弃了。
2.在命令行创建一个点A(1,1)
A=(1,1)
3. 创建一个按钮
按钮的属性设置就和普通的点线设置一样,这里就不多说了,但是注意,点击放置按钮后会出现一个脚本框,我们暂时先不写。
4. 右键按钮,点击设置,可以打开右侧的设置面板
5. 在Scripting菜单下选择JavaScript脚本,将代码粘贴到On Click栏里
// 检查点 A 是否存在
if (ggbApplet.exists("A")) {// 获取点 A 的当前可见状态var isVisible = ggbApplet.getVisible("A");// 切换点 A 的可见状态ggbApplet.setVisible("A", !isVisible);
} else {// 提示点 A 不存在ggbApplet.setError("Point A does not exist.");
}
6. 点击按钮就可以开始运行了
三、GeoGebra脚本使用的注意事项
1. 脚本输入框没有单独的进入选项
书写脚本必须依附于某一个命令行才能进入,切记切记
2. GeoGebra的脚本触发机制有6种
分为:On Click、On Update、On Change、On Drag-end、Global JavaScript、监听器六种,官方的解释是这样的:
简单来说就是:
不同的对象支持不同类型的脚本;脚本的执行可以通过以下方式触发:- 点击特定对象(OnClick 选项卡)
- 更新特定对象(当对象的值或属性发生变化时)(OnUpdate 选项卡)
- 改变输入框的内容(OnChange 选项卡)
- 拖动对象后释放鼠标按钮(或在触摸设备上移开手指)(On Drag-end 选项卡)
- 加载文件(对于 JavaScript - Global JavaScript 选项卡)
- JavaScript 监听器(参见参考:JavaScript)`OnUpdate` 和 `OnChange` 选项卡中输入框脚本的区别在于,`OnUpdate` 选项卡中的脚本仅在从输入框移开焦点
(例如,点击按钮、点击图形视图等)时执行,而 `OnChange` 选项卡中的脚本会在输入框内容发生变化且焦点仍在输入框上时立即执行。
3. 如果想写全局脚本
(1)关于function ggbOnInit() {}的疑惑
可以随机选择一个对象打开其属性,就可以找到全局脚本的输入就可以了。不过很多新手估计会很懵,怎么会有个默认函数,那我是删除还是不删除。
关于function ggbOnInit() {}
代码的解释:
在 GeoGebra 中,ggbOnInit() 是一个特殊的 JavaScript 函数,用于在 GeoGebra 应用程序初始化时执行特定的代码。这个函数在以下情况下被自动调用:
- 初始化时: 当 GeoGebra 工具加载或刷新时,ggbOnInit() 函数会被执行。这通常发生在页面加载时,或者当用户重新加载 GeoGebra 应用时。
- 设置初始化代码: 可以在 ggbOnInit() 函数中编写需要在应用初始化时执行的 JavaScript 代码。例如,设置默认的对象属性、初始化图形、创建图形对象等。
因此你可以把自己的全局脚本写到这里这个{}花括号里,然后关闭文档,重新打开一次就运行起来了。
(2)全局脚本的案例(计算有多少行命令)
比如我这里有一个统计有多少行命令的脚本:
function ggbOnInit() {// 文本对象名称var textNames = ['FifthDesign01', 'FifthDesign02', 'FifthDesign03'];// 初始化计数器var totalLines = 0;var visibleLines = 0;var hiddenLines = 0;// 创建文本对象(如果它们不存在)for (var i = 0; i < textNames.length; i++) {if (!ggbApplet.exists(textNames[i])) {ggbApplet.evalCommand(textNames[i] + ' = ""');}}// 获取所有对象的名称var objects = ggbApplet.getAllObjectNames();// 遍历所有对象,排除指定的文本对象for (var i = 0; i < objects.length; i++) {var objName = objects[i];if (textNames.indexOf(objName) === -1) { // 不包含在文本名称列表中totalLines++;if (ggbApplet.getVisible(objName)) {visibleLines++;} else {hiddenLines++;}}}// 更新文本对象的内容ggbApplet.setTextValue(textNames[0], '总行数: ' + totalLines);ggbApplet.setTextValue(textNames[1], '显示的行数: ' + visibleLines);ggbApplet.setTextValue(textNames[2], '隐藏的行数: ' + hiddenLines);
}
文章打开后就可以看到数据:
四、关于官方文档的使用
本篇文章我没有过多的讲解代码的原理,因为涉及到很多专业的编程知识,不过也留给懂编程的伙伴一些学习方式,比如官方文档。
API文档
需要注意的是,官方文档里有这么一句话(所有的方法都是属于ggbApplet对象):
所以如果想调用API文档里的方法,需要使用ggbApplet对象调用。
比如我上边隐藏/显示点里写了一句代码:
ggbApplet.setVisible("A", !isVisible);
在官方文档的这个地方:
五、文章最后
需要资料、代做、技术咨询,都可以联系。