🧨

Nuke Python Script

2023/05/29に公開

メモです。

随時更新
最終更新 : 2023/06/21

まとめられているサイト

Welcome to NUKE Python Developer’s Guide — Nuke Python API Reference
https://learn.foundry.com/nuke/developers/latest/pythonreference/index.html

http://mukaimame.blog111.fc2.com/blog-entry-1228.html

Welcome to NUKE Python Developers Guide — NUKE Python Developers Guide v6.3v8 documentation
https://learn.foundry.com/nuke/developers/63/pythondevguide/index.html

Module Hierarchy
https://learn.foundry.com/nuke/developers/63/pythonreference/module-tree.html

Identifier Index
ここに一覧としてかなり、メソッドがまとめられている。検索がしやすい。
https://learn.foundry.com/nuke/developers/63/pythonreference/identifier-index.html

nuke

nukeのライブラリ

import nuke

よく使う系

nuke.createNode('name', 'parameter value')

nuke.createNode(node, args, inpanel)→ Node.
Parameters
node – Node class (e.g. Blur).

args – Optional string containing a TCL list of name value pairs (like size 50 quality 19)

inpanel – Optional boolean to open the control bin (default is True; only applies when the GUI is running).

Returns
Node.
[引用] https://learn.foundry.com/nuke/developers/latest/pythonreference/_autosummary/nuke.createNode.html

nodeの作成ができる、引数にはnodeの種類の名前を与える。

以下のようにcreateNodeを連続で呼ぶと、そのノードは連結された状態になる。

nuke.createNode('Roto')
nuke.createNode('Blur')

parameterはknobという風にも呼ばれている。
parameterの名前を第二引数にいれて、そのvalueも入れるとそれでセットアップしてくれる。

parameter nameはマウスホバーしてくるときに出てくる名前

nuke.createNode('Roto', 'output rgba')
nuke.createNode('Blur', 'size 2')

複数のparameterの設定をしたい時は、以下のようにspaceで開ければ良い。

nuke.createNode('Blur', 'size 2 channels rgba')

nodeのlabelも一つのparameterとして、設定すればおk

nuke.createNode('Roto', 'output rgba label "[value size]"')


label

Read node

nuke.createNode('Read', "file{filepath}")の状態にすればよい

nuke.createNode( 'Read', "file {"+nuke.getClipname('Select tracked camera video file ')+"}")

#上記のcreateNode()と根本的には一緒なので、結局はfileのparamterにfilepathが入ればおk
nuke.createNode('Read', "file filepath")

nuke.nodes.() でのcreateNode

nuke.nodes.Camera()

createNode()と同じ機能でcameraのcreateすることができる

Cam = nuke.nodes.Camera(name="Cam", xpos=-90,ypos=-200, rot_order='ZYX')

nuke.nodes.ScanlineRender()

スキャンラインレンダーの作成できる。createできる。

classicの方のscanline render
https://learn.foundry.com/nuke/content/reference_guide/3d_nodes/scanlinerender.html?Highlight=scanlinerender

inputs=[node,node,node]でinput側の指定できる。

nuke.nodes.ScanlineRender(name="ScanlineRender",xpos=-100,ypos=-100, inputs=[Scene,,StypeCam])

nuke.nodes.ScanlineRender2()

新しい3Dの方のscanline Render

https://learn.foundry.com/nuke/content/reference_guide/3dnew_nodes/scanlinerender.html?Highlight=scanlinerender

nuke.nodes.LensDistortion()

こっちで生成されるやつはおそらく古いほうのLensDistortion nodeなのかもしれない。
こっちのnodeの記事は、2007年の記事だった。

LensDistortionノードは、撮影素材に含まれるレンズディストーション(レンズディストーション、歪曲収差)の適用、または除去が行えます。レンズディストーションを推定するために、Image Analysis(画像での解析)、Grid Analysis(グリッドでの解析)、Line Analysis(線を使用した解析)の3つのオプションがあります。これらのいずれかを使用してレンズディストーションを計算することができます。

これにより、CG素材との合成や、トラッキング時の補正に使用することができます。

LensDistortionはNUKEXおよびNUKE STUDIOで使用可能です。NUKEでは分析は行えません。NUKEXまたはNUKE STUDIOで分析した結果を使用することのみ可能です。
[引用] https://nukex.jp/2017/07/08/nuke-lensdistortion-01/


nuke.nodes.LensDistortion()


nuke.nodes.LensDistortion()

nuke.nodes.LensDistortion(name="LensDistot")

nuke.nodes.LensDistortion2()

なぜ2なのか?
(nukeX14.0v3)でtabから検索するnode検索だと、このLensDistortion2で生成される方のと一致するため、おそらく今現在のnukeのversionで使うnodeっぽい。

こっちのLensDistortionは、nukeX, Nuke Studioで使えるLensDistort

https://learn.foundry.com/ja/nuke/content/reference_guide/transform_nodes/lensdistortion.html

The LensDistortion node (NukeX and Nuke Studio only) estimates the lens distortion in a given image, either through Grid Detection or manual Line Detection. The warp can then be used to add or remove distortion or produce an STMap in the motion channel for use elsewhere.

Note: You must perform the analysis in NukeX or Nuke Studio, but you can use the results in Nuke.
[引用] https://learn.foundry.com/nuke/content/reference_guide/transform_nodes/lensdistortion.html


nuke.nodes.LensDistortion2()


nuke.nodes.LensDistortion2()

nuke.nodes.LensDistortion2(name="LensDistort",xpos=-100,ypos=-56, inputs=[Render], output=(2), scalingType=(2))

nuke.nodes.LensDistortion1()

は存在しなかった。
nukeX14.0v3

LensDistortion1 : Unknown command

nuke.getClipname()

https://learn.foundry.com/nuke/developers/latest/pythonreference/_autosummary/nuke.getClipname.html

Pops up a file chooser dialog box. You can use the pattern to restrict the displayed choices to matching filenames, normal Unix glob rules are used here. getClipname compresses lists of filenames that only differ by an index number into a single entry called a ‘clip’.
[引用] https://learn.foundry.com/nuke/developers/latest/pythonreference/_autosummary/nuke.getClipname.html
ファイル選択ダイアログボックスをポップアップ表示します。getClipnameは、インデックス番号だけが異なるファイル名のリストを、「クリップ」と呼ばれる1つのエントリに圧縮する。


以下のようなpopupを出現させて、ファイルパスをstringで返す。

menu.py

新しいnuke自体のインスタンス、新しく開き直したらscriptの内容が消えるが、それを初回起動時に覚えさせとくためには、menu.pyに書いておく。

ノード系(nuke.Node)

nuke.Nodeがもっているメソッドの一覧は以下
https://learn.foundry.com/nuke/developers/latest/pythonreference/_autosummary/nuke.Node.html?highlight=setxy

nuke.toNode("node_name")

引数にnodeの名前、returnでnuke.Nodeが帰ってくる。

Read = nuke.toNode('mynode')

nuke.allNodes()

NodeGraphに存在するnodeの名前のリストをゲットできる。

for n in nuke.allNodes():
	#n.name()で名前をget
	n.name()


nuke.allNodes()


for n in nuke.allNodes()

nuke.Node.hideControlPanel()

Propertiesのウィンドウに操作したものを表記しないようにできる。

nuke.createNode('Roto', 'output rgba').hideControlPanel()

nuke.knobDefault( 'node parameter', 'value' )

特定のノードに対して、特定のparmeterにdefaultのvalueを設定することができる。

nuke.knobDefault( 'Blur.size', '77' )

# nodeを省けばどのノードにでもそのparameterのものdefaultが設定される。
nuke.knobDefault( 'channels', 'rgba' )

nuke.Node.setXYpos(x,y)

NodeGraphに対してのノードをどこの座標に表示するか。

StypeRead.setXYpos(0,-200)

nuke.Node['paramter_name']

knob(parameter)を指定すると

その型に合わせたkonbというclassのオブジェクトとしされる

以下はint_knob
https://learn.foundry.com/nuke/developers/63/pythonreference/nuke.Int_Knob-class.html

setValue()とvalue()のメソッドを持っている

nuke.Node['paramter_name'].setValue()

そのNodeがもつparmeterに.setValue()でそこに代入できる。

nuke.Node['name'].setValue('')

nodeのネームをつけれる。

#Readをnuke.Nodeになっている前提とする。
Read['name'].setValue('myNodeeeeee')

nuke.Node['frame_mode'].setValue(index)

Read = nuke.toNode('Read')
#index 1のstart atに設定
Read['frame_mode'].setValue(1)

knob名がframe_modeになっている。

frame_mode

nuke.Node['frame'].setValue('')

Read = nuke.toNode('Read')

StypeRead['frame'].setValue(325)


