-- coding: utf-8 --
import sys
import os
import re
import getpass
from PySide import QtCore, QtGui
from script.ui_pyqt4 import ui_CheckAnimationWindows
import shiboken,time
import xlrd
import maya.mel as mm
import maya.cmds as cmds
from functools import partial
import maya.OpenMayaUI as apiUI
import maya.OpenMayaUI as omUI
reload(ui_CheckAnimationWindows)
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
_windowName = ‘checkAnimationWindows’
得到maya主窗口,转换成pyqt的类
def getMayaWindow():
ptr = omUI.MQtUtil.mainWindow()
return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)
class CheckAnimation(QtGui.QMainWindow,ui_CheckAnimationWindows.Ui_CheckAnimationMainWindow):
def init(self, parent=getMayaWindow(),*args):
super(CheckAnimation, self).init(parent)
self.setupUi(self) #给定所有的窗口部件,相当于重新创建我们在QT设计师里的所有窗体
self.setObjectName(_windowName)
self.error = []
self.setTableWidth()
self.setAcceptDrops(True)
self.camname = "cam_ep"
QtCore.QObject.connect(self.CheckAnimationButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.checkAnimation_m)
QtCore.QObject.connect(self.AnimationFileSavePathButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.set_path_output)
QtCore.QObject.connect(self.CacheFileSavePathButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.set_daochupath_output)
def setTableWidth(self):
self.CheckAnimationTableWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.CheckAnimationTableWidget.setColumnWidth(0,340)
self.CheckAnimationTableWidget.setColumnWidth(1,300)
self.CheckAnimationTableWidget.setColumnWidth(2,200)
self.CheckAnimationTableWidget.setColumnWidth(3,200)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
else:
super(CheckAnimation, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
super(CheckAnimation, self).dragMoveEvent(event)
def dropEvent(self, event):
while self.CheckAnimationTableWidget.rowCount()>0:
self.CheckAnimationTableWidget.removeRow(0)
if event.mimeData().hasUrls():
a = 0
l = []
#遍历输出拖动进来的所有文件路径
for url in event.mimeData().urls():
iturl = str(url.toLocalFile()).decode('UTF-8').encode('GBK')
if os.path.isdir(iturl) == True:
ist = os.listdir(iturl)
for i in ist:
gs = os.path.split(i)[-1]
ts = os.path.splitext(gs)[-1]
if ts == ".ma":
l.append(iturl + '/' + i)
a += 1
else:
gs = os.path.split(iturl)[-1]
ts = os.path.splitext(gs)[-1]
if ts == ".ma":
l.append(iturl)
a += 1
self.CheckAnimationTableWidget.setRowCount(a)
self.ReadFilePathJudgment(l)
self.MatchCamera(l)
#self.CurrentState(l)
event.acceptProposedAction()
else:
super(CheckAnimation,self).dropEvent(event)
def ReadFilePathJudgment(self,l):
# 文件路径
a = 0
for i in l:
item = QtGui.QTableWidgetItem()
self.CheckAnimationTableWidget.setVerticalHeaderItem(a, item)
item = self.CheckAnimationTableWidget.verticalHeaderItem(a)
item.setText(_translate("CheckAnimationMainWindow", str(a), None))
item = QtGui.QTableWidgetItem()
self.CheckAnimationTableWidget.setItem(a, 0, item)
item = self.CheckAnimationTableWidget.item(a, 0)
item.setText(_translate("CheckAnimationMainWindow", i, None))
filea = i.split("/")[-1]
pafi = filea.split(".")[0]
try:
ep = pafi.split("_")[0][-4:]
except:
pass
aniPath = "X:/PIPILU/Season01/%s/scenes/ani/"%ep
cachePath = "X:/PIPILU/Season01/%s/scenes/cache/"%ep
try:
os.makedirs(aniPath)
except WindowsError:
pass
try:
os.makedirs(cachePath)
except WindowsError:
pass
self.AnimationFileSavePathLineEdit.setText(aniPath)
self.CacheFileSavePathLineEdit.setText(cachePath)
a += 1
def MatchCamera(self,l):
# 文件摄像机
a = 0
for i in l:
with open(i,"r") as f:
frd = f.read()
gcam = re.findall(r'createNode camera -n "(\w+)" -p "(\w+)"',frd)
if len(gcam) == 0:
gcam = re.findall(r'createNode camera -name "(\w+)" -parent "(\w+)"',frd)
#print gcam
item = QtGui.QTableWidgetItem()
self.CheckAnimationTableWidget.setItem(a, 1, item)
item = self.CheckAnimationTableWidget.item(a, 1)
try:
for c in gcam:
if c[0].startswith(self.camname):
item.setText(_translate("CheckAnimationMainWindow", str(c[-1]), None))
except:
item.setText(_translate("CheckAnimationMainWindow", "None", None))
a += 1
# def CurrentState(self,l):
# a = 0
# for i in l:
# self.progressBar = QtGui.QProgressBar()
# self.progressBar.setGeometry(QtCore.QRect(0, 0, 200, 30))
# self.progressBar.setFocusPolicy(QtCore.Qt.NoFocus)
# self.progressBar.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
# self.progressBar.setAcceptDrops(False)
# self.progressBar.setLayoutDirection(QtCore.Qt.LeftToRight)
# self.progressBar.setProperty("value", 0)
# self.progressBar.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
# self.CheckAnimationTableWidget.setCellWidget(a, 2,self.progressBar)
# a += 1
def checkAnimation_m(self):
a = 0
count = self.CheckAnimationTableWidget.rowCount()
while a < count:
self.error = []
rls = []
nls = ''
l = []
self.progressBar = QtGui.QProgressBar()
self.progressBar.setGeometry(QtCore.QRect(0, 0, 200, 30))
self.progressBar.setFocusPolicy(QtCore.Qt.NoFocus)
self.progressBar.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
self.progressBar.setAcceptDrops(False)
self.progressBar.setLayoutDirection(QtCore.Qt.LeftToRight)
self.progressBar.setProperty("value", 0)
self.progressBar.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.CheckAnimationTableWidget.setCellWidget(a, 2,self.progressBar)
ia = self.CheckAnimationTableWidget.item(a,0).text()
i = str(ia)
cmds.file(i, ignoreVersion=True, prompt=False,type="mayaAscii", open=True, force=True, options="v=0;")
self.progressBar.setProperty("value", 20)
self.layers()
self.cameras()
self.refereceName()
self.checkFrames()
self.deleteTurtle()
self.deleteWin()
self.oneandfour()
self.deleteUnknow()
self.progressBar.setProperty("value", 40)
maya_name = i.split("/")[-1]
print maya_name
apath = self.AnimationFileSavePathLineEdit.text()
cmds.file(rename="%s%s"%(apath,maya_name))
cmds.file(force=True, save=True, options='v=1;p=17')
rl = cmds.ls(rf=True)
for i in rl:
try:
fg = cmds.referenceQuery(i,filename=True )
nazl = cmds.referenceQuery(i,namespace=True )[1:]
if fg.split("/")[4] == "BG":
rls.append(fg)
nls = nazl
except:
pass
self.progressBar.setProperty("value", 60)
cpath = self.CacheFileSavePathLineEdit.text()
cpathName = "%s%s"%(cpath,maya_name)
print cpathName
cmds.file(rename ="%s%s"%(cpath,maya_name))
cmds.file(force=True, save=True, options='v=1;p=17')
self.progressBar.setProperty("value", 80)
if len(rls) == 0:
pass
else:
try:
self.recheckENV(rls,nls,cpathName)
except:
pass
l.append(cpathName)
self.progressBar.setProperty("value", 100)
item = QtGui.QTableWidgetItem()
self.CheckAnimationTableWidget.setItem(a, 3, item)
item = self.CheckAnimationTableWidget.item(a, 3)
if len(self.error) == 0:
item.setText(_translate("CheckAnimationMainWindow", '没有错误信息', None))
else:
g = ''
for s in self.error:
if len(g) == 0:
g = s
else:
g = g + ',' + s
item.setText(_translate("CheckAnimationMainWindow", str(g), None))
#error = checkAnimation_mode.CheckAnimation(i)
a += 1
try:
self.checkENV(l)
except:
pass
self.error = []
def set_path_output(self,*args):
t = "设置输出位置"
t = t.decode('utf-8').encode('gbk')
get_path=cmds.fileDialog2(fileMode=3,caption=t)
if(str(get_path)!="None"):
get_path_arr=str(get_path).split("'")
self.AnimationFileSavePathLineEdit.setText(get_path_arr[1]+"/")
#cmds.textField("thePath_to_out",e=True,tx=get_path_arr[1]+"/")
def open_path_output(self,*args):
get_tx_path=cmds.textField("thePath_to_out",q=True,tx=True)
get_tx_path.replace("\\","/")
if get_tx_path[-1]!="/":
get_tx_path=get_tx_path+"/"
os.startfile(get_tx_path)
def set_daochupath_output(self,*args):
t = "设置输出位置"
t = t.decode('utf-8').encode('gbk')
get_path=cmds.fileDialog2(fileMode=3,caption=t)
if(str(get_path)!="None"):
get_path_arr=str(get_path).split("'")
self.CacheFileSavePathLineEdit.setText(get_path_arr[1]+"/")
#cmds.textField("thePath_daochu_out",e=True,tx=get_path_arr[1]+"/")
def open_daochupath_output(self,*args):
get_tx_path=cmds.textField("thePath_daochu_out",q=True,tx=True)
get_tx_path.replace("\\","/")
if get_tx_path[-1]!="/":
get_tx_path=get_tx_path+"/"
os.startfile(get_tx_path)
def layers(self,*args):
renderLayer = cmds.ls(type='renderLayer')
aniLayer = cmds.ls(type='animLayer')
dispLayer = cmds.ls(type='displayLayer')
for re in renderLayer:
try:
cmds.delete(re)
except:
pass
for al in aniLayer:
try:
cmds.delete(al)
except:
pass
for dp in dispLayer:
try:
cmds.delete(dp)
except:
pass
def cameras(self,*args):
sqcam = []
cam = cmds.ls(ca = True)
for item in cam:
if item.startswith("cam_sq") or item.startswith("cam_ep"):
srctm = cmds.pickWalk(item,d="up")
for ig in srctm:
try:
cmds.setAttr("|%s.translateX"%ig,k=True,lock=False)
cmds.setAttr("|%s.translateX"%ig,k=True,lock=False)
cmds.setAttr("|%s.translateX"%ig,k=True,lock=False)
cmds.setAttr("|%s.rotateX"%ig,k=True,lock=False)
cmds.setAttr("|%s.rotateY"%ig,k=True,lock=False)
cmds.setAttr("|%s.rotateZ"%ig,k=True,lock=False)
cmds.setAttr("|%s.scaleX"%ig,k=True,lock=False)
cmds.setAttr("|%s.scaleY"%ig,k=True,lock=False)
cmds.setAttr("|%s.scaleZ"%ig,k=True,lock=False)
except:
pass
sqcam.append(ig)
try:
cmds.rename(item,"%sShape"%ig)
except:
pass
if len(sqcam) == 0:
self.error.append('缺少正确的摄像机命名')
elif len(sqcam) > 1:
self.error.append('有多余的摄像机')
def refereceName(self,*args):
rl = cmds.ls(rf=True)
ts = ''
item = ""
for i in rl:
try:
if cmds.referenceQuery(i,isLoaded=True ) == False:
fg = cmds.referenceQuery(i,filename=True )
cmds.file(fg,loadReferenceDepth="asPrefs",loadReference=i)
except RuntimeError:
pass
try:
nazl = cmds.referenceQuery(i,namespace=True )[1:]
if type(nazl[-1]) == int:
try:
a = int(nazl[-3])
ng = nazl[0:-3]
except:
try:
a = int(nazl[-2])
ng = nazl[0:-2]
except:
try:
a = int(nazl[-1])
ng = nazl[0:-1]
except:
ng = nazl
else:
ng = nazl
fileName = cmds.referenceQuery(i,filename=True)
fn = fileName.split("/")[-1]
ft = fn.split(".")[0]
fg = ft.split("_")
if fg[3] == "RD":
na = fg[2]
elif fg[4] == "RD":
na = fg[2]+"_"+fg[3]
elif fg[5] == "RD":
na = fg[2]+"_"+fg[3]+"_"+fg[4]
if ng == na:
pass
else:
self.error.append('有不正确的参考命名,已进行修改')
cmds.file(fileName,e=True,namespace=na)
except:
pass
def checkFrames(self,*args):
patha = cmds.file(sceneName=True,q=True)
cmds.currentUnit( time='pal' )
filea = patha.split("/")[-1]
pafi = filea.split(".")[0]
try:
ep = pafi.split("_")[0][-4:]
pgpg = pafi.split("_")[1]
except:
pass
print ep
try:
self.xls(ep)
except:
cmds.warning( "使用正确的文件命名" )
get_end_frame = cmds.playbackOptions(q=True,max=True)
cmds.playbackOptions( min=101)
cmds.playbackOptions( max=100+self.xlrddic[pgpg])
def xls(self,ep):
#xls文件生成字典
data = xlrd.open_workbook('X:/PIPILU/Season01/PA/%s.xlsx'%ep) # 打开xls文件
table = data.sheets()[0] # 打开第一张表
nrows = table.nrows # 获取表的行数
ncols = table.ncols # 获取表的列数
for i in range(ncols): # 循环逐列打印
t = table.col_values(i)[0]
if t == u'Shot': # 镜头号
scxlrd = table.col_values(i)[1:]
elif t == u'帧数': #结束帧
maxxlrd = table.col_values(i)[1:]
s = 0
self.xlrddic = {}
while s < len(scxlrd):
self.xlrddic[scxlrd[s]] = maxxlrd[s]
s += 1
def deleteTurtle(self,*args):
tbl = ["TurtleRenderOptions","TurtleUIOptions","TurtleBakeLayerManager","TurtleDefaultBakeLayer"]
for i in tbl:
try:
cmds.lockNode(i,lock=False)
cmds.delete(i)
except:
pass
def deleteWin(self,*args):
wins = cmds.lsUI(wnd=True)
if wins:
for x in wins :
try:
if (cmds.window(x, q=True, vis=True) and x != 'MayaWindow') :
# print x
# remove scriptEditor will cause maya crash ,so set scriptEditorPanel1Window vis to false
if x != 'scriptEditorPanel1Window' :
try:
cmds.deleteUI(x, window=True)
except:
cmds.error('delete window %s error' % x)
else:
# close scriptEditor
cmds.window(x, e=True, vis=False)
except Exception:
pass
def oneandfour(self,*args):
mm.eval('DisplayWireframe')
def deleteUnknow(self,*args):
try:
allUnknow = cmds.ls(dep=True)
if allUnknow:
for n in allUnknow:
try:
node_type = cmds.nodeType(n)
# TODO: No object matches name: rmanFinalGlobals
# so use try and except to catch this
except:
pass
else:
if( node_type == 'unknown' ):
try:
cmds.lockNode(n, l=False)
cmds.delete(n)
except Exception:
cmds.error('can not delete%s' % n)
except:
pass
def checkENV(self,l,*args):
for cpathName in l:
with open(cpathName,"r") as f:
content = f.read()
gcreateNode = re.findall(r'createNode assemblyDefinition',content)
a = 0
while a < len(gcreateNode):
startIndex = content.index("createNode assemblyDefinition")
if startIndex>=0:
startIndex += len("createNode assemblyDefinition")
endIndex = content.index('/objects.ma";')
print content[startIndex:endIndex]
g = 'createNode assemblyDefinition' + content[startIndex:endIndex] + '/objects.ma";'
content = content.replace(g,"")
with open(cpathName,"w") as f:
f.write(content)
with open(cpathName,"r") as f:
content = f.read()
a += 1
def recheckENV(self,rls,nls,cpathName,*args):
a = 0
for fg in rls:
with open(cpathName,"r") as f:
frd = f.read()
f.seek(0)
for content in f.readlines():
print 'file -rdi 1 -ns "%s"'%nls
startIndex = content.find('file -rdi 1 -ns "%s"'%nls)
if startIndex == -1:
pass
else:
frd = frd.replace(content,"")
with open(cpathName,"w") as f:
f.write(frd)
with open(cpathName,"r") as f:
frd = f.read()
f.seek(0)
startIndex = content.find(fg)
if startIndex == -1:
pass
else:
frd = frd.replace(content,"")
with open(cpathName,"w") as f:
f.write(frd)
with open(cpathName,"r") as f:
frd = f.read()
f.seek(0)
startIndex = content.find('file -r -ns "%s"'%nls)
if startIndex == -1:
pass
else:
frd = frd.replace(content,"")
with open(cpathName,"w") as f:
f.write(frd)
with open(cpathName,"r") as f:
frd = f.read()
f.seek(0)
a += 1
def main():
if cmds.window(_windowName,exists=True):
cmds.deleteUI(_windowName,window=True)
ui = CheckAnimation()
ui.show()
if name==‘main’:
main()