水深1mm

広く浅い個人的メモ。

Maya2017・2016の両方で動作するUIについて

Maya2016のスクリプトをMaya2017で動作するような対応を行った。

作業環境

  • Window7 64bit
  • Maya2017

動作確認を行ったスクリプトについて

  • Maya2016で動作済み
  • QtDesignderで作成した.uiファイルを.pyに変換して使用
  • QtDesignder上でのSignal・Slotの設定は無し
  • 直接のShibokenは無し

対応方法

Documents/maya/2017/scripts にuserSetup.pyを作成して(すでに存在する場合は先頭に)
以下を記述する。

# -*- coding: utf-8 -*-
import sys
import PySide2
import PySide2.QtWidgets

sys.modules['PySide'] = PySide2

import PySide.QtGui
for key, value in PySide2.QtWidgets.__dict__.items():
    setattr(sys.modules['PySide.QtGui'], key, value)

setattr(PySide.QtGui.QApplication, 'UnicodeUTF8', -1)

PySide2をPySideとしてimportできるようするために参照を渡し、PySide.QtGuiには
PySide2.QtWidgets以下のクラスをアトリビュートとして追加している。
最後にその他の不足していた参照を後述の方法で検証し追加した。

この処理を追加すると、以降は見た目PySide・中身PySide2というような状態のモジュールを
importできるようになるので、Maya2016で動作していたスクリプトの変更を一切行わずに
Maya2017に対応できる。.uiを変換した.pyもそのまま。やったぜ。

Mayaウィンドウの後ろに行かないようにするための処理についてはshibokenではなく
MayaQWidgetBaseMixin を使用していたためshiboken2の対応は必要ない状態だったので書いていないが、
同じような処理をuserSetup.pyに追加すればいけそうな気がする。

不足していた参照の追加

上記のスクリプト追加後の実行時に.uiファイルを変換した.pyファイル内部で
PySideに関するエラーが発生した場合には、

setattr(PySide.QtGui.QApplication, 'UnicodeUTF8', -1)

という形で参照を追加する必要がある。

Google先生に聞いてみてもPySide2のリファレンス的なものが見つからなかったので
元の.uiファイルをPySide2対応の.pyに一度変換してPySide(無印)と比較することでどのような値を
追加すればよいかの確認を行った。

変換方法

(作業環境ではないためあやふや。Maya2017はProgramFiles/Autodeskのヤツ。)

Maya2017/bin/mayapy.exe Maya2017/bin/pyside2-uic 対象の.uiファイル > 出力先.pyファイル

自作したスクリプトの処理部分でPySideのエラーが発生した場合の対応は不明。
PyCharm師匠にmayapy.exeのパス設定したらPySide2のHinting出してくれたりしないかな?