局部变量有效地存储任何类型的值。在规则或函数的范围内,它们可以通过标识符以与参数相同的方式多次使用。局部变量消除了将中间结果作为参数传递的需要,并帮助您更好地构建代码。
示例 1
在这个例子中,我们扩展了上一节CGA 函数中介绍的规则Lot。
getHeight(area) =
case area > 1000 : 300
case area > 500 :
20% : 200
50% : 150
else : 100
else : rand(20,50)
Lot -->
Lot(getHeight(geometry.area))
Lot(height) -->
extrude(height)
comp(f) { top : roofHip(case height < 35 : 45 else : 10) Roof
| all = Envelope }
在拉伸几何体的顶面上构造了一个屋顶(有关压缩操作的详细信息,请参见组件拆分)。如果高度小于 35,屋顶角度设置为 45 度,否则设置为 10 度。我们只想调用一次函数getHeight()并多次使用评估值。这是通过将计算的高度值作为参数传递给重载的Lot规则来实现的(请参阅 带参数的规则)。
使用局部变量,我们可以只使用一个规则Lot来编写:
Lot with ( height := getHeight(geometry.area) ) -->
extrude(height)
comp(f) { top : roofHip(case height < 30 : 45 else : 10) Roof
| all = Envelope }
调用规则后,立即评估和存储局部变量高度。在规则定义中引用它时不会重新评估它。
示例 2
除了规则之外,还可以为函数、常量函数和属性定义局部变量。在以下示例中,getHeight()函数没有参数区域。相反,只要调用该函数,就会计算该区域并将其存储在局部变量中。
getHeight with ( area := geometry.area ) =
case area > 1000 : 300
case area > 500 :
20% : 200
50% : 150
else : 100
else : rand(20,50)
示例 3
可以定义一系列局部变量。表达式可以引用列表中先前定义的局部变量。这使得局部变量成为将复杂计算拆分为几个较小步骤的简单工具。
getHeight with (
area := geometry.area
minHeight := sqrt(area) * 0.2
heightDowntown := 80%: rand(15,35) else: rand(5,15)
heightHighrise := rand(50,150)
height := 10%: heightHighrise else: heightDowntown
finalHeight := max(minHeight, height)
) = finalHeight