原文链接:https://zhuanlan.zhihu.com/p/2046238983785539460
作者:宝藏小树林
转载提示:请确认这是你自己的文章,或已获得转载授权。发布前请人工核对图片、代码块和排版。
众所周知,maya这类的ddc软件往往会给用户提供一个窗口用来运行python脚本。

如图,maya的入口为windows->常规编辑器->脚本编辑器
至于要检验这些脚本编辑器能做什么或者能不能满足我们的需求,我们就需要去到对应ddc软件的官方文档处去查询他们在软件之中提供了什么API

一般直接搜索就可以找到网页了
比如我这里找到的网址是Help | Python API 2.0 Reference: Maya Python API 2.0 Reference | Autodesk
这里可以看一些官方的示例

python文档页面
但是一行行看肯定是太过于麻烦的,很多时候我们只需要自己需求的内几个接口,我们可以直接在右上角进行搜索操作

直接搜export相关的接口发现没有
比如这里我想在导出的时候进行资产检查,然后我就搜索了下,结果发现在这个页面里面没有export相关的东西,这就很奇怪了。后面发现这里搜索指挥显示到类,不会显示类里面的变量之类的。
然后我在文档中心的大标题搜索了一下,发现maya的导出是用的MEL命令,然后在python里面封装这些命令来执行的,所以不会直接写到pythonAPI里面

像这里就是用command来驱动maya的导出功能的
使用这里的command就可以执行导出的动作了,同时,我们需要在导出的时候去挂钩子,我们可以搜索callback,beforeExport之类的

这里看到了python里面用这个MSceneMessage来挂钩子
然后点进去,我们就可以找到我们要的函数了

我们可以给beforeExportCheck注册回调函数
我们可以简单写一段
import maya.cmds as cmds
import maya.api.OpenMaya as om
try:
for cb in ASSET_CHECKER_CALLBACKS:
om.MMessage.removeCallback(cb)
except Exception:
pass
ASSET_CHECKER_CALLBACKS = []
def before_export_check(*args):
unit_short = cmds.currentUnit(query=True, linear=True)
unit_full = cmds.currentUnit(query=True, fullName=True, linear=True)
print("currentUnit short =", repr(unit_short))
print("currentUnit full =", repr(unit_full))
if unit_short != "m":
cmds.confirmDialog(
title=u"资产检查失败",
message=u"场景单位不是米\n\n当前单位 short: {}\n当前单位 full: {}".format(
unit_short or "<empty>",
unit_full or "<empty>"
),
button=[u"确定"],
icon="critical"
)
return False
return True
cb_id = om.MSceneMessage.addCheckCallback(
om.MSceneMessage.kBeforeExportCheck,
before_export_check
)
ASSET_CHECKER_CALLBACKS.append(cb_id)
print(u"导出前检查已注册,callback id =", cb_id)
在脚本编辑器里面运行一下,这里就可以进行最基础的检测了

在脚本编辑器里面运行一下
这里可以导出测试一下,很完美,会拦截到导出行为
检测场景单位
当然,这样的东西肯定没法交付,你的同事肯定不会每次自己导出的时候先复制下你的代码,然后到脚本编辑器里面运行,然后再导出(´・ω・`)
同理,我们可以搜索initailize相关内容看到,我们需要去写appdir/version/scripts里面去加一个userSetup.py脚本来启动我们的导出检测脚本。

自启动python脚本
比如这里我就用maya的utils把我的脚本注册到maya里面了
userSetup.py
import os
import sys
import maya.utils
ASSET_CHECKER_DIR = r"C:\Users\Yin\Documents\maya\2025\zh_CN\scripts\asset_checker"
if ASSET_CHECKER_DIR not in sys.path:
sys.path.append(ASSET_CHECKER_DIR)
def _install_asset_checker():
import asset_export_checker
asset_export_checker.install()
maya.utils.executeDeferred(_install_asset_checker)
这样执行后,maya会问你要不要改变自启动配置,确认即可。
但是即使是这样,其他同学要注册这个东西还是很麻烦,要自己一个个的去文件夹里面配置,看起来很麻烦欸
(›´ω`‹ ),有条件的同学可以自己封装一个exe然后给其他同学注册这个的时候。这个就需要大伙发挥自己的python功底了,可以像我一样写给installer然后用pyqt做ui然后pyinstaller封装成exe交付给其他同学

我这里写了一个规则集合用于编辑