maya 명령을 사용하여 GUI를 작성하는 방법

17343 단어 파이썬maya

소개



maya로 도구를 만들 때 도구 용 GUI를 만들 수 있습니다.
MEL로 만들 때는 MEL 명령을 사용하여
Python으로 만드는 경우는 PySide를 사용하거나 maya.cmds나 pymel에서 MEL을 호출하여 만드는 느낌인지 생각합니다.

트위터라든지 보고 있으면 Python으로 쓸 경우는 PySide를 사용하는 사람이 많습니까.
이번에는 틈새 레이어를 목표로 maya.cmds를 사용하여 GUI를 만들 때
with 구문과 LayoutManager 를 사용하면 편리해! 라는 것을 소개합니다.

GUI 예제(MEL)



maya.cmds를 사용한 예를 설명하기 전에 MEL로 만들면 예를 들면 다음과 같습니다.
global proc testWindow()
{
//既にGUIが存在する時に古いほうを消す処理
if(`window -ex testWindow`) deleteUI testWindow;
string $windowName = `window -title "testWindow" testWindow`;
//GUIを作成
string $tabTest = `tabLayout -innerMarginWidth 1 -innerMarginHeight 5 -scrollable false`;
string $tabTestColumn =`columnLayout -adj true -rowSpacing 10`;
    button -label "TestButton";
    button -label "TestButton"; 
    textField -tx "TestTextField" -w 500; 
    rowLayout -numberOfColumns 4 -columnWidth4 100 150 150 150 -columnAttach4 left left left left;
        button -label "TestButton";
        checkBox -label "TestCheckBox";
        checkBox -label "TestCheckBox";
        checkBox -label "TestCheckBox";
    setParent..;  
    text -label "TestText";
    textField -tx "TestTextField" -w 500;    
setParent..;
tabLayout -edit -tabLabel $tabTestColumn "Test" $tabTest;
//GUIを表示
showWindow;
}

testWindow()

위의 MEL을 실행하면 이런 느낌의 GUI가 시작됩니다.


코드에서 GUI를 만드는 부분을 색으로 구분해 봅니다.
가장 큰 빨간색 테두리가 columnLayout이고 (요소를 세로로 정렬하는 레이아웃입니다)
파란색 테두리에서 columnLayout 내에 button과 textField를 위에서 순서대로 배치합니다.
녹색 테두리는 한 줄 안에 button과 checkBox 3개를 배치하고 있습니다.
MEL로 작성하는 경우 GUI 레이아웃의 계층 구조에 따라 들여 쓰기를 변경하면
코드를 쉽게 볼 수 있습니다.



GUI 예제(maya.cmds)



다음은 maya.cmds가 작성한 예입니다.
# !/usr/bin/env python
# -*- coding: utf-8 -*-

import maya.cmds as cmds

def testWindow():
    #既にGUIが存在する時に古いほうを消す処理
    if cmds.window('testWindow', ex=1):
        cmds.deleteUI('testWindow')
    windowName = cmds.window('testWindow',title='testWindow')
    #GUIを作成
    tabTest=cmds.tabLayout(scrollable=False, innerMarginHeight=5, innerMarginWidth=1)
    tabTestColumn=cmds.columnLayout(adj=True, rowSpacing=10)
    cmds.button(label="TestButton")
    cmds.button(label="TestButton")
    cmds.textField(w=500, tx="TestTextField")
    cmds.rowLayout(numberOfColumns=4, columnAttach4=('left', 'left', 'left', 'left'), columnWidth4=(100, 150, 150, 150))
    cmds.button(label="TestButton")
    cmds.checkBox(label="TestCheckBox")
    cmds.checkBox(label="TestCheckBox")
    cmds.checkBox(label="TestCheckBox")
    cmds.setParent('..')
    cmds.text(label="TestText")
    cmds.textField(w=500, tx="TestTextField")
    cmds.setParent('..')
    cmds.tabLayout(tabTest, edit=1, tabLabel=(tabTestColumn, "Test"))
    #GUIを表示
    cmds.showWindow()

if __name__ == '__main__':  
    testWindow()

maya.cmds의 경우 (마침내 python의 경우) 들여 쓰기가 어긋나면 오류가 발생하기 때문에
레이아웃의 계층에 맞게 들여 쓰기를 변경할 수 없습니다.
한층 더 말하면 cmds.setParent('..') 도 몇번이나 나오므로 지우고 싶은 곳입니다. . .
그래서 여기에서 이번 본제입니다!

with 구문과 LayoutManager 사용



with 구문과 maya 안에 디폴트인 LayoutManager 라는 모듈을 조합해 사용합니다.
with 구문은 주로 파일을 열고 닫을 때 사용하는 것입니다.
with를 사용하지 않으면 ↓처럼 씁니다.
f = open("test.txt", "r")
print(f.read())
f.close()

with를 사용하면 f.close() 부분을 생략 할 수 있습니다.
게다가 편리하게도 with 문장 아래의 행은 들여쓰기를 비우는 결정이 되어 있습니다.
with open("test.txt", "r") as f:
    print(f.read())
LayoutManager 는 with 구문의 이러한 구조를 이용하여
들여쓰기를 자유롭게 바꿀 수 있는 모듈입니다.
maya.common.ui의 라이브러리에 포함되어 있으므로 아래와 같이 가져옵니다.
from maya.common.ui import LayoutManager
LayoutManager 를 사용하여 maya.cmds 를 사용한 GUI 예제를 다시 작성하면 다음과 같습니다.
# !/usr/bin/env python
# -*- coding: utf-8 -*-

import maya.cmds as cmds
from maya.common.ui import LayoutManager

def testWindow():
    #既にGUIが存在する時に古いほうを消す処理
    if cmds.window('testWindow', ex=1):
        cmds.deleteUI('testWindow')
    windowName = cmds.window('testWindow',title='testWindow')
    #GUIを作成
    tabTest=cmds.tabLayout(scrollable=False, innerMarginHeight=5, innerMarginWidth=1)
    with LayoutManager(cmds.columnLayout(adj=True, rowSpacing=10)) as tabTestColumn:
        cmds.button(label="TestButton")
        cmds.button(label="TestButton")
        cmds.textField(w=500, tx="TestTextField")
        with LayoutManager(cmds.rowLayout(numberOfColumns=4, columnAttach4=('left', 'left', 'left', 'left'), columnWidth4=(100, 150, 150, 150))):
            cmds.button(label="TestButton")
            cmds.checkBox(label="TestCheckBox")
            cmds.checkBox(label="TestCheckBox")
            cmds.checkBox(label="TestCheckBox")
        cmds.text(label="TestText")
        cmds.textField(w=500, tx="TestTextField")
    cmds.tabLayout(tabTest, edit=1, tabLabel=(tabTestColumn, "Test"))
    #GUIを表示
    cmds.showWindow()

if __name__ == '__main__':  
    testWindow()

들여 쓰기의 위치를 ​​변경 한 것과 cmds.setParent('..')사라졌기 때문에 조금 보기 쉬워졌습니다!

결론



PySide를 사용하기 때문에 필요하지 않습니다.
라고 생각한 분도 있을지도 모릅니다만
인터넷에서 검색해도 LayoutManager 나오지 않았기 때문에 소개하겠습니다.
그렇게 편리한 기능은 아니지만 좋으면 사용해보세요!

좋은 웹페이지 즐겨찾기