原文链接:https://zhuanlan.zhihu.com/p/2046376275607032115
作者:宝藏小树林
转载提示:请确认这是你自己的文章,或已获得转载授权。发布前请人工核对图片、代码块和排版。
像houdini这种商业 DCC 软件,想要做自己的工具或者修改一些功能的话,只有用他官方开出来的接口来制作,一般情况下会开command和python或者一些c++的api这些用于用户的自定义开发。
那么我们如果要在这种DCC软件中制作资产检验工具的话就必须从官方的文档开始看起
这里是官方文档主入口 https://www.sidefx.com/docs/


可以找自己版本的文档入口进去
找到我们要改的地方,做资产检测类的工具我们用python用的多


选择自己版本的python文档
我们都知道houdini的导出往往是用rop节点里面的save to disk


一般的houdini导出流程


save to disk导出
所以我要在导出时做资产检测就需要到python的scripting页面houdini python文档页
搜索相关的RopNode相关的API,来做导出的操作


搜索RopNode出来的结果
然后我们制作某个时机触发的行为插件的时候用的方式一般就是添加回调或者挂钩子这种。所以我们进到ropnode节点里面之后就去搜索callback


看到出来了注册回调的函数
看完这些后,我们可以自己尝试注册一下
import hou
def asset_export_check_callback(rop_node, render_event_type, time):
if render_event_type != hou.ropRenderEventType.PreRender:
return
print("[AssetChecker] PreRender:", rop_node.path())
# 这里先写一个简单测试:阻止所有导出
hou.ui.displayMessage(
"资产检查触发:\n\n{}".format(rop_node.path()),
title="资产检查"
)
def is_export_rop(node):
return isinstance(node, hou.RopNode)
def register_export_callbacks():
count = 0
for node in hou.node("/").allSubChildren():
if not is_export_rop(node):
continue
try:
node.removeRenderEventCallback(asset_export_check_callback)
except hou.OperationFailed:
pass
except Exception:
pass
node.addRenderEventCallback(
asset_export_check_callback,
run_before_script=True
)
count += 1
print("[AssetChecker] registered:", node.path())
hou.ui.displayMessage(
"已注册导出检查回调:{} 个 ROP 节点".format(count),
title="资产检查"
)
register_export_callbacks()
放到python sourceEditor里面测试一下


点击apply测试下


看到displayMessage信息已经注册
点击一下save to disk 看到信息正确打印了


导出信息正常打印了
很不错,我们的工具基本雏形已经搭建好了。当然,这种模式的肯定无法交付,其他同学肯定不可能每次要导出的时候都去手动添加一下这个脚本的,所以我们最好把这个脚本封装好,让houdini开启的时候就启动这个脚本
我们可以去官网搜索startup相关内容


官方脚本
可以看到这个脚本名称相当的奇怪嗷


我们就往这个里面去写启动的脚本
这样我们就可以去创建一个scripts文件夹在document houdini的目录下写这个脚本456.py


在目录下写这个456.py
写完之后可以注册试试,发现确实没问题,添加uv后可以正常导出


导出检查默认的sphere


我们就可以把这个注册的过程封装成一个exe在其他同学打开的时候就进行配置的一个安装


houdini注册工具
至此我们的工具就比较完善了