문자열의 format 함수를 이용하면, 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다.



'Houdini > Python' 카테고리의 다른 글

[REGEX] Greedy vs Non-Greedy  (0) 2016.10.09
[PySide] Python panel Test UI  (0) 2016.01.25
Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Posted by scii
:

정규식에서 Greedy(탐욕스러운)란 어떤 의미일까?


"<.*>" 정규식의 매치 결과로 <html> 문자열이 리턴되기를 기대했다. 하지만 * 메타 문자는 매우 탐욕스러워서 매치할 수 있는 최대한의 문자열인 <html><head><title>Title</title></head></html> 문자열을 모두 소모시켜 버렸다. 어떻게 하면 이 탐욕스러움을 제한하고 <html> 이라는 문자열까지만 소모되도록 막을 수 있을까?

다음과 같이 Non-Greedy 문자인 ? 을 사용하면, * 의 탐욕을 제한할 수 있다.


Non-Greedy 문자인 ? 은 *?, +?, ??, {m, n}? 와 같이 사용할 수 있다.

가능한 한 가장 최소한의 반복을 수행하도록 도와주는 역할.


'Houdini > Python' 카테고리의 다른 글

고급 문자열 formatting  (0) 2016.10.10
[PySide] Python panel Test UI  (0) 2016.01.25
Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Posted by scii
:

'Houdini > Python' 카테고리의 다른 글

고급 문자열 formatting  (0) 2016.10.10
[REGEX] Greedy vs Non-Greedy  (0) 2016.10.09
Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Posted by scii
:


참고 사이트: http://odforce.net/wiki/doku.php?id=viewers


간단한 예)

- 뷰창에서 임의의 포인트를 클릭하고 엔터를 누르면, 그 포인트의 정보가 반환된다.

import toolutils


def parent(obj_node, new_parent):

    xform = obj_node.worldTransform()

    obj_node.setFirstInput(new_parent)

    obj_node.setWorldTransform(xform)


def aa():

    viewer = toolutils.sceneViewer()

    node_to_reparent = viewer.selectObjects(quick_select=True)[-1]

    new_parent = viewer.selectObjects(use_existing_selection=False, quick_select=True,

    prompt="select new parent node")[-1]

    parent(node_to_reparent, new_parent)


def tmp():

    viewer = toolutils.sceneViewer()

    selection = viewer.selectGeometry("select some point and enter",

        geometry_types=(hou.geometryType.Points,), use_existing_selection=False)

    

    print selection, type(selection)                                                                                     # class instance

    print selection.mergedSelectionString(), type(selection.mergedSelectionString()) # ptnum

    print selection.nodes()                                                                     # select point has Node instance 


'Houdini > Python' 카테고리의 다른 글

[REGEX] Greedy vs Non-Greedy  (0) 2016.10.09
[PySide] Python panel Test UI  (0) 2016.01.25
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Python으로 만든 뷰창 옵션 지우기  (0) 2013.02.23
Posted by scii
:

rot, trans, scale

Houdini/Python 2013. 5. 25. 12:55 |




'Houdini > Python' 카테고리의 다른 글

[PySide] Python panel Test UI  (0) 2016.01.25
Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
hou Module Functions  (0) 2013.04.01
Python으로 만든 뷰창 옵션 지우기  (0) 2013.02.23
모든 하위 노드 출력하기  (0) 2013.02.22
Posted by scii
:

hou Module Functions

Houdini/Python 2013. 4. 1. 23:06 |

※ sys.path.append(os.environ['HFS'] + '/houdini/scripts/python')

    import hou


- HOM hou -


hou.pwd(function)     ->     현재 노드의 위치를 알아온다.

hou.cd(function)     ->     현재 위치를 바꾼다.

hou.Node(class)

node(self, node_path)     ->     node_path 의 노드 이름을 반환한다.

inputs(self)     ->     input으로 연결된 노드 이름을 반환한다.

setFirstInput(setf,, node_to_become_input, output_index=0) or setFirstInput(self, indirect_to_become_input)

setFirstInput(None)     ->     연결된 상위 노드가 끊어진다. unparent가 된다.

children(self)     ->     자식 노드를 반환한다.

ex) for i in hou.node('/obj').children():

print i.name()

/obj 하위에 있는 node 이름들을 반환한다.

destroy(self)     ->     노드를 삭제한다.

createNode(self, node_type_name, node_name=None, run_init_scripts=True, load_contents=True)     ->     노드를 만든다.

parm(self, parm_path)     ->     파라미터 값을 가지고 온다.


hou.objNode

worldTransform(self)     ->     geometry(into world space) 의 위치를 매트릭스로.

set(self, value, language=None)     ->     파라미터에 값을 설정한다.


worldTransform 함수를 이용한 예제)

상위 노드와의 연결을 그냥 끊어 버리면, 상속받고있던 노드의 포지션값을 다시 원상태로 돌아간다. 

하지만, 밑의 스크립트를 이용하면 상속받고 있던 표지션값을 그대로 유지시키면서 연결을 끊을 수 있다.

def unparentKeepPos(obj_node)

xform = obj_nod.worldTransform()

