六六の魔法世界

注册

Maya常识 - Maya技能 - 2022年6月4日

在Maya中添加shelf工具栏与工具按钮与子菜单

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/

它的代码模板我将会放入以下链接中。

    相关文件下载地址
    该资源需登录后下载,去登录?
    ©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!