frame 右側の入力値

nuke.Node['paramter_name'].value()

getValue()という認識。
値をgetすることができる。
https://learn.foundry.com/nuke/developers/63/pythonreference/nuke.Int_Knob-class.html

Animation

keyframeの作り方

nuke.Node['knob'].setAnimated(index)

animationをonにする。
引数にindexを与えれば、parameterが2つあるときはindexとして機能する。

Cam = nuke.toNode('Camera1')

Cam['translate'].setAnimated()
Cam['rotate'].setAnimated()
Cam['focal'].setAnimated()
Cam['focal_point'].setAnimated()
Cam['win_translate'].setAnimated()
Cam['haperture'].setAnimated()
Cam['vaperture'].setAnimated()
Cam['win_scale'].setAnimated(1)

https://learn.foundry.com/nuke/developers/63/pythondevguide/animation.html

nuke.Node['knob'].setValue()

現在のフレームに対してsetするため、setAnimated()していればkeyを打つことになる。

k = node['size']
k.setAnimated()
k.setValue( 5 )

nuke.Node['knob'].setValueAt(value, frame)

frame指定でsetする。
10frame目に55, 100frame目に66を入れている例

k = node['size']
k.setAnimated()
k.setValueAt( 55, 10 )
k.setValueAt( 66, 100 )

入れたいところが配列のknobの場合は
第三引数目にindexをいれればおk

k.setValueAt( 77, 100, 0 )
k.setValueAt( 88, 100, 1 )

nuke.Node['knob'].isAnimated()

returnで boolが帰ってkちえ、animationがonかどうか調べれる。
expressionが入っている場合でもtrueが帰る。

nuke.Node['knob'].hasExpression()

エクスプレッションのみの検出はこれでいける。

nuke.Node['knob'].animation(index)

リターンで現在のAnimationCurve objectを返してくれる。
Result: <AnimationCurve object at 0x17979e650>。
indexでarrayになっているknobに対して、のアクセスができる。

k = node['size']
animCurve = k.animation( 0 ) #ANIMATION IN THE FIRST FIELD (X VALUE)
animCurve = k.animation( 1 ) #ANIMATION IN THE SECOND FIELD (Y VALUE)

nuke.Node['knob'].animations(index)

全体のAnimationCurve objectを返してくれるのは.animations

allCurves = k.animations()

AnimationCurveObject.addKey(nuke.AnimationKey(frame, value))

AnimationObjectに対してkeyframeを追加する。
nuke.AnimationKey objectとして引数に入れないといけない。

#keyArrayがframeとvalueが組になっている配列だとする。
#animCurve : AnimationCurveObject
animCurve.addKey([nuke.AnimationKey(frame, value) for (frame,value) in keyArray])

https://learn.foundry.com/nuke/developers/63/pythonreference/nuke.AnimationCurve-class.html

AnimationCurveObject.Keys()

もっているkeyframeを参照することができる。

for key in animCurve.keys():
    xValue = key.x
    yValue = key.y
    print 'ket at %s has value %s' % ( xValue, yValue )

# Result:
ket at 1.0 has value 5.0
ket at 10.0 has value 55.0
ket at 100.0 has value 77.0

AnimationCurveObject.clear()

AnimationCurveObjectに対して、curveをclearさせる。


for curve in k.animations():
    curve.clear()

nuke.Node.metadata

dictionary型でそのノードが持っているメタデータを返してくる。
nodeオブジェクトだったら.metadataを持っている。

The metadata() method returns a dictionary containing the metadata for the specified node:
[引用] https://learn.foundry.com/nuke/developers/63/pythondevguide/metadata.html

https://learn.foundry.com/nuke/developers/63/pythondevguide/metadata.html

ノードのメタPropertiesの中に、Metadataのtabにそのノードが持っているmetadataを持っている。


Read nodeのmeatadata

node = nuke.toNode( 'Read1' )
print node.metadata()