obj_node.setFirstInput(None)

obj_node.setWorldTransform(xform)


unparantKeepPos(hou.node('/obj/box_object')




toolutils Module

toolutils.sceneView()     ->     씬 뷰어 창을 반환한다. (뷰어 창만 관여)

ex) 뷰 창에서 선택한 obj의 경로를 반환하는 예제

scene_viewer = toolutils.sceneViewer()

path = scene_viewer.pwd()     ->     씬 뷰어의 네트워크 경로를 가져온다. 만약, /obj/geo1에서 뷰어창이 보인다면, 반환되는 경로는 /obj/geo1 이다.

obj = scene_viewer.selectObjects(quick_select = True)[-1]     ->     뷰 창에서 원하는 것을 선택할 수 있도록 해준다.


ex) 뷰 창에서 선택한 것의 노드를 상위노드와 연결 해제한다. 그러면서 상속받은 값 유지시키는 예제

viewer = toolutils.sceneViewer()

obj_name = viewer.selectObjects(quick_select=True)[-1]

unparentAndKeepPos(obj_name)




hou.SceneViewer


    selectObjects(self, prompt='Select objects', sel_index=0, allow_drag=False, quick_select=False, use_existing_selection=True, allow_multisel=True, allowed_types=('*',), icon=None, label=None) : viewer에서 오브젝트를 선택하는 넘인데... 정확한 설명이 없당 된장 추측은 prompt는 viewer에서 뭘 하라고 하는 메세지를 출력 해주는 거 같고, quick_select=True 하면 선택을 use_existing_selection=False하면 이미 선택된 넘들은 무시하라는 뜻인듯... 


hou.SceneViewer.selectObjects(quick_select=True)[-1]

대략 이런 식이면 이런 에러 메시지가

TypeError: unbound method selectObjects() must be called with SceneViewer instance as first ar

gument (got nothing instead)

그래서

import toolutils

viewer = toolutils.sceneViewe()

node1 = viewer.selectObjects(quick_select=True)[-1] <-- 아무것도 선택이 되어져 있지 않을 경우

node2 = viewer.selectObjects(use_existing_selection=False, quick_select=True)[-1] <-- 뭔가가 선택되어져 있을 경우 무시하고 다시 선택하는 경우


----------------------------------------------------------------------------------------------


standalone


CentOS 5.1 x86_64

Python 2.5


$ cd /opt/hfs10.0.465/

$ source houdini_setup_bash


import sys, os

sys.path.append(os.environ['HFS'] + '/houdini/scripts/python')

import hou


import hou 에서

ImportError: libpython2.5.so.1.0: cannot open shared object file: No such file or directory 이런 에러라면

/opt/hfs10.0.465/python/lib/libpython2.5.so.1.0 를

Houdini DSO - error on '/opt/hfs10.0.465/houdini/dso/audio/CL_AudiereClipReader.so'

libaudiere-1.9.4.so: cannot open shared object file: No such file or directory 이런 에러라면

/opt/hfs10.0.465/dsolib/libaudiere-1.9.3.so 를

LD_LIBRARY_PATH에 추가 해 주어야 한다


걍 이런게 귀찮다면

$ export LD_LIBRARY_PATH=/opt/hfs10.0.465/python/lib:/opt/hfs10.0.465/dsolib:$LD_LIBRARY_PATH



----------------------------------------------------------------------------------------------


Geo convert - hom standalone


    준비할 것들에 대해서 


console 을 실행합니다


$ cd /opt/hfs10.0.465/

$ source houdini_setup_bash

$ export LD_LIBRARY_PATH=/opt/hfs10.0.465/python/lib:/opt/hfs10.0.465/dsolib


여기 까지 하면 후디니를 파이썬에서 넌구이 버전으로 실행이 가능해 집니다

확인 방법은


$ python 

>>> import sys, os

>>> sys.path.append(os.environ['HFS'] + '/houdini/scripts/python')

>>> import hou

>>>


import hou 했을 때 에러가 없어야 합니다


참고 하세요

위와 같은 환경 셋팅이 되면 구이버전 후디니가 안됩니다

리눅스에서만 해봤습니다 ubuntu9.10 64bit

파이썬 버전이 틀려도 됐습니다 후디니파이썬2.5.2 리눅스설치된파이썬2.6.4


    실행 방법 


usage  : ./geoCutting.py [hip file] [geo path] [cutting box file] [output]

[hip file] : 포인트들과 컷팅박스가 있는 후디니 화일입니다

               /home/pinkclear/ntfsData/WORK/Project/FLD047/pointCutting.hip

[geo path] : 컨버팅 하기 전 원본 geo 가 있는 디렉토리입니다 컨버팅할 geo만 있는게 좋습니다

                  /home/pinkclear/ntfsData/WORK/Project/FLD047/original_geo

[cutting box file] : 컷팅박스 geo 화일입니다

                          /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_box.geo

[output] : 컷팅 박스로 잘려진 포인트들의 geo 가 저장될 디렉토리입니다

              /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_geo


./geoCutting.py /home/pinkclear/ntfsData/WORK/Project/FLD047/pointCutting.hip /home/pinkclear/ntfsData/WORK/Project/FLD047/original_geo /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_box.geo /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_geo

전체적인 명령은 이렇게 됩니다


$ ./geoCutting.py

라고만 하면 간단 설명이 나옵니다

usage  : ./geoCutting.py [hip file] [geo path] [cutting box file] [output]

sample : ./geoCutting.py /home/pinkclear/ntfsData/WORK/Project/FLD047/pointCutting.hip /home/pinkclear/ntfsData/WORK/Project/FLD047/original_geo /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_box.geo /home/pinkclear/ntfsData/WORK/Project/FLD047/cutting_geo

이렇게


※ Help에서 "feedloader" 검색하여 알아보기.

'Houdini > Python' 카테고리의 다른 글

Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
Python으로 만든 뷰창 옵션 지우기  (0) 2013.02.23
모든 하위 노드 출력하기  (0) 2013.02.22
Houdini Python Test  (0) 2013.02.20
Posted by scii
:


뷰창 옵션 지우는 것을 한번 작성해 보았습니다. 쉘프창에서 new tool 누르신 후 스크립크 창에 적용하시면 됩니다.

All을 누르시면 옵션 모두 지우고, One을 누르시면 옵션들을 하나씩 보여주면서 선택적으로 지울 수 있습니다.


'Houdini > Python' 카테고리의 다른 글

Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
모든 하위 노드 출력하기  (0) 2013.02.22
Houdini Python Test  (0) 2013.02.20
Posted by scii
:

children() 함수: 하위 노드들의 목록을 보여줍니다.

name(): 이름을 보여줍니다.


1. 일단 아무노드나 만듭니다~


2. geo2 의 하위노드들 


3. python창에서 작업을 하면, 디버깅하기가 여간 불편한것이 아니라서... 디버깅을 편하게 하기 위해, 그리고 단순 클릭만으로 스크립트가 실행되게끔 하려고 shelf 툴에서 작업을 하였습니다. 

shelf 에서 마우스 오른쪽 클릭을하면, Edit Shelf가 나오는데 그것을 클릭 후 Script Language를 Python으로 바꾸어주면 됩니다. 

그 다음, 아래의 소스코드를 작성하시면 됩니다.

이 소스코드에서 PrintChild함수는 재귀함수(함수안에서 다시 자기 자신을 호출하는 함수)입니다. 여기서 재귀함수를 쓴 까닭은 트리구조에서 재귀함수를 쓰면, 코드가 상당히 간결해집니다. 물론 쓰지 않고 함수를 구성해도 됩니다만 코드가 상당히 너저분해지고 까다로워질 것이라 생각합니다. 

그래서 트리구조에서 하위노드들을 가져올 때, 재귀함수를 써서 가져옵니다. 

후디니는 노드구조(트리구조) 이기때문에 재귀적으로 구현해야 코드가 간결해집니다. 트리구조와 재귀함수의 관계가 무엇인지 다 아시겠지만, 혹 궁금하신 분들은 "이진 트리의 순회"를 찾아보시면 좋을 것 같네요.

위키백과: http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C

PrintChild함수 내에서 가장 중요한 라인은 5번째 라인입니다. 5번째 라인을 보시면 다시 자기자신을 호출합니다.

그래서 첫번째 인수인 node로 진행중인 child가 전달되고, 두번째 인수로 indent가 +3이 되어 3이 전달됩니다.

그 다음, 하위노드가 또 다시 존재한다면, 첫번째 인수인 node로 진행중인 child가 전달되고, 두번째 인수로 indent가 +3이 되어 6이 전달됩니다.

이렇게 더 이상 하위노드가 존재하지 않을때까지 내려가면, node.children()은 None을 리턴하고 for문은 거짓이되어 자기를 호출했던 곳으로 다시 돌아갑니다.

그렇게 맨처음 자기자신을 호출했던 곳까지 돌아가고 함수가 끝납니다. 

재귀함수를 글로 설명하려니 참 애매하네요. 그림으로 보시면 아마 금방 이해하실겁니다. 재귀함수의 관한 그림 많으니 한번 찾아보시면 좋을 듯 합니다.


4. 위의 스크립트의 실행 결과입니다. 

결과를 보시면, ipr_camera노드의 하위노드 caOrigin, file1, xform1이 보이네요.

geo1는 file1...

그런데 위의 스크립트는 파이썬 창을 열어야 확인가능합니다. print문은 python창으로 출력을 보내네요. 리눅스에서는 이렇게 되는데 윈도우에서는 어떨지 모르겠습니다. 

여하튼, 보기가 좀 불편합니다. 


5. 여기서는 print문 대신에 메시지를 띄우기위해 hou.ui.displayMessage를 함수를 썼습니다.

그리고 이 함수를 써서 결과물을 잘 나오게 하도록 '\n'(new line) 을 넣었습니다.


6. 실행 결과


'Houdini > Python' 카테고리의 다른 글

Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Python으로 만든 뷰창 옵션 지우기  (0) 2013.02.23
Houdini Python Test  (0) 2013.02.20
Posted by scii
: