2012년 4월 23일 월요일

Nuke 스튜디오 셋팅


 기본적으로 nuke windows7 환경내에서 “C:\Users\Administrator\.nuke” 안의 inti.py 파일을 실행하게 되어 있습니다.

, 포토샵이나 기타 프로그램처럼 플러그인 브러쉬등을 nuke 가 실행될 때 로드를 한다는 것이죠.
가장 처음 nuke 를 설치 하게 되면 위에 언급한 폴더만이 생성이 되고 어떤 파일도 존재 하지 않습니다.
inti.py 파일을 사용하여 개인 사용자 설정을 하게 되며 레이아웃등을 저장하면 xml 파일로 레이아웃관련된 파일만이 생성이 될 뿐입니다.

최초 실행시 init.py 파일을 참조 하는 것을 이용하여, 여러 사용자가 동일한 환경내에서의 동작을 보장할 수 있게끔 해주기 위한 작업을 지금부터 해보도록 하겠습니다.

사용은 간단합니다.

보통 gizmo python 스크립트를 다운 받아 사용한다거나 제작 사용한다고 할 때

Inti.py 에서는
nuke.pluginAddPath('.\gizmos')
nuke.pluginAddPath('.\python')
nuke.pluginAddPath('.\icons')
nuke.pluginAddPath('.\tcl')

위와 같이 플러그인 패스를 추가 해주게 됩니다. 이러한 python 명령어를 통해 nuke 가 실행될 때 다운 받거나 만든 gizmo 등을 로드 하여 사용할 수 있게 해주는 것입니다.

플러그인 패스를 공용 폴더(, 서버의 어떠한 경로)로 설정할 경우 그 안의 init.py menu.py 도 자동으로 실행 합니다.

대충 눈치를 채셨나요?
여러 명의 컴퍼지터가 nuke 를 사용하고 랜더팜 등을 활용하기 위해서는 동일한 nuke 환경에서 동일한 플러그 인을 가지고 작업을 진행해야 랜더팜으로 랜더를 걸 때 오류가 나지 않습니다.

, 작업자는 동일한 플러그인을 설치 함과 동시에 동일한 gizmo python 을 사용해야 한다는 것입니다. 그렇지 않을 경우 랜더팜에서는 엄청난 에러를 뿜어내겠죠.. ^^(뭐 개별적으로 설치한 gizmo python 을 설치 하고 사용한 경우이긴 하지만요..)

그럼 기본 폴더안에 init.py 파일을 만들고 파일안에 다음과 같이 작성해 넣어줍니다.
--나머지 파일은 전부 지우고(레이아웃 xml 파일을 제외 하고 ^^)--
nuke.pluginAddPath('Z:\\global\\DS2L_nukeScript')

Z:\\global\\DS2L_nukeScript 부분은 공용 폴더나 자신이 지정하고자 하는 폴더경로를 넣으시면 되구요.

지정한 폴더내에는

위와 같이 (똑같진 않겠죠.. ^^) 기존에 gizmo python 스크립트를 넣고 사용하면 됩니다.

물론 기존 “C:\Users\Administrator\.nuke” 패스 내의 init.py menu.py 파일의 내용이 여기에 들어가게 될 것이며 관리자는 지정한 폴더내의 init.py menu.py 파일 수정 및 gizmo 파일이나 python 파일의 추가 및 제거를 하였을 때 각 사용자들은 nuke 를 다시 실행 하기만 하면 변경된 부분을 바로 적용 받는 다는 것입니다.

물론 레이아웃 파일이 존재 한다면 그 파일을 참고 하게 되니 같은 레이아웃을 사용할 수도 있습니다.

2012년 4월 17일 화요일

IndentationError: unexpected indent 에러 관련

IndentationError: unexpected indent 


위 에러 때문에 아무것도 아닌것에 아주 골 머리를 썩힌 적이 있습니다.

저는 notepad++ 에서 python 스크립팅을 합니다.

테스트야 뭐 그냥 ctrl+c , ctrl+v  신공으로 nuke 의 script editor 창에서 직접 하지요.

위의 에러는 여기서 생기는 문제 입니다.

