在maya中创建各种UI
创建主菜单和菜单项:
menuItem() 若不指定父级,都默认将菜单项添加到上一个创建的菜单中。
示例代码:
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)" )
创建菜单集
菜单集中的菜单项来自于上面创建的主菜单,因此需要有菜单项才能添加和显示菜单集。空的菜单集不在菜单集的下拉框中显示,因此菜单集下至少应该拥有一项菜单项。
示例代码:
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”即可。
示例代码:
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 控件生成,创建后可指定吸附到边界上。
示例代码:
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下创建工具按钮即可:
示例代码:
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")