局部变量可以有效地存储任意类型的值。 在一个规则或函数范围内,该变量可以通过一个标识符多次使用,其使用方式与参数相同。 局部变量使您无需将中间结果作为参数传递,有助于更好地构建代码。

示例 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