본문 바로가기

Code/cinema4d & 3dsmax

[3dsMax python] Layer with pymxs

레이어 생성하기

안녕하세요, 레이어 생성하기 코드입니다. 레이어 계층을 관리할 수 있습니다.

 

from pymxs import runtime as rt

if __name__ == '__main__':
	parent = rt.LayerManager.NewLayerFromName("C")
	child = rt.LayerManager.NewLayerFromName("D")
	child.setParent(parent)

 

레이어에 객체 넣기

레이어에 객체를 넣어볼려고 하니깐, 어떤 함수가 있는지를 몰라서 맥스스크립트 문서를 참고했습니다.

 

obj =rt.getNodeByName(target_name)
layer = rt.LayerManager.NewLayerFromName(new_name)
layer.addnode(obj)

 

전체 레이어 가져오기

전체 레이어의 수를 가져와서 index로 레이어를 하나 씩 불러옵니다.

 

from pymxs import runtime as rt

for i in range(rt.layerManager.count):
    print (rt.layerManager.getLayer(i)).name

 

특정 레이어 이름으로 가져오기

C라는 레이어를 만들고  이름 'C'로 참조해서 레이어를 가져와 보겠습니다.

 

from pymxs import runtime as rt

rt.LayerManager.NewLayerFromName('C')
layer = rt.layerManager.getLayerFromName('C')
print layer.name

 

내가 맥스에서 선택한 레이어만 가져오기

맥스의 레이어창에서 shift, ctrl, 클릭을 이용해서 특정 레이어틀만 선택 후 그 값을 가져올 수 있습니다. 

 

from pymxs import runtime as rt

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

for l in layer:
    print l.name

 

선택한 레이어에 속한 오브젝트들 가져오기

이게 제 생각과 문서에 따르면 레이어.nodes 하면 되야하는데, 안되서 찾아보니 아래와 같이해야합니다. Ref 에 대해서는 아직은 잘 모르겠습니다ㅜ

 

from pymxs import runtime as rt

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

for l in layer:

    # l.nodes # Not work!
    # l.getChild(0) # Not work!

    layer_nodes = rt.refs.dependents(l.layerAsRefTarg) # It works!
    print layer_nodes

오브젝트의 레이어 확인하기

그냥 object.layer 로 가져올수 있습니다.

 

레이어 삭제하기

아래 처럼 True로 주면 레이어에 속한 노드들이 0 레이어로 빠지고 레이어는 삭제됩니다.

레이어가 있는지 확인하고 사용하면 좋을것 같습니다.

 

rt.LayerManager.deleteLayerHierarchy(new_name, forceDelete=True)

 

관련문서

레이어 프로퍼티 목록:

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

 

레리어에 속한 오브젝트 논쟁;

forums.autodesk.com/t5/3ds-max-programming/pymxs-documentation/m-p/8690351#M23242