지속성(Persistence) 이란 어떤 프로그램이 만든 데이터가 프로그램이 종료되고 나서도 존재하게 하고, 또 그 후에 다시 그 데이터를 프로그램에서 사용하는것이다.


리스트, 튜플, 사전 등 읨의의 객체를 파일에 쓰고, 읽으려면 어떻게 해야 할까? 또 내가 만든 클래스나 인스턴스를 그대로 파일에 쓰려면 어떻게 해야 할까?

이러한 작업은 단순한 파일 입/출력 기법으로는 구현하기 어렵다. 파이썬은 파이썬 객체를 파일에 저장하는 몇 가지의 기법을 제공하고 있다.


DBM 관련 모듈

데이터를 DBM 형식으로 파일에 기록한다.

시스템에 따라서 관련된 다양한 모듈들이 제공된다. (anydbm, dbm, gdbm, dbhash, dumbdbm)

anydbm 모듈을 사용하면 시스템에서 사용가능한 모듈 중 DBM 호환 가능한 최적의 모듈을 찾아준다. 기능이 가장 떨어지긴하지만 dumbdbm이 기본적으로 제공된다. 

사전 자료형을 쓰는 법과 동일한 인터페이스를 제공한다. 

키와 값은 모두 문자열이어야 한다.


pickle 모듈

파이썬 객체를 피클링하여 파일에 저장하는 일반화된 지속성 모듈이다. 

파이썬 기본 객체뿐 아니라 복잡하게 얽혀 있는 객체들의 관계까지도 저장 가능하다.

재귀적인 관계도 모두 처리한다.

사용자 정의 클래스와 인스턴스도 처리한다.

기본적으로 텍스트 모드로 저장되나 이진 모드로도 저장 가능하다.


marchal 모듈

파이썬의 기본 객체(None, 수치 형, 문자열, 튜플, 리스트, 사전 및 코드 객체)를 이진 포멧으로 저장한다. 

재귀적인 사전이나 리스트는 처리할 수 없다. 

이 모듈은 주로 .PYC 파일의 컴파일된 코드를 쓰고 읽는데 사용된다.

일반 객체 입/출력은 pickle 모듈을 사용해야한다. 사용법은 pickle과 동일하다.


shelve 모듈

사전 자료형으로 자료를 접근할 수 있도록 한 것은 anydbm과 동일하나, 차이점은 임의의 파이썬 객체가 값(value)로 사용될 수 있다.

내부에서 사전형 인터페이스를 위해서 anydbm 모듈을 사용하고 객체 저장을 위해서 cPickle 모듈 (pickle의 C 버전) 을 이용한다.

값으로 임의의 객체가 저장될 수 있다.


DBM 파일 관련 모듈

anydbm 모듈은 시스템에서 사용 가능한 dbm 호환 가능한 최적의 모듈을 찾아준다. 사용법은 사전 자료형과 거의 유사하다.

키에 의한 참조로 파일에서 자료를 읽어 오고, 인덱싱으로 치환하는 것으로 파일에 자료를 저장한다. 

키와 값은 반드시 문자열이어야 한다.


사용 예


생성된 DBM 파일을 읽어서 처리하는 예 



피클링 (Pickling)

pickle 모듈은 임의의 파이썬 객체를 저장하는 가장 일반화된 모듈이다.

pickle 모듈은 파이썬 기본 객체뿐 아니라 사용자 클래스, 인스턴스 및 복잡하게 얽혀 있는 객체들의 관계까지도 저장한다. 

재귀적인 관계도 모두 처리한다.


※ 피클링은 '절임' 이란 뜻이다. 오이나 배추 등을 소금에 절여서 저장해 두는 것을 말한다. 여기서는 객체를 파일에 저장하는 의미이다. 

소금이 원래의 상태를 보존하듯이 파이썬 피클링은 객체의 상태를 그대로 저장한다. 피클링을 이용하면 기본 자료형 이외의 복잡한 자료형을 텍스트 형태로 혹은 이진 파일 형태로 변환하여 저장하거나, 네트워크를 통해 다른 시스템으로 전달 가능하며, 다시 원래의 객체 형태로 복원 가능하게 된다.


객체를 파일로 출력하려면 pickle.dump를 이용한다.

pickle.dump(출력할 객체, 파일 객체)


객체를 파일에서 읽어 들이려면 pickle.load를 이용한다.

pickle.load(파일 객체)


문자열로 객체를 출력하거나 문자열에서 객체를 읽어 들이려면 dumps, loads 를 사용한다.

s = pickle.dumps(출력할 객체)

object = pickle.loads(s)





pickle의 좋은 점:

사용자가 정의한 임의의 클래스 및 인스턴스 객체도 저장할 수 있다는 것이다.

저장될 시점의 모든 멤버 변수들의 값이 그대로 유지되므로 언제든지 다시 불러서 계속적인 수행이 가능하다. 예를 들어, 일정한 분량의 작업을 수행하다가 멈추고 현재 상태를 pickle을 이용하여 저장한 후 나중에 다시 읽어 들여 계속적으로 수행하게 할 수 있다.


다음은 사용자 클래스 인스턴스 객체를 저장하고 읽는 예이다.





이것은 디버깅을 쉽게 하고 문제가 생겼을 때 일반 텍스트 에디터로 복구를 쉽게 하기 위한 것이다.

하지만, 이 방식은 파일 크기도 크고 또한 처리 속도도 느리다. 만일 이진 모드로 저장하여 효과적인 처리를 원한다면 dump할 때 이진 모드로 설정하면 된다.


위의 예에서 pickle.dump를 호출할 때 생략된 세 번째 인수 bin에 참 값을 넣어 주면 효과적인 이진 파일로 저장된다.

pickle.dump(s, f, bin=1)     # bin 인수에 True가 주어지면 이진 파일로 인스턴스가 저장된다.


cPickle 모듈

만일 pickle 모듈의 속도가 느리다고 생각한다면, C로 만들어진 cPickle 모듈을 사용하면 된다. 

cPickle 모듈은 pickle 모듈과 같은 인터페이스를 가지고 있지만 약 1000배 빨리 수행되도록 설계되었다.


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

키워드 인수  (0) 2013.04.27
함수의 중첩 영역  (0) 2013.04.27
표준 입/출력 방향 전환  (0) 2013.04.13
파일 입/출력 예제  (0) 2013.03.12
파일 객체 속성들  (0) 2013.03.11
Posted by scii
:


표준 출력

표준 출력을 파일로 저장

print에 의해 출력되는 내용을 파일로 저장하는 방법이 있다. sys모듈의 stdout은 출력을, stderr은 표준 에러 출력을, stdin은 입력을 위한 객체를 지정하고 있다. 

sys.stdout을 파일 객체로 변환하면 모든 print 문(표준 출력)에 의한 출력이 파일로 저장된다.




표준 에러 (stderr)

print 문을 직접 이용하기

print 문의 출력을 파일로 직접 보낼 수 있다. 표준 에러로 출력을 보내려면, 다음과 같이 하면된다.


이것은 sys.stderr(표준 에러)로 리다이렉션하고 옆의 문장을 내보내라가 된다. 즉, 표준에러로 문장을 내보내라



표준 출력을 문자열로 저장

print 출력을 문자열로 저장하는 방법은 StringIO 표준 모듈을 이용하는 것이 간편하다.

StringIO 모듈의 StringIO 클래스는 문자열을 파일 객체처럼 입/출력한다.




문자열을 파일 객체처럼 읽기

주어진 문자열이 있고, 그것을 파일 객체를 이용해서 파일처럼 읽어 내야 할 필요가 있을 때 StringIO 모듈을 이용한다.



실행 결과



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

함수의 중첩 영역  (0) 2013.04.27
[File I/O] 지속 모듈  (0) 2013.04.14
파일 입/출력 예제  (0) 2013.03.12
파일 객체 속성들  (0) 2013.03.11
객체의 복사 및 형 변환  (0) 2013.03.08
Posted by scii
:

OpenCL

Programming/OpenCL 2013. 4. 10. 00:38 |


병렬화의 중요성

CPU 의 동작 주파수가 매년 향상되면서 소프트웨어를 최적화하지 않아도 동작 속도가 빨라지는 시절이 있었다. 하지만, 인텔 cpu가 4GHz 에 가까워진 2004년쯤부터는, cpu의 동작 주파수 향상은 점점 더뎌졌다. 그리고 Power Wall(전력 장벽) 이라는 소비 젼력과 발열량의 증가가 심각한 문제로 주목받기 시작했다.

또한, 2004년 이후의 cpu는 동작 주파수 향상이 아니라 연산코어 증가라는 형태로 진화했다. 그런데 멀티코어 cpu의 동작 주파는 싱글코어 cpu와 같거나 약간 느려진 상황이기 때문에 싱글코어에서 만든 기존의 애플리케이션을 멀티코어 cpu에서 동작시킨다고 속도가 빨라지지 않는다. 최근 일반 소비자용 노트북에도 멀티코어 cpu가 탑재되고 있고, 고도의 연산 능력이 필요한 분야뿐만 아니라 일반 컴퓨팅 환경에서도 병렬화 기술을 사용한다. 따라서 멀티코어 프로세서의 성능을 충분히 사용하는 병렬처리 연산이 가능한 애플리케이션으로 최적화시킬 필용성도 높아졌다.


하드웨어 관점의 병렬 컴퓨팅

위키피디아에서 정의하는 병렬 컴퓨팅: http://ko.wikipedia.org/wiki/%EB%B3%91%EB%A0%AC%EC%BB%B4%ED%93%A8%ED%8C%85

실제로 어떤 작업 하나를 처리 장치 여러 개로 나누어 동작시키는 하드웨어 아키텍처는 여러 가지가 있다. 규모가 큰 것에서 작은 순서로 나열하면 다음과 같다.

# 인터넷에 접속된 다양한 종류의 연산 자원을 연결해, 하나의 연산을 실행하는 그리드 컴퓨팅

# 슈퍼 컴퓨터의 아키텍처로서 유명한 초병렬 연산기 (Massively Parallel Processor, MPP) 시스템

# 범용 컴퓨터를 조합해 만드는 클러스터 서버 (Cluster Server) 시스템

# 같은 cpu 여러 개를 탑재하고 밀접하게 결합해, 하나의 연산기를 구성하는 대칭형 멀티프로세싱 (Symmetric Multiprocessing, SMP) 시스템

# cpu 내부에 여러 개의 연산코어를 가진 멀티코어 프로세서 (Multicore Processor) 시스템


플린의 분류

컴퓨터 아키텍처를 분류하는 지표 중에 '플린의 분류(Fluynn's Taxonomy) 가 있다. 마이클 J. 플린은 하나의 처리를 실현하는 명령의 나열인 명령 스트림(Instruction Stream) 의 병렬도(병렬성이 있는지나 없는지의 정도를 나타냄) 처리 대상이 되는 데이터의 나열인 데이터 스트림(Data Stream) 의 병렬도에 따라 모든 컴퓨터 아키텍처를 다음 4가지로 분류한다.

SISD (Single Instruction, Single Data Stream) 

하나의 명령 스트림이 하나의 데이터 스트림을 처리하는, 즉 명령과 데이터에 병렬성이 없는 순차적인 시스템을 말한다. 싱글코어 프로세서 하나가 탑재된 pc가 여기에 해당한다.

SIMD (Single Instruction, Multiple Data Streams)

단일 명령을 복수의 연산기에 전달하더라도 각각의 연산기는 서로 다른 데이터를 가지고 연산하는 시스템을 말한다. 벡터 연산기라고 불리는 일분의 슈퍼 컴퓨터가 대표적인 예이다.

MISD (Multiple Instruction, Single Data Stream)

복수의 명령 스트림이 단일 데이터 스트림을 처리하는 시스템을 말한다. 이론상으로만 존재할 뿐 쓸모가 없으므로 이 분류에 해당하는 실제 시스템은 거의 존재하지 않는다.

MIMD (Multiple Instruction, Multiple Data Streams)

복수의 연산기가 가진 각기 다른 데이터 스트림을 서로 다른 명령 스트림에서 처리하는 시스템을 말한다.


이 4가지 분류에 다르면 앞서 이야기한 클러스터 시스템이나 SMP 시스템 등 별렬 컴퓨팅을 실행하기 위한 하드웨어 아키텍처의 대부분이 MIMD 에 속한다. 따라서 병렬 컴퓨팅을 더욱 상세하게 분류하고 싶다면 하드웨어의 메모리 구성에 주목하는 것이 일반적이다.


Posted by scii
:


CentOS는 python 2.6 버전을 쓰는 파일 시스템들이 있다. 그래서 2.6버전을 지우고 2.7버전을 쓰면 안되고 ,두 가지 버전이 공존해 있어야 한다.

※ /usr/bin/python --version 명령했을 때, python 2.6버전 대가 출력되어야 한다.


맨 처음 CentOS를 설치하고 2.6버전을 2.7로 덮어씌우니 매우 어려운 문제가 발생하였다. 그래서 다시 포맷을 하고 다시 CentOS 설치를 해야 했다...


1. Install development tools

# yum groupinstall "Development tools"

# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel


2. Dwonload and Install Python

make를 수행할 때, altinstall 로 하는 것이 중요하다. CentOS 는 python 2.6버전을 쓰는 파일 시스템이 있기 때문에 두 가지 버전을 설치하여야 한다.

DOWNLOAD AND INSTALL PYTHON 2.7.3

# wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2

# tar xf Python-2.7.3.tar.bz2

# cd Python-2.7.3

# ./configure --prefix=/usr/local

# make && make altinstall


DOWNLOAD AND INSTALL PYTHON 3.3.0

# wget http://python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2

# tar xf Python-3.3.0.tar.bz2

# cd Python-3.3.0

# ./configure --prefix=/usr/local

# make && make altinstall

/usr/local/bin/python2.7 or /usr/local/bin/python3.3

파이썬 2.6의 시스템 버전은 /usr/bin/python 그리고 /usr/bin/python2.6 로 계속 사용할 수 있다.


3. Download and Install Distribute

이것은 파이썬에 대한 패캐지를 설치하는데 사용하는 스크리브 /usr/local/bin/easy_install-2.7을 생성한다.

/usr/local/lib/python버전/site-packages/ 에 패키지가 저장된다.

DOWNLOAD AND INSTALL DISTRIBUTE FOR PYTHON 2.7 (2.7버전을 쓰려면 이것을 실행)

# wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.35.tar.gz

# tar xf distribute-0.6.35.tar.gz

# cd distribute-0.6.35

# python2.7 setup.py install


DOWNLOAD AND INSTALL DISTRIBUTE FOR PYTHON 3.3

# wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.35.tar.gz

# tar xf distribute-0.6.35.tar.gz

# cd distribute-0.6.35

# python3.3 setup.py install


4. Vitual Environment Install

위의 3번까지만 하면 파이썬 설치가 완료된다. 

하지만, 파이썬의 여러 버전으로 작업하는 것은 어렵고 오류가 발생하기 쉽다. 그래서 virtualenv을 설치하고 사용하는 것이 좋을 듯 싶다.

Vitualenv 는 샌드 박스와 같은 환경에서 파이썬을 실행하는 것이 가능하게하는 가상 파이썬 환경 빌드이다.

각각의 샌드 박스는 자신의 파이썬 버전과 패키지를 가질 수 있다. 여러 프로젝트 자체의 의존성 및 각각 작업 할 때 이것은 매우 유용하다.

INSTALL AND USE VIRTUALENV FOR PYTHON 2.7

# easy_install-2.7 virtualenv

# virtualenv-2.7 --distribute someproject

New python executable in someproject/bin/python2.7

Also creating executable in someproject/bin/python

Installing distribute...................done.

Installing pip................done.

# source someproject/bin/activate

(someproject)# python --version

Python 2.7.3

(someproject)#


INSTALL AND USE VIRTUALENV FOR PYTHON 3.3

# easy_install-3.3 virtualenv

# virtualenv-3.3 --distribute otherproject

New python executable in otherproject/bin/python3.3

Also creating executable in otherproject/bin/python

Installing distribute...................done.

Installing pip................done.

# source otherproject/bin/activate

(otherproject)# python --version

Python 3.3.0

(otherproject)#


'Linux > CentOS' 카테고리의 다른 글

CentOS 7 - media repository  (0) 2014.08.24
CentOS 7 NTFS FileSystem Mount  (0) 2014.08.16
RPM (Redhat Package Manager)  (0) 2013.08.11
CentOS 6.4 NVIDIA GeForce Graphic Driver Install  (3) 2013.04.06
[CentOS] centos 6.4 Net Install  (1) 2013.03.24
Posted by scii
:

Linux Theme Settings

Linux/Common 2013. 4. 7. 00:24 |


equinox gtk engine

미리 설치가 되어있어야 할 것들

# yum install gtk2-devel (Redhat 계열)

# sudo apt-get install libgtk2.0-dev (Debian 계열)


Install

http://gnome-look.org/content/show.php?content=121881&forumpage=1&PHPSESSID=ccac437ae6db2b803984fb3588d80cd8

여기로 가서 엔진을 다운 받는다. 그 후 다음 명령들을 수행한다.

tar xvfz 121881-equinox-1.50.tar.gz

cd equinnox-1.50

./configure --prefix=/usr --enable-animation

./configure --prefix=/usr --libdir=/usr/lib64 --enable-animation

make

make install


Faenza Icon Theme

http://gnome-look.org/content/show.php?content=121881&forumpage=1&PHPSESSID=ccac437ae6db2b803984fb3588d80cd8

여기로가서 faenza-icon-theme_1.1.tar.gz 를 다운 받고 압축을 푼다. 그 후 /usr/share/icons 디렉토리로 옮겨 놓으면 된다.

ex) mv exam/* /usr/share/icons/


equinox evolution themes

http://gnome-look.org/content/show.php?content=121881&forumpage=1&PHPSESSID=ccac437ae6db2b803984fb3588d80cd8

여기로 가서 equinox-themes.tar.gz. 를 다운받는다. 그 후 "system > preference > appearence 에서 install 을 눌러 tar.gz 파일을 선택한다.

설치된 테마는 ~/.themes 디렉토리에 저장된다.



테마를 적용한 모습


'Linux > Common' 카테고리의 다른 글

xargs, find 명령어  (0) 2013.05.08
Linux Theme  (0) 2013.04.28
터미널에서 멀티태스킹하기  (0) 2013.02.02
gcc 다른 버전 추가하기  (0) 2012.12.30
리눅스 ps 명령 프로세스  (0) 2012.12.25
Posted by scii
:

CentosOS 6.4 에서 NVIDIA 그래픽 드라이버 설치하기.

centos 에는 nouveau 라는 nvidia 그래픽 카드용 프레임버퍼 모듈이 들어가 있다. 이것의 용도는 부팅 시 멋지게 연출이 가능하도록 한다.

그런데, 문제점이 있다. 그것은 nvidia에세 제공하는 그래픽카드의 드라이버와 충돌을 일으킨다는 점이다. 그래서 이것을 없애야 그래픽 드라이버를 설치할 수 있다.


1. http://www.nvidia.com 에서 자신의 시스템에 맞는 드라이버를 다운로드하여 적당한 곳에 저장한다.


2. NVIDIA 그래픽 드라이버를 설치(컴파일 후 설치) 하려면 현재 사용중인 CentOS 의 커널 소스가 필요하다. 만약 커널 소스가 설치되어 있지 않다면 아래의 명령으로 커널 소스를 설치해준다.

# yum install -y kernel-devel


3. 작업은 root에서 해야 하기때문에 su - 로 권한을 준다.


4. modprobe.d 디렉토리로 이동한 후 disable-nouveau.conf 파일을 만든다.(확장자가 conf로 끝나면 되고 파일이름은 어떤것이든 상관없음)


5. 이것은 centos에서 기본으로 내장된 nvidia 드라이버를 Disable시키는 것이다.


6. 재부팅할 때, nouveau를 disable 해야 하므로, /boot/grub/으로 이동 후 grub.conf를 수정한다.


7. 본인이 사용하는 커널 버전의 맨 끝 행에 다음의 명령을 입력한다.

rdblacklist=nouveau

저장한 후 컴퓨터를 reboot 한다.


8. X-server 에서는 그래픽카드 드라이버를 설치할 수 없으므로, TUI 환경으로 가서 설치를 진행해야 한다.


9. 드라이버파일이 있는 곳으로 가서 관리자모드로 설치를 진행한다.


10. sh ./해당드라이버파일명


11. 설치하는 도중에 거의 막바지에 이렇게 선택하는 화면이 나올 것이다. 여기서 Yes를 눌러주어야 한다. 이것은 X11.conf 파일 그리고 x-server 설정을 생성 및 수정할 것인지에 대한 것인데 Yes를 해주어야 한다.

NVIDIA 그래픽카드 드라이버가 온전히 설치된 모습



※ 주의 사항:

NVIDIA 드라이버를 설치한 다음, disable-nouveau.conf 를 삭제하거나 grub.conf 의 수정사항을 원래대로 되돌리면 안된다.

이후에 어떤 프로그램이 이 수정사항을 건드렸다면, 다시 작업해주어야 한다. 그렇게 하지 않았을 때는 nouveau와 nvidia 드라이버가 서로 충돌이 일으킨다.


※ 새로운 버전의 커널 또는 새로운 버전의 X 시스템이 설치될 때마다 6단계부터 끝까지 반복하여 NVIDIA 그래픽 드라이버를 다시 install 해줘야 한다.

그리고 새로운 버번의 NVIDIA 그래픽 드라이버를 인스톨하면 인스톨 과정에서 구버전 드라이버는 자동으로 uninstall 된다. 

만약, 드라이버를 삭제하고 싶다면 sh ./드라이버파일명 --uninstall 명령으로 uninstall 할 수 있다.


'Linux > CentOS' 카테고리의 다른 글

CentOS 7 - media repository  (0) 2014.08.24
CentOS 7 NTFS FileSystem Mount  (0) 2014.08.16
RPM (Redhat Package Manager)  (0) 2013.08.11
[CentOS] How to install Python 2.7 and 3.3 Install  (0) 2013.04.07
[CentOS] centos 6.4 Net Install  (1) 2013.03.24
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
:




jrand 함수의 예제 파일:

myCustom_jrand_exam.hipnc


jrand 함수의 소스 코드:

Houdini_Jeon_jrand.txt


밑의 캡쳐 사진에서 보면 Houdini의 rand() 함수는 숫자가 중복된다. 

숫자가 중복되지 않도록 하기 위해 고민을 하다가, 그냥 Houdini 내의 함수로 만들었다.  Houdini의 내장 함수를 만들 때, 문법 상 안되는 것들이 상당히 많아서 골머리를 썩었지만 다른 방식으로 해결되어서 참 좋다.

jrand 함수를 만들었는데 사용법은 이렇다.

jrand(최소범위, 최대범위, 생성할 난수 개수) 이렇게 3개의 인자를 받고 그에 맞는 난수를 생성해 준다. 중복되지 않는 숫자들로만!!


그리고, 시스템 시간으로 seed값을 주어서 jrand를 적용한 노드의 작은 변화가 생겨도 난수가 바뀌도록 하였다. 그 외의 노드에서 변경 안됨. 



Posted by scii
: