Maya自定义插件¶
代码所存在的问题 类名大驼峰的写法 代码不符合PEP8规范 代码单引号双引号统一 代码使用Git管理测试上线 varName != None改成not varName docstring和注释需要规范
如何编写一个简单的.py插件工具 如何在启动的时候 Maya扩展开发的层级结构
插件环境变量部署
# C:\Program Files\Autodesk\Maya2017\modules\hprender.mod
+ hpRender any C:/Users/huweiguo/Documents/.RENDER_ROOT/MayaPlugin/Setup/2017
PATH +:= bin
PATH +:= bin意味着将路径C:/Users/huweiguo/Documents/.RENDER_ROOT/MayaPlugin/Setup/2017/bin路径添加到PATH环境变量中,这里的加bin文件夹并没有任何作用,可以删除
扩展开发层级结构
plug-ins中添加需要加载的插件 scripts中写菜单工具执行的模块代码
Maya环境变量 MAYA_PLUG_IN_PATH 插件文件位置 MAYA_MODULE_PATH mod文件位置 MAYA_SCRIPT_PATH 脚本文件位置 XBMLANGPATH 图标文件位置
Maya.env配置的案例
MTOAROOT = \\server\manager\thirdParty\maya\mtoa\3.1.2.1\2018
REDSHIFT_COREDATAPATH = \\server\manager\thirdParty\maya\Redshift\2.5.48
QAULOTH_PATH = \\server\manager\thirdParty\maya\Qualoth
REDSHIFT_PLUG_IN_PATH = %REDSHIFT_COREDATAPATH%\Plugins\Maya\2018\nt-x86-64
REDSHIFT_SCRIPT_PATH = %REDSHIFT_COREDATAPATH%\Plugins\Maya\Common\scripts
REDSHIFT_XBMLANGPATH = %REDSHIFT_COREDATAPATH%\Plugins\Maya\Common\icons
REDSHIFT_RENDER_DESC_PATH = %REDSHIFT_COREDATAPATH%\Plugins\Maya\Common\rendererDesc
REDSHIFT_CUSTOM_TEMPLATE_PATH = %REDSHIFT_COREDATAPATH%\Plugins\Maya\Common\scripts\NETemplates
REDSHIFT_MAYAEXTENSIONSPATH = %REDSHIFT_PLUG_IN_PATH%\extensions
REDSHIFT_PROCEDURALSPATH = %REDSHIFT_COREDATAPATH%\Procedurals
MAYA_MODULE_PATH = %MAYA_MODULE_PATH%;%MTOAROOT%
PATH = %PATH%;%MTOAROOT%\bin;%REDSHIFT_COREDATAPATH%\bin
MAYA_RENDER_DESC_PATH = %MAYA_RENDER_DESC_PATH%;%MTOAROOT%;%REDSHIFT_RENDER_DESC_PATH%
PYTHONPATH = %PYTHONPATH%;%MTOAROOT%\scripts;%REDSHIFT_SCRIPT_PATH%
MAYA_PLUG_IN_PATH = %REDSHIFT_PLUG_IN_PATH%;%QAULOTH_PATH%\bin
MAYA_SCRIPT_PATH = %REDSHIFT_SCRIPT_PATH%;%QAULOTH_PATH%\script
XBMLANGPATH = %REDSHIFT_XBMLANGPATH%
MAYA_CUSTOM_TEMPLATE_PATH = %REDSHIFT_CUSTOM_TEMPLATE_PATH%
MAYA_DISABLE_CLIC_IPM = 1
来看下如何写个py的插件到插件管理器吧,分两步 注册插件 C:UsershuweiguoDocuments.RENDER_ROOTMayaPluginSetup2017plug-ins hpRender.py
如何创建自定义菜单
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Custom menu plug-in
"""
import os
import sys
import maya.cmds as cmds
import maya.mel as mel
import maya.OpenMayaMPx as omm
def initializePlugin(mobject):
"""
Initialize the script plug-in
"""
mPlugin = omm.MFnPlugin(mobject, "tdUtils", "1.0", "any")
if cmds.menu("menuTD", exists=1):
cmds.deleteUI("menuTD", menu=1)
gMainWindow = mel.eval("global string $gMainWindow;$temp = $gMainWindow")
cmds.menu("menuTD", label="TD Tools", parent=gMainWindow,
tearOff=1, allowOptionBoxes=1)
cmds.menuItem(dividerLabel="General", divider=True)
cmds.menuItem(label="Submit To Deadline", parent="menuTD",
command="print(100)")
cmds.menuItem(dividerLabel="Step", divider=True)
cmds.menuItem("menuRIG", label="RIG", parent="menuTD",
subMenu=True, tearOff=True)
cmds.menuItem(label="Select Skin Joint", parent="menuRIG",
command="print(100)")
def uninitializePlugin(mobject):
"""
Uninitialize the script plug-in
"""
mPlugin = omm.MFnPlugin(mobject)
if cmds.menu("menuTD", exists=1):
cmds.deleteUI("menuTD", menu=1)
sys.path模块导入机制 import hpMayaClient reload(hpMayaClient) hpMayaClient.client().main()
main函数的核心 checkList 检测客户端是否安装 检测C盘是否有读写权限 检测文件是否保存 检测每一层渲染层的渲染帧数范围,这块没必要用正则表达式,可以直接获取 cmds.getAttr(“defaultRenderGlobals.startFrame”) 分析渲染层的函数 如何获取当前场景中用到的所有插件 如何获取当前场景中用到的所有资产文件 cmds.file(query=True, list=True, withoutCopyNumber=True) ver.ini检测Maya版本信息 检测插件版本C:UsershuweiguoDocuments.RENDER_ROOTMayaPluginmayaPluginItems_2017.ini 检测每一层的渲染设置 UI cmds.window 窗口如果存在删除 控件(button, text, intFieldGrp, checkBox, textFieldGrp, radioButtonGrp) 布局
PyQt重写界面 PySide & PyQt4 PySide2 & PyQt5 PyQt4和PyQt5 uic pyside-uic
# Maya Dialog
import sys
import maya.OpenMayaUI as omui
from PySide2 import QtCore
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
path = "D:/2019/centralizeTools/houdini/scripts/python"
path in sys.path or sys.path.insert(0, path)
from houQt import mainDialog
def _get_maya_main_window():
pointer = omui.MQtUtil.mainWindow()
return wrapInstance(long(pointer), QtWidgets.QWidget)
class WindowA(QtWidgets.QDialog, mainDialog.Ui_Dialog):
def __init__(self, parent=None):
super(WindowA, self).__init__(parent)
self.setupUi(self)
def show():
dialog = WindowA(_get_maya_main_window())
dialog.show()
if __name__ == "__main__":
show()
# Maya Main Window
import sys
import maya.OpenMayaUI as omui
from PySide2 import QtCore
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
path = "D:/2019/centralizeTools/houdini/scripts/python"
path in sys.path or sys.path.insert(0, path)
from houQt import mainWin
def _get_maya_main_window():
pointer = omui.MQtUtil.mainWindow()
return wrapInstance(long(pointer), QtWidgets.QWidget)
class WindowB(QtWidgets.QMainWindow, mainWin.Ui_MainWindow):
def __init__(self, parent=None):
super(WindowB, self).__init__(parent)
self.setupUi(self)
def show():
dialog = WindowB(_get_maya_main_window())
dialog.show()
if __name__ == "__main__":
show()
if cmds.window(WINDOW_NAME, exists=True, q=True):
cmds.deleteUI(WINDOW_NAME)