まとめ
この記事では、OpScript ノードの Lua スクリプト内で評価された CEL ステートメント (収集操作) のキャッシュされた結果を使用する方法について説明します。
これは、OpScript ノードでスクリプト ボタンの Python スクリプトを実行し、結果として得られるシーン グラフの場所のパスをユーザー パラメーターにキャッシュすることで実現され、OpScript ノードの Lua スクリプト自体で使用できるようになります。
これにより、ユーザーは都合の良いときに収集操作を実行し、OpScript ノードがクックされるたびに CEL ステートメントをシーン グラフ全体と照合する必要がなく、キャッシュされた結果に対して OpScript Lua スクリプトを実行できるようになります。
このようなスクリプトを設定する方法とその理由については、以下をお読みください。
詳しくは
ユーザーは、OpScript ノード上の Lua スクリプト内で収集操作の結果を使用することができます。たとえば、結果のロケーション パスをシーン グラフ属性の下に保存したり、Lua スクリプトで操作できるようにしたりすることができます。
望ましくないアプローチ
OpScript 内で CEL ステートメントの評価結果を収集することは、位置が指定された CEL ステートメントと一致するかどうかを判断するために、上流のレシピが変更されるたびにシーンのすべてではないにしても一部をクックする必要があるため、望ましくありません。
大規模なシーン グラフを含むシーンで作業する場合、これは非常に計算コストが高く、時間のかかる操作になる可能性があります。これは対話型のコンテキストでは非常に望ましくなく、 Katanaの遅延評価モデルに反します。
推奨されるアプローチ
CEL ステートメントの評価結果を収集するには、ユーザーがトリガーして 1 回実行されるスクリプトを使用することをお勧めします。このスクリプトは、1 回限りのクックでシーンを走査し、ノード パラメーターの設定に使用できる情報を収集します。関連する場所が変更された場合にプロジェクトを最新の状態に保つために、これを繰り返す必要があります。
CEL ステートメントに一致する既存の場所のセットを取得するには、CEL 収集操作を使用します。スクリプト ボタンを介して実行されるスクリプトではCollectAndSelectInScenegraph()
ウィジェットモジュールの一部である CollectAndSelectInScenegraph() 関数を使用できます。
collector = Widgets.CollectAndSelectInScenegraph(celStatement, traversalRootLocationPath)
matchedLocationPaths = collector.collectAndSelect(select=False, node=myNode)
どこ:
- celStatementは評価される式です。
- traversalRootLocationPathは、評価を開始するシーン グラフの場所のパスです。これは、 /rootまたはその他の指定されたシーン グラフの場所になります。たとえば、このブランチ内の子の場所のみを CEL ステートメントと照合する必要がある場合は、 /root/world/geo になります。
サンプルシーン
添付のサンプル シーンでは、この戦略の実装を確認できます。このシーンは、 「OpScript でのジオメトリの生成」サンプル プロジェクトの L システムを使用しています。 CollectAndSet OpScript ノードのスクリプトを検査するには、[パラメータ] タブの上部にあるレンチ アイコンをクリックし、[ユーザー パラメータの編集] をクリックし、次に CollectGeometryLocations ボタンの上にあるレンチ アイコンをクリックし、[ウィジェット オプション…] をクリックします。
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 スクリプトに設定されているものなどのユーザー OP 引数にアクセスする方法の詳細については、 「Cook Interface (OpScript)に関するKatana開発者ガイド」を参照してください。
これに関して問題が発生した場合は、サポート チケットを開いて、問題とこれまでに実行したトラブルシューティング手順についてお知らせください。
サポート チケットを開く方法の詳細については、 「Q100064: サポート チケットを発行する方法」を参照してください。
添付ファイル
私たちはそれを聞いて申し訳ございません
理由をお聞かせください