2016-05-25 1 views
2

私は良いタイトルを考えるのに苦労したので、ここで説明します。私はいくつかのイベントコールバックオプションを持つMayaでPythonを使用していますので、on save: run functionのようなことができます。私はユーザーインターフェイスクラスを持っていますが、これは特定のイベントがトリガされたときに更新することができますが、これを行うためのよりクリーンな方法を探しています。 Mayaが再起動されるまでクラス内の現在の値を使用してコールバックを使用して関数を実行する

class test(object): 
    def __init__(self, x=0): 
     self.x = x 
    def run_this(self): 
     print self.x 
    def display(self): 
     print 'load user interface' 

#Here's the main stuff that used to be just 'test().display()' 
try: 
    callbacks = [callback1, callback2, ...] 
except NameError: 
    pass 
else: 
    for i in callbacks: 
     try: 
      OpenMaya.MEventMessage.removeCallback(i) 
     except RuntimeError: 
      pass 

ui = test(5) 
callback1 = OpenMaya.MEventMessage.addEventCallback('SomeEvent', ui.run_this) 
callback2 = OpenMaya.MEventMessage.addEventCallback('SomeOtherEvent', ui.run_this) 
callback3 = ...... 
ui.display() 

コールバックが解消されないが、あなたはそれをaddEventCallbackから返された値を渡した場合、あなたはそれがremoveCallbackを使用して削除することができます。

は、ここで私が持っているものに似て基本的な例です。私が現在行っている方法は、設定する前に変数が設定されているかどうかをチェックするだけです。これは前の1行よりもずっと面倒です。test().display()

私は関数でうまくいく方法がありますか?私がtestクラスをやり直すか、それとも似たようなものを実行すれば、古いものを削除するか?

+0

だから、同じ関数を(同じ時刻に)実行するために複数のコールバックを登録したいのではないでしょうか? – 101

+0

いいえ、別々のコールバックをイベント毎に持っていますが、イベントごとに1つしかありません。 – Peter

答えて

1

これを試してみる方法は2つあります。

コールバックマネージャを表す永続オブジェクトを作成し、それをフックしたりアンフックすることができます。このバージョンで

import maya.api.OpenMaya as om 
import maya.cmds as cmds 
om.MEventMessage.getEventNames() 

class CallbackHandler(object): 

    def __init__(self, cb, fn): 
     self.callback = cb 
     self.function = fn 
     self.id = None 

    def install(self): 
     if self.id: 
      print "callback is currently installed" 
      return False 
     self.id = om.MEventMessage.addEventCallback(self.callback, self.function) 
     return True 

    def uninstall(self): 
     if self.id: 
      om.MEventMessage.removeCallback(self.id) 
      self.id = None 
      return True 
     else: 
      print "callback not currently installed" 
      return False 

    def __del__(self): 
     self.uninstall() 

def test_fn(arg): 
    print "callback fired 2", arg 

cb = CallbackHandler('NameChanged', test_fn) 
cb.install() 
# callback is active 
cb.uninstall() 
# callback not active 
cb.install() 
# callback on again 
del(cb) # or cb = None 
# callback gone again 

あなたは限り、あなたは、コールバックが持続して、それらを手動でアンインストールしたり、任意のより多くのそれらを必要としないときにそれらがスコープ外に落ちるようにしたいとのために作成CallbackHandlerはを保存すると思います。

別のオプションは、独自のオブジェクトを作成してコールバックを表し、それから自分のコードでトリガーする関数を追加または削除することです。これは、あなたのニーズに応じて良いか悪いか、apiに頼るのではなく、管理をあなたの側に完全に保ちます。あなたは__call__()を使用して(呼び出し可能だったEvent()クラスを持っているだろうし、それがその後、発射する機能のリストを持っているでしょうその__call__()マヤによって呼び出されました。あなたがほしいとイベントハンドラオブジェクトの種類の例がありますhere

+0

良いアイデアで素晴らしいと思うが、別の簡単な質問ですが、 'cb'が別の変数に割り当てられていても起動する' __del__'の代替手段はありますか?既に存在する場合はウィンドウを削除するので、コードを追加するのに最適な場所になるかもしれません。私はそれをグローバル変数として設定します。 2番目の選択肢は少し難しいと思うが、私のOpenMayaの知識は非常に基本的なものなので、私はそれがなくてもイベントにアクセスする方法がわからない。 – Peter

+0

私はちょうどあなたが少し異なるインポートを使用して気づいた、 'maya.OpenMaya'は' maya.api.OpenMaya'とほとんど同じですか? – Peter

+0

'maya.api'は 'api2'とも呼ばれる '新しい' apiをインポートします。より速く、簡単に操作できますが、古いものより完全ではありません。まだ移行されていない関数の1つが必要でない限り、あなたが使用するはずのものです。 – theodox

関連する問題