增量保存

Incremental Saves

我正在尝试编写有关增量保存的脚本,但我 运行 遇到了一些小问题。

如果文件名为 "aaa.ma",我将收到以下错误 - ValueError: invalid literal for int() with base 10: 'aaa' # 如果我的文件名为 "aaa_0001"

,则不会发生这种情况

如果我以这种格式编写代码,就会发生这种情况:Link

所以为了解决上面的问题,我输入了一个if..else..语句-Link,貌似解决了手头的问题,但我想知道有没有更好的对此的处理方法?

任何建议将不胜感激!

使用正则表达式以获得更好的灵活性,尤其是对于像这样的文件重命名脚本。

在你的情况下,因为你知道预期的文件名格式是 "some_file_name_<increment_number>",你可以使用正则表达式为你进行搜索和匹配。我们应该这样做的原因是因为 people/users 可能不是机器,并且可能不遵守我们的脚本期望的确切命名约定。例如,用户可以将文件命名为 aaa_01.ma 甚至 aaa001.ma 而不是您的脚本当前期望的 aaa_0001。要将这种灵活性构建到您的脚本中,您可以使用正则表达式。对于您的用例,您可以这样做:

# name = lastIncFile.partition(".")[0] # Use os.path.split instead
name, ext = os.path.splitext(lastIncFile)

import re

match_object = re.search("([a-zA-Z]*)_*([0-9]*)$", name)
# Here ([a-zA-Z]*) would be group(1) and would have "aaa" for ex.
# and ([0-9]*) would be group(2) and would have "0001" for ex.
# _* indicates that there may be an _, or not.
# The $ indicates that ([0-9]*) would be the LAST part of the name.

padding = 4  # Try and parameterize as many components as possible for easy maintenance 
default_starting = 1
verName = str(default_starting).zfill(padding)  # Default verName
if match_object: # True if the version string was found
    name = match_object.group(1)
    version_component = match_object.group(2)
    if version_component:
        verName = str(int(version_component) + 1).zfill(padding)

newFileName = "%s_%s.%s" % (name, verName, ext)
incSaveFilePath = os.path.join(curFileDir, newFileName)

在 Python 正则表达式上查看这个不错的 tutorial 以了解上面的块中发生了什么。根据您的用例、测试和需求随意调整、发展和构建正则表达式。

额外提示:

在脚本开头调用cmds.file(renameToSave=True)。这将确保文件不会被意外保存到自身,并强制 script/user 重命名当前文件。只是一个安全措施。

如果您想对正则表达式进行一些花哨的处理并使它们更具可读性,您可以尝试这样做:

match_object = re.search("(?P<name>[a-zA-Z]*)_*(?P<version>[0-9]*)$", name)
name = match_object.group('name')
version_component = match_object('version')

这里我们使用?P<var_name>...语法为匹配组分配一个字典键名。在您访问它时提高可读性 - mo.group('version')mo.group(2) 更清晰。 确保也通过 official docs

使用 Maya 的命令保存。这将确保 Maya 在保存时和保存之前进行所有检查:

cmds.file(rename=incSaveFilePath)
cmds.file(save=True)

更新 2:

如果您想要检查 space,这里是一个更新的正则表达式:

match_object = re.search("(?P<name>[a-zA-Z]*)[_ ]*(?P<version>[0-9]*)$", name)

此处 [_ ]* 将检查 0 - _(space) 的多次出现。对于更多正则表达式的东西,最好自己尝试和学习。查看此 post.

上的链接

希望对您有所帮助。