语法

  • splitArea(axis) { area1 : operations1 | area2 : operations2 | … | arean-1 : operationsn-1 }
  • splitArea(axis) { area1 : operations1 | area2 : operations2 | … | arean-1 : operationsn-1 }*
  • splitArea(axis, adjustMode) { area1 : operations1 | … | arean-1 : operationsn-1 }
  • splitArea(axis, adjustMode) { area1 : operations1 | … | arean-1 : operationsn-1 }*

参数

  1. axis – 选择器
    x | y | z } – 分割时随沿的轴的名称。 这相对于局部坐标系(即,scope)。
  2. adjustMode
    adjust | noAdjust } – 用于控制所计算形状的范围计算的可选选择器。 默认设置是将范围调整为几何的边界框。 使用 noAdjust 可以避免这种情况,因此生成的形状的范围将无缝填充父项的范围。
  3. area – 浮点型

    分割面积。 当前形状分割为生成的形状具有指定面积。 根据前缀,area 解释如下:

    • 无前缀(绝对)- 新形状具有完全相同的 area
    • ‘(相对)- 新形状大小将为 area * 当前几何面积
    • ~(浮动)- 使用 ~ 前缀,具有绝对维度的分割部分之间的剩余空间将自动调整。 如果在一个分割内定义了多个浮动部分,则将按比例对维度进行加权。
  4. operations
    要在新创建的形状上执行的形状操作的顺序。
  5. *
    重复切换按钮:重复切换按钮触发已定义分割的重复操作(分割为当前形状的 scope),并进行尽可能多的重复。 将调整重复次数和浮动维度以适合最佳解决方案(最佳重复次数和最小拉伸)。

说明

splitArea 操作用于沿指定 scope 轴将当前形状几何细分成几何面积由 area 参数指定的一组形状。 此操作适用于平面 2D 几何以及近平面几何。 非平面几何会降低面积精度。 此操作不适用于 3D 几何,例如网格或高度非平面几何。

对于每个指定的 area,将使用垂直于分割轴的平面切割当前形状几何,以使生成的形状包含具有指定面积的几何。

可使用可选重复切换按钮 * 多次重复 {  }* 块中的内容,直到其在选定轴方向上完全适合范围维度。

相关内容

示例

颜色

这些规则适用于在以下示例中使用的颜色。

Red     -->                          // red
   color(1, 0, 0)                       
   print("area(R) = " + geometry.area)

Yellow  -->                         // yellow
   color(1, 1, 0)                       
   print("area(Y) = " + geometry.area)

Green   -->                         // green
   color(0, 1, 0)                       
   print("area(G) = " + geometry.area)

Cyan    -->                         // cyan
   color(0, 1, 1)                      
   print("area(C) = " + geometry.area)

Blue    -->                         // blue
   color(0, 0, 1)                       
   print("area(B) = " + geometry.area)

Magenta -->                         // magenta
   color(1, 0, 1)                      
   print("area(M) = " + geometry.area)

Pink    -->                         // semi-transparent pink
   color(1, 0.5, 0.5, 0.3)

此形状分割成两部分。 第一部分为原始面积的 70%,第二部分为原始面积的 30%。 请注意,指定面积数量的总和不需要为 1。 如果总和小于 1,将删除形状的其余部分,将忽略大于 1 的分割部分。

Lot -->
   print("total area = " + geometry.area)
   splitArea(x) { '0.7 : Green
                | '0.3 : Yellow }
GUID-3DDF45CE-DC38-4349-B747-408894CAE2BB-webGUID-2E55CEBF-3807-4C4A-9F3D-451791336E82-web
 

重复分割

此分割使用重复分割将形状划分成五个等积部分。 它会重复将形状分割成面积等于初始面积 20% 的几个部分。 请注意,如果面积设置为 ‘0.3,将获得面积等于原始面积的 30%、30%、30% 和 10% 的四个部分。

Lot -->
   print("total area = " + geometry.area)
   splitArea(x) { '0.2 : ColorMe }*

ColorMe -->
   case split.index == 0 :
      Red
   case split.index == 1 :
      Yellow
   case split.index == 2 :
      Green
   case split.index == 3 :
      Cyan
   else :
      Blue
GUID-4ABB074C-C073-4247-BBC6-F01902B4EE35-webGUID-01833964-C0AE-4C76-85FB-EA6733819CCF-web
 

使用浮动和绝对面积进行分割

此分割用于将形状划分成具有绝对面积 600 的中间部分(黄色)以及两个面积相同的侧部分。 黄色部分由两部分组成,因为原始形状中有一个孔,分割会沿孔边界剪切形状。

Lot -->
   print("total area = " + geometry.area)	
   splitArea(x) { ~1  : Green
                | 600 : Yellow
                | ~1  : Blue
GUID-540270FC-E2ED-4C23-BE74-EF93474F53B8-webGUID-3908EE6F-B756-49A2-A33B-F1D9B80C1C19-web
 

嵌套分割

此嵌套分割首先会在 x 方向上划分形状,以获取三个等积部分。 然后,在 z 方向上将每个部分划分成两个相等部分。 这将生成六个等积部分。

Lot -->
   print("total area = " + geometry.area)	
   splitArea(x) { ~1 : splitArea(z) { '0.5 : Red
                                    | '0.5 : Yellow }
                | ~1 : splitArea(z) { '0.5 : Green
                                    | '0.5 : Cyan }
                | ~1 : splitArea(z) { '0.5 : Blue
                                    | '0.5 : Magenta }
                }
GUID-5F2BC8C9-D61D-49D1-BD61-51676B9EDFD6-webGUID-62A33822-F8FB-4C7E-AA94-F0491C55607A-web
 

adjust 与 noAdjust

这是原始形状及其范围。

GUID-B21E3FFD-3254-4715-9394-459ADAE9D6A8-web

如果未指定 adjustSelector 的值,则默认行为是将范围大小调整为每个分割部分的几何。 每个粉色框显示每个分割部分的范围。 范围会保留原始范围的方向,但是会缩减为几何的边界框。

SplitAdjust -->
   splitArea(x) 
      { '0.2 : splitArea(z) 
      { '0.2 : SplitLeaf }* }*

SplitLeaf-->
   color(0.5, 0.5, 0.5)
   Geometry.
   primitiveQuad()
   t(0, 0.02, 0)
   Pink
   comp(e) { all : color(0, 0, 0) Edge. }
GUID-E286E608-4E3F-4B65-A80D-B154BF68C267-web

如果使用 noAdjust,则每个分割部分范围的并集将组成原始范围。 范围不会调整为几何内部。

SplitNoAdjust -->
   splitArea(x, noAdjust) 
      { '0.2 : splitArea(z, noAdjust) 
      { '0.2 : SplitLeaf }* }*
GUID-470AEE08-09A8-47E9-A039-56A422249A89-web
 

将区块拆分成多个相等部分

这是原始形状及其范围。 下面是如何使用 splitArea 操作将街区拆分成多个等积地块的示例。

GUID-C266E898-BC45-4719-842E-4CB52996DDB4-web

将使用 splitArea 以递归的方式拆分块。 每个分割会将形状垂直于其最长轴划分成两个等积部分。 将根据面积对每个地块进行着色,这样具有相同面积的地块会具有相同的颜色。 使用 splitArea 时,所有地块为黄色,因为区块划分为等积地块。

Lot -->
   SplitArea(3)

SplitArea(n) -->
   case n == 0 :
      A
   case scope.sz > scope.sx :
      splitArea(z) { ~1 : SplitArea(n-1)
                   | ~1 : SplitArea(n-1) }
   else :
      splitArea(x) { ~1 : SplitArea(n-1)
                   | ~1 : SplitArea(n-1) }

A -->
   color(getColor)
   print("area(A) = " + geometry.area)
	
// color by area 
// (so that lots with same area get same color)
const minArea = 243
const maxArea = 1255
alpha = (geometry.area - minArea)/
              (maxArea - minArea)
getColor = colorRamp("spectrum", alpha)
GUID-53B11F51-391B-4DB1-AFE1-18C5E748B1C6-webGUID-25B19529-A18B-4827-9132-FB13FEECF5AD-web

与之相比,使用分割操作时,地块颜色不同,因为区块划分为面积不同的地块。

Lot2 -->
   Split(3)

Split(n) -->
   case n == 0 :
      B
   case scope.sz > scope.sx :
      split(z) { ~1 : Split(n-1)
               | ~1 : Split(n-1) }
   else :
      split(x) { ~1 : Split(n-1)
               | ~1 : Split(n-1) }

B -->
   color(getColor)
   print("area(B) = " + geometry.area)
GUID-4C0B5295-792D-45AC-B78A-A87807344771-webGUID-6B6083CB-8E43-4EFC-AAA1-B3680A365642-web