局部变量

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

示例 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 操作的详细信息,请参阅组件分割)。 如果 height 值小于 35,则屋顶角度将设置为 45 度,否则,将设置为 10 度。 您仅希望调用一次 getHeight() 函数,并多次使用计算得出的值。 要实现此目的,可以将计算出的 height 值作为参数传递至已重载的 Lot 规则(请参阅带有参数的规则)。

使用局部参数,您可以仅使用一个 Lot 规则编写此内容:

Lot with ( height := getHeight(geometry.area) ) --> 
   extrude(height)
   comp(f) { top : roofHip(case height < 30 : 45 else : 10) Roof
           | all = Envelope }

规则被调用后,将计算局部变量高度并进行存储。 当变量在规则定义中被引用时,则不会重新计算。

示例 2

除了规则外,您也可以为函数、const 函数和属性定义局部变量。 在以下示例中,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


在本主题中
  1. 示例 1
  2. 示例 2
  3. 示例 3