Maya Script Python – ファイルエクスプローラ(仮)

import pymel.util.path as pmp
import pymel.core as pm
import maya.cmds as cmds
import maya.OpenMaya as om
import maya.OpenMayaUI as OpenMayaUI
from PySide import QtGui, QtCore
import shiboken

class TestQtWindow(QtGui.QMainWindow):
	def __init__(self,parent=None):
		super(TestQtWindow,self).__init__(parent)
		self.setWindowTitle('Maya Explorer')
		self.resize( 600, 800 )
		
		menuBar = self.menuBar()
		menuBar.addMenu( "memu" )
		
		widget = QtGui.QWidget()
		self.setCentralWidget(widget)
		
		mainLayout = QtGui.QVBoxLayout()
		
		widget.setLayout(mainLayout)
		
		self.line = QtGui.QLineEdit(self)
		self.line.editingFinished.connect(self.put_text)
		
		self.fileBrowserWidget = QtGui.QWidget(self)
		
		self.dirmodel = QtGui.QFileSystemModel()
		self.dirmodel.setRootPath("C:/")
		
		self.folder_view = QtGui.QTreeView(parent=self)
		self.folder_view.setModel(self.dirmodel)
		self.folder_view.clicked[QtCore.QModelIndex].connect(self.clicked) 
		self.folder_view.doubleClicked[QtCore.QModelIndex].connect(self.doubleClicked) 
		
		self.folder_view.setColumnWidth(0,250)
		
		mainLayout.addWidget(self.line,1,0)
		mainLayout.addWidget(self.folder_view)
	
	def clicked(self,index):
		index = self.folder_view.currentIndex()
		dir_path = pmp(self.dirmodel.filePath(index))
		self.line.setText(dir_path.normpath())
	
	def doubleClicked(self,index):
		index = self.folder_view.currentIndex()
		path = pmp(self.dirmodel.filePath(index))
		self.open_scene_file(path)
	
	def put_text(self):
		path = self.line.text()
		index = self.dirmodel.index(path)
		self.folder_view.setCurrentIndex(index)

	def open_scene_file(self,path):
		fbxPlug = "fbxmaya"
		types = {".ma":"mayaAscii",".mb":"mayaBinary",".fbx":"FBX",".obj":"OBJ"}
		options = {".ma":"v=0",".mb":"v=0",".fbx":"fbx",".dae":"dae",".obj":"obj"}
		if path.ext.lower() not in types.keys():
			return
		sceneName = pm.sceneName()
		fileType = types[path.ext.lower()]
		option = options[path.ext.lower()]
		scenePath = path.replace("\\","/")
		prjPath = path.parent.normpath().rsplit("\\scenes",1)[0]
		io = om.MFileIO()
		if not sceneName:
			#pm.openFile(scenePath,f=1,op=option,typ=fileType)
			#cmds.file(scenePath,f=1,op=option,typ=fileType,o=1)
			io.open(scenePath,fileType,1)
			self.add_rectnt_file(scenePath,fileType)
			self.set_project(prjPath.replace("\\","/"))
		else:
			flag = 1
			while flag:
				result = pm.confirmDialog(t="File Open",m="New Scene Open or Import Scene?",b=["New Scene","Import Scene","Cansel"],db="New Scene",cb="Cansel",ds="Cansel")
				if result == "Cansel":
					return
				else:
					flag = 0
			if result == "New Scene":
				#pm.openFile(scenePath,f=1,op=option,typ=fileType)
				#cmds.file(scenePath,f=1,op=option,typ=fileType,o=1)
				io.open(scenePath,fileType,1)
				self.add_rectnt_file(scenePath,fileType)
				self.set_project(prjPath.replace("\\","/"))
			elif result == "Import Scene":
				pm.loadPlugin("{0:}.mll".format(fbxPlug),qt=1)
				if fbxPlug not in pm.pluginInfo(q=1,ls=1):
					#pm.system.displayWarning("{0:} Plugin in not loaded".format(fbxPlug))
					#om.MGlobal.displayWarning("{0:} Plugin in not loaded".format(fbxPlug))
					#pm.system.displayError("{0:} Plugin in not loaded".format(fbxPlug))
					om.MGlobal.displayError("{0:} Plugin in not loaded".format(fbxPlug))
					return
				#pm.importFile(scenePath,type=fileType,ra=1,ns=path.name.replace(".","_"),op=option,lrd="all")
				#cmds.file(scenePath,i=1,type=fileType,ra=1,ns=path.name.replace(".","_"),op=option,lrd="all")
				io.importFile(scenePath,fileType,1,str(path.name.replace(".","_")))
		[cmds.setAttr(x+'.ftn',cmds.getAttr(x+'.ftn'),type='string') for x in cmds.ls(typ='file',type='mentalrayTexture')]

	def set_project(self,project):
		pm.Workspace.open(project)
		maxSize = pm.optionVar["RecentProjectsMaxSize"]
		[pm.optionVar(rfa=["RecentProjectsList",i]) for i,x in enumerate(pm.optionVar["RecentProjectsList"]) if project == x]
		pm.optionVar(sva=["RecentProjectsList",project ])
		prjList = pm.optionVar["RecentProjectsList"]
		if len(prjList) > maxSize:
			[pm.optionVar(rfa=["RecentProjectsList",0]) for i,x in enumerate(prjList) if i >= maxSize]

	def add_rectnt_file(self,filePath,fileType):
		maxSize = pm.optionVar["RecentFilesMaxSize"]
		[[pm.optionVar(rfa=["RecentFilesList",i]),pm.optionVar(rfa=["RecentFilesTypeList",i])] for x in enumerate(pm.optionVar["RecentFilesList"]) if filePath == x]
		pm.optionVar(sva=["RecentFilesList",filePath])
		pm.optionVar(sva=["RecentFilesTypeList",fileType])
		fileList = pm.optionVar["RecentFilesList"]
		if len(fileList) > maxSize:
			[[pm.optionVar(rfa=["RecentFilesList",0]),pm.optionVar(rfa=["RecentFilesTypeList",0])] for i,x in enumerate(fileList) if i >= maxSize]


