Maya上方的工具架除了手动新增子工具架外还可以用代码生成,并且只需要简单的几个命令就可以解决。
我们的思路是:1、检查我们要创建的shelf是否存在,存在则删除,因为在后面会重新生成,如果原本的shelf已经被破坏了,再执行了这个代码就会重新生成一个新的
2、创建shelf工具架
3、创建工具架内的按钮,并使按钮具有点击后出现子菜单的效果,而不是直接运行某代码
4、为子菜单创建其它子菜单
import maya.cmds as mc
class SelfButton(object):
def __init__(self, name,*iconPath):
self.shelf_name = name
# self.iconPath = iconPath#需要放入的图片的路径没有添加到Maya的图片环境里时打开这行
self.labelBackground = (213, 169, 169, 0)
self.labelColor = (220, 135, 206)
self.cleanOldShalf()
self.build()
def cleanOldShalf(self):
if mc.shelfLayout(self.shelf_name, ex = 1):
if mc.shelfLayout(self.shelf_name, q = 1, ca = 1):
for each in mc.shelfLayout(self.shelf_name, q = 1, ca = 1):
mc.deleteUI(each)
else:
mc.shelfLayout(self.shelf_name, p = 'ShelfLayout')
import maya.cmds as mc
class SelfButton(object):
def __init__(self, name):
self.shelf_name = name
# self.iconPath = iconPath
self.labelBackground = (213, 169, 169, 0)
self.labelColor = (220, 135, 206)
self.cleanOldShalf()
self.build()
def cleanOldShalf(self):
if mc.shelfLayout(self.shelf_name, ex = 1):
if mc.shelfLayout(self.shelf_name, q = 1, ca = 1):
for each in mc.shelfLayout(self.shelf_name, q = 1, ca = 1):
mc.deleteUI(each)
else:
mc.shelfLayout(self.shelf_name, p = 'ShelfLayout')
def build(self):
self.addButton('按钮1', command = 'print "1",', icon = 'ss.jpg')
self.addButton('按钮2', icon = 'ss.jpg')
p = mc.popupMenu(b = 1)
self.addMenuItem(p, '菜单1', icon = 'xiao.jpg')
self.addMenuItem(p, '菜单2', icon = 'xiao.jpg')
sub = self.addSubMenu(p, '子菜单1', icon = 'xiao.jpg')
self.addMenuItem(sub, '子菜单1级', icon = 'xiao.jpg')
sub2 = self.addSubMenu(sub, '子菜单2', icon = 'xiao.jpg')
self.addMenuItem(sub2, '子菜单2级1', icon = 'xiao.jpg')
self.addMenuItem(sub2, '子菜单2级2', icon = 'xiao.jpg')
self.addMenuItem(sub, '子菜单3' , icon = 'xiao.jpg')
self.addMenuItem(p, '菜单3', icon = 'xiao.jpg')
self.addButton('按钮2', command = 'print "2",', icon = 'ss.jpg')
def addButton(self, label, icon, command = '', doubleCommand = ''):
"""
直接在shelf栏中生成按钮,并设置按钮的相关参数
"""
mc.setParent(self.shelf_name)
if icon:
# icon = self.iconPath + icon
mc.shelfButton(w = 37, h = 37, i = icon, l = label, c = command, dcc = doubleCommand, iol = label, olb = self.labelBackground, olc = self.labelColor)
def addMenuItem(self, parent, label, icon, command = ''):
"""
在按钮被点击时执行生成子菜单,并设置相关参数
"""
if icon:
# icon = self.iconPath + icon
return mc.menuItem(p = parent, l = label, c = command, i = icon)
def addSubMenu(self, parent, label, icon):
"""
为menuItem添加子菜单,只需要设置其父级即可
"""
if icon:
# icon = self.iconPath + icon
return mc.menuItem(p = parent, l = label, i = icon , sm = 1)
从代码可以看出,只需要在需要出现菜单时为mc.menuItem指定一个父级即可达到子级效果。而父级在创建时需要用一个变量来接受这个按钮,好让子菜单能拿到这个父级。
其中mc.shelfButton中c标签代表单击左键执行,dcc代表双击左键。并且你可以看出它的尺寸是37*37,这表示你的图片大小也的是37*37像素。而子菜单的menuItem的图片大小为32*32。注意,shelf栏按钮的图片如果太大,它会撑大工具栏。
另外,如果你想像我一样不加载路径直接使用图片名称即可引用到图片,则需要将你的图片路径放入到Maya的图片环境路径中。我们可以通过以下代码查询已经可以直接访问的图片路径:
#mel查询方法
getenv XBMLANGPATH
#python查询方法
import os
os.environ['XBMLANGPATH']
查询出来的环境是字符串类型,且他不等于Maya环境与python环境。需要添加自己的路径时我们可以进行如下操作:
import os
os.environ['XBMLANGPATH'] = str(os.environ['XBMLANGPATH']) + ';' + r'iconPath'
需要注意的是,自定义添加的路径会在关闭Maya后失效,这导致每次打开Maya时都要重新添加,所以当你需要每次都使用时将它添加到userSetup文件中。
参考文章:https://bindpose.com/scripting-custom-shelf-in-maya-python/
它的代码模板我将会放入以下链接中。