Select the node than run this script
Python
# ============================
# PB selected Nodes
# ============================
import hou
# ============================
# Parameters
# ============================
# You can edit the prams in the opengl ROP here.
parms = {
'camera':'/obj/cam1',
'res1':1920,
'res2':1080,
'gamma':2.2,
'shadingmode':7, #6:smooth, 7:wire
'aamode':4, # Anti-Aliasing
'usetextures':1, # 是否带纹理
'pointsize':2, #点渲染大小
'trange':0, #Current Frame:0; FrameRange:1
'f1':1, #Frame Start
'f2':30, #Frame End
'f3':1, #Frame Step
}
enable_time = True # If True, Play the timeline.
path = '$HIP/render/'
hos = '$OS'
frame = '$F4'
ext = '.jpg'
prefix = ''
# ============================
# 函数区
# ============================
import psutil
def smart_cache_cleanup(threshold_percent=90):
"""
如果当前系统内存占用超过阈值,则执行 Houdini 内存清理
:param threshold_percent: 内存占用百分比阈值
"""
# 获取系统内存状态
vm = psutil.virtual_memory()
current_usage = vm.percent
print(f"RAM usage: {current_usage}%")
if current_usage > threshold_percent:
print(f"RAM usage above {threshold_percent}%,RAM cleaning...")
# 1. 清理全部缓存 (对应 Cache Manager 中的 Clear All)
hou.hscript("oppurge -f")
# 2. 清理纹理和 GL 缓存
hou.hscript("glcache -f")
# 3. 如果有 VEX 相关的缓存也一并清理
hou.hscript("vcc -l")
print("Houdini RAM cleaned")
else:
# print("RAM safe")
pass
# ============================
# 获取选中的节点
# ============================
selected_nodes = hou.selectedNodes()
if not selected_nodes:
raise RuntimeError("Select at least one node")
# ============================
# 获取选中节点的父级节点
# ============================
parent_node = selected_nodes[0].parent()
# ============================
# 创建 ROP Network
# ============================
# 如果已经存在同名 ROP,则先删除
rop_net_name = "PB_ROPNET"
existing_rop_net = parent_node.node(rop_net_name)
print(existing_rop_net)
if existing_rop_net:
print(f"Existed Node: {existing_rop_net.path()}")
# existing_rop_net.destroy()
rop_net = existing_rop_net
else:
rop_net = parent_node.createNode("ropnet", rop_net_name)
# ============================
# 确保更新模式为自动更新
# ============================
hou.setUpdateMode(hou.updateMode.AutoUpdate)
for node in hou.selectedNodes():
node.setSelected(False)
# ============================
# 循环创建 OpenGL 并渲染
# ============================
opengls = []
for i,node in enumerate(selected_nodes):
print('------')
# ============
# 设置渲染对象可见性
# ============
node.setDisplayFlag(True)
node.setRenderFlag(True)
hou.setFrame(i+1 if enable_time else hou.frame())
# ============
# 创建OpenGL节点
# ============
opengl_name = f"{node.name()}"
existing_opengl = rop_net.node(opengl_name)
if existing_opengl:
print(f"Existed Node: {existing_opengl.path()}")
opengl = existing_opengl
else:
opengl = rop_net.createNode("opengl", opengl_name)
opengl.moveToGoodPosition()
# ============
# 设置参数
# ============
for key, value in parms.items():
p = opengl.parm(key)
if p:
p.set(value)
# print(f"Set pram: {key} -> {value}")
else:
print(f"WARNING: invalid parm: '{key}'")
# ============
# 输出路径
# ============
picture = hos
if(parms['trange']==0):
pass
else:
picture = hos + '/' + frame
picture = path + prefix + str(i+1).zfill(3) + '_'+ picture + ext
opengl.parm("picture").set(picture)
# ============
# 渲染
# ============
print(f"Rendering: {node.path()}")
opengl.render(verbose=True)
opengls.append(opengl)
# ============
# 清理缓存
# ============
smart_cache_cleanup()
# ============================
# 循环结束
# ============================
print("======DONE======")