« 思い込み力 | トップページ | とりあえずやってみる »

2016年4月21日 (木)新しいツールで蛇使い 其の肆

おはようございます。本日の当番、モーションデザイナーのR.Iです。

最近は服装に迷うこともない暖かい日が多くなってきました。
さすがに4月後半にもなるとこんな感じでしょうか。

さて、今回もしつこくスクリプトの話をしようと思います。
仕事で色々なキャラクターにモーションをつけている私ですが、担当するキャラクター、モーションは一つではありません。

基本的にモーション毎にファイルを開いたり、キャラクターになるとフォルダ毎で
管理されていることが多いため、開きたいキャラクターのフォルダへ移動してからファイルを開いたりなど、ファイルへのアクセスが頻繁に行われます。

上記のようなことをできるだけ早く行うことができれば、それだけ作業が楽になるはず...たぶん。

そこでMayaの画面上にファイルブラウザ的なツールを置いておいて、上記のアクセスを簡単にできればというのが、今回の話です。

今回はあらかじめ作られたUIファイルにファイルの一覧を表示する例をご紹介したいと思います。

まずは画像みたいなことをやりたい。
20160420_00

説明用に最低限の機能を搭載したものになりますが、ファイル、フォルダを表示し、ファイルをダブルクリックするとイベントを取得するようにしています。

スクリプトの構造はこんな感じ。

blog(フォルダ)
┝ __init__.py
┝ Blog_Browser.ui
└ ui.py

「__init__.py」はMayaからPythonファイルを呼び出す際に必要なファイルで中身は空で問題ありません。
「Blog_Browser.ui」はQt Designerで作成したUIファイルになります。
Qt Designerの説明は省略しますが、ネットで調べれば、出てくると思います。
「ui.py」に上記のUIファイルの呼び出し、表示する一覧の情報などを記載していきます。
Mayaから「ui.py」を呼出して、実行する形になります。


まず、UIファイルの中身はコチラ

上記のコードを「.ui」という拡張子で保存するとUIファイルの出来上がりです。
できたUIファイルは「ui.py」と同じ階層に保存しておきます。


そして、「ui.py」の中身は以下になります。
# -*- coding: utf-8 -*-

import PySide.QtGui as QtGui
import PySide.QtCore as QtCore
import shiboken
import os
from PySide.QtUiTools import QUiLoader
from maya import OpenMayaUI as OpenMayaUI

def getMayaWindow():
Ptr = OpenMayaUI.MQtUtil.mainWindow()
return shiboken.wrapInstance(long(Ptr), QtGui.QWidget)

class Ui_MainWidget(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, getMayaWindow())
loader = QUiLoader()
uifile = os.path.dirname(os.path.abspath(__file__)) + "/Blog_Browser.ui"
self.ui = loader.load(uifile)
self.setCentralWidget(self.ui)
self.setWindowTitle("Blog_Browser")

## ウィンドウサイズの指定
self.setGeometry(100, 100, 700, 300)

## エクスプローラ処理としてFileSystemModelの宣言
self.model = QtGui.QFileSystemModel()
self.ui.trw_main.setModel(self.model)

## FileSystemModelの設定
Root_Index_Path = "E:\\blog\\scenes"
self.model.setRootPath("E:\\blog")
self.ui.trw_main.setRootIndex(self.model.index(Root_Index_Path))
self.model.setNameFilters("*.ma,*.mb")
self.model.setNameFilterDisables(False)
self.ui.path_line.setText(Root_Index_Path)

## treeViewのカラムの大きさ設定
self.ui.trw_main.setColumnWidth(0, 300)
self.ui.trw_main.setColumnWidth(1, 80)
self.ui.trw_main.setColumnWidth(2, 80)
self.ui.trw_main.setColumnWidth(3, 100)

## 各種UIのイベント
self.ui.trw_main.doubleClicked.connect(self.trw_main_itemDoubleClicked)

def closeEvent(self, event):
## ウィンドウが閉じた時
print "closeEvent!"

def trw_main_itemDoubleClicked(self):
## FileSystemModelで表示されているアイテムをダブルクリックしたときの処理
print "trw_main_itemDoubleClicked!"


# 重複起動回避
try:
MainWindow.close()
except:
pass

def main():
MainWindow.show()

MainWindow = Ui_MainWidget()



部分的に解説していきます。

def getMayaWindow():
Ptr = OpenMayaUI.MQtUtil.mainWindow()
return shiboken.wrapInstance(long(Ptr), QtGui.QWidget)

class Ui_MainWidget(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, getMayaWindow())
loader = QUiLoader()
uifile = os.path.dirname(os.path.abspath(__file__)) + "/Blog_Browser.ui"
self.ui = loader.load(uifile)
self.setCentralWidget(self.ui)
self.setWindowTitle("Blog_Browser")


上記についてはMaya上にウィンドウを表示する決まり文句のようなものです。
UIファイルをMayaのウィンドウとして呼び出しています。


## エクスプローラ処理としてFileSystemModelの宣言
self.model = QtGui.QFileSystemModel()
self.ui.trw_main.setModel(self.model)

## FileSystemModelの設定
Root_Index_Path = "E:\\blog\\scenes"
self.model.setRootPath("E:\\blog")
self.ui.trw_main.setRootIndex(self.model.index(Root_Index_Path))
self.model.setNameFilters("*.ma,*.mb")
self.model.setNameFilterDisables(False)


上記について、どこのパスの内容をUI上に表示するかの設定になります。
「FileSystemModel」というものを使用すると簡単にWindowsのエクスプローラに似た処理を実装できます。

「FileSystemModel」に表示させるパスを指定する必要がありますので、
「Root_Index_Path = "E:\\blog\\scenes"」
「self.model.setRootPath("E:\\blog")」

というように「Root_Index_Path」にファイルが格納されているフォルダパスを
「self.model.setRootPath」の引数にプロジェクトフォルダパスを指定しています。

表示するファイルのフィルタ設定もできるので、今回は拡張子「.ma」「.mb」のファイルを表示するように設定しています。
「self.model.setNameFilterDisables(False)」の「False」でフィルタ以外のファイルは表示されなくなり、
「True」にすれば、フィルタ以外のファイルも表示されますが、フォントが少し暗くなっているような見た目になります。

## 各種UIのイベント
self.ui.trw_main.doubleClicked.connect(self.trw_main_itemDoubleClicked)


上記について、表示されているファイルなどをクリックすると関数が呼び出されるようにしています。
関数の内容は以下のようにしています。
def trw_main_itemDoubleClicked(self):
## FileSystemModelで表示されているアイテムをダブルクリックしたときの処理
print "trw_main_itemDoubleClicked!"


説明用に単純なものにしていますが、ファイルをダブルクリックすると「trw_main_itemDoubleClicked!」とログが出るようにしています。
ここまでできれば、好きな処理を書き込むことで色々なことができます。

最後にウィンドウが複数表示されないようにする処理とUIを表示する処理になります。
# 重複起動回避
try:
MainWindow.close()
except:
pass

def main():
MainWindow.show()

MainWindow = Ui_MainWidget()


あとは「PYTHON_PATH」が通っているパスに

blog(フォルダ)
┝ __init__.py
┝ Blog_Browser.ui
└ ui.py

上記のような構造で保存し、ファイルを実行します。
実行スクリプトは以下になります。

import blog.ui
reload(blog.ui)

blog.ui.main()


解説は以上になります。

仕事で実際使う時には一覧を表示するパスを動的に変化させてフォルダを移動したり、ダブルクリックすることでファイルを開いたり、選択しているファイルの名前やフルパスを取得して、batファイルに引数を渡したりもできます。
他にもできることがあるかもしれませんが、そんな感じになります。

上記のようなスクリプトは考えるにも、作成するにも時間がかかりますが、恩恵を受ける人が多かったり、今後の仕事でも使えたりと効率化できる範囲が大きいと思います。
簡単なモノから始めて検証を繰り返し、技術検証ができたら仕様を組むのも面白いと思います。
そういうことが好きな人はぜひ、やってみてください。

では、また。

参考ドキュメント
※ドキュメントは英語になります。

QTreeView(ファイルを一覧する所のUI情報)
QFileSystemModel
QLineEdit(フォルダパスを表示するUI情報)
follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2016/04/post-7560.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 思い込み力 | トップページ | とりあえずやってみる »

モーションデザイナー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 新しいツールで蛇使い 其の肆:

« 思い込み力 | トップページ | とりあえずやってみる »