gameboy12615 / MMD4Maya

Import pmx/pmd model to maya.
158 stars 33 forks source link

无法导入动画的解决方法 #13

Open LemonDrug opened 10 months ago

LemonDrug commented 10 months ago

你在使用过程中大概率可能会遇到如下报错:

# # Exception in thread MMD4MayaProcessor:
# Traceback (most recent call last):
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\UI\MainWindow.py", line 191, in AsyncProcess
#     self.fbxFilePath = self.__converter.Process(self.__pmxFile, self.__vmdFileList)
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\FBXConverter.py", line 38, in Process
#     arguments += ConvertToUnixPath(vmdFile)
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\Utils.py", line 6, in ConvertToUnixPath
#     return path.replace("\\", "/")
# TypeError: a bytes-like object is required, not 'str'
# 
# During handling of the above exception, another exception occurred:
# 
# Traceback (most recent call last):
#   File "C:\Program Files\Autodesk\Maya2022\Python37\lib\threading.py", line 926, in _bootstrap_inner
#     self.run()
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\UI\MainWindow.py", line 26, in run
#     self.mainWindow.AsyncProcess()
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\UI\MainWindow.py", line 201, in AsyncProcess
#     self.CleanTempFiles()
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\UI\MainWindow.py", line 182, in CleanTempFiles
#     bytesFile = GetDirFormFilePath(vmdFile) + GetFileNameFromFilePath(vmdFile) + '.anim.bytes'
#   File "C:/Program Files/Autodesk/Maya2022/bin/plug-ins\MMD4Maya\Scripts\Utils.py", line 19, in GetDirFormFilePath
#     nPos = filePath.rfind('/')
TypeError: argument should be integer or bytes-like object, not 'str'

主要有三个问题,解决方法就是简单修改这三个函数而已。 问题1: 在 ConvertToUnixPath 函数中,你需要确保提供给该函数的 path 变量是一个字符串,而不是一个字节样式的对象。如果确实是一个字节样式的对象,你需要先将其解码为字符串。

def ConvertToUnixPath(path):
    if isinstance(path, bytes):
        path = path.decode('utf-8')
    return path.replace("\\", "/")

问题2: 在 GetDirFormFilePath 函数中,当调用 rfind 方法时,确保 filePath 是字符串。如果 filePath 是字节样式对象,你需要先解码。

def GetDirFormFilePath(filePath = ""):
    if isinstance(filePath, bytes):
        filePath = filePath.decode('utf-8')
    nPos = filePath.rfind('/')
    return filePath[0:nPos+1]

问题3:在 GetFileNameFromFilePath 函数中遇到了同样的问题。具体地说,filePath.rfind('/') 方法调用期望一个整数或字节样式对象作为参数,但是你传递的是一个字符串。

def GetFileNameFromFilePath(filePath=""):
    if isinstance(filePath, bytes):
        filePath = filePath.decode('utf-8')
    nPos = filePath.rfind('/')
    return filePath[nPos+1:filePath.rfind('.')]

实际测试支持Maya2022以及2024,理论上2023也是支持的,电脑没安装。 只要官方不更新Python的Pyside和PyMel,应该可以用到2030吧(手动狗头)。 修改完成后重启Maya,这样插件才能够刷新。 如果你觉得修改比较麻烦,可以直接下载我已经修改好之后二次打包的。 https://www.123pan.com/s/sKd9-H3wc.html 如果有BUG,可以来找我修一下,微信yufeng57 如果方便,给我来一杯雪顶咖啡,Cheers。 WechatIMG783