[숙제] hscript---->hpython
.아..다썼는데 날라갔네요..암튼 다시써봅니다.
오픈클래스에 참여는 못했지만 숙제라도 제출해보렵니다. 안그래도 후디니와 파이튼이 어떻게 연동되는지 굉장히 궁금하던차에 아주 도움이 많이 되는 강의와 숙제였습니다. 나름 Hpython에 대한 생경함이 줄었어요^^ 감사합니다.
암튼 숙제를 하면서 느낀건데 제 후디니 버전이 747인데 이후로 더 많은 버전이 나온건지 아님 원래 없는건지 헬프파일에 hpython명령어에 대한 설명이 거의 되어있지 않더라구요...제버전만 그런건가요? 그나마 다행인건 숙제하는데 필요한건 HOM헬프메인페이지에 다 있었다는점이었습니다....아니었다면 전혀 못했을것같아요...
그럼 제가 한 숙제 써보겠습니다.
>>> noalias=1
>>> saved_path='executed("oppwf")'
>>> hou.cd('/obj')
>>> n=hou.node('/obj')
>>> geoP=n.createNode('geo','geoP')
>>> hou.cd('/obj/geoP')
>>> box=geoP.createNode('box')
>>> subd=geoP.createNode('subdivide')
>>> subd.setFirstInput(box)
>>> subd.parm('iterations').eval()
1
>>> subd.parm('iterations').set(3)
>>> subd.setDisplayFlag(1)
>>> subd.setRenderFlag(1)
>>> hou.cd('/obj')
>>> hou.pwd()
>>>
숙제하고난뒤 궁금한거
1. hscript에서 처음 두줄의 문장이 의미하는것이 무엇인지 궁금합니다. 헬프파일을 찾아보니 두번째줄의 oppwf는 현재경로를 출력해주는명령어더라구요. 그것이 이번 숙제 스크립트에서 어떤 용도로 쓰인것인지(일단 hpython에서 경로확인명령어를 마지막에 써놓긴했습니다만)궁금합니다. 그냥 경로이동하는 연습인건지 아니면 다른 의미가 있는것인지 궁금해요^^
2. 변수에 createNode가 사용된 문을 대입시켰더니 노드가 대입이 되더라구요. 저는 명령어 자체가 대입될줄알았는데...이부분이 좀 애매하네요. 이해가 확실히는 안되네요. 대충느낌이 명령어를 통해 만들어진 노드가 대입되는 느낌인데...이게 맞는건가요? 그럼 명령어를 변수에 대입하고싶을땐 어떻게 해야할까요? 그리고 n에 대입시킨 저 경로는 단순히 긴 경로를 짧게 표현하는데만 사용되는것인가요? 아니면 다른용도도 있을수있는건가요?
3. setDisplatFlag명령어에서는 1과 true가 동일한 의미로 잘 인식되더라구요. 근데 안되는 명령어도 있던데 단순히 명령어에 따라서 달라지는건지 아니면 어떤 법칙이 있는건지 궁금합니다.^^
후기
정말 유익한 숙제였습니다. 항상 궁금해해왔던 파이튼과 후디니가 어떻게 돌아가는지 궁금했는데 hou.모듈을 통해서 돌아간다는것을 알게된것도 유익했구요 실제용례도 직접경험해볼수있어서 좋았습니다. 다음강의는 꼭참여하겠습니다.
피드백해주세요~^^
Houdini
Wed, 12/05/2007 - 16:19
Permalink
Re: [숙제] hscript---->hpython
요즘 많이 "피드백 해주세요"라는 말씀을 많이들 하시는데 엄청난 압박이네요. 관심과 능력에 닿는한 많은 분들이 리플을 해 주실겁니다.
muskccat
Thu, 01/03/2008 - 23:14
Permalink
저도 숙제 올리겠습니다.
이번 오픈클래스에 참가하질 못해서... 대화내용 캡춰해 올려주신 것 보고 한 번 해봤습니다.
[hScript]
/ ->\set noalias = 1
/ ->set saved_path = `execute("oppwf")`
/ ->opcf /obj
/ ->opadd -n geo geo1
/ ->opcd /obj/geo1/
/ ->opadd box
/ ->opadd subdivide
/ ->opparm /obj/geo1/subdivide1 iterations 3
/ ->opwire box1 -0 subdivide1
/ ->opset -d on ?r on subdivide1
/ ->opcf /obj
/ ->opcf $saved_path
[Python]
noalias = 1
saved_path = hou.pwd()
geo_01 =hou.node('/obj').createNode('geo','geo1')
box_01 = hou.node("/obj/geo1").createNode("box")
subDivide_01 = hou.node("/obj/geo1").createNode("subdivide")
subDivide_01.parm("iterations").set(3)
subDivide_01.setInput(0,box_01)
subDivide_01.setDisplayFlag(1)
#hou.Node.createNode에서 한참 삽질했습니다.
#hou.Node.createNode 로만 하니 계속 에러발생하더군요..
#변수로 hou.node등을 입력받아 좀더 간단하게 구문을 작성할 수 있었습니다.
#헬프에 나오는 hou.Node, hou.SopNode를 직접 다 타이핑하고 있었는데 변수를 활용해서 훨씬 간략하게 구문을 작성할 수 있었습니다..
#각 파라미터에서 우클릭해서 edit Expressions를 할 경우 위치부터 속성네임을 알아낼 수 있었습니다.
#opparm의 iteration은.... subdivide의 Depth Parameter.
#saved_path에서 hou.pwd()로 hou.Node at / #hScript란 것 자체를 처음 만져본데다가.. 파이썬도 책 앞부분만 왔다갔다 거리다가.. 이번 오픈클래스덕에 여러가지 해보게됐습니다. 앞으로도 잘 부탁드리겠습니다.
#mel에 익숙해져서.. 항상 구문 끝에 세미콜론 붙이는게 습관되버려서.. 아직 좀 불편하네요
질문사항)
1) hscript에선 디렉토리라고 해야하나요.. 디렉토리를 바꿔서 명령이 수행을 하지 않으면 에러가 발생하는 데에 반해서 파이썬은 node에 한번 디렉토리를 지정만 해주면 굳이 계속 이동을 하지 않아도 되는 것 같은데.. opcf, oppwd등을 파이썬에서 hou.cd hou.pwd등이 정작 필요한 것인지.. 모르겠네요.
2) noalias에 대해 이것저것 찾아봤는데.. 프로그램을 제대로 공부한 적이 없어서인지.. 상당히 난해합니다.
처음에 \set noalias = 1
다음 오픈 클래스때는 꼭 참여하도록 하겠습니다. (어떻게 해서 참여하는지를 잘 모르고 있습니다. 지현님의 네이트주소로 친구추가를 해놓긴 했는데.. 엉겁결에 찹스에 대한 말 한마디도 없이 "안녕하세요. 이권석입니다"라고 이름 석자만 남겨놨습니다.
죄송합니다 ㅠㅠ)
올 한해 행복하게! 새해 복 많이 받으세요!
열정이 식어가는 건.. 죽어가는 것과 마찬가지..
Houdini
Fri, 01/04/2008 - 05:21
Permalink
Re: [숙제] hscript---->hpython
좋은 질문입니다. 그대로 컨버팅하는 것은 파이썬과 hscript의 차이점을 이해하는 것이고, 그 차이점을 아는 것이 파이썬의 장점을 제대로 이해하는것이라고 생각합니다.
muskccat
Sun, 01/06/2008 - 15:22
Permalink
Re: [숙제] hscript---->hpython
2. 변수에 createNode가 사용된 문을 대입시켰더니 노드가 대입이 되더라구요. 저는 명령어 자체가 대입될줄알았는데...이부분이 좀 애매하네요. 이해가 확실히는 안되네요. 대충느낌이 명령어를 통해 만들어진 노드가 대입되는 느낌인데...이게 맞는건가요?
stuartPark님께서 질문하신 부분 중에서 2번 중에 저 부분이 저도 특히 궁금하던 차였는데.. 오늘 읽던 부분(이강성님이 쓰신 열혈강의 파이썬) 중에 몇가지 내용을 보고 어느 정도 이해가 가는 부분이 있어서 글 올립니다.
저도 단지 변수 자체에 createNode로 사용된 부분이 대입이 되는 거라고만 생각했는데 ..
이것이 객체와 이름에 대한 관계더군요.
예를 들어 a1 = hou.node("/obj") 의 경우 a1에 hou.node("/obj")가 직접 저장 되는 것이 아니고 , 단지 hou.node("/obj')라는 객체를 참조(refererncing)하게 되어 있는 것이라는군요.
이것을 a1 = hou.pwd() 로 바꾸는 경우, a1이 hou.node("/obj")라는 객체에서 hou.pwd()라는 객체를 참조하도록 바뀌는 것이고, hou.node("/obj")라는 객체는 참조되지 않으므로 메모리에서 제거된다는 것이네요. (전부 책에 나와있는 내용입니다 p.89-90)
그런데 이 참조의 개념으로 객체를 치환하는 경우..
>>> x = [1, 2, 3]
>>> y = ["a", x, "b"]
>>> z = [1, x, 3]
>>> x
[1, 2, 3]
>>> y
['a', [1, 2, 3], 'b']
>>> z
[1, [1, 2, 3], 3]
>>> x[1] = 100
>>> x
[1, 100, 3]
>>> y
['a', [1, 100, 3], 'b']
>>> z
[1, [1, 100, 3], 3]
이렇게 같은 리스트 형에서 x의 객체가 치환되는 경우는 y,z에도 치환이 이루어지는데, x의 자료형이 바뀌는 다음과 같은 경우는
>>> x = "refer"
>>> x
'refer'
>>> y
['a', [1, 100, 3], 'b']
>>> z
[1, [1, 100, 3], 3]
>>>
치환이 이루어지질 않더군요..
열정이 식어가는 건.. 죽어가는 것과 마찬가지..
muskccat
Sun, 01/13/2008 - 11:13
Permalink
Re: [숙제] hscript---->hpython
/ ->\set noalias = 1
/ ->set saved_path = `execute("oppwf")`
/ ->opcf /obj
/ ->opadd -n geo geo1
/ ->opcd /obj/geo1/
/ ->opadd box
/ ->opadd subdivide
/ ->opparm /obj/geo1/subdivide1 iterations 3
/ ->opwire box1 -0 subdivide1
/ ->opset -d on ?r on subdivide1
/ ->opcf /obj
/ ->opcf $saved_path
이부분의 경우 hou.cd를 이용하니까 해결됐습니다.
saved_path는 hou.pwd()를 통해 hou.pwd()를 수행한 당시 주소값을 참조하고 있으므로
>>> hou.cd ( saved_path.path())
의 형식으로 실행해야 했습니다.
열정이 식어가는 건.. 죽어가는 것과 마찬가지..