上下文和遮挡查询

上下文查询是函数,用于返回有关当前形状环境中的上下文形状的信息。 遮挡查询是特殊的上下文查询,用于返回有关几何相交的信息。

可用上下文查询列表

遮挡查询

  • bool func()
  • bool func(target)
  • bool func(target, label)
  • inside - 当前形状位于另一个形状几何内部时,返回 true
  • overlaps - 当前形状与另一个形状几何重叠时,返回 true
  • touches - 当前形状与另一个形状几何接触时,返回 true

常规上下文查询

  • float func(target, label, ...)
  • minimumDistance - 返回当前范围到另一个标注几何范围的距离。
  • contextCompare - 返回根据特定比较器当前形状在其他标注形状几何中的等级。
  • contextCount - 返回环境中的标注形状数。

目标选择器

对于所有函数,参数 target 选择器用于确定当前几何的测试依据,可以设置为 intrainterall。 因此,可针对形状几何测试当前形状:

  • intra - 在同一形状树中(即来自同一初始形状),或
  • inter - 在同一形状树中(即来自同一初始形状),或
  • all - 在同一和其他形状树中。

如果未给定 target 选择器(遮挡查询),则 all 设置为默认值。

有关相互上下文的详情

邻域距离

将考虑在与当前初始形状边界框相距用户定义邻域距离范围的初始形状。 距离适用于

  • 默认值为 1 的遮挡查询以及
  • 默认值为无穷大的上下文查询,即将忽略距离并考虑场景中的所有形状。

默认值适用于大多数情况。 距离可在程序运行时首选项中进行修改,并根据场景进行存储。

注:

相互上下文查询可能需要在环境中考虑许多初始形状,并且计算成本高于内部上下文查询。 如果您只想检查 intra,请将 intra 指定为 target 选择器,以免不必要的 inter 架空。

场景

相互上下文查询是否在其环境中考虑初始形状取决于形状所属的场景:

  • 默认形状的查询不会考虑情景的形状。
  • 情景的形状查询会考虑默认形状。
  • 默认形状的查询会考虑默认形状。
  • 如果情景形状至少共享一个公共场景,则其查询会考虑情景形状。
注:

形状的上下文影响取决于其分配的情景,而不是其在视窗中的当前可见性。

两次生成过程

计算上下文查询时,尚未生成可能相关的全部几何。 此外,上下文查询通常应用于规则的条件部分。 其结果可能影响生成的模型,因此,可能反过来影响查询的结果。 鉴于这一情况,将针对 intra 上下文执行特殊的确定性两次生成过程:

  1. 将使用内部查询生成形状树,并返回默认值:

  2. 重新开始派生。 这次,将针对之前在第 1 步中生成的几何进行测试,来计算内部上下文查询。

如果是 inter 上下文,将通过类似方式实现确定性行为。 当前初始形状邻域内模型的所有相互查询均返回默认值。 经过实践检验,所述方法在大多数实际用例情景中可获得令人满意的结果。

注:

对于 intra 遮挡,不会考虑内部遮挡查询中非默认情况有条件生成的形状。 对于相互遮挡,不会考虑 inter 遮挡查询中非默认情况有条件生成的形状。

相关内容

示例

标注

在第一次生成过程中,每个 label 操作会创建当前形状的标注副本。 在第二次过程中,将使用 contextCompare 查询函数检索具有标注 "label" 的所有形状数。

Lot --> label("label")
        print(contextCount(intra, "label"))
        label("label")
在控制台中进行标注

条件

在本示例中,地块规则应用于具有两个面的单个初始形状(内部遮挡)。 overlaps 的默认 false 情况会扩大拉伸体积。 因此,几何与相邻拉伸体积相交,overlaps 查询返回 true。 扩大的遮挡物形状不可见。

Lot   --> comp(f) { all : extrude(10) Test }

Test  --> case overlaps(intra) : Red
          else : s('2,'1,'2) center(xyz) Green
		  
Red   --> color(1,0,0)
Green --> color(0,1,0)

与之相反,如果在非默认 true 情况下扩大拉伸体积,overlaps 查询会返回 false

Test --> case overlaps(intra) : s('2,'1,'2) center(xyz) Red
         else : Green
带条件应用的地块规则