JavaScript 函数
用 JavaScript 编写的函数:适用于用通用编程语言更容易编写的计算和几何图形,并可直接使用图纸的变量和点。它与其他函数一样,在图纸变化时被调用、保存和重新生成。
语法
FUNCTION NAME(a,b,…) JAVASCRIPT <<<
JavaScript …
>>>
FUNCTION NAME(a,b,…) JAVASCRIPT <<< JavaScript … >>>
| 部分 | 含义 |
|---|---|
| NAME | 函数名,与任何 FUNCTION 相同。 |
| a、b | 函数的形参:JavaScript 名称,按书写原样使用(x、width、c)。 |
<<< … >>> |
代码:从 <<< 之后的一行到仅包含 >>> 的一行,或在同一行中位于两者之间。代码完全按书写原样保存。 |
代码是以这些形参为参数的 JavaScript 函数(严格模式)的函数体。它 return 的值就是函数的值;如果只生成几何图形,可以不返回任何值。
代码可以使用的内容
绘图 API,与扩展共用:图纸的变量和正在处理的页面上的点,以及创建点和图元的函数。简要说明如下:
| 值 | 数字、字符串和 true/false 保持原样;位置为 {x, y};列表为数组;字典为 Map。返回的值也按相同方式转换:带有数字 x 和 y 的对象是位置,其他对象是由其属性组成的字典。 |
vars.NAME、variable("NAME") |
图纸的变量:vars.L 和 variable("L") 即为 L。 |
getPoint(n) |
点:getPoint(4) 或 getPoint("P4"),形式为 {x, y, id}。 |
evaluate("…") |
图纸语言的表达式:evaluate("DISTANCE(P0,P2)")。 |
setVariable("NAME", value) |
将变量设置为数字或表达式。 |
newPoint(…)、offset(p, dx, dy)、polar(p, angle, distance)、between(p, q, t) |
新点:位于某个位置或由表达式定义;基于另一个点。尺寸可以是表达式("W/2")。 |
line、arc、circle、bezier、polyline、point、text |
图元,由点或位置生成。 |
layer(n) |
此后生成的图元所在的图层。 |
command("…") |
图纸语言的任意语句:command("FILLET(@1,@2,5)")。 |
print(…)、console.log(…) |
显示值,与 PRINT 相同。 |
位置可以写作 {x: 10, y: 20} 或 [10, 20];以点本身给出的点(getPoint(4)、"P4")会使基于它生成的内容跟随它变化。
示例
FUNCTION HYPOT(a, b) JAVASCRIPT <<< return Math.sqrt(a * a + b * b) >>>
DIAGONAL = HYPOT(L, W)

FUNCTION STAR(c, n, r) JAVASCRIPT <<<
for (let k = 0; k < 2 * n; k++) {
const a = Math.PI / 2 + k * Math.PI / n, b = a + Math.PI / n;
const r1 = k % 2 ? r / 2 : r, r2 = k % 2 ? r : r / 2;
line({ x: c.x + r1 * Math.cos(a), y: c.y + r1 * Math.sin(a) },
{ x: c.x + r2 * Math.cos(b), y: c.y + r2 * Math.sin(b) });
}
>>>
CALL STAR(P2, 5, W / 4)
在盒子的角点 P2 处画一个五角星:更改 W 或移动 P2,它都会重新生成。
FUNCTION HOLES(widths) JAVASCRIPT <<<
let x = 20;
for (const w of widths) {
circle([x + w / 2, 50], w / 2);
x += w + 10;
}
return x;
>>>
WIDTHS = {10, 20, 40}
CALL HOLES(WIDTHS)
列表作为数组传给 JavaScript:每个宽度生成一个孔。
说明
- JavaScript 函数能看到调用时图纸的变量和点。它生成的点和图元属于它自己(与块生成的内容一样):与图纸一起绘制和导出,但不是可以逐个选取或捕捉的图纸图元。
- 它的调用方式与其他函数相同:在表达式中获取其值(
HYPOT(3,4)),或用 CALL 获取其几何图形,可以从图纸、块或其他函数中调用。图纸语言的函数可以调用它,它也可以通过evaluate调用这些函数。 - 沙盒运行:代码无法访问文件、网络或计算机,只能使用上面列出的内容。如果一次调用执行超过一百万条语句或运行超过十秒、自身调用嵌套超过 200 层,或占用内存过多,调用就会停止。
- 可重复:图纸每次计算的结果必须相同,因此
Math.random()每次都给出相同的数字,并且没有Date。 - 无法解析的代码在定义函数时即被拒绝,并显示原因。运行时出现的错误会连同其所在 FUNCTION 的行一起显示。