Nuke scripting 初體驗:Nuke + Alfred

Dec 25 2008

animationpythonrenderman

大約三週之前,開發 Nuke 的 The Foundry,由 CEO, Bill Collis, 偕同技術人員 Matt Plec 與兩位美麗的華裔女士來台,參與了 SIGGRAPH 2008 Taipei Chapter 的活動,會後立即趕來太極,面對太極的幾位 compositors,給了一個更加深入一點的 talk + demonstration。

Matte 就 Nuke 與 Ocula 做了不少的 demo,像是 3D scene/model/camera importing by FBX、multi-channel manipulation、customized gizmo、stereoscopic vector viewing by Ocula、stereoscopic offset、stereoscopic filein handling…其中我最感興趣的,是 Nuke 的可程式化能力。

Nuke 5 發佈的特色之一是對 Python scripting 的支援。根據我 k 了文件後的了解,幾乎所有在 Nuke 裏頭的操作,都可以使用 Python 來做到,於是乎,有很大的空間可以就「自動化」與「整合其它軟體或服務」做延伸上的開發。我對於這一點感到非常的興奮。相對於 Apple Shake 限制多多的 shake macros 與我們一直無緣拿到手的 Shake SDK,Nuke 對 programmer 實在友善太多了。

我立即寫了個 python script,做了點設定上的調整,在 Nuke 上頭多新增了一個 Digimax 的 menu,然後裏頭有個 Submit To Render Farm 的功能。目的是透過它來產生一個 alfscript 來,然後呼叫 alfred 把 nuke rendering 給送進 render farm。

我實驗性地新增的 menu:

透過一小段 python script,一個 nuke 就可以很容易地被丟進 render farm 去算圖了,而且使用的界面一樣是 alfred,於是乎,我們不管是 renderman, maya software, mentalray, motion j2k 等各式各樣的算圖工作,都一併與 render farm 掛上鉤了。

簡易且感覺不錯的開始,我想有機會,時間允許的話,我會多投入一些時間開發一些供我們 comp 部門同事使用的工具。

def dgSubmitToRenderFarm():
    root = nuke.Root()

    curFilename = root.knob("name").getValue()

    # make sure the file has been saved
    if root.modified() or curFilename == "":
        txt = r"""
        This Nuke script has been modified and not saved.
        The script has to be saved before submitting to render farm.
        Are you willing to save it right now?"""
        if not nuke.ask(txt):
            return
        if not nuke.scriptSave():
            return

    # prompt a dialog for start/end/step, resolution, proxy?
    frame_start = int(root.knob("first_frame").getValue())
    frame_end = int(root.knob("last_frame").getValue())
    step = 3

    # copy the current script
    tempfd, tempfn = tempfile.mkstemp(prefix="nuke_", suffix=".nk", text=True)
    shutil.copy(curFilename, tempfn)

    #generate an alfscript
    alfscript = genAlfscript(os.path.basename(curFilename), tempfn, frame_start, frame_end, step)

    # invoke alfred
    cmd = "alfred "+alfscript
    #system()
    os.system(cmd)

# vim: set hls is ai et sw=4 sts=4 nu:
comments powered by Disqus