ある処理の前後に違う処理を挟む?
例:コンビニのレジ
1.いらっしゃいませ。
2.お会計、○○円です。
3.ありがとうございました。
この時、2の工程の内容は常に変化がありますが
1、3に関してはルーチン化してますよね。
挨拶がルーチンというと失礼にあたりそうですが、あくまで例なので…笑
さて、この2の処理の前後に1、3のような処理をお手軽に挟むことができるのが
デコレータ、with文と呼ばれるものです。
お好みでどっちを使っても良いと思います。
Mayaでどう使う?
Mayaでは、選択情報の保持やundoChunk開閉でよく使われる印象があります。
今回は選択情報の保持を例に作ってみました。
Mayaのいくつかのコマンドでは、選択状態を変えてしまうコマンドが結構あります。
例えば、createNodeコマンドは指定したノードを作るコマンドですが選択状態が作ったノード側に移ってしまいます。
いつのバージョンのMayaかは忘れましたがcreateNodeコマンドに
skipSelectというフラグが追加されました。これを追加すると上記の問題は解消されます。
ただ、createNodeコマンド以外にも選択状態を変えてしまうコマンドが結構あります。
なので変えないようにデコレーターで処理を挟んであげるということをします。
選択状態を保持する手続きは?
1.選択情報をlsコマンドを使い変数に入れておく
2.好きな処理をする
3.selectコマンドに1の変数を与える
こんな感じです。
早速、デコレーターとwith文を使ってやってみたサンプルコードが以下です。
デコレータ
from maya import cmds
def keep_selection(func):
def wrapper(*args, **kwargs):
_selection = cmds.ls(selection=True)
func(*args, **kwargs)
cmds.select(_selection)
return wrapper
@keep_selection
def hoge():
cmds.createNode("joint")
with文
from maya import cmds
class KeepSelection(object):
def __enter__(self):
self._selection = cmds.ls(selection=True)
return self
def __exit__(self, exc_type, exc_value, traceback):
cmds.select(self._selection)
with KeepSelection():
cmds.createNode("joint")
コメント