サポートチケットを作成する
フォローする

Q100291:OpScriptでCELステートメントを収集する

概要

この記事では 、OpScriptノードのLuaスクリプト内で CELステートメント( 収集 操作) を評価した結果のキャッシュを使用する方法について説明します

これは、OpScriptノードでスクリプトボタンのPythonスクリプトを実行し、結果のシーングラフのロケーションパスをユーザーパラメーターにキャッシュして、OpScriptノードのLuaスクリプト自体で使用できるようにします。

これにより、ユーザー は都合の良いときに 収集 操作 を実行でき 、OpScriptノードがクックされるたびにシーングラフ全体に対してCELステートメントを一致させる必要なく、キャッシュされた結果に対してOpScript Luaスクリプトを機能させることができます。

このようなスクリプトを設定する方法と理由については、以下をお読みください。

詳しくは

ユーザーは、OpScriptノードのLuaスクリプト内で収集操作の結果を使用したい場合があります。たとえば、結果のロケーションパスをシーングラフ属性の下に保存したり、Luaスクリプトで操作できるようにしたりする場合です。

望ましくないアプローチ

OpScript内でCELステートメントを評価した結果を収集することは望ましくありません。場所の特定のCELステートメントと一致するかどうかを判断するために、アップストリームレシピが変更されるたびにシーンの一部(すべてではないにしても)を調理する必要があるためです。

これは、大きなシーングラフを含むシーンで作業する場合、非常に計算コストが高く、時間がかかる操作です。これは、対話型のコンテキストでは非常に望ましくなく、遅延評価のKatanaのモデルに反します。

推奨されるアプローチ

CELステートメントの評価結果を収集するためのより良いオプションは、1回実行されるユーザートリガースクリプトを使用することです。このスクリプトは、1回限りのクックでシーンをトラバースし、情報を収集して、ノードパラメータの入力に使用できます。

関連する場所が変更された場合、プロジェクトを最新の状態に保つためにこれを繰り返す必要があります。

CELステートメントに一致する既存の場所のセットを取得するには、CEL収集操作を使用します。スクリプトボタンを介して実行されるスクリプトでは Widgets モジュールの 一部である CollectAndSelectInScenegraph() 関数を 使用でき ます。

 

EXAMPLE SCENE

In the attached example scene you can see an implementation of this strategy. The scene is using t he L-system from the 'Generating Geometry in OpScript' example project. You can inspect the script in the CollectAndSet OpScript node by clicking on the wrench icon at the top of the Parameters tab > ‘Edit User Parameters’, then clicking on the wrench icon above the CollectGeometryLocations button > ‘Widget Options…’.

 Capture.PNG

3.PNG

4.PNG

The user parameters on the CollectAndSelect OpScript node were set up following these steps:

  1. Create an OpScript node and press to open its parameters in the Parameters tab.
  2. Click on the wrench icon at the top of the Parameters tab > ‘Edit User Parameters’. This adds a new group parameter to the node, named user .

    6.png

  3. Click ‘Add’ to add parameters to the user group parameter and choose ‘String Array’ as the parameter type. This will be the parameter where we will store the matched location paths.

    6.png

  4. Click the wrench icon directly above the new parameter and click ‘Rename Parameter’. This will open a dialog where you can enter a new name. Rename the parameter to ‘matchedLocationPaths’

    7.png


  5. Click ‘Add’ again and this time choose ‘Button’ as the parameter type.
  6. Click the wrench icon directly above the newly created Button, and choose ‘Widget Options…’. This will open a dialog where you can change the button text to something descriptive, for example ‘CollectGeometryLocations’. The dialog also provides a Script field where you can add the Python commands that should be executed when the button is clicked.
  7. Copy and paste the following Python commands into the Script field:

    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
    To store the matched location paths in the node’s matchedLocationPaths user parameter, add the following commands to the script:

    param.parseXmlIO(element)

Running the script by clicking the button will open a modal dialog while the scene is being traversed and locations are cooked, giving you the option to cancel the operation.

The collectAndSelect() function will return a list of location paths that can then be set as a user parameter on an OpScript node so that it is accessible for use in the Lua script as a user Op Arg, for example.

5.PNG 

FURTHER READING

For more information on the CEL syntax,  please see the CEL Reference section of the Katana Developer Guide.

For more details on accessing user op args, like the one set in the Python script, in an OpScript node’s Lua script, please see  the Katana Developer Guide on the Cook Interface (OpScript) .

If you are encountering any issues with this, then please open a Support ticket and let us know about the problem and which troubleshooting steps you have taken so far.

For more information on how to open a Support ticket, please refer to Q100064: How to raise a support ticket .

この記事は役に立ちましたか?

私たちはそれを聞いて申し訳ございません

理由をお聞かせください
8人中8人がこの記事が役に立ったと言っています