局部变量可以有效地存储任意类型的值。 在一个规则或函数范围内,该变量可以通过一个标识符多次使用,其使用方式与参数相同。 局部变量使您无需将中间结果作为参数传递,有助于更好地构建代码。
示例 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 }
已在拉伸几何的顶面上构造屋顶(有关 comp 操作,请参阅组件分割)。 如果高度小于 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