Q100158:为您的 Nuke 脚本生成多个自动保存文件

概括

本文解释了如何自定义Nuke的自动保存功能,以实现滚动式和增量式自动保存系统。

更多信息

默认情况下, Nuke只会为当前正在处理的文件保留一个自动保存文件。该文件名为<scriptname>.nk.autosave ,并会按照您在Nuke首选项中设置的频率进行更新/覆盖。

您可以通过设置自定义的 Python 自动保存函数来定制Nuke的自动保存行为。以下示例( 摘自Nuke Python 开发者指南)将设置滚动自动保存,以存储您正在编写的脚本的多个增量备份。

您可以通过以下步骤进行设置。

  1. 下载附件中的autosave.py文件,并将其放置在当前用户的.nuke目录中: Q100048: Nuke目录位置

  2. .nuke目录下的init.py文件中添加以下代码行: import autosave
    注意:如果您的.nuke目录中还没有init.py文件,则需要创建一个。

下次启动Nuke时,它将创建多个增量自动保存文件,如下所示:

<scriptname>.nk.autosave

<scriptname>.nk.autosave1

<scriptname>.nk.autosave2

<scriptname>.nk.autosave3

至多

<scriptname>.nk.autosave9

如果您在使用Nuke时遇到任何问题,例如崩溃或脚本损坏,您可以加载每个自动保存文件(使用“文件”>“打开”),找到问题发生之前的脚本。

延伸阅读

Nuke的在线文档提供了更多关于如何加载自定义 Python 脚本和其他自定义项的信息。
Nuke Python 开发者指南》提供了更多关于如何使用 Python 回调函数(如 onAutoSave)的信息

示例代码

以下是autosave.py文件的内容。

import nuke
import glob
import time
import os

### Example that implements a rolling autosave using the autoSaveFilter callbacks
###
## autosaves roll from 0-9 eg myfile.autosave, myfile.autosave1, myfile.autosave2...
#
## To use just add 'import nuke scripts.autosave' in your init.py


def onAutoSave(filename):

  ## ignore untiled autosave
  if nuke .root().name() == 'Root':
    return filename

  fileNo = 0
  files = getAutoSaveFiles(filename)

  if len(files) > 0 :
    lastFile = files[-1]
    # get the last file number

    if len(lastFile) > 0:
      try:
        fileNo = int(lastFile[-1:])
      except:
        pass

      fileNo = fileNo + 1

  if ( fileNo > 9 ):
    fileNo = 0

  if ( fileNo != 0 ):
    filename = filename + str(fileNo)

  return filename


def onAutoSaveRestore(filename):

  files = getAutoSaveFiles(filename)

  if len(files) > 0:
    filename = files[-1]

  return filename

def onAutoSaveDelete(filename):

  ## only delete untiled autosave
  if nuke .root().name() == 'Root':
    return filename

  # return None here to not delete auto save file
  return None

  
def getAutoSaveFiles(filename):
  date_file_list = []
  files = glob.glob(filename + '[1-9]')
  files.extend( glob.glob(filename) )

  for file in files:
      # retrieves the stats for the current file as a tuple
      # (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)
      # the tuple element mtime at index 8 is the last-modified-date
      stats = os.stat(file)
      # create tuple (year yyyy, month(1-12), day(1-31), hour(0-23), minute(0-59), second(0-59),
      # weekday(0-6, 0 is monday), Julian day(1-366), daylight flag(-1,0 or 1)) from seconds since epoch
      # note:  this tuple can be sorted properly by date and time
      lastmod_date = time.localtime(stats[8])
      #print image_file, lastmod_date   # test
      # create list of tuples ready for sorting by date
      date_file_tuple = lastmod_date, file
      date_file_list.append(date_file_tuple)
   
  date_file_list.sort()
  return [ filename for _, filename in date_file_list ]


nuke .addAutoSaveFilter( onAutoSave )
nuke .addAutoSaveRestoreFilter( onAutoSaveRestore )
nuke .addAutoSaveDeleteFilter( onAutoSaveDelete )

### As an example to remove the callbacks use this code
#nuke.removeAutoSaveFilter( onAutoSave )
#nuke.removeAutoSaveRestoreFilter( onAutoSaveRestore )
#nuke.removeAutoSaveDeleteFilter( onAutoSaveDelete )

我们很遗憾听到

请告诉我们