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

Q100291:OpScriptでのCELステートメントの収集

概要

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

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

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

そのようなスクリプトを設定する方法とその理由についての情報を読んでください。

詳しくは

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

計り知れないアプローチ

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

大きなシーングラフを用いてシーンを処理する場合、これは非常に計算コストがかかりかつ時間のかかる操作となり得る。これは対話的な文脈では非常に望ましくなく、Katanaの遅延評価モデルに反します。

推奨アプローチ

CELステートメントの評価結果を収集するためには、1回実行されるユーザー起動スクリプトを使用することをお勧めします。このスクリプトは、1回限りの操作でシーンをトラバースし、その後ノードパラメータを設定するために使用できる情報を収集します。

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

CELステートメントと一致する一連の既存の場所を検索するには、CEL収集操作を使用します。スクリプトボタンを介して実行されるスクリプトでは ウィジェット モジュールの 一部である 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システム を使用してい ます。 CollectAndSet OpScriptノードでスクリプト 調べるには、「パラメーター」タブ>「ユーザーパラメーターの編集」の上部にあるレンチアイコンをクリックし、次に「CollectGeometryLocations」ボタン>「ウィジェットオプション…」の上にあるレンチアイコンをクリックします。

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')。ダイアログにはスクリプトフィールドもあり、ボタンをクリックしたときに実行される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() 関数は、例えば、ユーザオペアンプのArg、としてLuaのスクリプトで使用するためにアクセス可能であるように、その後OpScriptノード上のユーザパラメータとして設定することができる場所のパスのリストを返します。

5.PNG

参考文献

CEL構文の詳細については 、 『Katana開発者ガイド』の「 CEL参照」 セクション を参照してください

PythonスクリプトやOpScriptノードのLuaスクリプトで設定されているものなど、ユーザー操作引数へのアクセスの詳細については、Katana開発者ガイド (Cookインターフェイス)(OpScript) を参照してください

あなたがこれに関して何か問題に遭遇しているならば、それからサポートチケットを開いて、問題とあなたがこれまでにどのトラブルシューティング手順をとったかについて私たちに知らせてください。

サポートチケットを開く方法の詳細については、「 サポートポータル 使用 」の記事 を参照してください

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

We're sorry to hear that!

Please tell us why.
6人中6人がこの記事が役に立ったと言っています

コメント