スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    Maya2014でPySide

     遂にMaya2014がリリースされましたね~。
    3D人さん : Autodesk Maya 2014 New Features – 新機能を動画で確認!リトポも可能な新モデリングツールに注目!

     モデリング機能が大幅に追加されてたり、ビュー上に絵を描けたりとかなり楽しそうなバージョンアップ。
     前回の2013は、なんとな~くスルーしてしまった(保守料勿体ない・・・)んですが、今回は久しぶりにインスコしてみましたよ~(*´∀`*)

     その中でも個人的に注目してるのがPySideが標準で搭載されるようになった事ですね!
     今まではPyQtを落としてきて事前準備する必要があったのですが、これによって標準で使えるようになったのはかなり嬉しいです。
     しかし、PyQtで作成した物もかなりあるんで、さぁどうしたものかと。。。

     って事で、しばらくの間はPyQt/PySide互換モジュールを作って、それを経由する方法でしのいでみるかどうか検討してみようかなぁと。



     とりあえずPyQt4とPySideを試してみて、ちゃんと読めた方を採用するって言う飛んでも8分歩いて10分なスクリプトを急ぎ作成。
     検証してない上にかなり怪しいスクリプトなんで、良い子は真似しちゃダメですよ(*^_^*)  あくまで個人的なメモなんで。
    # qtBinding.py
    # -*- coding:utf-8 -*-
    
    QtBindings = [
        [ 'PyQt4',  'QtCore.QObject', 'pyqtSignal', 'pyqtSlot', 'sip', '' ],
        [ 'PySide', 'QtGui.QWidget', 'Signal',     'Slot',     'shiboken', 'wrapInstance' ],
    ]
    
    QtGui   = None
    QtCore  = None
    sip     = None
    QObject = None
    Signal  = None
    Slot    = None
    for binding in QtBindings:
        try:
            Qt = __import__(
                binding[0], globals(), locals(), ['QtGui', 'QtCore'], -1
            )
        except Exception, inst:
            pass
        QtGui   = getattr( Qt, 'QtGui' )
        QtCore  = getattr( Qt, 'QtCore' )
        ParentModule = {
            'QtGui'  : QtGui,
            'QtCore' : QtCore,
        }
    
        objectInfo = binding[1].split( '.' )
        QObject = getattr( ParentModule[objectInfo[0]], objectInfo[1] )
    
        # Get signal and slot.
        Signal  = getattr( QtCore, binding[2] )
        Slot    = getattr( QtCore, binding[3] )
    
        sip     = __import__( binding[4] )
        if not hasattr( sip, 'wrapinstance' ):
            sip.wrapinstance = getattr( sip, binding[5] )
        break
    
     これを読み込んで使えば、とりあえずPyQtでもPySideでも通る方を使うって言う流れになります。
    import qtBinding
    QtGui, QtCore = qtBinding.QtGui, qtBinding.QtCore
    
    class Window( QtGui.QWidget ):
        def __init__( self, parent=None ):
            super( Window, self ).__init__( parent )
    # ...
    
    と、書いといて何ですけど、こんなん有りなんだろうか・・・



     んで、前に作ったヤツを試しにコレで通してみる。
    Maya2012バージョン
    maya2014Pre01_002.png
    Maya2014バージョン
    maya2014Pre01_001.png
     を~、問題なく通った~(∩´∀`)∩ワーイ
     しばらくはこれでしのぎつつ、これからボチボチPySideへ移行しようかなぁ~、面倒だけど。













































































    と、思ったら・・・一部でエラー・・・
    何でじゃぁぁぁぁぁヽ(`Д´)ノウワァァァン!!

     エラーを辿ってみたところ、「そんなクラス内変数無いぞ!」とPython様が仰せられてました。




    ( ゚д゚)ポカーン




     いやいや、ちゃんと定義してますよ、何処見てんですかアンタは!
    あ、あれですね、時代遅れのツンデレタソを今さら気取ってるんですね? そうですね、わかります。
     なんて言ってる場合じゃないので、さらにモチっとコードと睨めっこしたところ、ひとつ思い当たる物が・・・

    多重継承

     そう言やぁ、ガチンコ神が「同じ型じゃないと多重継承できないんですよ~(∩´∀`)∩」なんて仰せられてましたねぇ。



     でも試したらうまくいったんですよね~、PyQtでは



     そんな訳で急いでテストサンプル作成!
    from PySide import QtGui, QtCore
     
    class CustomWidgetA( QtGui.QWidget ):
        def __init__( self, parent=None ):
            super( CustomWidgetA, self ).__init__( parent )
            self.setWindowTitle( 'Sample Window' )
        def makeButton( self ):
            button = QtGui.QPushButton( 'Test Window' )
            self.layout.addWidget( button )
     
    class CustomWidgetB( QtGui.QGroupBox ):
        def __init__( self, parent=None ):
            super( CustomWidgetB, self ).__init__( parent )
            self.setTitle( 'Test Group' )
            self.layout = QtGui.QVBoxLayout( self )
            self.move( 0, 0 )
        def makeButton( self ):
            button = QtGui.QPushButton( 'Test Button' )
            self.layout.addWidget( button )
     
    class ButtonExample( CustomWidgetA, CustomWidgetB ):
        def __init__( self, parent=None ):
            super( ButtonExample, self ).__init__( parent )
            self.makeButton()
     
     
    window = ButtonExample()
    window.show()
    
     さっそく実行~




     落ちた~+。:.゜ヽ(*´∀`)ノ゜:.。+゜


     と言うことだそうです。。。
     もちろん上のコードのPySideをPyQtにすれば問題なく通ります。これはPySide側のバグなのか仕様なのかわかりませんが。


     しかし21行目の継承部分をCustomWidgetB, CustomWidgetAにしてやると問題なく動作しました、少なくともこのサンプルでは。
     って事は、継承するオブジェクト間の継承関係が重要になってくるって事でしょうかね・・・。
    (上の例だと、QGroupBoxはQWidgetを継承している、いわば孫なので、孫を先に書く必要があるとか?)
     ただ、Pythonでは多重継承する時に継承先のクラスに同名のメソッドがあった場合、先に記述されているクラスのメソッドを優先するため、結構が順番が重要だったりするのでこれは難しい問題かも・・・
     そもそも根本的にこういう風に書こうとしてる自分がアフォなのか?

     どうしよ・・・



     しばらく様子見しますかぁ(ヽ´ω`)
     何か有益な情報求む!!
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

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

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

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。