在maya中创建各种UI

创建主菜单和菜单项:

menuItem() 若不指定父级,都默认将菜单项添加到上一个创建的菜单中。

主菜单菜单项.png

示例代码:

import maya.cmds as cmds 
cmds.menu( "test",label='流程框架', tearOff=True,parent="MayaWindow" )
cmds.menuItem( label='New' )
cmds.menuItem( label='Open' )
cmds.menuItem( label='Save' )
cmds.menuItem( divider=True )  # 分隔线
cmds.menuItem( label='print',c="print(11111)" )

创建菜单集

菜单集中的菜单项来自于上面创建的主菜单,因此需要有菜单项才能添加和显示菜单集。空的菜单集不在菜单集的下拉框中显示,因此菜单集下至少应该拥有一项菜单项。

菜单集.png

示例代码:

import maya.cmds as cmds 
cmds.menuSet( 'testSet', label='testSetLabel' )  # 创建菜单集,不指定标签,显示为空行
cmds.menuSet(am="mainKeysMenu")  # 从当前菜单添加
cmds.menuSet(cms=1,q=1 ) #  设置当前激活的菜单,只是激活,不刷新显示
cmds.menuSet (ams=True,q=True)  # 所有的菜单集
cmds.menuSet(rm="mainKeysMenu")  # 从当前菜单移除
currentmenus = cmds.menuSet(query=True, menuArray=True)  # 查询当前流单集中所有的菜单项

创建状态栏菜单

状态行只需要为控件指定父级窗口为”statusFieldButton”即可。

状态栏.png

示例代码:

import maya.cmds as cmds 
cmds.iconTextButton("状态行名称1",l="标签1",style="textOnly",al='center',p=cmds.iconTextButton("statusFieldButton",q=1,p=1))
cmds.button("状态行名称2",l="标签2",al='center',p=cmds.iconTextButton("statusFieldButton",q=1,p=1))
cmds.nodeIconButton("状态行名称3", label="标签3" , style='iconAndTextHorizontal', command='cmds.spotLight()', image1='spotlight.png',p=cmds.iconTextButton("statusFieldButton",q=1,p=1))

创建侧栏工具页

侧栏工具页通过 toolBar 控件生成,创建后可指定吸附到边界上。

侧栏工具页.png

示例代码:

import maya.cmds as cmds 
myWindow=cmds.window()
buttonForm = cmds.formLayout( parent = myWindow)
cmds.button( parent = buttonForm,l="testSide")
cmds.toolBar( area='top', content=myWindow, allowedArea=['top', 'bottom', "left", "right"])

创建工具架分页:

工具架分页由cmds.shelfLayout()创建,将创建的工具架分页的父级指向shelf主窗口,然后在shelfLayout下创建工具按钮即可:

工具架分页.png

示例代码:

import maya.mel as mm
import maya.cmds as cmds

mainTopShelfTab = mm.eval('global string $gShelfTopLevel;string $a=$gShelfTopLevel;')# 获取工具架顶级布局
newShelfLayout = cmds.shelfLayout("NewLayout",p=mainTopShelfTab)  # 创建工具架分页
newToolButton = cmds.shelfButton("testShelf",docTag=u"测试工具",rpt=1,l="工具",i1 = r"S:/icon/TDtool.ico",iol="工具",c='print(u"测试")',p=newShelfLayout)  # 添加工具按钮

一些常用代码:

mainTopShelfTab = mm.eval('global string $gShelfTopLevel;string $a=$gShelfTopLevel;')  # 获取工具架顶级布局
shelfnum = cmds.shelfTabLayout(mainTopShelfTab,q=1,numberOfChildren=1)  # 获取指定工具架窗口的工具数量
shelfTools = cmds.shelfTabLayout(mainTopShelfTab,q=1,ca=1) # 获取工具架上所有工具栏
shelf_fullname = cmds.shelfLayout(shelfTool[2],q = 1,fpn = 1)  # 获取指定名称的工具架全路径
shelfVisible = cmds.shelfButton("testShelf",e=1,visible=0) # 设置工具按钮可见性
maya.mel.eval('addNewShelfTab "test"')  # 添加指定名称工具架页
maya.mel.eval('deleteShelfTab "test"')  #删除指定个名称工具架

从maya文档中加载默认工具架及其按钮:

#注意此脚本会将一部分默认不加载的工具架也加载到maya工具架下 
def get_shelf():
  """获取maya安装目录下shelf"""
  shelf_files = []
  maya_shelf_path = '{}/scripts/shelves'.format(os.getenv('MAYA_LOCATION'))
  files = os.listdir( maya_shelf_path)
  if files:
      for _file in files:
          if "_" in _file and "." in _file and ".res." not in _file:
              shelf_files.append(_file.split('.')[0].split('_')[-1])
  return shelf_files

def load_shelf():
  """加载maya默认shelf"""

  allShelfs = mel.eval('shelfTabLayout -q -childArray $gShelfTopLevel') # 获取maya默认shelfs
  maya_files = get_shelf()
  if maya_files:
      for _shelf in maya_files:
          if _shelf not in allShelfs:
              mel.eval('loadNewShelf "shelf_{}.mel";'.format(_shelf))

循环删除指定工具架下的按钮:

def remove button (self,shelf):
    """批量删除指定工具架下的工具""""
    shelf_fullname = cmds.shelfLayout ("shelfname",q=1,fpn=1)
   buttons = cmds.shelfLayout(shelf_fullname,q = 1,ca = 1)
    for _button in buttons:
        button_fullname = cmds.shelfButton(_button,q =1,fpn =1)
        cmds.deleteUI( button_fullname)

删除指定的工具架,方法改自deleteShelfTab,会删除一些首选项中存储的变量:

import os
import maya.cmds as cmds
import maya.mel as mm 


def remove_shelf(_shelfname):
    mainTopShelfTab = mm.eval('global string $gShelfTopLevel;string $a=$gShelfTopLevel;')
    shelf_info = {i: _shelf for i, _shelf in enumerate(cmds.shelfTabLayout(mainTopShelfTab, q=1, ca=1)) 
                  if _shelf.split("|")[-1].startswith(_shelfname[:2])}
    shelfnum= cmds.shelfTabLayout(mainTopShelfTab, q=1, numberofChildren=1)
    if shelf_info:
        for _k,_v in shelf_info.items():
            if _v == _shelfname:
                shelf_fullname = cmds.shelfLayout(_v, q=1, fpn=1)
                for _i in range(shelfnum):
                    _align_c = "left"
                    if cmds.optionVar(ex="shelfAlign{}".format(_i+1)):
                        _align_c = cmds.optionVar(q="shelfAlign{}".format(_i+1))
                    _shelfload_c = cmds.optionVar(q="shelfLoad{}".format(_i+1))
                    _shelfname_c = cmds.optionVar(q="shelfName{}".format(_i+1))
                    _shelffile_c = cmds.optionVar(q="shelfFile{}".format(_i+1))
                    cmds.optionVar(
                        iv=("shelfLoad{}".format(_i+1), _shelfload_c),
                        sv=[("shelfAlign{}".format(_i+1), _align_c),
                            ("shelfName{}".format(_i+1), _shelfname_c),
                            ("shelfFile{}".format(_i+1), _shelffile_c)
                            ])
                cmds.optionVar(remove =["shelfLoad{}".format(_k),
                                        "shelfAlign{}".format(_k),
                                        "shelfName{}".format(_k),
                                        "shelfFile{}".format(_k)
                                        ])
                cmds.deleteUI(shelf_fullname, layout=1)
                shelfDir = cmds.internalVar(ush=1)
                shelfFile = os.path.join(shelfDir, "shelf_{}.mel".format(_v))
                if os.path.exists(shelfFile):
                    os.remove(shelfFile)
  

删除UI

删除UI需要知道窗口的窗口名称:

import maya.cmds as cmds 
cmds.deleteUI("windowName")