NUKE .nkファイルの増分オートセーブで複数のファイルを保持する

▼概要

こちらの記事では、 NUKEの自動保存機能をカスタマイズして、増分する自動保存システムを実装する方法について紹介致します。

 

 

▼詳細

デフォルトでは、NUKEは現在作業しているファイルの自動保存ファイルを1つだけ保持します。ファイルは<ファイル名> .nk.autosaveという名前で、NUKEの Preferencesで設定された頻度で更新または上書きされます。

NUKEの自動保存の動作は、独自の自動保存のPython関数を設定することでカスタマイズできます。以下の例(Nuke Python Developer’s Guideより)では、作業中のスクリプトの増分バックアップを複数格納する自動保存を設定します。

 

こちらを設定するには、以下の内容を行います。

  1. こちらのページの最下部にある「autosave.py」ファイルをダウンロードし、$ HOMEエリアの.nukeディレクトリに配置します。
     
  2. $ HOME / .nukeディレクトリの 「init.py」ファイルに次の行を追加します(.nukeディレクトリにinit.pyファイルがない場合は作成する必要があります)。
import autosave

.nukeディレクトリ内は以下の画像のようになります。

 

次回NUKEを起動したときから、次のような複数の増分オートセーブのファイルが作成されます。

<.nkファイル名>.nk.autosave

<.nkファイル名>.nk.autosave1

<.nkファイル名>.nk.autosave2

<.nkファイル名>.nk.autosave3

<.nkファイル名>.nk.autosave9

この自動保存は、<scriptname>.nk.autosave9 まで増分して保存し、それ以降は、最初に作成された<scriptname>.nk.autosaveから、順番に最新の作業内容が上書きで保存されていきます。

 

 

クラッシュやスクリプトの破損など、NUKEに問題が発生した場合は、問題が発生する前の.nkファイルを見つけるために、([File] > [Open Comp…] を使用して)それぞれのオートセーブしたデータを読み込むことができます。

 

補足:デフォルトの設定では [Open Comp…] を選択してもautosaveファイルは表示されません。ウィンドウ下部の [Filter] を「*.nk」から「*」または「.* *」に切り替えると、autosaveファイルも表示され、選択可能になります。

 

▼参考文献

こちら では、カスタムのPythonスクリプトやその他のカスタマイズをロードする方法について紹介しております。

onAutoSave のようなPythonのコールバックの使用方法については、Nuke Python Developer’s Guide で詳細をご覧いただけます。

 

 

▼サンプルコード

こちらでは、 「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 nukescripts.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 )

 

※参考リンク