项目制作过程中常常会遇到制作文件打不开或者打开慢的情况,对于此类问题:

  1. 如果是’.mb’文件,会比较麻烦些,需要在打开文件时不加载引用文件,然后一个一个加载引用文件,根据引用文件的加载情况进行判断是否有引用文件有问题。一般会出现:单个引用文件加载崩溃、单个引用文件加载慢、所有引用文件加载都没问题,但是保存后还是打开有问题,这时就需要分别尝试打开带有加载不同引用文件的maya文件。(之前碰到过引用文件中有的节点有冲突:相同的引用文件单独加载都没问题,但保存后加载会崩溃,然后逐步定位加载有问题的文件一步一步排除,最后将有冲突的节点重建才解决问题。)

  2. 如果是’.ma’文件:

    • 使用上面的’.mb’文件的办法。
    • 在文件中插入 mel 脚本,在打开脚本的同时,执行mel脚本,通过脚本的日志内容情况来判断是什么文件导致的‘.ma’文件打不开,或者打开慢的情况。

代码如下:

import codecs

def checkMayaAsciiFile(source_file, target_file, log_file):
    """
    1. 用于检查 Maya Ascii 文件打开崩溃
    2. - - - - - - - - - - - - - -耗时
    Args:
        source_file: ma 文件
        target_file: 修改后的文件
        log_file: logging

    Returns: none

    """
    # # 记录打不开的ma文件是从哪一行崩溃的
    # __startMel = '''python("logFile='%s';ff = open(logFile,'w');ff.write(' ');ff.close();");''' % log_file
    # __proc = '''python("ff = open(logFile,'a');ff.write('%s - {0}\\\\n'.format(comp_time));ff.close();");\n'''
    # __endMel = ""

    # 记录打开文件时的耗时信息
    __startMel = '''python("from datetime import datetime;import time;line_time=datetime.now();time.sleep(0.002);threshold_time=datetime.now() - line_time;start_time=line_time;logging=list();logFile='%s'");''' % log_file
    __proc = '''python("comp_time = datetime.now() - line_time;logging.append('%s - '+ str(comp_time)) if comp_time > threshold_time else None;line_time = datetime.now();");\n'''
    __endMel = '''python("logging.append('\\\\n\\\\nStart Time - '+ str(start_time) + '\\\\nEnd Time - '+ str(line_time) + '\\\\nTotal Time - ' + str(line_time - start_time));ff = open(logFile,'w');[ff.write(line+'\\\\n') for line in logging];ff.close();");'''

    with codecs.open(source_file, "r", "gbk") as f:
        aLines = f.readlines()

    fileter = ("select", "connectAttr", "dataStructure", "createNode", "requires", "currentUnit")
    # other relationship fileInfo
    rule = 1
    for num, line in enumerate(aLines):
        line_add = "".join([aLines[num - 1][:-1], __proc % str(num)])
        if rule:  # 文件开头的 file 每一行都加 mel
            if __startMel:  # 文件开头结尾初始化命令
                aLines[num] = __startMel + line
                if __endMel:
                    aLines[num - 1] = __endMel + aLines[num - 1]
                __startMel = 0
                continue
            if "file" in line:  # 可能有的设置里会有file字符串,所以这里要独立规则
                if ";\n" not in aLines[num - 1]:
                    continue
                aLines[num - 1] = line_add
            if "requires" in line:  # requires 之后改变规则
                rule = 0

        # 在 fileter 参数里的,对它的前一行添加 mel
        # setAttr 用的是 .attr 的方式,在它之后加 mel 会影响下一个 setAttr 所以这里添加这个过滤
        for _ in fileter:
            if _ in line:
                if ";\n" in aLines[num - 1]:
                    aLines[num - 1] = line_add

    with codecs.open(target_file, "w", "gbk") as ff:
        for lines in aLines:
            ff.write(lines)

if __name__ == '__main__':
    srcFile = r"E:\test\shot00401.ma"
    srcFile = srcFile.replace("\\", "/")

    sourceFile = srcFile
    targetFile = srcFile[:-3] + "_v01.ma"
    logFile = srcFile[:-3] + "_v01.txt"
    # print(sourceFile, targetFile, logFile)
    checkMayaAsciiFile(sourceFile, targetFile, logFile)

以上代码中,需要将”E:\test\shot00401.ma”替换成你的‘.ma’文件路径,执行完成后,会在同级文件目录下生成一个版本号为‘-v01’的‘.ma’文件,使用Maya打开该文件,打开文件的同时会执行文件中的mel脚本保存日志信息,文件读取完成后,也会在统计目录下生成一个版本号为‘-v01’的txt日志文件,打开文件分析即可。

转载

部分内容转载自:https://ruben.blog.csdn.net/article/details/90082639