Q100158: Nuke スクリプトの複数の自動保存の生成

フォローする

まとめ

この記事では、 Nukeの自動保存機能をカスタマイズして、ローリングおよび増分自動保存システムを実装する方法について説明します。

詳しくは

デフォルトでは、 Nuke作業中の現在のファイルの自動保存を 1 つだけ保持します。ファイルは<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.autosave

<スクリプト名>.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 )

私たちはそれを聞いて申し訳ございません

理由をお聞かせください