Nuke Python Script
メモです。
随時更新
最終更新 : 2023/06/21
まとめられているサイト
Welcome to NUKE Python Developer’s Guide — Nuke Python API Reference
Welcome to NUKE Python Developers Guide — NUKE Python Developers Guide v6.3v8 documentation
Module Hierarchy
Identifier Index
ここに一覧としてかなり、メソッドがまとめられている。検索がしやすい。
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
inputs=[node,node,node]
でinput側の指定できる。
nuke.nodes.ScanlineRender(name="ScanlineRender",xpos=-100,ypos=-100, inputs=[Scene,,StypeCam])
nuke.nodes.ScanlineRender2()
新しい3Dの方のscanline Render
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
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()
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がもっているメソッドの一覧は以下
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
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することができる。
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)
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])
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
ノードのメタ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('任意の名前')
でできる。
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という名前が設定された。
**
menu
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()
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
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
Discussion