fc2ブログ

    Randomizer

     オブジェクトをランダムに配置したり、選択するツールを作成。
    randomizer.jpg
     正確には昔作ってたんですが、Pythonで書き直しました。
     友達からMaya2011で動かんぞゴラァと指摘を受けたのと、ランダム配置した結果が今まで箱状にしか配置できなかったのを球状に配置できるようにして欲しいとの要請を受けてまして、ルーチンや作りも古いしMelだったってのもあって、この際1から作り直してしまおうと。

     欲しい人がいたら、ここからダウソできます。
    Melpy-Studio Tool Download
    randomizerってのがソレです(ってまだ1個しかないけど)

     Python化するんで、やっぱりPythonの機能を使わないともったいないって事でGUIは例によってクラスで作成してみました。またPyQt勉強してて気づいたことを導入してみました。
     そしたらまぁ、なんと便利だ事!!(いつも言ってるような気がしますな)

     今回やった事をメモ。
     ツールではTranslate・Rotate・Scaleセクションでそれぞれ同じオプションが付属しているのですが、共通パーツなんでこの部分をStandardOptionと言うクラスにしました。
     ・__init__メソッドでGUIを定義してクラスを呼び出せばGUIを作成できるようします。
     ・checkBoxをOnするとGUIが切り替わる動作のようなGUIのリフレッシュ系動作もメソッドとして登録。
     ・getValueメソッドを用意し、このメソッドで必要な情報を一括で返すようにします。
    これでこのクラスを呼び出せば、同じ動作をするGUI郡を何回でも作れるようになります。

     とまぁ、ここまではMayaでGUIにユニークタグでも引数として渡してやれば出来なくもないんですが、次にやったクラスの継承で感動!
     Translateオプションは微妙にオプションが他2つに比べて多いので、上記StandardOptionクラスを継承したサブクラスTranslateOptionを作成。
     基本StandardOptionでやってることは一緒。ただ、PyQt勉強するまで気がつかなかったことがあってそこで感動しました。
     今まで、サブクラスで__init__メソッドを上書きしてしまうと、親クラスの__init__の効果は無効になるとばかり思ってたのですが、なんとしっかり親クラス__init__を使った上でカスタマイズもできました!!
     サブクラスの__init__メソッドの中で親クラスの__init__を呼び出すだけで、なんとまぁ!バッチリ実行してくれるじゃないですか!
     こんな感じ
    import maya.cmds as mc
    import functools
    fp = functools.partial
    class StandardOption( object ):
        def __init__( self, parent ):
            self.uiClm = mc.columnLayout( p=parent, adj=True )
            self.check = mc.checkBox( l='Test', v=True )
        def printGUI( self, *tmp ):
            print 'Check box state : %s' % mc.checkBox( self.check, q=True, v=True )
    
    class AdvancedOption( StandardOption ):
        def __init__( self, parent ):
            self.mainClm = mc.frameLayout( l='Test', p=parent )
            clm = mc.columnLayout( adj=True )
            self.slider = mc.floatSliderGrp( l='Slider', f=True, v=1, min=0, max=10 )
            StandardOption.__init__( self, clm )
            self.button = mc.button( l='Button', c=fp(self.printGUI) )
    

    こんな感じのクラスを用意しておき、今度は下記のを実行すると・・・
    win = mc.window()
    clm = mc.columnLayout()
    a = StandardOption( clm )
    b = StandardOption( clm )
    c = StandardOption( clm )
    d = AdvancedOption( clm )
    mc.showWindow( win )
    
    sampleWindow.jpg
     こんな感じのウィンドウがでます。
     Testと言うチェックボックスはStandardOptionクラスで作成、スライダやボタンがあるヤツはStandardOptionを継承したAdvancedOptionクラスで作成しています。
     AdvancedOptionの__init__メソッドではまずフレームレイアウトを作成して、スライダを作成、その後StandardOptionクラスを呼び出し、最後にボタンを作成しています。
     なのでTestと言うチェックボックスがスライダとボタンの間に作成されているんですね。
     ボタンにはStandardOptionクラスのprintGUIメソッドをアサインしてるので、しっかり継承されているのがわかると思います。

     似たようなGUIを多数作成する必要がある場合、クラスの継承は超便利!!

     今までのツールのGUIも見直しかなぁ
    スポンサーサイト



    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR