본문 바로가기
Nuke/개발

Callbacks

by 르면가게 2025. 2. 19.

NUKE Python 콜백 (Callbacks) 정리 및 번역

NUKE에서는 nuke.add…() 함수들을 사용하여 특정 이벤트(예: 노드 생성, 스크립트 로드 시)에 자동으로 Python 함수를 실행할 수 있습니다.

이러한 nuke.add…() 함수들은 init.py 또는 menu.py 파일에서 사용할 수 있으며, 이를 통해 NUKE 환경 내에서 항상 적용되도록 설정할 수 있습니다.


1. 기본 구조

모든 nuke.add…() 함수의 기본 구조는 다음과 같습니다.

nuke.addOnCreate(callable, args=(), kwargs={}, nodeClass='*')

각 매개변수의 역할

  • callable : 실행할 Python 함수 또는 함수명
  • args : 함수에 전달할 인수 리스트 (괄호 안에 포함)
    nuke.addOnCreate(nuke.tprint, ('출력할 메시지'))
  • kwargs : 키워드+값 형태의 추가 인수 리스트
nuke.addOnCreate(nuke.tprint, ('a', 'b'), {'sep': ','})
  • nodeClass : 특정 노드 클래스에서만 실행할 경우 지정 (기본값은 '*'로 모든 노드에서 실행)
nuke.addOnCreate(nuke.tprint, ('Write 노드 생성'), nodeClass='Write')

2. 콜백 실행 시점

콜백이 실행될 때, 해당 노드가 "컨텍스트 노드"가 됨.

  • nuke.thisNode() : 현재 영향을 받는 노드를 가져옴.
  • nuke.thisKnob() : knobChanged 콜백에서 현재 영향을 받는 노브를 가져옴.

3. NUKE의 콜백 종류

콜백 함수는 크게 두 가지 유형으로 나뉩니다.

1) 노드 속성 패널(Python 탭)에서 설정 가능한 콜백 (아티스트가 편집 가능)

이들은 NUKE UI에서 직접 설정할 수 있으며, 일반적인 이벤트에 대한 대응을 위해 사용됩니다.

콜백 함수설명
onScriptLoad 스크립트 로드 시 실행
onScriptSave 스크립트 저장 시 실행
onScriptClose 스크립트 종료 시 실행
beforeRender 렌더 시작 전에 실행
beforeFrameRender 각 프레임 렌더 전에 실행
afterRender 렌더 완료 후 실행
afterFrameRender 각 프레임 렌더 후 실행

2) 숨겨진(Visible UI에 표시되지 않는) 콜백 (Gizmo 등에 활용)

이들은 Python 코드에서만 설정 가능하며, 주로 Gizmo의 동작을 제어하는 데 사용됩니다.

콜백 함수설명
onCreate 노드가 생성될 때 실행
onDestroy 노드가 삭제될 때 실행
knobChanged 노드의 특정 Knob 값이 변경될 때 실행
updateUI UI 업데이트 시 실행
autolabel 노드의 레이블을 자동 변경할 때 실행

📌 Gizmo 개발 시 유용:

  • Gizmo 내부에 기본 동작을 설정할 때 onCreate, knobChanged 등을 사용 가능.
  • 아티스트가 직접 수정해서는 안 됨 (사용자가 설정을 변경하면 Gizmo 기본 설정이 덮어씌워짐).

4. 콜백 실행 순서

콜백이 여러 개 등록된 경우, 실행 순서는 다음과 같습니다.

  1. Knob에 설정된 콜백이 가장 먼저 실행됨.
  2. nuke.add…()로 추가된 콜백이 실행됨.
    • nodeClass가 지정된 콜백부터 실행됨.
    • 그다음 '*'(모든 노드에 적용되는) 콜백이 실행됨.
    • 콜백은 등록된 순서대로 실행됨.
  3. 단, addAutolabel() 및 addFilenameFilter()는 역순으로 실행됨.

5. 콜백 제거

모든 add…() 콜백 함수에는 해당 콜백을 제거하는 remove 함수가 존재합니다.

callback_id = nuke.addOnCreate(my_function) nuke.removeOnCreate(callback_id)
 

콜백을 제거할 때는, add…() 함수가 반환하는 ID를 사용해야 합니다.


📌 예제 1: Write 노드가 생성될 때 메시지 출력

def on_write_create(): 
	print("새로운 Write 노드가 생성되었습니다!") 
    nuke.addOnCreate(on_write_create, nodeClass="Write")
 

📌 예제 2: 노드의 특정 Knob 값이 변경될 때 자동 실행

 
def knob_changed(): 
	node = nuke.thisNode() 
    knob = nuke.thisKnob() 
    print(f"{node.name()}의 {knob.name()} 값이 변경됨!") 
    nuke.addKnobChanged(knob_changed, nodeClass="Blur")

📌 예제 3: 렌더 시작 전에 로그 남기기

def before_render():
	print("렌더 시작 전: 스크립트 준비 중...") 
    nuke.addBeforeRender(before_render)

6. 요약

  • nuke.add…() 함수로 특정 이벤트 발생 시 Python 코드 실행 가능.
  • init.py 또는 menu.py에 설정하면 NUKE 환경 내에서 지속적으로 적용됨.
  • onCreate, knobChanged 같은 숨겨진 콜백은 Gizmo 개발 시 유용.
  • 콜백 실행 순서는 Knob → 특정 노드용 콜백 → 전체 노드용 콜백 순서.
  • 콜백을 추가한 후에는 remove…() 함수로 제거 가능.

'Nuke > 개발' 카테고리의 다른 글

확장자 - EXR: 무손실 압축  (0) 2025.02.27
폰트  (0) 2025.02.26
Command Line Operations  (0) 2025.02.19
HTML in Nuke  (0) 2024.12.17
nuke의 다양한 개발방식?들  (0) 2024.12.07