ptr = OpenMayaUI.MQtUtil.mainWindow()
widget = shiboken.wrapInstance(long(ptr),QtGui.QWidget)

testWin = TestQtWindow(widget)
testWin.show()

Mayaで使えるウィンドウズエクスプローラの様なものです。
Pysideが入っていないと使えません。
2014からデフォルトで入っていたかと思うのですが、バージョンが違う場合はインストールが必要かと思います。

 

このスクリプト、随分と前に書きました。
PysideのQFileSystemModel()クラスが凄く、Mayaの外で更新されたファイルやディレクトリの情報も勝手に取ってくれます。
なので、このエクスプローラも自動で更新されます。
MayaのUI機能だけでこういったものを作ると、必ずリロードボタンをつけていました。出ないと更新が取得できない。
ただ、始めに表示された時のドライブリストが納得行かない。順番が綺麗にならない、、
調べてみると、どうやら現状のPysideのバグだ、という話がありました。
で、ちょっとげんなりして開発を止めていました。
更には、ウィンドウズエクスプローラのように、左にツリービュー、右にディレクトリやファイルのリストを表示したかったのですが、
やり方が分からなかったので、これも理由に開発を止めていました。

 

なので、プロトタイプです。
ただ、機能としては実用性はあるので、プロトタイプはプロトタイプとして公開しておきます。

 

スクリプトを実行すると、ウィンドウズエクスプローラの様なウィンドウが表示されます。
使い方はだいたい同じですが、ツリービューにファイルも表示されます。
ファイルの拡張子が、「.ma」「.mb」「.fbx」「.dae」「.obj」であればシーンに読み込むことができます。
Maya上でシーンが開かれていない場合は、そのまま開きます。
すでにシーンが開いている場合は、新たに読み込むか、シーンにインポートするかを選べます。

 

このスクリプトを使ってファイルを開くと、
プロジェクトのセットを自動で行います。
最近使ったファイル、最近使ったプロジェクトに登録も行います。
開いたシーンファイル内のテクスチャもリロードします。

 

なので、このスクリプトでシーンを開くと、その他の余計な操作が不要になります。
というか、デフォルトでそれくらいの事はできて欲しい、、

 

で、備忘録ついでに、
ファイルの読み込み、エラーやワーニングの表示に、
Pymel、Mayaコマンド、OpenMayaの三種類で同じ事を実現するためにそれらをコメントアウトして記載しておきました。
デフォルトで使用されているのはOpenMayaです。
ただ、MayaコマンドでPymelやOpenMayaの様なエラーやワーニングの出し方を忘れました。
errorコマンドだと違う結果になる。まぁ、必要ないからいいや。ということで。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です