Chapter 2 表达式

对象的很多属性的输入栏很强大,尤其是那些保存尺寸值的,它们既可以接受明文数值,也可以接受数学表达式后演算出它的值。

如果你的系统设置里是公制单位,但是有一部分尺寸你只知道英制值,那可以像这样直接输入:

6 in

它会把带单位的英制值转换成毫米数字,然后保存在输入框里。这种强大的功能在 FreeCAD 各处都有效。让我们多花一点时间,了解一下表达式系统的运作机制,以及怎样使用表达式编辑器。

FreeCAD 可以保存表达式,然后在必要的时候重新演算出一个值。如果一个输入栏右上角有个蓝色阳文提示符 ,这个属性就既可以既接受表达式也可以接受明文数值作为输入。

这个输入框可以接受表达式

图 2.1: 这个输入框可以接受表达式

如果提示符是蓝色阴文 ,表示这个输入框里已经有一个表达式了,不接受直接输入新的明文数值。

这个输入框已经有了表达式

图 2.2: 这个输入框已经有了表达式

要输入或编辑表达式,可以点击蓝色提示符,也可以直接敲等号键。这时编辑器会打开一个小悬浮窗口。你一边输入表达式,解算器一边尝试实时地演算出当前的值,把它显示在屏幕上。解算器会自动检测错误,编辑器也拒绝接受不完整的表达式。

表达式对话框支持自动补全;错误信息显示为红色

图 2.3: 表达式对话框支持自动补全;错误信息显示为红色

注意区别在哪里输入表达式。如果直接把表达式敲进属性栏的输入框,输入框便只保留它演算后的值,把它当作一个明文输入。如果把表达式敲进悬浮窗的编辑器,编辑器会保存表达式本身,并在每次刷新对象的时候,都重新演算一遍表达式。

2.1 运算符

如你所愿,输入框可以接受标准数学运算符 \((+-/*)\)。运算符还能识别出单位,所以下面这样的表达式有效:

2in + 16mm

同样支持用括号表达运算的优先级:

(2mm + 3mm) / 2.4 + 8mm

2.2 函数

表达式支持很多种函数:

  • 数学函数: sqrt, round, trunc, log, log10, mod, pow
  • 三角函数: such as cos, tan, sin, acos, atan, asin
  • 集合函数: min, max, count, sum, stddev, and average
  • 数学常数: pi, e
sqrt(19.2)

2.3 引用 spreadsheet

通过 Spreadsheet 工作台,你可以创建一个数据表,给某个单元填入一个值,然后可以通过表达式来引用这个单元格的内容,就像:

Spreadsheet.B4

这个例子中,表达式会指向 B4,接受它里面的任何内容。

我们将在第 6 章更深入地讲解 spreadsheet 链接。

2.4 条件分支

表达式可以含有条件语句,它会根据情况,当条件为真时返回一个值,条件为假时返回另一个值。条件语句一般含有比较运算符(==, !=, >, <, >=, 和 <=)。

条件语句的格式为:

= [条件语句] ? [条件为真时的值] : [条件为假时的值]

例如,创建一个立方体,像下面那样根据长度条件,设置它的宽度属性。

Cube.Length == 10mm ? 20 : 50

这样,如果长度为 10mm 的话,宽度就是 20,否则其他情况下宽度都是 50。

2.4.1 引用其他文档

可以在一个表达式里引用其他文档中的元素。

首先,创建文档,保存,再关闭当前文档,然后重新打开这个你想引用的主文档。在这之后,你可以继续编辑这个文档,但是在做任何引用之前,你应该已经建好了这个文档的名字。假设我将要引用的文档被保存为 “masterdoc.fcstd”。

masterdoc#Spreadsheet.B4

这个功能虽然很强大,但是要注意几点:

  • 如果你在文档之间做了链接,不要重命名和移动文档,那会破坏链接的表达式。
  • 表达式解算器在演算跨文档的链接的时候,受到大家都清楚的某种限制。你会发现解算器一直在提示表达式“不合法”,直到你输入完了最后一个字符,它才变成合法的。
  • 一般来说,我们建议你避免使用跨文档的链接表达式。

FreeCAD 表达式功能还在发展的路上。去 Wiki 页面看看,那里讲了它的更多用法和使用限制。 https://www.freecadweb.org/wiki/Expressions