구글링을 해보면 뭐 영어가 워낙에 짧아 내용 찾는게 힘들었는데.. 들여쓰기가 문제 더군요.

mel script 나 max script 는 구문을 나눌때 괄호로 나누기 때문에

단지 가독성이 좋아 지라고 탭으로 들여쓰기를 합니다.

하지만 python 은 구문을 나눌때 들여쓰기로 나누더군요.

예로
for t in test:
    print t

는 notepad++에서는 print t 라인을 쓰기 위해 탭 을 사용하여 들여쓰기를 합니다.

외관상으로는 문제가 없지만 있는 그대로 .py 파일로 저장을 하고 실행을 할때는

들여쓰기에 문제가 있다고 판단을 해서 위의 에러 메세지를 표시 하는것 이지요.


그래서 notepad++ 에서 들여쓰기 하면서 사용한 이 문제가 된 것 이었습니다.

즉 파일로 저장해서 실행을 하면 구문 오류가 나는것이죠.


여기서 쉽게 수정하는 방법을 찾게 됩니다.

복사 신공으로 실행 하면 에러가 나지 않지만 파일로 저장을 하면 에러가 난다..

즉 복사 해서 nuke의 script editor 창에 붙여 넣는 순간 탭은 모두 4칸의 공백
(notepad++에서의 탭은 4칸 공백과 크기가 같아서..)으로 바뀝니다.

script editor 창에 복사해두고 다시 복사 해서 notepad++ 에 붙여 넣으면 들여쓰기가 탭이

아닌 4칸의 스페이스로 인식되는 것이고 구문상에도 문제가 없게 되는 것 입니다.


참고로 아예 탭 설정을 바꿔 버리는 방법도 있습니다.

추후에 다시 이런 문제가 생기는걸 미연에 방지 하기 위함이지요~~~


Nuke에 PyQt 설치 하기


실행환경
os는 Windows 7 64bit 한글
Nuke는 6.3v4 64bit
- Python 2.6.5 final


설치


1. python 2.6 설치
http://www.python.org
위 경로에서 자신에 맞는 python을 다운 받아 설치 합니다.

2. pyqt 설치
http://www.riverbankcomputing.co.uk/software/pyqt/download
위 링크 에서 Python 버전에 맞는 파일을 다운받아 설치 하면 됩니다.

만약 밑의 테스트 과정에서 문제가 생긴다면 다음의 링크에서 다운받아서
설치 하면 됩니다.(저 같은 경우에는 위의 pyqt를 설치 하면 임포트가 안되더라구요.
그래서 밑의 링크의 pyqt 를 다운 받아 설치 했습니다.)

http://code.google.com/p/pyqt4-win64-binaries/downloads/detail?name=PyQt-Py2.6-gpl-4.6-snapshot-20090810-1.exe&can=2&q=

위의 경우 컴파일된 환경이 다를때 나타날 수 있는 문제로 보입니다.
같은 환경에서 컴파일된 것이라도 미묘한 차이가 있나 보네요... 이 부분은 너무 깊이
들어갈 실력이 안되어서 정확히 머라 설명 드리기가 복잡하네요.

구글링 해보면 컴파일 해두고 설치 파일로 만들어 놓은 것들이 꽤나 있습니다.

각 시스템 환경에 맞게 다운 받아 설치 하면 됩니다.

3. 설치된 PyQt module 을 Nuke 폴더로 복사
C:\Python25\Lib\site-packages 폴더안의 파일들을
C:\Program Files\Nuke6.3v4\lib\site-packages 폴더안으로 복사합니다.

위의 과정을 모두 거치고 나면 pyqt 설치가 완료 된 것이며
다음의 테스트 과정에서 문제가 없다면 정상적인 사용이 가능합니다.

from PyQt4 import QtCore

만약 모듈 네임을 못찾겠다는 등의 에러가 뜬다면 설치한 pyqt 버전이 안맞는것으로
같은 Windows 7 64bit 환경에서 컴파일된 pyqt를  찾아야 합니다.



참고로 모든 시스템에 이러한 방법으로의 설치가 필요한것은 아닙니다.
설치 하고 문제가 없다라고 한다면~ 다른 같은 시스템에는 3번의 과정만으로 Nuke 에서
pyqt 가 사용 가능합니다.

물론 테스트로 pyqt를 임포트 해보아야 하죠~~~

기존의 여러 예제 파일이 pyqt 설치를 하면
C:\Program Files\Nuke6.3v4\plugins\nukescripts\pyQtExamples
폴더 안에 있으니 사용해 보시면 됩니다.


from nukescripts.pyQtExamples import pyQtRender
pyQtRender.startQtRenderDialog()


위와 같이 예제 파일을 불러볼 수 있습니다. 간혹 설치가 제대로 되어 있더라도
모듈 에러가 날 수 있습니다. 이러한 부분은 직접 python 코드를 script editor 창에
복사 후 실행 해보셔도 됩니다.


예제를 실행 해보면 나타나는 창입니다.

사실 pyqt만 임포트가 제대로 된다면 예제를 힘들게 실행해볼 필요도 없긴 하죠~~ ^^;

Nuke의 Python 버전 확인 하기


import sys
print sys.version_info

위와 같이 입력을 하게 되면 현재 사용하는 Nuke의 Python 버전 정보를
알 수 있습니다.


현재 제가 사용하고 있는 Nuke 는 6.3v4 입니다.
위에 보시는 것 처럼 Python은 2.6.5을 사용하고 있다고 나오는군요.

2012년 4월 10일 화요일

Mel Script 개인 UI 만들기




string $KNF_reNaming_n = "RE_NAMING"; //윈도우 이름을 정하고 변수 선언

if(`window -exists $KNF_reNaming_n`) //RE_NAMING 이란 윈도우가 있으면 창을 닫는다
deleteUI $KNF_reNaming_n;

window -t "Re Naming MEL" $KNF_reNaming_n; //윈도우 타이틀


string $form = `formLayout`; //레이아웃 변수 선언


string $KNF_reN_textField = `textFieldGrp -label "Input String : " -text "" reNaming_UI`; //텍스트 필드


string $KNF_reN_radioButtonGrpA = `radioButtonGrp -numberOfRadioButtons 4
-cc KNF_ccOptionMenu
-labelArray4 "Re Name" "Replace" "Add prefix" "Add postfix" -sl 1 KNF_reN_radioButtonGrp1`; //라디오버튼 그룹

string $KNF_reN_buttonA = `button -h 30 -w 250 -label "EXCUTE" -c KNF_reN_Excute`; //버튼

string $KNF_reN_buttonB = `button -h 30 -w 250 -label "CANCLE" -command ("deleteUI -window " + $KNF_reNaming_n)`; //버튼

string $KNF_reN_checkBoxA = `checkBox -label "AutoGroup(Just Rename in BF)"  -align "left" -enable 0 -v 0 KNF_reN_checkboxAUI`; //체크박스
string $KNF_reN_checkBoxB = `checkBox -label "Fix Padding Number"   -align "left" -cc KNF_reN_ccCheckboxB -v 1 KNF_reN_checkboxBUI`; //체크박스
string $KNF_reN_intSliderA = `intSliderGrp -field true -minValue 3 -maxValue 8 -value 3 -enable 1 KNF_reN_intSliderAUI`; //슬라이드 바


optionMenu -label "Name Type :" -cc KNF_ccOptionMenu KNF_whichNameType; //옵션메뉴
menuItem -label "Done";
menuItem -label "geo";
menuItem -label "shp";
menuItem -label "lgt";
menuItem -label "anm";
menuItem -label "bon";
menuItem -label "cam";
menuItem -label "grp";
menuItem -label "con";
menuItem -label "msc";



string $fgtextA = `text -label "By Kyounan 5:36pm, 17/06/10" -align "left" -font "smallPlainLabelFont"`; //텍스트
string $fgtextB = `text -label "V 0.3.0"   -align "right" -font "smallPlainLabelFont"`; //텍스트
string $fgseparatorA = `separator`; //분할라인

//여기서 부터가 윈도우에 배치

formLayout -edit
-attachForm $KNF_reN_textField "top" 10
-attachForm $KNF_reN_textField "left" 1

-attachForm KNF_whichNameType "top" 10
-attachControl KNF_whichNameType "left" 10 $KNF_reN_textField



-attachControl $KNF_reN_radioButtonGrpA "top" 10 $KNF_reN_textField
-attachForm $KNF_reN_radioButtonGrpA "left" 70



-attachControl $KNF_reN_buttonA "top" 10 $KNF_reN_radioButtonGrpA
-attachForm $KNF_reN_buttonA "left" 20


-attachControl $KNF_reN_buttonB "top" 10 $KNF_reN_buttonA
-attachForm $KNF_reN_buttonB "left" 20

-attachControl $KNF_reN_checkBoxA "top" 10 $KNF_reN_radioButtonGrpA
-attachControl $KNF_reN_checkBoxA "left" 20 $KNF_reN_buttonA

-attachControl $KNF_reN_checkBoxB "top" 5 $KNF_reN_checkBoxA
-attachControl $KNF_reN_checkBoxB "left" 20 $KNF_reN_buttonA

-attachControl $KNF_reN_intSliderA "top" 5 $KNF_reN_checkBoxB
-attachForm $KNF_reN_intSliderA "right" 20


-attachForm $fgtextA "bottom" 2
-attachForm $fgtextA "left" 5
-attachForm $fgtextB "bottom" 2
-attachForm $fgtextB "right" 5
-attachForm $fgseparatorA "bottom" 20
-attachForm $fgseparatorA "left" 5
-attachForm $fgseparatorA "right" 5
$form;
//여기까지가 윈도우 배치

showWindow $KNF_reNaming_n; //윈도우 표시

window -e -wh 550 180 $KNF_reNaming_n; //윈도우 창 크기 설정





위의 코드를 실행 하면 다음과 같은 윈도우가 생성이 됩니다.

제가 mel 을 이용하여 UI 를 만들때 가장 쉽다고 생각 되는 부분이 formLayout 을
이용하여 작성 하는 것인데요..

윈도우 배치 부분만을 설명을 드리면
제일 마지막 줄에서 윈도우 크기를 지정을 하고 그 안에 적절하게 배치 될 수 있게
-attachControl, -attachForm 플래그를 사용하여 작성하는 방법입니다.


길어 보이지만 상당히 간단 합니다.

-attachForm 은 윈도우에 붙인다는 뜻으로

-attachForm $KNF_reN_textField "top" 10 의 경우

$KNF_reN_textField 에 해당하는 아이템을 윈도우의 top을 기준으로 10픽셀을 띄우고
배치 한다는 뜻입니다.

-attachControl 은 윈도우가 아닌 해당 아이템을 다른 아이템을 기준으로 붙인다는뜻으로

-attachControl $KNF_reN_radioButtonGrpA "top" 10 $KNF_reN_textField

$KNF_reN_radioButtonGrpA 에 해당하는 아이템을 $KNF_reN_textField 에 해당하는 아이템
을 기준으로 10픽셀을 띄우고 배치 하라는 의미 입니다.

즉, $KNF_reN_textField 에 해당하는 아이템 밑에 10픽셀의 공간을 두고 배치하게 됩니다.


위 코드를 실행 해보고 formlayout 부분을 확인 하면 쉽게 알 수 있을것입니다.



Nuke의 모든 Read 노드 이름과 경로 보기


tempRNN = nuke.allNodes('Read')
       
for t in tempRNN:
    print t.name() + '\t' + t['file'].value()


Script Editor 창에 위 코드를 입력하면 각 Read Node Name 과 경로 가 출력 된다.

우선 간단히 표현만 한것..

2012년 4월 9일 월요일

QListWidget Item 을 Python 문자로 가져오기

pyqt 를 사용하여 리스트 표현을 할때 QListWidget 을 사용하게 됩니다.

선택된 리스트를 사용하기 위해서는

myList.currentItem().text()

만약 myList.currentItem() 로만 값을 가져온다면

<PyQt4.QtGui.QListWidgetItem object at 0x0000000004DBFB48>

위와 같은 형태로 표현이 됩니다.

하지만 currentItem().text() 를 사용하여 문자로 가져 올 수 있습니다.


multi selection 이 가능하게 해둔 QListWidget 은 다른 방법을 사용해야 합니다.

myList.selectedItems()

를 사용해서 값을 가져 올 수 있지만 가져 온 값은

예를 들어 2개의 item 을 선택 한 경우

[<PyQt4.QtGui.QListWidgetItem object at 0x0000000004DBFB48>, <PyQt4.QtGui.QListWidgetItem object at 0x0000000004DBFBC8>]

위와 같이 출력이 되게 됩니다.


이는 다음과 같이 문자로 가져 올 수 있었습니다.

selReadName = []


for r in self. myList .selectedItems():
    selReadName.append(str(r.text()))

배열이니 하나씩 가져오는 무식한 방법.. ㅡ.ㅡ 허나 동작에 문제는 없습니다. ^^;;


이는 단일로 선택되었을때와는 다르게 myList.selectedItems().text()로

보여지는 item 을 그대로 표현 못하더군요.



아직 nuke 에서 python을 다룬지 얼마 되지도 않고 간단히 선택한 인자 값을 가져오는
방법이 있을것 같지만 이것저것 고민하고 사용해서 가능한 방법을 선택 한 것이라
편법인지는 모르겠지만 잘 동작 하네요.. ^^;;;



2012년 4월 6일 금요일

DeadLine 4.1에서 Slave CPU 를 100% 로 사용하지 못하는 경우

DeadLine 4.1 에서 Maya 파일을 Submit 할 때 스튜디오 환경에서

간단히 submit 하기 위해서

자체적으로 지원되는 Maya Mel Script를 사용하지 않고 간단하게 새로 작성하여

사용하고 있는 중입니다.


뭐 동작 자체는 상당히 간단 합니다.

데이터 스트럭쳐에 맞춰서 저장할 폴더를 생성하고 파일네임 만들어 주고

랜더 셋팅을 통한 프레임을 자동으로 입력해주는 정도....



그런데 여기서 문제가 생기더군요.

submit 도 정상적이고 render 도 정상적으로 걸리는데

문제 발생~~~~~ slave 머신의 cpu 를 100%로 사용하지 못하더군요.

DeadLine 포럼을 찾아 보니 Concurrent Tasks 값이 잘못 들어가거나

Treads 값이 잘못 들어 간거 아니냐는 얘기 들뿐~~~


하나하나 설정을 만지다 보니 전혀 예상치 못한 곳에 문제가 있었습니다.


바로 체크한 Renderer 설정이 문제더군요.


씬내에서 랜더 레이어 별로 Mental ray 혹은 Maya Software 로 랜더 걸일이 생겨서

씬을 2개 만들기는 귀찮아 저 설정으로 사용을 했더니 생기던 문제 였습니다.


그뒤로 Script 수정을 하지 않고 그냥 사용해서 이런일들이.. ㅡ,.ㅡ


Mental ray 로만 구성된 씬을 file 과 mental ray 2가지 셋팅으로 submit 해보니

file로 선택 했을때는 core 1개만 사용하여 랜더를 하고

mental ray 로 선택 했을때는 core를 전부 사용하더군요.

다른 renderer 설정도 마찬가지 입니다. 정확하게 지정하지 않으면 core를

전부 사용하지 못하는 문제가 있습니다.

Nuke node dimmed

작성 중인 Nuke Python Script 에서 필요하게 되어 찾아본것..


nuke.toNode('노드이름')['disable'].setValue(True)



ex)

test = nuke.allNodes('mov_maker')

for f in test:
     nuke.toNode(f.name())['disable'].setValue(True)


현재 씬내의 모든 mov_maker 노드를 dimmed 시킨다.

cmd 에서 환경변수 생성, 추가

사용자 변수 추가
ex) setx 변수이름 "추가 하고자 하는 값"

시스템 변수 추가
ex) setx 변수이름 "추가 하고자 하는 값" -m


기존 주어진 패스에 추가를 하고자 할 때는 다른 방법을 취해야 함.
ex) setx 기존변수이름 "%path%;추가하고자하는경로"

마찬가지로 시스템 변수에 추가를 위해서는 제일 뒤에 -m 을 붙여야 함

참고로 추가하고자 하는 값 제일 뒤에 \ 가 붙는 다면 \\ 로 표기...
ex) setx testName "d:\test\\" -m