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或任何其他指定的场景图位置,例如,如果仅要将此分支中的子位置与 CEL 语句进行匹配,则可以/root/world/geo

示例场景

在随附的示例场景中,您可以看到此策略的实现。该场景使用了“在 OpScript 中生成几何体”示例项目中的 L 系统。您可以通过以下步骤查看 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. 点击新建按钮正上方的扳手图标,然后选择“控件选项…”。这将打开一个对话框,您可以在其中将按钮文本更改为描述性内容,例如“收集几何位置”。该对话框还提供了一个脚本字段,您可以在其中添加单击按钮时要执行的 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()函数将返回一个位置路径列表,该列表可以设置为 OpScript 节点上的用户参数,以便在 Lua 脚本中作为用户 Op Arg 使用,例如:

CEL_Statements_OpScript_7.png

延伸阅读

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

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

如果您在使用过程中遇到任何问题,请提交支持工单,并告知我们您遇到的问题以及您目前已采取的故障排除步骤。

有关如何提交支持工单的更多信息,请参阅Q100064:如何提交支持工单

附件

我们很遗憾听到

请告诉我们