checkAnimation_maya

-- 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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值