创建支持服务单
关注

Q100291:在OpScript中收集CEL语句

摘要

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

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

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

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

更多信息

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

不可接受的方法

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

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

推荐的方法

为了收集评估CEL语句的结果,更好的选择是使用一次执行的用户触发的脚本。此脚本在一次性烹饪中遍历场景,并收集可用于填充节点参数的信息。

如果任何相关位置发生变化,则需要重复此操作以使项目保持最新。

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

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

Where:
- celStatement  is the expression to be evaluated.
- traversalRootLocationPath is the scene graph location path at which the evaluation should start. This can be /root or any other specified scene graph location, for example /root/world/geo if only child locations in this branch should be matched against the CEL statement.

示例场景

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

Capture.PNG

3.PNG

4.PNG

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

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

    6.png

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

    6.png

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

    7.png


  5. 再次单击“添加”,这次选择“按钮”作为参数类型。
  6. 单击新创建的按钮正上方的扳手图标,然后选择“窗口小部件选项...”。这将打开一个对话框,您可以在其中将按钮文本更改为描述性内容,例如“CollectGeometryLocations”。该对话框还提供了一个Script字段,您可以在其中添加单击按钮时应执行的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的脚本用作用户欧普精氨酸,例如访问的位置的路径列表。

5.PNG

进一步阅读

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

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

如果您遇到任何问题,请打开支持服务单,告诉我们您遇到的问题以及您已采取的故障排除步骤。

有关如何打开支持服务单的更多信息,请参阅“ 使用支持门户 ”一文。

这篇文章有帮助吗?
/

We're sorry to hear that!

Please tell us why.
6 人中有 6 人觉得有帮助

评论