본문 바로가기

Coding/3dsMax python

[3dsMax python] Scene object with pymxs

전체 씬그래프 탐색

맥스 왼쪽에 보면 레이어와 씬그래프를 볼 수 있는곳이 있습니다.

전체를 가져올때도 좋지만, 특정계층을 오브젝트를 가져올때 유용합니다. 

 

from pymxs import runtime as rt 

def output_node(node, indent=''):
    """Print the scene graph as text to stdout."""
    print(indent, node.Name)
    for child in node.Children:
        output_node(child, indent + '--')

output_node(rt.rootnode)

 

계층없이 모든 오브젝트 가져오기

objs = pymxs.runtime.objects
for o in objs:
    print(o.name)

 

특정 오브젝트 가져오기

씬그래프안에서 만약 이름이 같은게 있으면 상위 계층것을 가져오는것 같습니다. (테스트필요)

s = pymxs.runtime.getNodeByName('Sphere002')

 

특정 오브젝트의 재질 접근

node = pymxs.runtime.getNodeByName('Sphere002')
print '{}'.format(node.material)

 

객체의 베이스객체 확인하기

레이어에 관련된 글쓰고 있는데, 하다가 신기해서 기록해둡니다.

저는 맥스전문가가 아니라서, 오브젝트의 타입이 '더미' 타입인지 '객체' 타입인지 구분하려고 했는데. 이런걸 맥스에서는 베이스 객체라고 하는것을 알았습니다. (링크) 이걸사용하면 다른 타입을 파악할수 있습니다. 근데 리턴값이 string이 아니여서 비교가 안됐었습니다. 그래서 getClassName 함수를 사용했습니다.

만약 객체의 타입이 더미타입임을 확인하고 싶다면 아래의 코드처럼 사용하면 됩니다.

 

if rt.getClassName(obj.baseobject) == 'Dummy':
	pass

 

더미객체 생성해보기

dummy()안에 인자를 넣으면 에러가납니다. 그래서 따로 이름을 넣어줘야합니다.

 

from pymxs import runtime as rt

obj = rt.dummy()
obj.name = 'velbie-dummy001'
obj.pos = rt.Point3(20, 20, 20)

맥스에서 선택한 객체 가져오기

선택한 레이어를 가져오는것과 같은 코드입니다.

 

tmp = rt.SceneExplorerManager.GetActiveExplorer()
nodes = tmp.SelectedItems()

Tip.

가져온 객체에 어떤 속성들이 있는지 코드로 확인하는 방법이 있습니다. getPropNames() 이 유용하게 사용될것 같습니다.

 

for name in rt.getPropNames(material_instance):
    print("\t" + name + " = " + str(rt.getProperty(material_instance, name)))

 

관련문서

help.autodesk.com/view/3DSMAX/2017/ENU/?guid=__files_GUID_141213A1_B5A8_457B_8838_E602022C8798_htm