Q100158:为 Nuke 脚本生成多个自动保存

关注

概括

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

更多信息

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

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

您可以通过执行以下操作来进行设置。

  1. 下载附加的autosave.py文件并将其放入活动用户的.nuke目录中: Q100048: Nuke目录位置

  2. 将以下行添加到 $HOME/.nuke 目录中的init.py文件中 import autosave
    注意:如果您的.nuke目录中还没有init.py文件,那么您需要创建一个。

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

<脚本名称>.nk.自动保存

<脚本名称>.nk.autosave1

<脚本名称>.nk.autosave2

<脚本名称>.nk.autosave3

取决于

<脚本名称>.nk.autosave9

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

延伸阅读

Nuke用户指南提供了有关如何加载自定义 Python 脚本和其他自定义的更多信息。
Nuke Python 开发人员指南提供了有关如何使用 onAutoSave 等 Python 回调的更多信息

示例代码

这是下面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 )

我们很遗憾听到

请告诉我们