# Result:
{'exr/displayWindow': [0, 0, 2047, 1555], 'input/width': 2048, 'exr/nuke/camera/vaperture': '18.672', 'input/bitsperchannel': '16-bit half float', 'input/filereader': 'exr', 'nuke/node_hash': 'c82817f8e9526abe', 'input/mtime': '2011-04-11 16:47:54', 'exr/nuke/camera/haperture': '24.576', 'input/ctime': '2011-04-11 16:47:54', 'exr/nuke/camera/matrix': '[-0.30901703238487244, -0.16514922678470612, 0.93660777807235718, 9.5105648040771484, 0.0, 0.98480772972106934, 0.1736481785774231, 2.0, -0.95105648040771484, 0.05366024374961853, -0.30432236194610596, -3.0901703834533691, 0.0, 0.0, 0.0, 1.0]', 'input/filename': '/Volumes/ohufx/consulting/Foundry/PythonDevGuide/footage/metadata/renderWithMetadata.0003.exr', 'input/filesize': 193828, 'exr/screenWindowCenter': [0.0, 0.0], 'exr/dataWindow': [463, 417, 1518, 1435], 'exr/nuke/camera/focal': '50.0', 'exr/screenWindowWidth': 1.0, 'input/height': 1556, 'exr/pixelAspectRatio': 1.0}

metadata('intput/fps')

そのnodeがメタデータとしてもつfps
Read nodeとかに使える。

Read = nuke.toNode("Read")
videofps = Read.metadata('input/frame_rate')

metadata('input/timecode')

現在のviewerの再生位置のframeにあたる、nodeのTimecodeを返す。

Read = nuke.toNode("Read")
videotc = StypeRead.metadata('input/timecode')

metadata('input/frame')

現在のviewerの再生位置のframeにあたる、nodeのフレームナンバーを返す。

Read = nuke.toNode("Read")
Read.metadata('input/frame')

nuke.root()

nuke.root()→ node
Get the DAG’s root node. Always succeeds.
Returns
The root node. This will never be None.
[引用] https://learn.foundry.com/nuke/developers/latest/pythonreference/_autosummary/nuke.root.html

DAG == node graphと思っていいらしい。
つまりNodeGraphのrootをnuke.nodeとして返す。

rootのnodeが持っている内容はほぼほぼprojectSettiingと思っても大丈夫。

DAG(NodeGraph)上で選択した単一のノードのdisableを切り替えるときは前回取り上げたnuke.selectedNode()を使うことができます(もちろんショートカットの方が簡単ですが)。
[引用] http://elephantplus.blogspot.com/2012/03/nukepython_26.html

nuke.root().format()

nuke.root().format()

Return : 
<Format object at 0x17979e0b0>

.x(): フォーマットの左端の座標を返します。
.y(): フォーマットの上端の座標を返します
.pixelAspect() : ピクセルアスペクト比を返してくれる。

.width()

nuke.root().format().width()

Return :
3424

.height()
.name(): フォーマットの名前を返します(例: "HD 1080"、"2K"など)。

nuke.root().fps()

fpsを返してくれるが、なんか23.976に設定していたとしたら整数でしか返してくれる

project settingのfps

root = nuke.root()
root['fps'].setValue(300)

UI

UIを設定できるところは

  • Nuke
  • Toolbar
  • Pane
  • Nodes
  • Properties
  • Animation
  • Viewer
  • Node Graph
  • Axis
    から選べる。
    基本的なpythonの関数は同じ。
    nuke.menu('Pane')みたいに打てばいい。
    これに対してnuke.menu('Pane').addMenu('任意の名前')でできる。

https://learn.foundry.com/nuke/developers/63/pythondevguide/custom_ui.html

Nodes

m = nuke.menu('Nodes')
myMenu = m.addMenu('MyStuff', icon='ohu_icon.png')


Nodes

hotkeyを設定したい場合.addCommand()の第三引数目に、'f'などhotkeyにしたいものを入れる。
もしくは、shortcut=''でもおk

nuke.menu( 'Nodes' ).addCommand( '3D/Axis', lambda: nuke.createNode( 'Axis2' ), 'a')

To use Ctrl (or cmd on Mac OS X) as the modifier, use:

ctrl+ followed by the key, or
^ followed by the key.
To use alt as the modifier, use:

alt+ followed by the key, or
# followed by the key.

To use shift as the modifier, use:

shift+ followed by the key, or

  • followed by the key.

[引用] https://learn.foundry.com/nuke/developers/63/pythondevguide/custom_ui.html

nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", 'ctrl+a')
nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", '^a')
nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", 'alt+a')
nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", '#a')
nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", 'shift+a')
nuke.menu( 'Nodes' ).addCommand( '3D/Axis', "nuke.createNode( 'Axis2' )", '+a')

デフォルトに存在している、NodesのDrawの中に、追加する方法

