生成热盒使用的popupMenu同样是一个很简单的方式。
代码步骤为1、判断自定义热盒是否存在,存在则删除
2、创建热盒本体对象
3、为热盒添加menuItem并编辑菜单项位置等选项
import maya.cmds as mc
class redBox(object):
def __init__(self):
self._removeOld()
self._build()
def _removeOld(self):
if mc.popupMenu(redBox_name, ex = 1):
mc.deleteUI(redBox_name)
menu = mc.popupMenu(redBox_name, mm = 1, b = 1, aob = 1, ctl = 1, alt = 1, sh = 0, p = 'viewPanes', pmo = 1, pmc = '')
其中aob指定是否创建子项;b指定鼠标点击按钮,最左侧为1,最右侧为3;p指定在哪里可以呼出此热盒。
为使代码有良好的可读性与分类,我将创建热盒对象与创建热盒菜单项放置在了一起,你当然可以将它们合并。
def _build(self):
menu = mc.popupMenu(redBox_name, mm = 1, b = 1, aob = 1, ctl = 1, alt = 1, sh = 0, p = 'viewPanes', pmo = 1, pmc = self._buildMenu)
def _buildMenu(self, menu, *args):
mc.popupMenu(redBox_name, e = True, dai = True)
mc.menuItem(p = menu, l = '方向', c = 'print "ss"')
mc.menuItem(p = menu, l = '下沉', rp = 'N', c = 'print "ll"')
menuItem中rp可以指定菜单项的位置,具体见下图。同样,不论是具有方向的还是在下面陈列的菜单项都可以为其添加图片,直接使用图片名称而非完整路径的方法在我上一篇文章有介绍。

同样,我们还可以与常规一样为热盒指定子热盒。
mc.menuItem(p = menu, l = '下沉', c = 'print "ss"')
mc.menuItem(p = menu, l = '方向', rp = 'N', c = 'print "ll"')
subMenu = mc.menuItem(p = menu, l = '子菜单', rp = 'E', subMenu = 1)
mc.menuItem(p = subMenu, l = '发生什么事了', rp = 'NE', c = 'print "发生什么事了",')
在需要添加子热盒的菜单项使用subMenu标志,并使用变量接收这个菜单项,使子热盒的菜单项的父项能指定到这个菜单项即可。在为热盒下方的菜单项添加子项时同样可以适用这个方法。
参考文章:https://bindpose.com/custom-marking-menu-maya-python/
它的博客里有很多优质文章,建议收藏。
代码模板在下方链接。