close

1. 通過py創建節點。
先說一下python for nuke的大概情況。Nuke 6.1 版本比 之前的版本,增加了幾個包和模塊。首先說一下大致的概況

模塊:
(1)_geo:該模塊為nuke 3d 核心模塊。
(2)_nukemath:該模塊提供了在nuke中矢量以及矩陣的算法。
(3)ntpath:類似於py中的os.path,直接用,不需導入os.path。
(4)nuke:該模塊為最重要的並且是最核心的模塊,提供了所有nuke特有的方法和類。
(5)nukescript:該模塊為nuke腳本的功能增加模塊,例如可以支持pyqt和wxpython等等,有一些集成好的方法。

創建節點:
創建節點我們使用nuke模塊下的createNode方法。
使用方法如下:
nuke. createNode(node, args, inpanel)
node:這裡為我們想要的節點類型,比如 Read,Blur,Merge等。
Args:這裡為創建節點時,設置節點的參數數值,注意它是以成對的方式出現,例如「size 50」,它是一個可選參數。
Inpanel:這裡是用來是否在節點生成後自動打開節點的控制板,True或者False。

給節點添加用戶自定義的屬性:
因為我們創建的節點都屬於nuke模塊下node類的實例,所以我們有時需要給創建的節點一個變量。
例如myNode = nuke.createNode(『Read')
這樣myNode就成為了node類的一個實例。
在nude類中有一個方法叫做addKnob,它的用法如下:
addKnob(self, k)
self:實例本身
k:用戶想添加的屬性名稱
例如:
myNode.addKnob(『myKnob')

設定屬性值的默認值:
設定屬性的默認值,我們市針對於某一類型的節點,比如我想在Blur節點的sizet屬性通道中設置默認值為20,我可以使用nuke模塊下的knobDefault方法,用法如下:
knobDefault(classknob, value)
例如:nuke.knobDefault(「Blur.size」, 「20〞)
這樣,我們之後每次生成Blur節點,size都會為20。

2. 在nuke中自定義菜單和工具欄。
(1)
在nuke中默認的工具欄,是通過nuke模塊下的toolbar類的實例來實現的。
我們可以實例化一個自定義的toolbar,並且給它添加一些相應的菜單和命令,並且可以制定出快捷鍵。
Nuke.toolbar這個類是object的子類,除了繼承了object類的
__delattr__, __getattribute__, __hash__, __init__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__等這些屬性和方法,它還有
__new__,addCommand(),addMenu(),addSeparator(),findItem()五個方法。
我們實例化一個toolbar後,可以通過addMenu,addCommand來添加功能。
下面就以一個具體的實例來說明:
功能:我們添加一個自己的toolbar,名字定義為「mine」,為該工具架添加一個帶圖標的菜單(color),在該菜單下添加創建Ramp節點的命令,並且指定快捷鍵「alt + r」

代碼實現:

myToolBar = nuke.toolbar(『mine')
myMenu = myToolBar.addMenu(『myMenu','calvin.png')#其實這一步實例化了nuke的menu
myMenu.addCommand(『color/Ramp','nuke.createNode(「Ramp」)』,'alt + r')

通過切換菜單 我們可以找到自己定義的東西了。

(2)
在nuke中實現對話框。
我們可以使用nuke模塊下的message方法。

比如我想再nuke裡顯示一個對話框,顯示內容:「I like nuke」
我們可以通過代碼:
nuke.meaasge(『I like nuke')

我們想顯示現在選擇的節點數量,我們可以通過幾個組合的函數實現:

selNodes = nuke.selectedNodes()
num = len(selNodes)
numStr = str(num)
nuke.meaasge(numStr + 『 nodes are selected')

具體解釋:
我們可以使用方法nuke.selectedNodes()將當前選擇的節點的實例存放在 selNodes 這個變量中,它返回的是一個列表。

我們使用len方法,可以獲得列表裡德元素的數量

因為nuke.message的參數隻能包含字符串,而不能是int float型的數據,所以我們要把 num 這個int型的數據,轉換為字符串,使用工廠函數str()


((3)

添加菜單。
給nuke添加菜單,我們需要瞭解nuke模塊下的menu方法。
它的用法如下:
nuke.menu(name)
該命令返回名字為name的menu的類的實例。
通過nuke的UI,我們可以將化為幾類,
1. 『nuke' 這就是我們需要用到的程序菜單。
2. 『pane' 這就是UI panes
3. 『Nodes' 這就是我們常提到的創建節點的工具欄
4. 『animation' 動畫菜單以及編輯器
5. 『viwer' 觀察視窗
6. 『node graph' 節點網絡圖

給nuke添加菜單,我們需要使用menu的方法,返回『Nuke'的實例。
如上面講到的,再次使用addMenu和addCommand的方法進行添加。
例如我想添加一個菜單如下架構:
myMenu > Transform > Reformat
這樣來創建節點,並且自定義快捷鍵為 alt + r
我們可以將代碼寫為:

 

 

menubar = nuke.menu("Nuke");  
m = menubar.addMenu("&myMenu")  
m.addCommand("Transform/Reformat", "nuke.createNode('Reformat')", "^r") 

 

3. 實例應用,我們將編寫一個清除nuke文件中沒有用的節點,優化文件。
我們的想法是選擇我們想保留的最終節點,可以選擇幾個,這樣在該節點的上游節點會全部保留,其他與這些節點無關的節點會自動刪除,並且在刪除後,彈出信息,說明刪除了多少節點並且說出這些節點的名字。
為了我們的想法,我們需要對python有一定的瞭解。
最後,我們將該功能添加到菜單裡,
菜單的結構如下:
myMenu > func> clear Rubbish Node

把該命令定義一個快捷鍵 alt + c
代碼如下:


selNode = nuke.selectedNodes()  
allNode = nuke.allNodes()  
connecedNode = []  
def returnInputs(node):  
    inputNum = 0  
    conNodes = []  
    if node != None:  
        inputNum = node.inputs()  
        if inputNum != 0:  
            for i in range(inputNum):  
                if (node.input(i) not in connecedNode) and (node.input(i) != None):  
                    connecedNode.append(node.input(i))  
                    conNodes.append(node.input(i))  
    return [inputNum,conNodes]  
def combineNode(conList):  
    if len(conList)>0:  
        for conNode in conList:  
            conN = returnInputs(conNode)  
            if conN[0] > 0:  
                combineNode(conN[1])  
def caculRelatedNode(selNodes):  
    for sel in selNodes:  
        conNs = returnInputs(sel)[1]  
        combineNode(conNs)  
    connecedNode.extend(selNode)  
def returnRubbishNode():  
    for usefulNode in connecedNode:  
        allNode.remove(usefulNode)  
    messages = str(len(allNode)) + ' nodes were deleted,they are:\n'  
    for singleNode in allNode:  
        messages += singleNode.name() + '\n'  
        nuke.delete(singleNode)  
    nuke.message(messages)  
def clearRubbish():  
    caculRelatedNode(selNode)  
    returnRubbishNode()  
  
menubar = nuke.menu("Nuke");  
m = menubar.addMenu("&myMenu")  
m.addCommand("func/clear Rubbish Node", "clearRubbish()", "^c")  

 


在nuke中,將這段代碼運行,找到菜單可以嘗試。

 

arrow
arrow
    文章標籤
    nuke python
    全站熱搜
    創作者介紹
    創作者 A咖來D賽 的頭像
    A咖來D賽

    A咖來D賽

    A咖來D賽 發表在 痞客邦 留言(0) 人氣()