局部变量有效地存储任何类型的值。在规则或函数的范围内,它们可以通过标识符以与参数相同的方式多次使用。局部变量消除了将中间结果作为参数传递的需要,并帮助您更好地构建代码。

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