PB selected nodes in Houdini

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======")