処理の前後に別の処理を挟む?デコレータとWith文

ある処理の前後に違う処理を挟む?

例:コンビニのレジ

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")

Pythonのおすすめ書籍

関連記事

  1. ShrinkWrap & Wrapを使ったジオメトリのデカール

    2020-11-11

  2. objectSetを使ってチェックツールを発展させよう!

    2021-12-06

  3. Maya Bifrostでプロシージャルリギング

    2024-03-27

  4. Maya最強のウェイトツール!ngSkinTools v2の紹介「スキンウェイトをPhotoshopレイヤー風に維持できる」

    2021-08-15

コメントをお待ちしています。

コメント

ABOUT

テクニカルアーティストの為のまとめサイトです。

本サイトでは、『YouTube ✕ Blog』を中心に
情報発信をしていきます。

また、テクニカルアーティストとしての様々な
ライフハック記事も投稿予定です。

限定情報会員

PATREONでは、限定情報やサンプルファイルの配布も行っています。登録頂けると更新頑張れます。支援の方よろしくお願いします。


免責事項

本ウェブサイト内で公開している全ての情報の有用性や安全性については当方は一切の保証を与えるものではありません。
利用したことによって引き起こる直接および間接的な損害に対して当方は一切責任を負うものではありません。
全て自己責任でご使用ください。

3DCGBOOK出版

BOOTHで技術書を販売利しております。







スポンサー

ページ上部へ戻る