まとめ
この記事では、OpScript ノードの Lua スクリプト内で評価された CEL ステートメント (収集操作) のキャッシュされた結果を使用する方法について説明します。
これは、OpScript ノードでスクリプト ボタンの Python スクリプトを実行し、結果のシーン グラフの場所のパスをユーザー パラメータにキャッシュすることで実現され、OpScript ノードの Lua スクリプト自体で使用できるようになります。
これにより、ユーザーは都合の良いときに「収集」操作を実行し、OpScript ノードがクックされるたびに CEL ステートメントをシーン グラフ全体と照合する必要なく、キャッシュされた結果に対して OpScript Lua スクリプトを実行できるようになります。
このようなスクリプトを設定する方法と理由については、以下をお読みください。
詳細情報
ユーザーは、OpScript ノード上の Lua スクリプト内で collect 操作の結果を使用して、たとえば、結果の場所のパスをシーン グラフ属性の下に保存したり、Lua スクリプトで操作できるようにしたりすることができます。
望ましくないアプローチ
OpScript 内で CEL ステートメントの評価結果を収集することは、場所が指定された CEL ステートメントと一致するかどうかを判断するために、上流のレシピが変更されるたびに、シーンのすべてではないにしても一部をクックする必要があるため、望ましくありません。
大規模なシーングラフを持つシーンを扱う場合、これは非常に計算コストが高く、時間のかかる操作になる可能性があります。これはインタラクティブなコンテキストでは非常に望ましくなく、 Katanaの遅延評価モデルに反します。
推奨されるアプローチ
CELステートメントの評価結果を収集するには、ユーザーがトリガーするスクリプトを一度だけ実行するのがより良い方法です。このスクリプトは、シーンを一度だけクックして情報を収集し、ノードパラメータの設定に使用します。関連する場所が変更された場合にプロジェクトを最新の状態に保つには、このスクリプトを繰り返し実行する必要があります。
CELステートメントに一致する既存の場所のセットを取得するには、CEL collect操作を使用します。スクリプトボタンから実行されるスクリプトではCollectAndSelectInScenegraph() Widgetsモジュールの一部であるCollectAndSelectInScenegraph()関数を使用できます。
collector = Widgets.CollectAndSelectInScenegraph(celStatement, traversalRootLocationPath)
matchedLocationPaths = collector.collectAndSelect(select=False, node=myNode)
どこ:
- celStatementは評価される式です。
- traversalRootLocationPathは、評価を開始するシーングラフの位置パスです。これは
/rootまたは任意のシーングラフの位置(例えば、このブランチ内の子の位置のみを CEL ステートメントと照合する場合は/root/world/geoに指定できます。
例のシーン
添付のサンプルシーンでは、この戦略の実装例を見ることができます。このシーンでは、 「Generating Geometry in OpScript」サンプルプロジェクトのL-Systemを使用しています。CollectAndSet OpScriptノードのスクリプトを確認するには、「Parameters」タブ上部のレンチアイコンをクリックし、「Edit User Parameters」をクリックした後、「CollectGeometryLocations」ボタンの上にあるレンチアイコンをクリックして「Widget Options…」を選択します。
CollectAndSelect OpScript ノードのユーザー パラメータは、次の手順で設定されました。
- OpScript ノードを作成し、 e キーを押して [パラメータ] タブでそのパラメータを開きます。
- 「パラメータ」タブの上部にあるレンチアイコンをクリックし、「ユーザーパラメータの編集」をクリックします。これにより、ノードに「user」という名前の新しいグループパラメータが追加されます。
- 「追加」をクリックしてユーザーグループパラメータにパラメータを追加し、パラメータタイプとして「文字列配列」を選択します。これは、一致したロケーションパスを保存するパラメータになります。
-
新しいパラメータのすぐ上にあるレンチアイコンをクリックし、「パラメータ名の変更」をクリックします。新しい名前を入力できるダイアログが開きます。パラメータ名を「matchedLocationPaths」に変更します。
-
もう一度「追加」をクリックし、今回はパラメータタイプとして「ボタン」を選択します。
- 新しく作成されたボタンの真上にあるレンチアイコンをクリックし、「ウィジェットオプション…」を選択します。するとダイアログが開き、ボタンのテキストを「CollectGeometryLocations」など、わかりやすいものに変更できます。また、このダイアログにはスクリプトフィールドがあり、ボタンがクリックされた際に実行されるPythonコマンドを追加できます。
-
次の Python コマンドをコピーしてスクリプト フィールドに貼り付けます。
collector = Widgets.CollectAndSelectInScenegraph('//*{hasattr("geometry")}', '/root/world/geo')一致した場所のパスをノードのmatchedLocationPathsユーザー パラメータに保存するには、次のコマンドをスクリプトに追加します。
# 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
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 構文の詳細については、 Katana開発者ガイドのCEL リファレンスセクションを参照してください。
OpScript ノードの Lua スクリプトで、Python スクリプトに設定されているようなユーザー opArgs にアクセスする方法の詳細についてはKatana Cook インターフェイス (OpScript)に関する Katana 開発者ガイドを参照してください。
これに問題が発生した場合は、サポート チケットを開いて、問題の内容とこれまでに実行したトラブルシューティング手順をお知らせください。
サポート チケットを開く方法の詳細については、 「Q100064: サポート チケットの発行方法」を参照してください。
添付ファイル
私たちはそれを聞いて申し訳ございません
理由をお聞かせください