Q100291:为 OpScript 收集 CEL 语句时如何提高效率

关注

概括

本文介绍如何在 OpScript 节点的 Lua 脚本内使用计算的 CEL 语句(收集操作)的缓存结果。

这是通过在 OpScript 节点上执行脚本按钮的 Python 脚本,并将生成的场景图位置路径缓存在用户参数中来实现的,以便它们可在 OpScript 节点的 Lua 脚本本身中使用。

这允许用户在方便时执行收集操作,并使 OpScript Lua 脚本处理缓存的结果,而不必在 OpScript 节点被烘焙时将 CEL 语句与可能的整个场景图进行匹配

请继续阅读以获取有关如何以及为何设置此类脚本的信息。

更多信息

用户可能希望在 OpScript 节点上的 Lua 脚本中使用收集操作的结果,例如,将生成的位置路径存储在场景图属性下,或者让它们可在 Lua 脚本中进行操作。

不良方法

在 OpScript 中收集评估 CEL 语句的结果是不可取的,因为每次修改上游配方时都需要对场景的一部分(如果不是全部)进行烘焙,以确定位置是否与给定的 CEL 语句匹配。

当处理具有大场景图的场景时,这可能是计算量非常大且耗时的操作。这在交互环境中是非常不受欢迎的,并且违背了Katana的延迟评估模型。

推荐方法

为了收集评估 CEL 语句的结果,更好的选择是使用执行一次的用户触发脚本。该脚本一次性遍历场景并收集可用于填充节点参数的信息。如果任何相关位置发生变化,则需要重复此操作以使项目保持最新状态。

要检索与 CEL 语句匹配的一组现有位置,请使用 CEL 收集操作。在通过脚本按钮执行的脚本中,您可以使用CollectAndSelectInScenegraph() Widgets模块一部分的 CollectAndSelectInScenegraph() 函数:

collector = Widgets.CollectAndSelectInScenegraph(celStatement, traversalRootLocationPath)
matchedLocationPaths = collector.collectAndSelect(select=False, node=myNode)

在哪里:

  • celStatement是要计算的表达式。
  • traversalRootLocationPath是评估应开始的场景图位置路径。这可以是/root或任何其他指定的场景图位置,例如/root/world/geo (如果只有此分支中的子位置应与 CEL 语句匹配)。

场景示例

在所附的示例场景中,您可以看到此策略的实现。该场景使用“在 OpScript 中生成几何”示例项目中的 L 系统。您可以通过单击“参数”选项卡顶部的扳手图标 >“编辑用户参数”,然后单击“CollectGeometryLocations”按钮 >“窗口小部件选项...”上方的扳手图标来检查 CollectAndSet OpScript 节点中的脚本。

CEL_Statements_OpScript.png

CEL_Statements_OpScript_2.png

CEL_Statements_OpScript_3.png

CollectAndSelect OpScript 节点上的用户参数按照以下步骤设置:

  1. 创建一个 OpScript 节点并按e在“参数”选项卡中打开其参数。
  2. 单击“参数”选项卡顶部的扳手图标 >“编辑用户参数”。这会向节点添加一个新的组参数,名为user

    CEL_Statements_OpScript_4.png

  3. 单击“添加”将参数添加到用户组参数中,并选择“字符串数组”作为参数类型。这将是我们存储匹配位置路径的参数。

    CEL_Statements_OpScript_5.png

  4. 单击新参数正上方的扳手图标,然后单击“重命名参数”。这将打开一个对话框,您可以在其中输入新名称。将参数重命名为“matchedLocationPaths”

    CEL_Statements_OpScript_6.png

  5. 再次单击“添加”,这次选择“按钮”作为参数类型。
  6. 单击新创建按钮正上方的扳手图标,然后选择“小部件选项...”。这将打开一个对话框,您可以在其中将按钮文本更改为描述性内容,例如“CollectGeometryLocations”。该对话框还提供了一个脚本字段,您可以在其中添加单击按钮时应执行的 Python 命令。
  7. 将以下 Python 命令复制并粘贴到脚本字段中:

    collector = Widgets.CollectAndSelectInScenegraph('//*{hasattr("geometry")}', '/root/world/geo')
    # This command will match all scene graph locations underneath /root/world/geo that have a ‘geometry’ attribute
    paths = collector.collectAndSelect(select=False, node=node)
    # The 'node' variable is this parameter's node
    要将匹配的位置路径存储在节点的matchedLocationPaths用户参数中,请将以下命令添加到脚本中:

    paramName = 'user.matchedLocationPaths'
    param = node.getParameter(paramName)
    element = param.buildXmlIO(True)
    element.removeAllChildren()
    for path in paths:
       child = element.addChild(PyXmlIO.Element("string_parameter"))
       child.setAttr("name", "i%i" % (len(element) - 1))
       child.setAttr("value", path)
    element.setAttr("size", len(element))
    param.parseXmlIO(element)

通过单击该按钮运行脚本将在遍历场景和烹饪位置时打开一个模式对话框,让您可以选择取消操作。

collectAndSelect collectAndSelect()函数将返回位置路径列表,然后可以将其设置为 OpScript 节点上的用户参数,以便可以在 Lua 脚本中作为用户 Op Arg 进行访问,例如:

CEL_Statements_OpScript_7.png

延伸阅读

有关 CEL 语法的更多信息,请参阅Katana开发人员指南的CEL 参考部分。

有关访问用户 op 参数(例如在 OpScript 节点的 Lua 脚本中的 Python 脚本中设置的参数)的更多详细信息,请参阅Katana Interface (OpScript)上的 Katana 开发人员指南

如果您遇到任何问题,请打开支持票证并让我们了解该问题以及您迄今为止采取的故障排除步骤。

有关如何开立支持票证的更多信息,请参阅Q100064:如何提出支持票证

附件

我们很遗憾听到

请告诉我们