On this page |
概要
Rig Treeビューは、キャラクタコンポーネントを階層で表示し、OBJリグとSOPリグのどちらとも互換性があります。 走査の挙動がオブジェクトリグとSOPリグで若干異なります。
OBJリグ
これは、オブジェクトノードで構成されたリグです。 OBJリグを表示すると、Rig Treeビュー内の各アイテムはリグ内の各オブジェクトノードに呼応します。
オブジェクトノードを含んだサブネットを選択すると、オブジェクトノードの子ネットワークが各ノードの入力と出力に基づいて走査されます。
例えば、subnet1
の中にgeo1
とgeo2
の2個の子ノードが含まれていて、geo1
の出力がgeo2
に接続されていたとします。
subnet1
を選択すると、Rig Treeビューでは、geo1
がgeo2
の親となった単純な階層を表示します。
SOPリグ
これは、ポイントとそれらのポイントを結んだプリミティブの形式でSOPノードの出力によって生成されたリグです。 SOPリグを表示すると、Rig Treeビュー内の各アイテムはポイントを表現します。
SOPノードを選択すると、そのジオメトリが読み込まれ、ポイントとそれらのポイントを結んだプリミティブから階層が生成されます。
挙動のカスタマイズ
Rig Treeビューは、ノードを走査する度に、そのノードのType Definition内に“rigtreeconfig”という名前の構成セクションが含まれていないかどうかをチェックします。 これが見つからなかった場合、Rig Treeビューは選択とドラッグアンドドロップの動作に対してデフォルトの挙動をします。
このrigtreeconfig
は、ユーザ側で利用可能なPythonモジュールで、名前を付けたメソッドにクラスインスタンスを登録することで独自の挙動を実装することができます。
独自の挙動を実装したメソッドが見つかれば、デフォルトの挙動は実行されなくなります。
詳細は、以下のサブセクションで説明しています。
"""状況に応じて必要なメソッドを使ってクラスを作成します。""" class RigTreeConfig: def __init__(self,widget): self._widget = widget """ 独自のRigTreeメソッドを実装します。 すべてのメソッドは任意で、そのメソッドを実装しなければデフォルトの挙動が使われます。 def select(self,kwargs): def get_selection(self,kwargs): def default_output(self,kwargs): def drag_drop(self,kwargs): def rename(self,kwargs): def available_actions(self,kwargs): def delete(self,kwargs): """ """rigtreeconfigモジュールのエントリーポイント。親のRigTreeViewウィジェットをこの関数の引数として与えます。""" def rigtreeconfig(widget): return RigTreeConfig(widget)
登録
rigtreeconfig
グローバル関数を定義します。
rigtreeconfig
関数は、Rig Treeペインが現行ノードを更新する際にコールされます。
widget
引数には、親のRig TreeビューPythonウィジェットの参照を指定します。
widget
をクラスのデータメンバーとして保持することで、kwargs
引数に欲しい情報を指定しなくてもウィジェットからたくさんの情報にアクセスすることができます。
rigtreeconfig
関数は、カスタムクラスのインスタンスを返すようにするか、または、kinefx.ui.rigtreeconfig
内のどれかのビルトインクラスのインスタンスを返すようにしてください。
from kinefx.ui.rigtreeconfig import GroupRigTreeConfig def rigtreeconfig(widget): return GroupRigTreeConfig(widget=widget)
デフォルトの出力
このメソッドは、SOPリグのみに関係します。特に複数の出力または入力を持つSOPリグがそうです。
このメソッドは、Rig Treeビューを開いた時にコールされ、どのジオメトリからRig Treeビューを構築するのかを定義します。 そのデフォルトの出力は、ウィジェットのヘッダ上のドロップダウンメニューのインデックスで設定します。
def default_output(self,kwargs): """ インデックスを返すには、`default_output`という名前の値に整数を設定します。 `show_dropdown`を`False`に設定することで、ドロップダウンメニューを非表示にすることもできます。 """ kwargs["default_output"] = 1 kwargs["show_dropdown"] = True
ツリービューの選択
デフォルトでは、ツリービューを選択すると以下の挙動になります:
-
OBJリグの場合、Rig Treeビュー内のアイテムを選択すると、ネットワークビュー内のそのオブジェクトノードが選択されます。
-
SOPリグの場合、Rig Treeビュー内のアイテムを選択すると、シーンビューア内のそのポイントが選択されます。
この選択の挙動をカスタマイズするには、クラスの中にselect
メソッドを入れてください。
def select(self, kwargs): """選択の挙動をカスタマイズする。 これは、選択イベント(サブツリー内のすべてのアイテムを選択、すべての選択の解除、単一アイテムの選択)が発生する度にコールされます。 - `selection`は選択されたすべてのアイテムのリストです。 - `selected`は選択されたばかりのアイテムのリストです。オブジェクトノードネットワークの場合、各リストエレメントはそのノードのフルパスです。 SOPネットワークの場合、存在すればそのポイントに関連付けられている名前です(存在しなければ、デフォルトが使用されます)。 - `deselected`は選択解除されたばかりのアイテムのリストです。 """ # 'selection'を使って何か処理をします。 print(kwargs['selection'])
Note
ハンドラーが実際にRig TreeビューのUI選択に干渉しないようにする必要があります。 つまり、ハンドラーがRig TreeビューのUI内で選択されたアイテムを変更しないようにする必要があります。
Rig Treeビューのドラッグアンドドロップ
単一アイテムのドラッグアンドドロップに対応しています。 各タイプのリグのデフォルトの挙動は以下の通りです:
-
OBJリグの場合、ドラッグアンドドロップによってオブジェクトノード間の接続を変更することができます。
-
SOPリグの場合、デフォルトではドラッグアンドドロップは何も処理しません。
ドラッグアンドドロップの独自の挙動を定義するには、クラス内にdrag_drop
メソッドを定義します。
def drag_drop(self,kwargs): """UI内でアイテムがドラッグアンドドロップされる度にコールされます。 リグを再び走査するように(つまり何かの変更があったことを)UIに知らせるにはTrueを返します。 再び走査する必要がないならFalseを返します。 - `item`はドラッグアンドドロップされるデータです。 - `old_parent_item`はドラッグされる前の`item`の親アイテムを表現したデータです。 ここで言う親とは、オブジェクトノードの親ではなくてRig Treeビューでの親を意味しています。 アイテムがトップレベルにあった場合は、これはNoneになります。 - `new_parent_item`はドロップした後の`item`の親アイテムを表現したデータです。 `item`がトップレベルに移動した場合は、これはNoneになります。 """ return False
アクション
アクションは、ユーザが右クリックで開かれるコンテキストメニューから“ノードアクション”オプションを選択してアクセス可能なカスタム関数です。 デフォルトでは、利用可能なアクションはありません。
リグに対して独自のアクションを定義するには、ノードのType Definitionのrigtreeconfig
セクション内にavailable_actions
関数を定義します:
def available_actions(self,kwargs): """右クリックでコンテキストメニューが開かれる度にコールされます。 - `selection`を使用することで、現行選択に基づいて利用可能なノードアクションを動的に選択することができます。 """ # 選択内容に応じて異なるアクションを返すのか、または、同じアクションを返すのか選ぶことができます。 return { 'action_1': lambda: "ここで何かを処理します", 'action_2': lambda: "ここで他の何かを処理します", }
名前の変更
OBJリグの場合、デフォルトでは、名前を変更するとそれに関連付いているオブジェクトノードの名前が変更されます。
SOPリグの場合、名前変更によるデフォルトの挙動がないので、独自に名前変更用の関数を定義する必要があります。
名前変更による独自の挙動を定義するには、rigtreeconfig
内にrename
関数を定義します:
# rigtreeconfigの中 def rename(self,kwargs): """Rig Treeビューを再び走査するように指示するにはTrueを返します。 変更があっても再び走査される事を保証しない場合にはFalseを返します。例: 何か失敗してrenameで何も変更を発生させたくない場合。 パラメータ: - `item`: 名前が変更されるアイテムを表現します。ここには、ノードパス(OBJリグの場合)または番号(SOPリグの場合)を指定することができます。 - `old_name`: これまで表示されていた名前。 - `new_name`: ユーザが要求した新しい名前。 NOTE: renameイベントは、`old_name`と`new_name`が同じ場合でも発動されます。 """ # ここで名前変更による何かの処理をします... return True
削除
削除によるデフォルトの挙動がないので、独自の削除用の関数を定義する必要があります。
削除による独自の挙動を定義するには、rigtreeconfig
内にdelete
関数を定義します:
# rigtreeconfigの中 def delete(self,kwargs): """Rig Treeビューを再び走査するように指示するにはTrueを返します。 変更があっても再び走査される事を保証しない場合にはFalseを返します。例: 何か失敗してdeleteで何も変更を発生させたくない場合。 パラメータ: - `selection`は選択されたすべてのアイテムのリストです。 """ # ここで何かしらの削除の処理をします... 例えば、ポイントを削除したり、オブジェクトノードを削除します。 return True
API
アイテムは“アイテムID”によって個別に識別されます。 SOPリグの場合、このアイテムIDはポイントインデックス(つまり整数)です。 OBJリグの場合、このアイテムIDはオブジェクトノードのフルパス(例えば、“/obj/myrig/shoulder1”)です。
selectItem(self, item_id, select_if_true, enable_handler=True)
→ bool
Rig Treeウィジェット内のitem_id
に相当するアイテムを選択または選択解除します。
合致したアイテムが見つかればTrueを返します。
見つからなければFalseを返します。
enable_handler
をFalse
に設定すると、デフォルトまたはユーザ定義の選択ハンドラー(つまり、rigtreeconfig
内のselect
)は発動されなくなります。
selectedItems(self)
→ list
選択されたアイテムのIDのリストを返します。
clearSelection(self, enable_handler=True)
Rig Treeビューの現行選択をクリアします。
enable_handler
はselectItem
と同じ様に動作します。
getCurrentNodePath()
→ str
or None
現行リグを表現したノードのフルパスを取得します。
現在何もノードが走査されていなければ、None
を返します。
setNode(node)
node
で表現されたリグを走査します。
node
がRig Treeウィジェットで表示されている現行ノードだった場合は、再び走査されることはありません。
resetCurrentNode()
現行ノードを再び走査します。