def RotoBlur_Shortcut():
    nuke.createNode('Roto', 'output rgba label "[value size]"')
    nuke.createNode('Blur', 'size 2 channels rgba').hideControlPanel()

nuke.menu('Nodes').addMenu('Draw').addCommand('Create roto and Blur node', lambda:RotoBlur_Shortcut(), shortcut='o', icon='Roto.png')


Draw


追加したCreate roto and Blur node

Pane

ややこしいが、nuke.toolbar()で追加できるメニューは、PaneWindowの項目

myToolbar = nuke.toolbar( 'My nodes' )


.toolbar() [Pane]
空のwindowが開く。

自分で作った My nodes

.toolbar()に対して、.addCommand('name', lambda: function())でボタンみたいなのを設置することができる。
pythonのlambda式で書くことができる。

lambda 引数:処理内容

myToolbar = nuke.toolbar( 'My nodes' )
myToolbar.addCommand( 'My Gizmo', lambda: nuke.createNode('NoOp') )


My GizmoというボタンUIが設置されて、createNode('NoOp')が発火される

.addCommand('nameA/nameB', lambda:処理)とすることで、ボタンUIにnameというnameAという名前をつけて、nameBという階層構造を作れて、lambdaが発火される。

....
....

myToolbar.addCommand( 'My Other Tools/tool A', lambda: nuke.createNode('NoOp') )
myToolbar.addCommand( 'My Other Tools/tool B', lambda: nuke.createNode('NoOp') )


my other toolという名前が設定された。

**

nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 1', lambda: nuke.message('yay, it works') )


上部のメニューが出てくる。


popup windowを出せる

index=numberをつけると、その指定した順番のところに入りこむことができる。

nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 1', "nuke.message('yay, it works too')")
nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 2', "nuke.message('yay, it works too')")
nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 1.5', "nuke.message('yay, it works too')", index=1 )


1.5がindex1番に差し込まれた。

セパレーターは以下

nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 1', "nuke.message('yay, it works too')")
nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 2', "nuke.message('yay, it works too')")
m = nuke.menu( 'Nuke' ).findItem( 'MyMenu' )
m.addSeparator()
nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 1.5', "nuke.message('yay, it works too')", index=1 )

nuke.menu( 'Nuke' ).addCommand( 'MyMenu/my tool 3', "nuke.message('yay, it works too')")


separator

メニューにある、ものを発火させたい時は.findItem().invoke()

m = nuke.menu( 'Nuke' ).findItem( 'Edit/Node/Filename/Show' )
m.invoke()


発火された。

ディアクティブ状態でグレーアウトさせたい場合は、setEnabled(False)戻したい場合は、setEnabled(True)

m = nuke.menu( 'Nuke' ).findItem( 'Render/Proxy Mode' )
m.setEnabled( False )

Viewer

Viewerを右クリックしたときに出てくるメニューの中にメニューを追加することができる。

m = nuke.menu( 'Viewer' )
myMenu = m.addMenu( 'MyStuff' )


Viewerを右クリックしたときのmenu

$gui nuke.executing()

https://www.ryotadeishi.com/post/nuke-tips-02-gui-executing

Project Setting

nuke.addFormat(format)

スペース区切りに'w h name'という文字列を
nuke.addFormat('w h name')と与えれば解像度fomatにテンプレートを追加できる。

square2k = '2048 2048 square 2k'
nuke.addFormat( square2k )


https://learn.foundry.com/nuke/developers/63/pythondevguide/formats.html

https://learn.foundry.com/nuke/developers/63/pythondevguide/formats.html

nuke.root()['format'].setValue(addformat)

上記のフォーマット形式のオブジェクトをそのままnuke.root()['format']にセットすることができる。

square2k = '2048 2048 square 2k'
addformat = nuke.addFormat( square2k )
nuke.root()['format'].setValue(addformat)

もしくは直接format nameを入れても成り立つ。

nuke.root()['format'].setValue('square 2k')

nuke.showSettings()

Project SettingのPropertiesを開く。
ショートカット sと一緒の効能

nuke.scriptClose()

nukeを普通に終了しようとする。
ので、普通に閉じようとした時みたいに、saveするか否かとかも聞いてくる

nuke.scriptExit()

nukeを強制的に終了しようとする。

Custom Panel

https://learn.foundry.com/nuke/developers/63/pythondevguide/custom_panels.html
https://learn.foundry.com/nuke/developers/latest/pythonreference/custom_panels.html

nuke.Panel()

Discussion